NSData+NSInputStream.m 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // NSData+NSInputStream.m
  3. // Tidbits
  4. //
  5. // Created by Ewan Mellor on 6/16/13.
  6. // Copyright (c) 2013 Tipbit, Inc. All rights reserved.
  7. //
  8. #import "NSData+NSInputStream.h"
  9. #define BUFSIZE 65536U
  10. @implementation NSData (NSInputStream)
  11. +(NSData *)dataWithContentsOfStream:(NSInputStream *)input initialCapacity:(NSUInteger)capacity error:(NSError **)error {
  12. if (!input) {
  13. if (error) {
  14. *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:ENOENT userInfo:nil];
  15. }
  16. return nil;
  17. }
  18. size_t bufsize = MIN(BUFSIZE, capacity);
  19. uint8_t * buf = malloc(bufsize);
  20. if (buf == NULL) {
  21. if (error) {
  22. *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:ENOMEM userInfo:nil];
  23. }
  24. return nil;
  25. }
  26. NSMutableData* result = capacity == NSUIntegerMax ? [NSMutableData data] : [NSMutableData dataWithCapacity:capacity];
  27. @try {
  28. while (true) {
  29. NSInteger n = [input read:buf maxLength:bufsize];
  30. if (n < 0) {
  31. result = nil;
  32. if (error) {
  33. *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil];
  34. }
  35. break;
  36. }
  37. else if (n == 0) {
  38. break;
  39. }
  40. else {
  41. [result appendBytes:buf length:n];
  42. }
  43. }
  44. }
  45. @catch (NSException * exn) {
  46. SVGKitLogWarn(@"[%@] WARNING: caught exception writing to file: %@", [self class], exn);
  47. result = nil;
  48. if (error) {
  49. *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EIO userInfo:nil];
  50. }
  51. }
  52. free(buf);
  53. return result;
  54. }
  55. @end