123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //
- // NSData+NSInputStream.m
- // Tidbits
- //
- // Created by Ewan Mellor on 6/16/13.
- // Copyright (c) 2013 Tipbit, Inc. All rights reserved.
- //
- #import "NSData+NSInputStream.h"
- #define BUFSIZE 65536U
- @implementation NSData (NSInputStream)
- +(NSData *)dataWithContentsOfStream:(NSInputStream *)input initialCapacity:(NSUInteger)capacity error:(NSError **)error {
- size_t bufsize = MIN(BUFSIZE, capacity);
- uint8_t * buf = malloc(bufsize);
- if (buf == NULL) {
- if (error) {
- *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:ENOMEM userInfo:nil];
- }
- return nil;
- }
-
- NSMutableData* result = capacity == NSUIntegerMax ? [NSMutableData data] : [NSMutableData dataWithCapacity:capacity];
- @try {
- while (true) {
- NSInteger n = [input read:buf maxLength:bufsize];
- if (n < 0) {
- result = nil;
- if (error) {
- *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil];
- }
- break;
- }
- else if (n == 0) {
- break;
- }
- else {
- [result appendBytes:buf length:n];
- }
- }
- }
- @catch (NSException * exn) {
- SVGKitLogWarn(@"[%@] WARNING: caught exception writing to file: %@", [self class], exn);
- result = nil;
- if (error) {
- *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EIO userInfo:nil];
- }
- }
-
- free(buf);
- return result;
- }
- @end
|