Statistics
| Branch: | Revision:

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