root / asi-http-request-with-pithos / Classes / CloudFiles / ASICloudFilesObjectRequest.m @ cc176feb
History | View | Annotate | Download (10.3 kB)
1 |
// |
---|---|
2 |
// ASICloudFilesObjectRequest.m |
3 |
// |
4 |
// Created by Michael Mayo on 1/6/10. |
5 |
// |
6 |
|
7 |
#import "ASICloudFilesObjectRequest.h" |
8 |
#import "ASICloudFilesObject.h" |
9 |
|
10 |
|
11 |
@implementation ASICloudFilesObjectRequest |
12 |
|
13 |
@synthesize currentElement, currentContent, currentObject; |
14 |
@synthesize accountName, containerName; |
15 |
|
16 |
#pragma mark - |
17 |
#pragma mark Constructors |
18 |
|
19 |
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName { |
20 |
NSString *urlString = [NSString stringWithFormat:@"%@/%@", [ASICloudFilesRequest storageURL], containerName]; |
21 |
ASICloudFilesObjectRequest *request = [[[ASICloudFilesObjectRequest alloc] initWithURL:[NSURL URLWithString:urlString]] autorelease]; |
22 |
[request setRequestMethod:method]; |
23 |
[request addRequestHeader:@"X-Auth-Token" value:[ASICloudFilesRequest authToken]]; |
24 |
request.containerName = containerName; |
25 |
return request; |
26 |
} |
27 |
|
28 |
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName queryString:(NSString *)queryString { |
29 |
NSString *urlString = [NSString stringWithFormat:@"%@/%@%@", [ASICloudFilesRequest storageURL], containerName, queryString]; |
30 |
ASICloudFilesObjectRequest *request = [[[ASICloudFilesObjectRequest alloc] initWithURL:[NSURL URLWithString:urlString]] autorelease]; |
31 |
[request setRequestMethod:method]; |
32 |
[request addRequestHeader:@"X-Auth-Token" value:[ASICloudFilesRequest authToken]]; |
33 |
request.containerName = containerName; |
34 |
return request; |
35 |
} |
36 |
|
37 |
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName objectPath:(NSString *)objectPath { |
38 |
NSString *urlString = [NSString stringWithFormat:@"%@/%@/%@", [ASICloudFilesRequest storageURL], containerName, objectPath]; |
39 |
ASICloudFilesObjectRequest *request = [[[ASICloudFilesObjectRequest alloc] initWithURL:[NSURL URLWithString:urlString]] autorelease]; |
40 |
[request setRequestMethod:method]; |
41 |
[request addRequestHeader:@"X-Auth-Token" value:[ASICloudFilesRequest authToken]]; |
42 |
request.containerName = containerName; |
43 |
return request; |
44 |
} |
45 |
|
46 |
#pragma mark - |
47 |
#pragma mark HEAD - Container Info |
48 |
|
49 |
+ (id)containerInfoRequest:(NSString *)containerName { |
50 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"HEAD" containerName:containerName]; |
51 |
return request; |
52 |
} |
53 |
|
54 |
- (NSUInteger)containerObjectCount { |
55 |
return [[[self responseHeaders] objectForKey:@"X-Container-Object-Count"] intValue]; |
56 |
} |
57 |
|
58 |
- (NSUInteger)containerBytesUsed { |
59 |
return [[[self responseHeaders] objectForKey:@"X-Container-Bytes-Used"] intValue]; |
60 |
} |
61 |
|
62 |
#pragma mark - |
63 |
#pragma mark HEAD - Object Info |
64 |
|
65 |
+ (id)objectInfoRequest:(NSString *)containerName objectPath:(NSString *)objectPath { |
66 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"HEAD" containerName:containerName objectPath:objectPath]; |
67 |
return request; |
68 |
} |
69 |
|
70 |
#pragma mark - |
71 |
#pragma mark GET - List Objects |
72 |
|
73 |
+ (NSString *)queryStringWithContainer:(NSString *)container limit:(NSUInteger)limit marker:(NSString *)marker prefix:(NSString *)prefix path:(NSString *)path { |
74 |
NSString *queryString = @"?format=xml"; |
75 |
|
76 |
if (limit && limit > 0) { |
77 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&limit=%i", limit]]; |
78 |
} |
79 |
if (marker) { |
80 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [marker stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; |
81 |
} |
82 |
if (path) { |
83 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&path=%@", [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; |
84 |
} |
85 |
|
86 |
return queryString; |
87 |
} |
88 |
|
89 |
+ (id)listRequestWithContainer:(NSString *)containerName limit:(NSUInteger)limit marker:(NSString *)marker prefix:(NSString *)prefix path:(NSString *)path { |
90 |
NSString *queryString = [ASICloudFilesObjectRequest queryStringWithContainer:containerName limit:limit marker:marker prefix:prefix path:path]; |
91 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"GET" containerName:containerName queryString:queryString]; |
92 |
return request; |
93 |
} |
94 |
|
95 |
+ (id)listRequestWithContainer:(NSString *)containerName { |
96 |
return [ASICloudFilesObjectRequest listRequestWithContainer:containerName limit:0 marker:nil prefix:nil path:nil]; |
97 |
} |
98 |
|
99 |
- (NSArray *)objects { |
100 |
if (objects) { |
101 |
return objects; |
102 |
} |
103 |
objects = [[[NSMutableArray alloc] init] autorelease]; |
104 |
|
105 |
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:[self responseData]] autorelease]; |
106 |
[parser setDelegate:self]; |
107 |
[parser setShouldProcessNamespaces:NO]; |
108 |
[parser setShouldReportNamespacePrefixes:NO]; |
109 |
[parser setShouldResolveExternalEntities:NO]; |
110 |
[parser parse]; |
111 |
return objects; |
112 |
} |
113 |
|
114 |
#pragma mark - |
115 |
#pragma mark GET - Retrieve Object |
116 |
|
117 |
+ (id)getObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath { |
118 |
return [ASICloudFilesObjectRequest storageRequestWithMethod:@"GET" containerName:containerName objectPath:objectPath]; |
119 |
} |
120 |
|
121 |
- (ASICloudFilesObject *)object { |
122 |
ASICloudFilesObject *object = [ASICloudFilesObject object]; |
123 |
|
124 |
NSString *path = [self url].path; |
125 |
NSRange range = [path rangeOfString:self.containerName]; |
126 |
path = [path substringFromIndex:range.location + range.length + 1]; |
127 |
|
128 |
object.name = path; |
129 |
object.hash = [[self responseHeaders] objectForKey:@"ETag"]; |
130 |
object.bytes = [[[self responseHeaders] objectForKey:@"Content-Length"] intValue]; |
131 |
object.contentType = [[self responseHeaders] objectForKey:@"Content-Type"]; |
132 |
object.lastModified = [[self responseHeaders] objectForKey:@"Last-Modified"]; |
133 |
object.metadata = [NSMutableDictionary dictionary]; |
134 |
|
135 |
for (NSString *key in [[self responseHeaders] keyEnumerator]) { |
136 |
NSRange metaRange = [key rangeOfString:@"X-Object-Meta-"]; |
137 |
if (metaRange.location == 0) { |
138 |
[object.metadata setObject:[[self responseHeaders] objectForKey:key] forKey:[key substringFromIndex:metaRange.length]]; |
139 |
} |
140 |
} |
141 |
|
142 |
object.data = [self responseData]; |
143 |
|
144 |
return object; |
145 |
} |
146 |
|
147 |
#pragma mark - |
148 |
#pragma mark PUT - Upload Object |
149 |
|
150 |
+ (id)putObjectRequestWithContainer:(NSString *)containerName object:(ASICloudFilesObject *)object { |
151 |
return [self putObjectRequestWithContainer:containerName objectPath:object.name contentType:object.contentType objectData:object.data metadata:object.metadata etag:nil]; |
152 |
} |
153 |
|
154 |
+ (id)putObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath contentType:(NSString *)contentType objectData:(NSData *)objectData metadata:(NSDictionary *)metadata etag:(NSString *)etag { |
155 |
|
156 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"PUT" containerName:containerName objectPath:objectPath]; |
157 |
[request addRequestHeader:@"Content-Type" value:contentType]; |
158 |
|
159 |
// add metadata to headers |
160 |
if (metadata) { |
161 |
for (NSString *key in [metadata keyEnumerator]) { |
162 |
[request addRequestHeader:[NSString stringWithFormat:@"X-Object-Meta-%@", key] value:[metadata objectForKey:key]]; |
163 |
} |
164 |
} |
165 |
|
166 |
[request appendPostData:objectData]; |
167 |
return request; |
168 |
} |
169 |
|
170 |
+ (id)putObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath contentType:(NSString *)contentType file:(NSString *)filePath metadata:(NSDictionary *)metadata etag:(NSString *)etag |
171 |
{ |
172 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"PUT" containerName:containerName objectPath:objectPath]; |
173 |
[request addRequestHeader:@"Content-Type" value:contentType]; |
174 |
|
175 |
// add metadata to headers |
176 |
if (metadata) { |
177 |
for (NSString *key in [metadata keyEnumerator]) { |
178 |
[request addRequestHeader:[NSString stringWithFormat:@"X-Object-Meta-%@", key] value:[metadata objectForKey:key]]; |
179 |
} |
180 |
} |
181 |
|
182 |
[request setShouldStreamPostDataFromDisk:YES]; |
183 |
[request setPostBodyFilePath:filePath]; |
184 |
return request; |
185 |
} |
186 |
|
187 |
#pragma mark - |
188 |
#pragma mark POST - Set Object Metadata |
189 |
|
190 |
+ (id)postObjectRequestWithContainer:(NSString *)containerName object:(ASICloudFilesObject *)object { |
191 |
return [self postObjectRequestWithContainer:containerName objectPath:object.name metadata:object.metadata]; |
192 |
} |
193 |
|
194 |
+ (id)postObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath metadata:(NSDictionary *)metadata { |
195 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"POST" containerName:containerName objectPath:objectPath]; |
196 |
|
197 |
// add metadata to headers |
198 |
if (metadata) { |
199 |
for (NSString *key in [metadata keyEnumerator]) { |
200 |
[request addRequestHeader:[NSString stringWithFormat:@"X-Object-Meta-%@", key] value:[metadata objectForKey:key]]; |
201 |
} |
202 |
} |
203 |
|
204 |
return request; |
205 |
} |
206 |
|
207 |
#pragma mark - |
208 |
#pragma mark DELETE - Delete Object |
209 |
|
210 |
+ (id)deleteObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath { |
211 |
ASICloudFilesObjectRequest *request = [ASICloudFilesObjectRequest storageRequestWithMethod:@"DELETE" containerName:containerName objectPath:objectPath]; |
212 |
return request; |
213 |
} |
214 |
|
215 |
#pragma mark - |
216 |
#pragma mark XML Parser Delegate |
217 |
|
218 |
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { |
219 |
[self setCurrentElement:elementName]; |
220 |
|
221 |
if ([elementName isEqualToString:@"object"]) { |
222 |
[self setCurrentObject:[ASICloudFilesObject object]]; |
223 |
} |
224 |
[self setCurrentContent:@""]; |
225 |
} |
226 |
|
227 |
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { |
228 |
if ([elementName isEqualToString:@"name"]) { |
229 |
[self currentObject].name = [self currentContent]; |
230 |
} else if ([elementName isEqualToString:@"hash"]) { |
231 |
[self currentObject].hash = [self currentContent]; |
232 |
} else if ([elementName isEqualToString:@"bytes"]) { |
233 |
[self currentObject].bytes = [[self currentContent] intValue]; |
234 |
} else if ([elementName isEqualToString:@"content_type"]) { |
235 |
[self currentObject].contentType = [self currentContent]; |
236 |
} else if ([elementName isEqualToString:@"last_modified"]) { |
237 |
[self currentObject].lastModified = [self dateFromString:[self currentContent]]; |
238 |
} else if ([elementName isEqualToString:@"object"]) { |
239 |
// we're done with this object. time to move on to the next |
240 |
[objects addObject:currentObject]; |
241 |
[self setCurrentObject:nil]; |
242 |
} |
243 |
} |
244 |
|
245 |
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { |
246 |
[self setCurrentContent:[[self currentContent] stringByAppendingString:string]]; |
247 |
} |
248 |
|
249 |
#pragma mark - |
250 |
#pragma mark Memory Management |
251 |
|
252 |
- (void)dealloc { |
253 |
[currentElement release]; |
254 |
[currentContent release]; |
255 |
[currentObject release]; |
256 |
[accountName release]; |
257 |
[containerName release]; |
258 |
[super dealloc]; |
259 |
} |
260 |
|
261 |
@end |