required libs:
* ZipArchive - Obj-C impl of zip
* asi-http-request : http request help to assist with asynchoronous downloading of files
* minizip : support for ZipArchive
*
Added default splash screen for iOS app. (using the Wagic background to keep it neutral to module)
TODO: refine handling for iPad splash screen
* add selection screen and input screen for location of downloadable content. (ie core files, image files, etc )
* add support to opt out of backing up to iCloud for core files. Right now iOS will automatically backup all files under Documents folder to iCloud. Consider only allowing player data to be backed up to iCloud. All graphics and other assets are considered volatile.
130 lines
3.7 KiB
Objective-C
130 lines
3.7 KiB
Objective-C
//
|
|
// 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";
|
|
|
|
static NSRecursiveLock *accessDetailsLock = nil;
|
|
|
|
@implementation ASICloudFilesRequest
|
|
|
|
+ (void)initialize
|
|
{
|
|
if (self == [ASICloudFilesRequest class]) {
|
|
accessDetailsLock = [[NSRecursiveLock alloc] init];
|
|
}
|
|
}
|
|
|
|
#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
|
|
{
|
|
[accessDetailsLock lock];
|
|
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:rackspaceCloudAuthURL]] autorelease];
|
|
[request addRequestHeader:@"X-Auth-User" value:username];
|
|
[request addRequestHeader:@"X-Auth-Key" value:apiKey];
|
|
[accessDetailsLock unlock];
|
|
return request;
|
|
}
|
|
|
|
+ (NSError *)authenticate
|
|
{
|
|
[accessDetailsLock lock];
|
|
ASIHTTPRequest *request = [ASICloudFilesRequest authenticationRequest];
|
|
[request startSynchronous];
|
|
|
|
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"];
|
|
|
|
// there is a bug in the Cloud Files API for some older accounts that causes
|
|
// the CDN URL to come back in a slightly different header
|
|
if (!cdnManagementURL) {
|
|
cdnManagementURL = [responseHeaders objectForKey:@"X-Cdn-Management-Url"];
|
|
}
|
|
}
|
|
[accessDetailsLock unlock];
|
|
return [request error];
|
|
}
|
|
|
|
+ (NSString *)username
|
|
{
|
|
return username;
|
|
}
|
|
|
|
+ (void)setUsername:(NSString *)newUsername
|
|
{
|
|
[accessDetailsLock lock];
|
|
[username release];
|
|
username = [newUsername retain];
|
|
[accessDetailsLock unlock];
|
|
}
|
|
|
|
+ (NSString *)apiKey {
|
|
return apiKey;
|
|
}
|
|
|
|
+ (void)setApiKey:(NSString *)newApiKey
|
|
{
|
|
[accessDetailsLock lock];
|
|
[apiKey release];
|
|
apiKey = [newApiKey retain];
|
|
[accessDetailsLock unlock];
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark Date Parser
|
|
|
|
-(NSDate *)dateFromString:(NSString *)dateString
|
|
{
|
|
// We store our date formatter in the calling thread's dictionary
|
|
// NSDateFormatter is not thread-safe, this approach ensures each formatter is only used on a single thread
|
|
// This formatter can be reused many times in parsing a single response, so it would be expensive to keep creating new date formatters
|
|
NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
|
|
NSDateFormatter *dateFormatter = [threadDict objectForKey:@"ASICloudFilesResponseDateFormatter"];
|
|
if (dateFormatter == nil) {
|
|
dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
|
|
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
|
|
// example: 2009-11-04T19:46:20.192723
|
|
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'H:mm:ss.SSSSSS"];
|
|
[threadDict setObject:dateFormatter forKey:@"ASICloudFilesResponseDateFormatter"];
|
|
}
|
|
return [dateFormatter dateFromString:dateString];
|
|
}
|
|
|
|
@end
|