-
Notifications
You must be signed in to change notification settings - Fork 1
/
CCMultipartReader.mm
138 lines (102 loc) · 3.16 KB
/
CCMultipartReader.mm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//
// CCMultipartReader.mm
// CCMultipartReader
//
// Copyright 2011 CodeCatalyst, LLC. All rights reserved.
//
#import "CCMultipartReader.h"
#include "MultipartReader.h"
@implementation CCMultipartReader
@synthesize delegate = delegate_;
@synthesize boundary = boundary_;
#pragma mark - Callback functions
void onPartBegin(const MultipartHeaders &headers, void *userData)
{
CCMultipartReader *reader = (CCMultipartReader *)userData;
NSMutableDictionary *headerDictionary = [[NSMutableDictionary alloc] init];
MultipartHeaders::const_iterator it;
for (it = headers.begin(); it != headers.end(); it++) {
NSString *key = [NSString stringWithCString:it->first.c_str() encoding:NSUTF8StringEncoding];
NSString *value = [NSString stringWithCString:it->second.c_str() encoding:NSUTF8StringEncoding];
[headerDictionary setValue:value forKey:key];
}
if (reader.delegate && [reader.delegate respondsToSelector:@selector(readerDidBeginPart:headers:)])
[reader.delegate readerDidBeginPart:reader headers:headerDictionary];
[headerDictionary release];
}
void onPartData(const char *buffer, size_t size, void *userData)
{
CCMultipartReader *reader = (CCMultipartReader *)userData;
NSData *data = [[NSData alloc] initWithBytesNoCopy:(void *)buffer length:size freeWhenDone:NO];
if (reader.delegate && [reader.delegate respondsToSelector:@selector(reader:didReadPartData:)])
[reader.delegate reader:reader didReadPartData:data];
[data release];
}
void onPartEnd(void *userData)
{
CCMultipartReader *reader = (CCMultipartReader *)userData;
if (reader.delegate && [reader.delegate respondsToSelector:@selector(readerDidEndPart:)])
[reader.delegate readerDidEndPart:reader];
}
void onEnd(void *userData)
{
CCMultipartReader *reader = (CCMultipartReader *)userData;
if (reader.delegate && [reader.delegate respondsToSelector:@selector(readerDidFinishReading:)])
[reader.delegate readerDidFinishReading:reader];
}
#pragma mark - Initialization
- (id)init {
self = [super init];
if (self) {
reader = new MultipartReader();
reader->onPartBegin = onPartBegin;
reader->onPartData = onPartData;
reader->onPartEnd = onPartEnd;
reader->onEnd = onEnd;
reader->userData = self;
}
return self;
}
#pragma mark - Properties
- (void)setBoundary:(NSString *)value
{
if (boundary_ != value)
{
[boundary_ release];
boundary_ = [value copy];
reader->setBoundary([value UTF8String]);
}
}
- (NSString*)errorMessage
{
return [NSString stringWithCString:reader->getErrorMessage() encoding:NSUTF8StringEncoding];
}
- (BOOL)hasError
{
return reader->hasError();
}
- (BOOL)stopped
{
return reader->stopped();
}
- (BOOL)succeeded
{
return reader->succeeded();
}
#pragma mark - Methods
- (void)reset
{
reader->reset();
}
- (size_t)read:(NSData*)data
{
return reader->feed((const char*)[data bytes], [data length]);
}
#pragma mark - Memory Management
- (void)dealloc
{
[boundary_ release];
delete reader;
[super dealloc];
}
@end