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