Ben Copsey

Merge branch 'cloudfiles' into integration

Conflicts:
	Classes/ASIHTTPRequest.m
	iPhone.xcodeproj/project.pbxproj
	set_version_number.sh
//
// ASICloudFilesCDNRequest.h
//
// Created by Michael Mayo on 1/6/10.
//
#import "ASICloudFilesRequest.h"
@class ASICloudFilesContainerXMLParserDelegate;
@interface ASICloudFilesCDNRequest : ASICloudFilesRequest {
NSString *accountName;
NSString *containerName;
ASICloudFilesContainerXMLParserDelegate *xmlParserDelegate;
}
@property (nonatomic, retain) NSString *accountName;
@property (nonatomic, retain) NSString *containerName;
@property (nonatomic, retain) ASICloudFilesContainerXMLParserDelegate *xmlParserDelegate;
// HEAD /<api version>/<account>/<container>
// Response:
// X-CDN-Enabled: True
// X-CDN-URI: http://cdn.cloudfiles.mosso.com/c1234
// X-CDN-TTL: 86400
+ (id)containerInfoRequest:(NSString *)containerName;
- (BOOL)cdnEnabled;
- (NSString *)cdnURI;
- (NSUInteger)cdnTTL;
// GET /<api version>/<account>
// limit, marker, format, enabled_only=true
+ (id)listRequest;
+ (id)listRequestWithLimit:(NSUInteger)limit marker:(NSString *)marker enabledOnly:(BOOL)enabledOnly;
- (NSArray *)containers;
// PUT /<api version>/<account>/<container>
// PUT operations against a Container are used to CDN-enable that Container.
// Include an HTTP header of X-TTL to specify a custom TTL.
+ (id)putRequestWithContainer:(NSString *)containerName;
+ (id)putRequestWithContainer:(NSString *)containerName ttl:(NSUInteger)ttl;
// returns: - (NSString *)cdnURI;
// POST /<api version>/<account>/<container>
// POST operations against a CDN-enabled Container are used to adjust CDN attributes.
// The POST operation can be used to set a new TTL cache expiration or to enable/disable public sharing over the CDN.
// X-TTL: 86400
// X-CDN-Enabled: True
+ (id)postRequestWithContainer:(NSString *)containerName;
+ (id)postRequestWithContainer:(NSString *)containerName cdnEnabled:(BOOL)cdnEnabled ttl:(NSUInteger)ttl;
// returns: - (NSString *)cdnURI;
@end
... ...
//
// ASICloudFilesCDNRequest.m
//
// Created by Michael Mayo on 1/6/10.
//
#import "ASICloudFilesCDNRequest.h"
#import "ASICloudFilesContainerXMLParserDelegate.h"
@implementation ASICloudFilesCDNRequest
@synthesize accountName, containerName, xmlParserDelegate;
+ (id)cdnRequestWithMethod:(NSString *)method query:(NSString *)query {
NSString *urlString = [NSString stringWithFormat:@"%@%@", [ASICloudFilesRequest cdnManagementURL], query];
ASICloudFilesCDNRequest *request = [[ASICloudFilesCDNRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setRequestMethod:method];
[request addRequestHeader:@"X-Auth-Token" value:[ASICloudFilesRequest authToken]];
return request;
}
+ (id)cdnRequestWithMethod:(NSString *)method containerName:(NSString *)containerName {
NSString *urlString = [NSString stringWithFormat:@"%@/%@", [ASICloudFilesRequest cdnManagementURL], containerName];
ASICloudFilesCDNRequest *request = [[ASICloudFilesCDNRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setRequestMethod:method];
[request addRequestHeader:@"X-Auth-Token" value:[ASICloudFilesRequest authToken]];
request.containerName = containerName;
return request;
}
#pragma mark -
#pragma mark HEAD - Container Info
+ (id)containerInfoRequest:(NSString *)containerName {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"HEAD" containerName:containerName];
return request;
}
- (BOOL)cdnEnabled {
return [[[self responseHeaders] objectForKey:@"X-Cdn-Enabled"] boolValue];
}
- (NSString *)cdnURI {
return [[self responseHeaders] objectForKey:@"X-Cdn-Uri"];
}
- (NSUInteger)cdnTTL {
return [[[self responseHeaders] objectForKey:@"X-Ttl"] intValue];
}
#pragma mark -
#pragma mark GET - CDN Container Lists
+ (id)listRequest {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"GET" query:@"?format=xml"];
return request;
}
+ (id)listRequestWithLimit:(NSUInteger)limit marker:(NSString *)marker enabledOnly:(BOOL)enabledOnly {
NSString *query = @"?format=xml";
if (limit > 0) {
query = [query stringByAppendingString:[NSString stringWithFormat:@"&limit=%i", limit]];
}
if (marker) {
query = [query stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", marker]];
}
if (limit > 0) {
query = [query stringByAppendingString:[NSString stringWithFormat:@"&limit=%i", limit]];
}
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"GET" query:query];
return request;
}
- (NSArray *)containers {
if (xmlParserDelegate.containerObjects) {
return xmlParserDelegate.containerObjects;
}
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:[self responseData]] autorelease];
if (xmlParserDelegate == nil) {
xmlParserDelegate = [[ASICloudFilesContainerXMLParserDelegate alloc] init];
}
[parser setDelegate:xmlParserDelegate];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
return xmlParserDelegate.containerObjects;
}
#pragma mark -
#pragma mark PUT - CDN Enable Container
// PUT /<api version>/<account>/<container>
// PUT operations against a Container are used to CDN-enable that Container.
// Include an HTTP header of X-TTL to specify a custom TTL.
+ (id)putRequestWithContainer:(NSString *)containerName {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"PUT" containerName:containerName];
return request;
}
+ (id)putRequestWithContainer:(NSString *)containerName ttl:(NSUInteger)ttl {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"PUT" containerName:containerName];
[request addRequestHeader:@"X-Ttl" value:[NSString stringWithFormat:@"%i", ttl]];
return request;
}
#pragma mark -
#pragma mark POST - Adjust CDN Attributes
// POST /<api version>/<account>/<container>
// POST operations against a CDN-enabled Container are used to adjust CDN attributes.
// The POST operation can be used to set a new TTL cache expiration or to enable/disable public sharing over the CDN.
// X-TTL: 86400
// X-CDN-Enabled: True
+ (id)postRequestWithContainer:(NSString *)containerName {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"POST" containerName:containerName];
return request;
}
+ (id)postRequestWithContainer:(NSString *)containerName cdnEnabled:(BOOL)cdnEnabled ttl:(NSUInteger)ttl {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"POST" containerName:containerName];
if (ttl > 0) {
[request addRequestHeader:@"X-Ttl" value:[NSString stringWithFormat:@"%i", ttl]];
}
[request addRequestHeader:@"X-Cdn-Enabled" value:cdnEnabled ? @"True" : @"False"];
return request;
}
#pragma mark -
#pragma mark Memory Management
-(void)dealloc {
[accountName release];
[containerName release];
[xmlParserDelegate release];
[super dealloc];
}
@end
... ...
//
// ASICloudFilesContainer.h
//
// Created by Michael Mayo on 1/7/10.
//
#import <Foundation/Foundation.h>
@interface ASICloudFilesContainer : NSObject {
// regular container attributes
NSString *name;
NSUInteger count;
NSUInteger bytes;
// CDN container attributes
BOOL cdnEnabled;
NSUInteger ttl;
NSString *cdnURL;
BOOL logRetention;
NSString *referrerACL;
NSString *useragentACL;
}
+ (id)container;
// regular container attributes
@property (nonatomic, retain) NSString *name;
@property (nonatomic) NSUInteger count;
@property (nonatomic) NSUInteger bytes;
// CDN container attributes
@property (nonatomic) BOOL cdnEnabled;
@property (nonatomic) NSUInteger ttl;
@property (nonatomic, retain) NSString *cdnURL;
@property (nonatomic) BOOL logRetention;
@property (nonatomic, retain) NSString *referrerACL;
@property (nonatomic, retain) NSString *useragentACL;
@end
... ...
//
// ASICloudFilesContainer.m
//
// Created by Michael Mayo on 1/7/10.
//
#import "ASICloudFilesContainer.h"
@implementation ASICloudFilesContainer
// regular container attributes
@synthesize name, count, bytes;
// CDN container attributes
@synthesize cdnEnabled, ttl, cdnURL, logRetention, referrerACL, useragentACL;
+ (id)container {
ASICloudFilesContainer *container = [[[self alloc] init] autorelease];
return container;
}
-(void) dealloc {
[name release];
[super dealloc];
}
@end
... ...
//
// ASICloudFilesContainerRequest.h
//
// Created by Michael Mayo on 1/6/10.
//
#import "ASICloudFilesRequest.h"
@class ASICloudFilesContainer, ASICloudFilesContainerXMLParserDelegate;
@interface ASICloudFilesContainerRequest : ASICloudFilesRequest {
// Internally used while parsing the response
NSString *currentContent;
NSString *currentElement;
ASICloudFilesContainer *currentObject;
ASICloudFilesContainerXMLParserDelegate *xmlParserDelegate;
}
@property (nonatomic, retain) NSString *currentElement;
@property (nonatomic, retain) NSString *currentContent;
@property (nonatomic, retain) ASICloudFilesContainer *currentObject;
@property (nonatomic, retain) ASICloudFilesContainerXMLParserDelegate *xmlParserDelegate;
// HEAD /<api version>/<account>
// HEAD operations against an account are performed to retrieve the number of Containers and the total bytes stored in Cloud Files for the account. This information is returned in two custom headers, X-Account-Container-Count and X-Account-Bytes-Used.
+ (id)accountInfoRequest;
- (NSUInteger)containerCount;
- (NSUInteger)bytesUsed;
// GET /<api version>/<account>/<container>
// Create a request to list all containers
+ (id)listRequest;
+ (id)listRequestWithLimit:(NSUInteger)limit marker:(NSString *)marker;
- (NSArray *)containers;
// PUT /<api version>/<account>/<container>
+ (id)createContainerRequest:(NSString *)containerName;
// DELETE /<api version>/<account>/<container>
+ (id)deleteContainerRequest:(NSString *)containerName;
@end
... ...
//
// ASICloudFilesContainerRequest.m
//
// Created by Michael Mayo on 1/6/10.
//
#import "ASICloudFilesContainerRequest.h"
#import "ASICloudFilesContainer.h"
#import "ASICloudFilesContainerXMLParserDelegate.h"
@implementation ASICloudFilesContainerRequest
@synthesize currentElement, currentContent, currentObject;
@synthesize xmlParserDelegate;
#pragma mark -
#pragma mark Constructors
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName queryString:(NSString *)queryString {
NSString *urlString;
if (containerName == nil) {
urlString = [NSString stringWithFormat:@"%@%@", [ASICloudFilesRequest storageURL], queryString];
} else {
urlString = [NSString stringWithFormat:@"%@/%@%@", [ASICloudFilesRequest storageURL], containerName, queryString];
}
ASICloudFilesContainerRequest *request = [[ASICloudFilesContainerRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setRequestMethod:method];
[request addRequestHeader:@"X-Auth-Token" value:[ASICloudFilesRequest authToken]];
return request;
}
+ (id)storageRequestWithMethod:(NSString *)method queryString:(NSString *)queryString {
return [ASICloudFilesContainerRequest storageRequestWithMethod:method containerName:nil queryString:queryString];
}
+ (id)storageRequestWithMethod:(NSString *)method {
return [ASICloudFilesContainerRequest storageRequestWithMethod:method queryString:@""];
}
#pragma mark -
#pragma mark HEAD - Retrieve Container Count and Total Bytes Used
// HEAD /<api version>/<account>
// HEAD operations against an account are performed to retrieve the number of Containers and the total bytes stored in Cloud Files for the account. This information is returned in two custom headers, X-Account-Container-Count and X-Account-Bytes-Used.
+ (id)accountInfoRequest {
ASICloudFilesContainerRequest *request = [ASICloudFilesContainerRequest storageRequestWithMethod:@"HEAD"];
return request;
}
- (NSUInteger)containerCount {
return [[[self responseHeaders] objectForKey:@"X-Account-Container-Count"] intValue];
}
- (NSUInteger)bytesUsed {
return [[[self responseHeaders] objectForKey:@"X-Account-Bytes-Used"] intValue];
}
#pragma mark -
#pragma mark GET - Retrieve Container List
+ (id)listRequestWithLimit:(NSUInteger)limit marker:(NSString *)marker {
NSString *queryString = @"?format=xml";
if (limit > 0) {
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&limit=%i", limit]];
}
if (marker != nil) {
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", marker]];
}
ASICloudFilesContainerRequest *request = [ASICloudFilesContainerRequest storageRequestWithMethod:@"GET" queryString:queryString];
return request;
}
// GET /<api version>/<account>/<container>
// Create a request to list all containers
+ (id)listRequest {
ASICloudFilesContainerRequest *request = [ASICloudFilesContainerRequest storageRequestWithMethod:@"GET"
queryString:@"?format=xml"];
return request;
}
- (NSArray *)containers {
if (xmlParserDelegate.containerObjects) {
return xmlParserDelegate.containerObjects;
}
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:[self responseData]] autorelease];
if (xmlParserDelegate == nil) {
xmlParserDelegate = [[ASICloudFilesContainerXMLParserDelegate alloc] init];
}
[parser setDelegate:xmlParserDelegate];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
return xmlParserDelegate.containerObjects;
}
#pragma mark -
#pragma mark PUT - Create Container
// PUT /<api version>/<account>/<container>
+ (id)createContainerRequest:(NSString *)containerName {
ASICloudFilesContainerRequest *request = [ASICloudFilesContainerRequest storageRequestWithMethod:@"PUT" containerName:containerName queryString:@""];
return request;
}
#pragma mark -
#pragma mark DELETE - Delete Container
// DELETE /<api version>/<account>/<container>
+ (id)deleteContainerRequest:(NSString *)containerName {
ASICloudFilesContainerRequest *request = [ASICloudFilesContainerRequest storageRequestWithMethod:@"DELETE" containerName:containerName queryString:@""];
return request;
}
#pragma mark -
#pragma mark Memory Management
- (void)dealloc {
[currentElement release];
[currentContent release];
[currentObject release];
[xmlParserDelegate release];
[super dealloc];
}
@end
... ...
//
// ASICloudFilesContainerXMLParserDelegate.h
//
// Created by Michael Mayo on 1/10/10.
//
#import "ASICloudFilesRequest.h"
@class ASICloudFilesContainer;
@interface ASICloudFilesContainerXMLParserDelegate : NSObject {
NSMutableArray *containerObjects;
// Internally used while parsing the response
NSString *currentContent;
NSString *currentElement;
ASICloudFilesContainer *currentObject;
}
@property (nonatomic, retain) NSMutableArray *containerObjects;
@property (nonatomic, retain) NSString *currentElement;
@property (nonatomic, retain) NSString *currentContent;
@property (nonatomic, retain) ASICloudFilesContainer *currentObject;
@end
... ...
//
// ASICloudFilesContainerXMLParserDelegate.m
//
// Created by Michael Mayo on 1/10/10.
//
#import "ASICloudFilesContainerXMLParserDelegate.h"
#import "ASICloudFilesContainer.h"
@implementation ASICloudFilesContainerXMLParserDelegate
@synthesize containerObjects, currentElement, currentContent, currentObject;
#pragma mark -
#pragma mark XML Parser Delegate
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
[self setCurrentElement:elementName];
if ([elementName isEqualToString:@"container"]) {
[self setCurrentObject:[ASICloudFilesContainer container]];
}
[self setCurrentContent:@""];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"name"]) {
[self currentObject].name = [self currentContent];
} else if ([elementName isEqualToString:@"count"]) {
[self currentObject].count = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"bytes"]) {
[self currentObject].bytes = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"cdn_enabled"]) {
[self currentObject].cdnEnabled = [[self currentObject] isEqual:@"True"];
} else if ([elementName isEqualToString:@"ttl"]) {
[self currentObject].ttl = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"cdn_url"]) {
[self currentObject].cdnURL = [self currentContent];
} else if ([elementName isEqualToString:@"log_retention"]) {
[self currentObject].logRetention = [[self currentObject] isEqual:@"True"];
} else if ([elementName isEqualToString:@"referrer_acl"]) {
[self currentObject].referrerACL = [self currentContent];
} else if ([elementName isEqualToString:@"useragent_acl"]) {
[self currentObject].useragentACL = [self currentContent];
} else if ([elementName isEqualToString:@"container"]) {
// we're done with this container. time to move on to the next
if (containerObjects == nil) {
containerObjects = [[NSMutableArray alloc] init];
}
[containerObjects addObject:currentObject];
[self setCurrentObject:nil];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[self setCurrentContent:[[self currentContent] stringByAppendingString:string]];
}
#pragma mark -
#pragma mark Memory Management
- (void)dealloc {
[containerObjects release];
[currentElement release];
[currentContent release];
[currentObject release];
[super dealloc];
}
@end
... ...
//
// ASICloudFilesObject.h
//
// Created by Michael Mayo on 1/7/10.
//
#import <Foundation/Foundation.h>
@interface ASICloudFilesObject : NSObject {
NSString *name;
NSString *hash;
NSUInteger bytes;
NSString *contentType;
NSDate *lastModified;
NSData *data;
NSMutableDictionary *metadata;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *hash;
@property (nonatomic) NSUInteger bytes;
@property (nonatomic, retain) NSString *contentType;
@property (nonatomic, retain) NSDate *lastModified;
@property (nonatomic, retain) NSData *data;
@property (nonatomic, retain) NSMutableDictionary *metadata;
+ (id)object;
@end
... ...
//
// ASICloudFilesObject.m
//
// Created by Michael Mayo on 1/7/10.
//
#import "ASICloudFilesObject.h"
@implementation ASICloudFilesObject
@synthesize name, hash, bytes, contentType, lastModified, data, metadata;
+ (id)object {
ASICloudFilesObject *object = [[[self alloc] init] autorelease];
return object;
}
-(void)dealloc {
[name release];
[hash release];
[contentType release];
[lastModified release];
[data release];
[metadata release];
[super dealloc];
}
@end
... ...
//
// ASICloudFilesObjectRequest.h
//
// Created by Michael Mayo on 1/6/10.
//
#import "ASICloudFilesRequest.h"
@class ASICloudFilesObject;
@interface ASICloudFilesObjectRequest : ASICloudFilesRequest {
NSString *accountName;
NSString *containerName;
// Internally used while parsing the response
NSString *currentContent;
NSString *currentElement;
ASICloudFilesObject *currentObject;
NSMutableArray *objects;
}
@property (nonatomic, retain) NSString *accountName;
@property (nonatomic, retain) NSString *containerName;
@property (nonatomic, retain) NSString *currentElement;
@property (nonatomic, retain) NSString *currentContent;
@property (nonatomic, retain) ASICloudFilesObject *currentObject;
// HEAD /<api version>/<account>/<container>
// HEAD operations against an account are performed to retrieve the number of Containers and the total bytes stored in Cloud Files for the account. This information is returned in two custom headers, X-Account-Container-Count and X-Account-Bytes-Used.
+ (id)containerInfoRequest:(NSString *)containerName;
- (NSUInteger)containerObjectCount;
- (NSUInteger)containerBytesUsed;
// HEAD /<api version>/<account>/<container>/<object>
// to get metadata
+ (id)objectInfoRequest:(NSString *)containerName objectPath:(NSString *)objectPath;
- (NSArray *)objects;
+ (id)listRequestWithContainer:(NSString *)containerName;
+ (id)listRequestWithContainer:(NSString *)containerName limit:(NSUInteger)limit marker:(NSString *)marker prefix:(NSString *)prefix path:(NSString *)path;
// Conditional GET headers: If-Match • If-None-Match • If-Modified-Since • If-Unmodified-Since
// HTTP Range header: “Range: bytes=0-5” • “Range: bytes=-5” • “Range: bytes=32-“
+ (id)getObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath;
- (ASICloudFilesObject *)object;
// PUT /<api version>/<account>/<container>/<object>
// PUT operations are used to write, or overwrite, an Object's metadata and content.
// The Object can be created with custom metadata via HTTP headers identified with the “X-Object-Meta-” prefix.
+ (id)putObjectRequestWithContainer:(NSString *)containerName object:(ASICloudFilesObject *)object;
+ (id)putObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath contentType:(NSString *)contentType objectData:(NSData *)objectData metadata:(NSDictionary *)metadata etag:(NSString *)etag;
// POST /<api version>/<account>/<container>/<object>
// POST operations against an Object name are used to set and overwrite arbitrary key/value metadata. You cannot use the POST operation to change any of the Object's other headers such as Content-Type, ETag, etc. It is not used to upload storage Objects (see PUT).
// A POST request will delete all existing metadata added with a previous PUT/POST.
+ (id)postObjectRequestWithContainer:(NSString *)containerName object:(ASICloudFilesObject *)object;
+ (id)postObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath metadata:(NSDictionary *)metadata;
// DELETE /<api version>/<account>/<container>/<object>
+ (id)deleteObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath;
@end
... ...
This diff is collapsed. Click to expand it.
//
// ASICloudFilesRequest.h
// Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
//
// Created by Michael Mayo on 22/12/09.
// mike.mayo@rackspace.com or mike@overhrd.com
// twitter.com/greenisus
// Copyright 2009 All-Seeing Interactive. All rights reserved.
//
// A class for accessing data stored on the Rackspace Cloud Files Service
// http://www.rackspacecloud.com/cloud_hosting_products/files
//
// Cloud Files Developer Guide:
// http://docs.rackspacecloud.com/servers/api/cs-devguide-latest.pdf
#import <Foundation/Foundation.h>
#import "ASIHTTPRequest.h"
@interface ASICloudFilesRequest : ASIHTTPRequest {
}
+ (NSString *)storageURL;
+ (NSString *)cdnManagementURL;
+ (NSString *)authToken;
#pragma mark Rackspace Cloud Authentication
+ (id)authenticationRequest;
+ (void)authenticate;
+ (NSString *)username;
+ (void)setUsername:(NSString *)username;
+ (NSString *)apiKey;
+ (void)setApiKey:(NSString *)apiKey;
// helper to parse dates in the format returned by Cloud Files
-(NSDate *)dateFromString:(NSString *)dateString;
@end
... ...
//
// ASICloudFilesRequest.m
// Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
//
// Created by Michael Mayo on 22/12/09.
// Copyright 2009 All-Seeing Interactive. All rights reserved.
//
// A class for accessing data stored on Rackspace's Cloud Files Service
// http://www.rackspacecloud.com/cloud_hosting_products/files
//
// Cloud Files Developer Guide:
// http://docs.rackspacecloud.com/servers/api/cs-devguide-latest.pdf
#import "ASICloudFilesRequest.h"
static NSString *username = nil;
static NSString *apiKey = nil;
static NSString *authToken = nil;
static NSString *storageURL = nil;
static NSString *cdnManagementURL = nil;
static NSString *rackspaceCloudAuthURL = @"https://auth.api.rackspacecloud.com/v1.0";
@implementation ASICloudFilesRequest
#pragma mark -
#pragma mark Attributes and Service URLs
+ (NSString *)authToken {
return authToken;
}
+ (NSString *)storageURL {
return storageURL;
}
+ (NSString *)cdnManagementURL {
return cdnManagementURL;
}
#pragma mark -
#pragma mark Authentication
+ (id)authenticationRequest {
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:rackspaceCloudAuthURL]];
[request addRequestHeader:@"X-Auth-User" value:username];
[request addRequestHeader:@"X-Auth-Key" value:apiKey];
return request;
}
+ (void)authenticate {
ASIHTTPRequest *request = [ASICloudFilesRequest authenticationRequest];
[request start];
if (![request error]) {
NSDictionary *responseHeaders = [request responseHeaders];
authToken = [responseHeaders objectForKey:@"X-Auth-Token"];
storageURL = [responseHeaders objectForKey:@"X-Storage-Url"];
cdnManagementURL = [responseHeaders objectForKey:@"X-Cdn-Management-Url"];
}
}
+ (NSString *)username {
return username;
}
+ (void)setUsername:(NSString *)newUsername {
[username release];
username = [newUsername retain];
}
+ (NSString *)apiKey {
return apiKey;
}
+ (void)setApiKey:(NSString *)newApiKey {
[apiKey release];
apiKey = [newApiKey retain];
}
#pragma mark -
#pragma mark Date Parser
-(NSDate *)dateFromString:(NSString *)dateString {
NSDateFormatter *format = [[NSDateFormatter alloc] init];
// example: 2009-11-04T19:46:20.192723
[format setDateFormat:@"yyyy-MM-dd'T'H:mm:ss"];
NSDate *date = [format dateFromString:dateString];
[format release];
return date;
}
@end
... ...
//
// ASICloudFilesRequestTests.h
//
// Created by Michael Mayo on 1/6/10.
//
#import "ASITestCase.h"
@class ASINetworkQueue;
@interface ASICloudFilesRequestTests : ASITestCase {
ASINetworkQueue *networkQueue;
float progress;
}
@property (retain,nonatomic) ASINetworkQueue *networkQueue;
@end
... ...
This diff is collapsed. Click to expand it.
... ... @@ -23,9 +23,7 @@
[super dealloc];
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Add the tab bar controller's current view as a subview of the window
[window addSubview:[tabBarController view]];
[[tabBarController view] setFrame:CGRectMake(0,47,320,433)];
... ...