Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

initial commit of the iOS SDK

  • Loading branch information...
commit baf9a0b64289ba72dbd470cce2b4dbd79757705d 0 parents
@tyamell tyamell authored
Showing with 7,515 additions and 0 deletions.
  1. +18 −0 .gitignore
  2. +17 −0 StackMob/Constants.m
  3. +18 −0 StackMob/StackMobAdditions.h
  4. +36 −0 StackMob/StackMobAdditions.m
  5. +263 −0 StackMob/StackMobClientData.m
  6. +330 −0 StackMob/StackMobRequest.m
  7. +125 −0 StackMob/StackMobSession.m
  8. +679 −0 StackMobiOS.xcodeproj/project.pbxproj
  9. +1,369 −0 StackMobiOS.xcodeproj/ty.mode1v3
  10. +197 −0 StackMobiOS.xcodeproj/ty.pbxuser
  11. +33 −0 StackMobiOS_Prefix.pch
  12. +20 −0 Tests-Info.plist
  13. +230 −0 external/OAuthConsumer/Crypto/Base64Transcoder.c
  14. +36 −0 external/OAuthConsumer/Crypto/Base64Transcoder.h
  15. +35 −0 external/OAuthConsumer/NSMutableURLRequest+Parameters.h
  16. +92 −0 external/OAuthConsumer/NSMutableURLRequest+Parameters.m
  17. +34 −0 external/OAuthConsumer/NSString+URLEncoding.h
  18. +52 −0 external/OAuthConsumer/NSString+URLEncoding.m
  19. +34 −0 external/OAuthConsumer/NSURL+Base.h
  20. +38 −0 external/OAuthConsumer/NSURL+Base.m
  21. +45 −0 external/OAuthConsumer/OAAsynchronousDataFetcher.h
  22. +134 −0 external/OAuthConsumer/OAAsynchronousDataFetcher.m
  23. +40 −0 external/OAuthConsumer/OAConsumer.h
  24. +51 −0 external/OAuthConsumer/OAConsumer.m
  25. +45 −0 external/OAuthConsumer/OADataFetcher.h
  26. +65 −0 external/OAuthConsumer/OADataFetcher.m
  27. +32 −0 external/OAuthConsumer/OAHMAC_SHA1SignatureProvider.h
  28. +58 −0 external/OAuthConsumer/OAHMAC_SHA1SignatureProvider.m
  29. +68 −0 external/OAuthConsumer/OAMutableURLRequest.h
  30. +229 −0 external/OAuthConsumer/OAMutableURLRequest.m
  31. +31 −0 external/OAuthConsumer/OAPlaintextSignatureProvider.h
  32. +43 −0 external/OAuthConsumer/OAPlaintextSignatureProvider.m
  33. +45 −0 external/OAuthConsumer/OARequestParameter.h
  34. +70 −0 external/OAuthConsumer/OARequestParameter.m
  35. +43 −0 external/OAuthConsumer/OAServiceTicket.h
  36. +51 −0 external/OAuthConsumer/OAServiceTicket.m
  37. +34 −0 external/OAuthConsumer/OASignatureProviding.h
  38. +41 −0 external/OAuthConsumer/OAToken.h
  39. +105 −0 external/OAuthConsumer/OAToken.m
  40. +39 −0 external/OAuthConsumer/OAuthConsumer.h
  41. +1 −0  external/libraries/YAJLIOS.framework/Headers
  42. +1 −0  external/libraries/YAJLIOS.framework/Resources
  43. +50 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/NSBundle+YAJL.h
  44. +118 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/NSObject+YAJL.h
  45. +34 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/YAJL.h
  46. +98 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/YAJLDocument.h
  47. +104 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/YAJLGen.h
  48. +34 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/YAJLIOS.h
  49. +129 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/YAJLParser.h
  50. +85 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/yajl_common.h
  51. +159 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/yajl_gen.h
  52. +193 −0 external/libraries/YAJLIOS.framework/Versions/A/Headers/yajl_parse.h
  53. +18 −0 external/libraries/YAJLIOS.framework/Versions/A/Resources/Info.plist
  54. BIN  external/libraries/YAJLIOS.framework/Versions/A/YAJLIOS
  55. +1 −0  external/libraries/YAJLIOS.framework/Versions/Current
  56. +1 −0  external/libraries/YAJLIOS.framework/YAJLIOS
  57. +193 −0 external/reachability/Reachability.h
  58. +814 −0 external/reachability/Reachability.m
  59. +15 −0 include/StackMob/Constants.h
  60. +75 −0 include/StackMob/StackMobClientData.h
  61. +79 −0 include/StackMob/StackMobRequest.h
  62. +139 −0 include/StackMob/StackMobSession.h
  63. +22 −0 resources/Framework.plist
  64. +70 −0 scripts/build.sh
  65. +30 −0 tests/APIRequestTests.h
  66. +127 −0 tests/APIRequestTests.m
18 .gitignore
@@ -0,0 +1,18 @@
+# use glob syntax.
+syntax: glob
+*.ser
+*.class
+*~
+*.bak
+*.off
+*.old
+.DS_Store
+
+
+# eclipse conf file
+.settings
+.classpath
+.project
+.manager
+
+build/**/*
17 StackMob/Constants.m
@@ -0,0 +1,17 @@
+// Copyright 2011 StackMob, Inc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "Constants.h"
+
+NSString * const kAPIVersion = @"1";
18 StackMob/StackMobAdditions.h
@@ -0,0 +1,18 @@
+// Copyright 2011 StackMob, Inc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <Foundation/Foundation.h>
+@interface NSDictionary (StackMobAdditions)
+ - (NSString *)queryString;
+@end
36 StackMob/StackMobAdditions.m
@@ -0,0 +1,36 @@
+// Copyright 2011 StackMob, Inc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "StackMobAdditions.h"
+
+@implementation NSDictionary (StackMobAdditions)
+
+- (NSString*)queryString
+{
+ NSMutableArray* encodedPieces = [NSMutableArray array];
+
+ for(NSString* argumentKey in self)
+ {
+ NSString* argumentValue = [self objectForKey:argumentKey];
+ if(!argumentValue)
+ continue;
+
+ argumentValue = [(NSString*)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)argumentValue, NULL, CFSTR("?=&+"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)) autorelease];
+ [encodedPieces addObject:[NSString stringWithFormat:@"%@=%@", argumentKey, argumentValue]];
+ }
+
+ return [encodedPieces componentsJoinedByString:@"&"];
+}
+
+@end
263 StackMob/StackMobClientData.m
@@ -0,0 +1,263 @@
+// Copyright 2011 StackMob, Inc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "StackMobClientData.h"
+#import <CoreLocation/CoreLocation.h>
+#import <UIKit/UIKit.h>
+#import "Reachability.h"
+#include <sys/sysctl.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+
+NSString *bundleVersion = @"";
+NSString *identifier = @"";
+NSString *model = @"";
+NSString *systemVersion = @"";
+NSString *device_name = @"";
+NSString *countryCode = @"";
+NSString *language = @"";
+NSString *jailBroken = @"NO";
+
+static StackMobClientData * _sharedInstance=nil;
+
+@interface StackMobClientData ()
+
+- (void)startLocationUpdates;
+- (void)startReachabilityUpdates;
+- (void)generateClientDataString;
+
+@end
+
+@implementation StackMobClientData
+
+- (id)init {
+ if(self = [super init]) {
+ // Device info.
+ UIDevice *device = [UIDevice currentDevice];
+ identifier = [device uniqueIdentifier];
+ model = [device model];
+ systemVersion = [device systemVersion];
+
+
+ // Locale info.
+ NSLocale *locale = [NSLocale currentLocale];
+ countryCode = [locale objectForKey:NSLocaleCountryCode];
+ language = [[NSLocale currentLocale] objectForKey: NSLocaleLanguageCode];
+
+ // App info.
+ bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
+
+ jailBroken = [self isJailBrokenStr];
+
+ [self startLocationUpdates];
+ [self startReachabilityUpdates];
+ [self generateClientDataString];
+ }
+
+ return self;
+}
+
++ (StackMobClientData*) sharedClientData;
+{
+ if(!_sharedInstance)
+ {
+ _sharedInstance = [[StackMobClientData alloc] init];
+ }
+ return _sharedInstance;
+}
+
+
+- (NSString *) platform{
+ size_t size;
+ sysctlbyname("hw.machine", NULL, &size, NULL, 0);
+ char *machine = malloc(size);
+ sysctlbyname("hw.machine", machine, &size, NULL, 0);
+ NSString *platform = [NSString stringWithCString:machine encoding: NSUTF8StringEncoding];
+ free(machine);
+ return platform;
+}
+
+- (NSString *) platformString{
+ NSString *platform = [self platform];
+
+ if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING;
+ if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING;
+ if ([platform hasPrefix:@"iPhone2"]) return IPHONE_3GS_NAMESTRING;
+ if ([platform hasPrefix:@"iPhone3"]) return IPHONE_4_NAMESTRING;
+ if ([platform hasPrefix:@"iPhone4"]) return IPHONE_5_NAMESTRING;
+
+ if ([platform isEqualToString:@"iPod1,1"]) return IPOD_1G_NAMESTRING;
+ if ([platform isEqualToString:@"iPod2,1"]) return IPOD_2G_NAMESTRING;
+ if ([platform isEqualToString:@"iPod3,1"]) return IPOD_3G_NAMESTRING;
+ if ([platform isEqualToString:@"iPod4,1"]) return IPOD_4G_NAMESTRING;
+
+ if ([platform isEqualToString:@"iPad1,1"]) return IPAD_1G_NAMESTRING;
+ if ([platform isEqualToString:@"iPad2,1"]) return IPAD_2G_NAMESTRING;
+
+ if ([platform isEqualToString:@"AppleTV2,1"]) return APPLETV_2G_NAMESTRING;
+
+ if ([platform hasPrefix:@"iPhone"]) return IPHONE_UNKNOWN_NAMESTRING;
+ if ([platform hasPrefix:@"iPod"]) return IPOD_UNKNOWN_NAMESTRING;
+ if ([platform hasPrefix:@"iPad"]) return IPAD_UNKNOWN_NAMESTRING;
+
+ if ([platform hasSuffix:@"86"] || [platform isEqual:@"x86_64"])
+ {
+ if ([[UIScreen mainScreen] bounds].size.width < 768)
+ return IPHONE_SIMULATOR_IPHONE_NAMESTRING;
+ else
+ return IPHONE_SIMULATOR_IPAD_NAMESTRING;
+ }
+ if ([platform isEqualToString:@"iFPGA"]) return IFPGA_NAMESTRING;
+ return IPOD_FAMILY_UNKNOWN_DEVICE;
+}
+
+- (void)dealloc {
+
+ [_locationManager release];
+ [_sharedInstance release];
+ [super dealloc];
+
+}
+
+#pragma mark - Properties
+
+@synthesize clientDataString = _clientDataString;
+
+- (float)longitude {
+ return _location.longitude;
+}
+
+- (float)latitude {
+ return _location.latitude;
+}
+
+#pragma mark -
+
+- (void)generateClientDataString {
+ device_name = [self platformString];
+ NSMutableDictionary* clientDataObject = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
+ identifier, DEVICE_TAG_NAME,
+ model, DEVICE_TYPE_NAME,
+ device_name, DEVICE_NAME,
+ systemVersion, DEVICE_OS_VERSION_NAME,
+ bundleVersion, APP_VERSION_NAME,
+ LIBRARY_VERSION_NUMBER,LIBRARY_VERSION_NAME,
+ countryCode, DEVICE_COUNTRY_CODE,
+ language, DEVICE_LANGUAGE,
+ jailBroken, DEVICE_IS_JAILBORKEN,
+ nil];
+
+
+ if(_locationUpdatesStarted) {
+ [clientDataObject setValue:[NSNumber numberWithFloat:_location.latitude] forKey:LATITUDE];
+ [clientDataObject setValue:[NSNumber numberWithFloat:_location.longitude] forKey:LONGITUDE];
+ }
+
+ NetworkStatus newStatus = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
+ switch (newStatus) {
+ case ReachableViaWWAN:
+ [clientDataObject setValue:@"m" forKey:NETWORK_AVAILABILITY]; // reachable via mobile network
+ break;
+ default:
+ [clientDataObject setValue:@"w" forKey:NETWORK_AVAILABILITY]; // reachable via wifi
+ break;
+ }
+
+
+
+ self.clientDataString = [clientDataObject yajl_JSONString];
+}
+
+#pragma mark - Location
+
+- (void)startLocationUpdates {
+ _locationUpdatesStarted = NO;
+ _location.longitude = 0.0;
+ _location.latitude = 0.0;
+
+ _locationManager = [[CLLocationManager alloc] init];
+
+ _locationManager.delegate = self;
+ _locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
+ _locationManager.distanceFilter = 500;
+ [_locationManager startUpdatingLocation];
+}
+
+- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
+ _locationUpdatesStarted = YES;
+ _location = newLocation.coordinate;
+ [self generateClientDataString];
+}
+
+#pragma mark - Reachability
+
+- (void)startReachabilityUpdates {
+ [Reachability reachabilityWithHostName:@"www.stackmob.com"];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:@"kReachabilityChangedNotification" object:nil];
+}
+
+- (void)reachabilityChanged:(NSNotification *)note {
+ [self generateClientDataString];
+}
+
+static const char* jailbreak_apps[] =
+{
+ "/Applications/Cydia.app",
+ "/Applications/limera1n.app",
+ "/Applications/greenpois0n.app",
+ "/Applications/blackra1n.app",
+ "/Applications/blacksn0w.app",
+ "/Applications/redsn0w.app",
+ NULL,
+};
+
+- (BOOL) isJailBroken
+{
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSDictionary *info = [bundle infoDictionary];
+
+ // This key-value pair should not be in the pinfo file. If it is, we can be reasonably sure that the app has been compromised.
+ if ([info objectForKey: @"SignerIdentity"] != nil)
+ {
+ return YES;
+ }
+
+ // Now check for known jailbreak apps. If we encounter one, the device is jailbroken.
+ for (int i = 0; jailbreak_apps[i] != NULL; ++i)
+ {
+ if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_apps[i]]])
+ {
+ //NSLog(@"isjailbroken: %s", jailbreak_apps[i]);
+ return YES;
+ }
+ }
+
+ // TODO: Add more checks? This is an arms-race we're bound to lose.
+
+ return NO;
+}
+
+
+- (NSString*) isJailBrokenStr
+{
+ if ([self isJailBroken])
+ {
+ return @"42";
+ }
+
+ return @"0";
+}
+
+
+@end
330 StackMob/StackMobRequest.m
@@ -0,0 +1,330 @@
+// Copyright 2011 StackMob, Inc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "StackMobRequest.h"
+#import "Reachability.h"
+#import "OAConsumer.h"
+#import "OAMutableURLRequest.h"
+#import "StackMobClientData.h"
+#import "StackMobSession.h"
+
+@implementation StackMobRequest;
+
+@synthesize connection = mConnection;
+@synthesize delegate = mDelegate;
+@synthesize method = mMethod;
+@synthesize result = mResult;
+@synthesize httpMethod = mHttpMethod;
+@synthesize httpResponse = mHttpResponse;
+@synthesize finished = _requestFinished;
+
+
++ (StackMobRequest*)request
+{
+ return [[[StackMobRequest alloc] init] autorelease];
+}
+
++ (StackMobRequest*)requestForMethod:(NSString*)method
+{
+ return [StackMobRequest requestForMethod:method withHttpVerb:GET];
+}
+
++ (StackMobRequest*)requestForMethod:(NSString*)method withHttpVerb:(SMHttpVerb) httpVerb
+{
+ return [StackMobRequest requestForMethod:method withArguments:nil withHttpVerb:httpVerb];
+
+}
+
++ (StackMobRequest*)requestForMethod:(NSString*)method withArguments:(NSDictionary*)arguments withHttpVerb:(SMHttpVerb) httpVerb
+{
+ StackMobRequest* request = [StackMobRequest request];
+ request.method = method;
+ request.httpMethod = [self stringFromHttpVerb:httpVerb];
+ if (arguments != nil) {
+ [request setArguments:arguments];
+ }
+ return request;
+}
+
++ (NSString*)stringFromHttpVerb:(SMHttpVerb)httpVerb {
+ switch (httpVerb) {
+ case POST:
+ return @"POST";
+ case PUT:
+ return @"PUT";
+ case DELETE:
+ return @"DELETE";
+ default:
+ return @"GET";
+ }
+}
+
+- (NSURL*)getURL
+{
+ if (self.method == nil)
+ return nil;
+ NSMutableString *stringURL = [session urlForMethod:self.method];
+ if ([[self httpMethod] isEqualToString: @"GET"] &&
+ [mArguments count] > 0) {
+ [stringURL appendString: @"?"];
+ [stringURL appendString: [mArguments queryString]];
+ }
+ StackMobLog(@"%@", stringURL);
+ return [NSURL URLWithString: stringURL];
+}
+
+- (NSInteger)getStatusCode
+{
+ return [mHttpResponse statusCode];
+}
+
+
+- (id)init
+{
+ self = [super init];
+ if (self == nil)
+ return nil;
+ self.delegate = nil;
+ self.method = nil;
+ self.result = nil;
+ mArguments = [[NSMutableDictionary alloc] init];
+ mConnectionData = [[NSMutableData alloc] init];
+ mResult = nil;
+ session = [StackMobSession session];
+ return self;
+}
+
+- (void)dealloc
+{
+ if (kLogVersbose == YES)
+ StackMobLog(@"StackMobRequest: dealloc");
+ [self cancel];
+ [mConnectionData release];
+ [mConnection release];
+ //[mDelegate release];
+ [mMethod release];
+ [mResult release];
+ [mHttpMethod release];
+ //[mHttpResponse release];
+ [super dealloc];
+ if (kLogVersbose == YES)
+ StackMobLog(@"StackMobRequest: dealloc finished");
+}
+
+#pragma mark -
+
+- (void)setArguments:(NSDictionary*)arguments
+{
+ [mArguments setDictionary:arguments];
+}
+
+- (void)setValue:(NSString*)value forArgument:(NSString*)argument
+{
+ [mArguments setValue:value forKey:argument];
+}
+
+- (void)setInteger:(NSUInteger)value forArgument:(NSString*)argument
+{
+ [mArguments setValue:[NSString stringWithFormat:@"%u", value] forKey:argument];
+}
+
+- (void)setBool:(BOOL)value forArgument:(NSString*)argument
+{
+ [mArguments setValue:(value ? @"true" : @"false") forKey:argument];
+}
+
+
+- (void)sendRequest
+{
+ _requestFinished = NO;
+
+ if (kLogVersbose == YES) {
+ StackMobLog(@"Sending Request: %@", self.method);
+ StackMobLog(@"Request url: %@", self.url);
+ StackMobLog(@"Request HTTP Method: %@", self.httpMethod);
+ }
+
+ OAConsumer *consumer = [[OAConsumer alloc] initWithKey:session.apiKey
+ secret:session.apiSecret];
+
+ //TODO: This should be its own call?
+// StackMobClientData *data = [StackMobClientData sharedClientData];
+// [self setValue:[data clientDataString] forArgument:@"cd"];
+
+ OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:self.url
+ consumer:consumer
+ token:nil
+ realm:nil
+ signatureProvider:nil]; // use the default method, HMAC-SHA1
+ [request setHTTPMethod:[self httpMethod]];
+
+ [request addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
+ [request addValue:@"deflate" forHTTPHeaderField:@"Accept-Encoding"];
+ [request prepare];
+ if (![[self httpMethod] isEqualToString: @"GET"]) {
+ [request setHTTPBody:[[mArguments yajl_JSONString] dataUsingEncoding:NSUTF8StringEncoding]];
+ NSString *contentType = [NSString stringWithFormat:@"application/json"];
+ [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
+ }
+
+ if (kLogVersbose) {
+ StackMobLog(@"StackMobRequest: Final URL was: %@", [request URL]);
+ }
+ [mConnectionData setLength:0];
+ self.result = nil;
+ self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] retain];
+}
+
+- (void)cancel
+{
+ [self.connection cancel];
+ self.connection = nil;
+}
+
+- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response {
+ mHttpResponse = [(NSHTTPURLResponse*)response copy];
+}
+
+- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
+{
+ if (data == nil) {
+ StackMobLog(@"StackMobRequest: Recieved data but it was nil");
+ return;
+ }
+
+ [mConnectionData appendData:data];
+
+ if (kLogVersbose == YES)
+ StackMobLog(@"StackMobRequest: Got data of length %u", [mConnectionData length]);
+}
+
+- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
+{
+ _requestFinished = YES;
+ // inform the user
+ NSLog(@"Connection failed! Error - %@ %@",
+ [error localizedDescription],
+ [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
+ self.result = [NSDictionary dictionaryWithObjectsAndKeys:[error localizedDescription], @"statusDetails", nil];
+ // If a delegate has been set, attempt to tell
+ // it all about this request's status.
+ if (self.delegate != nil)
+ {
+ // If a selector has been set for this request,
+ // attempt to notify the delegate using it.
+ if ([self.delegate respondsToSelector:@selector(requestCompleted:)] == YES)
+ [[self delegate] requestCompleted:self];
+ }
+}
+
+
+- (void)connectionDidFinishLoading:(NSURLConnection*)connection
+{
+ _requestFinished = YES;
+ if (kLogRequestSteps == YES)
+ StackMobLog(@"Received Request: %@", self.method);
+ NSString* textResult;
+ NSDictionary* result;
+
+ if ([mConnectionData length] == 0)
+ {
+ result = [NSDictionary dictionary];
+ }
+ else
+ {
+ textResult = [[[NSString alloc] initWithData:mConnectionData encoding:NSUTF8StringEncoding] autorelease];
+ StackMobLog(@"Text result was %@", textResult);
+
+ [mConnectionData setLength:0];
+ result = [textResult yajl_JSON];
+ }
+
+ if (kLogRequestSteps == YES)
+ NSLog(@"Request Processed: %@", self.method);
+
+
+ self.result = result;
+
+ // If a delegate has been set, attempt to tell
+ // it all about this request's status.
+ if (mDelegate != nil)
+ {
+ if ([mDelegate respondsToSelector:@selector(requestCompleted:)] == YES)
+ [mDelegate requestCompleted:self];
+
+ }
+}
+
+- (NSDictionary *)sendSynchronousRequest {
+ if (kLogVersbose == YES) {
+ StackMobLog(@"Sending Request: %@", self.method);
+ StackMobLog(@"Request url: %@", self.url);
+ StackMobLog(@"Request HTTP Method: %@", self.httpMethod);
+ }
+
+ OAConsumer *consumer = [[OAConsumer alloc] initWithKey:session.apiKey
+ secret:session.apiSecret];
+
+ //TODO: This should be its own call?
+ // StackMobClientData *data = [StackMobClientData sharedClientData];
+ // [self setValue:[data clientDataString] forArgument:@"cd"];
+
+ OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:self.url
+ consumer:consumer
+ token:nil // we don't need a token
+ realm:nil // should we set a realm?
+ signatureProvider:nil]; // use the default method, HMAC-SHA1
+
+ [request setHTTPMethod:[self httpMethod]];
+
+ [request addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
+ [request addValue:@"deflate" forHTTPHeaderField:@"Accept-Encoding"];
+ [request prepare];
+ if (![[self httpMethod] isEqualToString: @"GET"]) {
+ [request setHTTPBody:[[mArguments yajl_JSONString] dataUsingEncoding:NSUTF8StringEncoding]];
+ NSString *contentType = [NSString stringWithFormat:@"application/json"];
+ [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
+ }
+
+ if (kLogVersbose) {
+ StackMobLog(@"StackMobRequest: Final URL was: %@", [request URL]);
+ }
+ [mConnectionData setLength:0];
+ NSURLResponse *response;
+ NSError *error;
+
+ NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
+ [mConnectionData appendData:data];
+ NSString* textResult;
+ NSDictionary* result;
+
+ if ([mConnectionData length] == 0)
+ {
+ result = [NSDictionary dictionary];
+ }
+ else
+ {
+ textResult = [[[NSString alloc] initWithData:mConnectionData encoding:NSUTF8StringEncoding] autorelease];
+ StackMobLog(@"Text result was %@", textResult);
+
+ [mConnectionData setLength:0];
+ result = [textResult yajl_JSON];
+ }
+ return result;
+
+}
+
+
+
+@end
125 StackMob/StackMobSession.m
@@ -0,0 +1,125 @@
+// Copyright 2011 StackMob, Inc
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "StackMobSession.h"
+
+@implementation StackMobSession
+
+static const int kMaxBurstRequests = 3;
+static const NSTimeInterval kBurstDuration = 2;
+
+NSString *url = @"";
+NSString *secureURL = @"";
+NSString *regularURL = @"";
+static StackMobSession* sharedSession = nil;
+
+@synthesize apiKey = _apiKey;
+@synthesize apiSecret = _apiSecret;
+@synthesize appName = _appName;
+@synthesize subDomain = _subDomain;
+@synthesize domain = _domain;
+@synthesize sessionKey = _sessionKey;
+@synthesize expirationDate = _expirationDate;
+
++ (StackMobSession*)session {
+ return sharedSession;
+}
+
+
++ (StackMobSession*)sessionForApplication:(NSString*)key secret:(NSString*)secret
+ appName:(NSString*)appName
+ subDomain:(NSString*)subDomain {
+ return [self sessionForApplication:key secret:secret appName:appName
+ subDomain:subDomain domain:@"stackmob.com"];
+}
+
++ (StackMobSession*)sessionForApplication:(NSString*)key secret:(NSString*)secret appName:(NSString*)appName
+ subDomain:(NSString*)subDomain domain:(NSString*)domain {
+ StackMobSession* session = [[[StackMobSession alloc] initWithKey:key
+ secret:secret
+ appName:appName
+ subDomain:subDomain
+ domain:domain] autorelease];
+ return session;
+}
+
+- (NSMutableString*)urlForMethod:(NSString*)method
+{
+ return [NSMutableString stringWithFormat:@"%@%@/",regularURL, method];
+
+}
+
+- (NSMutableString*)secureURLForMethod:(NSString*)method {
+ return [NSMutableString stringWithFormat:@"%@%@/",secureURL, method];
+}
+
+- (StackMobSession*)initWithKey:(NSString*)key secret:(NSString*)secret appName:(NSString*)appName
+ subDomain:(NSString*)subDomain domain:(NSString*)domain
+{
+ if (self = [super init]) {
+ if (!sharedSession) {
+ sharedSession = self;
+ }
+ _apiKey = [key copy];
+ _apiSecret = [secret copy];
+ _appName = [appName copy];
+ _subDomain = [subDomain copy];
+ _domain = [domain copy];
+ _sessionKey = nil;
+ _expirationDate = nil;
+ _requestQueue = [[NSMutableArray alloc] init];
+ _lastRequestTime = nil;
+ _requestBurstCount = 0;
+ _requestTimer = nil;
+ url = [[NSString stringWithFormat:@"%@.%@/api/%@/%@/",_subDomain,_domain,kAPIVersion,_appName] retain];
+ secureURL = [[NSString stringWithFormat:@"https://%@", url] retain];
+ regularURL = [[NSString stringWithFormat:@"http://%@", url] retain];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ if (kLogVersbose == YES)
+ StackMobLog(@"StackMobSession: dealloc");
+ if (sharedSession == self) {
+ sharedSession = nil;
+ }
+
+ [_apiKey release];
+ [_apiSecret release];
+ [_appName release];
+ [_subDomain release];
+ [_domain release];
+ [_sessionKey release];
+ [_expirationDate release];
+ [_lastRequestTime release];
+ [_requestQueue release];
+ [_requestTimer release];
+ [url release];
+ [secureURL release];
+ [regularURL release];
+ [super dealloc];
+ if (kLogVersbose == YES)
+ StackMobLog(@"StackMobSession: dealloc finished");
+}
+
+- (NSString*)apiURL {
+ return regularURL;
+}
+
+- (NSString*)apiSecureURL {
+ return secureURL;
+}
+
+@end
679 StackMobiOS.xcodeproj/project.pbxproj
@@ -0,0 +1,679 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 82CE42BA1288CB5300A73E9C /* Build Framework */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 82CE42C11288CBA200A73E9C /* Build configuration list for PBXAggregateTarget "Build Framework" */;
+ buildPhases = (
+ 82CE42B91288CB5300A73E9C /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Build Framework";
+ productName = "Build Framework";
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 8239D7CA129109F600F90A7B /* StackMobAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8239D7C8129109F600F90A7B /* StackMobAdditions.h */; };
+ 8239D7CB129109F600F90A7B /* StackMobAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8239D7C9129109F600F90A7B /* StackMobAdditions.m */; };
+ 82CE425C1288CA1B00A73E9C /* StackMobClientData.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42591288CA1B00A73E9C /* StackMobClientData.m */; };
+ 82CE425D1288CA1B00A73E9C /* StackMobRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE425A1288CA1B00A73E9C /* StackMobRequest.m */; };
+ 82CE42601288CA2600A73E9C /* StackMobClientData.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE425E1288CA2600A73E9C /* StackMobClientData.h */; };
+ 82CE42611288CA2600A73E9C /* StackMobRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE425F1288CA2600A73E9C /* StackMobRequest.h */; };
+ 82CE427E1288CA4A00A73E9C /* NSMutableURLRequest+Parameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42641288CA4A00A73E9C /* NSMutableURLRequest+Parameters.h */; };
+ 82CE427F1288CA4A00A73E9C /* NSMutableURLRequest+Parameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42651288CA4A00A73E9C /* NSMutableURLRequest+Parameters.m */; };
+ 82CE42801288CA4A00A73E9C /* NSString+URLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42661288CA4A00A73E9C /* NSString+URLEncoding.h */; };
+ 82CE42811288CA4A00A73E9C /* NSString+URLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42671288CA4A00A73E9C /* NSString+URLEncoding.m */; };
+ 82CE42821288CA4A00A73E9C /* NSURL+Base.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42681288CA4A00A73E9C /* NSURL+Base.h */; };
+ 82CE42831288CA4A00A73E9C /* NSURL+Base.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42691288CA4A00A73E9C /* NSURL+Base.m */; };
+ 82CE42841288CA4A00A73E9C /* OAAsynchronousDataFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE426A1288CA4A00A73E9C /* OAAsynchronousDataFetcher.h */; };
+ 82CE42851288CA4A00A73E9C /* OAAsynchronousDataFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE426B1288CA4A00A73E9C /* OAAsynchronousDataFetcher.m */; };
+ 82CE42861288CA4A00A73E9C /* OAConsumer.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE426C1288CA4A00A73E9C /* OAConsumer.h */; };
+ 82CE42871288CA4A00A73E9C /* OAConsumer.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE426D1288CA4A00A73E9C /* OAConsumer.m */; };
+ 82CE42881288CA4A00A73E9C /* OADataFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE426E1288CA4A00A73E9C /* OADataFetcher.h */; };
+ 82CE42891288CA4A00A73E9C /* OADataFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE426F1288CA4A00A73E9C /* OADataFetcher.m */; };
+ 82CE428A1288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42701288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.h */; };
+ 82CE428B1288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42711288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.m */; };
+ 82CE428C1288CA4A00A73E9C /* OAMutableURLRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42721288CA4A00A73E9C /* OAMutableURLRequest.h */; };
+ 82CE428D1288CA4A00A73E9C /* OAMutableURLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42731288CA4A00A73E9C /* OAMutableURLRequest.m */; };
+ 82CE428E1288CA4A00A73E9C /* OAPlaintextSignatureProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42741288CA4A00A73E9C /* OAPlaintextSignatureProvider.h */; };
+ 82CE428F1288CA4A00A73E9C /* OAPlaintextSignatureProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42751288CA4A00A73E9C /* OAPlaintextSignatureProvider.m */; };
+ 82CE42901288CA4A00A73E9C /* OARequestParameter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42761288CA4A00A73E9C /* OARequestParameter.h */; };
+ 82CE42911288CA4A00A73E9C /* OARequestParameter.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42771288CA4A00A73E9C /* OARequestParameter.m */; };
+ 82CE42921288CA4A00A73E9C /* OAServiceTicket.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42781288CA4A00A73E9C /* OAServiceTicket.h */; };
+ 82CE42931288CA4A00A73E9C /* OAServiceTicket.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42791288CA4A00A73E9C /* OAServiceTicket.m */; };
+ 82CE42941288CA4A00A73E9C /* OASignatureProviding.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE427A1288CA4A00A73E9C /* OASignatureProviding.h */; };
+ 82CE42951288CA4A00A73E9C /* OAToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE427B1288CA4A00A73E9C /* OAToken.h */; };
+ 82CE42961288CA4A00A73E9C /* OAToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE427C1288CA4A00A73E9C /* OAToken.m */; };
+ 82CE42971288CA4A00A73E9C /* OAuthConsumer.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE427D1288CA4A00A73E9C /* OAuthConsumer.h */; };
+ 82CE429B1288CA6000A73E9C /* Base64Transcoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42991288CA6000A73E9C /* Base64Transcoder.c */; };
+ 82CE429C1288CA6000A73E9C /* Base64Transcoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE429A1288CA6000A73E9C /* Base64Transcoder.h */; };
+ 82CE42A01288CA7400A73E9C /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE429E1288CA7400A73E9C /* Reachability.h */; };
+ 82CE42A11288CA7400A73E9C /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE429F1288CA7400A73E9C /* Reachability.m */; };
+ 82CE42A41288CA9000A73E9C /* YAJLIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CE42A31288CA9000A73E9C /* YAJLIOS.framework */; };
+ 82CE42B41288CADC00A73E9C /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE42B31288CADC00A73E9C /* Constants.m */; };
+ 82CE42B61288CAE500A73E9C /* Constants.h in Headers */ = {isa = PBXBuildFile; fileRef = 82CE42B51288CAE500A73E9C /* Constants.h */; };
+ 82CE43D41288F14000A73E9C /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CE43341288EFE000A73E9C /* CoreLocation.framework */; };
+ 82CE43DB1288F15500A73E9C /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CE43341288EFE000A73E9C /* CoreLocation.framework */; };
+ 82CE43E41288F16700A73E9C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; };
+ 82CE443E1288F17700A73E9C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CE433A1288F02E00A73E9C /* SystemConfiguration.framework */; };
+ 82CE44881288F5CE00A73E9C /* YAJLIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CE42A31288CA9000A73E9C /* YAJLIOS.framework */; };
+ 82CE45151289025B00A73E9C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CE432C1288EFB900A73E9C /* UIKit.framework */; };
+ 82CE45F412892FFA00A73E9C /* APIRequestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CE45F212892FFA00A73E9C /* APIRequestTests.m */; };
+ 82DFD9D1128CC45E008D20E2 /* StackMobSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 82DFD9D0128CC45E008D20E2 /* StackMobSession.m */; };
+ 82DFD9D3128CC46C008D20E2 /* StackMobSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 82DFD9D2128CC46C008D20E2 /* StackMobSession.h */; };
+ AA747D9F0F9514B9006C5449 /* StackMobiOS_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* StackMobiOS_Prefix.pch */; };
+ AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 8239D7C8129109F600F90A7B /* StackMobAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StackMobAdditions.h; path = StackMob/StackMobAdditions.h; sourceTree = "<group>"; };
+ 8239D7C9129109F600F90A7B /* StackMobAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StackMobAdditions.m; path = StackMob/StackMobAdditions.m; sourceTree = "<group>"; };
+ 82CE42591288CA1B00A73E9C /* StackMobClientData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StackMobClientData.m; path = StackMob/StackMobClientData.m; sourceTree = "<group>"; };
+ 82CE425A1288CA1B00A73E9C /* StackMobRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StackMobRequest.m; path = StackMob/StackMobRequest.m; sourceTree = "<group>"; };
+ 82CE425E1288CA2600A73E9C /* StackMobClientData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StackMobClientData.h; path = include/StackMob/StackMobClientData.h; sourceTree = "<group>"; };
+ 82CE425F1288CA2600A73E9C /* StackMobRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StackMobRequest.h; path = include/StackMob/StackMobRequest.h; sourceTree = "<group>"; };
+ 82CE42641288CA4A00A73E9C /* NSMutableURLRequest+Parameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableURLRequest+Parameters.h"; path = "external/OAuthConsumer/NSMutableURLRequest+Parameters.h"; sourceTree = "<group>"; };
+ 82CE42651288CA4A00A73E9C /* NSMutableURLRequest+Parameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableURLRequest+Parameters.m"; path = "external/OAuthConsumer/NSMutableURLRequest+Parameters.m"; sourceTree = "<group>"; };
+ 82CE42661288CA4A00A73E9C /* NSString+URLEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+URLEncoding.h"; path = "external/OAuthConsumer/NSString+URLEncoding.h"; sourceTree = "<group>"; };
+ 82CE42671288CA4A00A73E9C /* NSString+URLEncoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+URLEncoding.m"; path = "external/OAuthConsumer/NSString+URLEncoding.m"; sourceTree = "<group>"; };
+ 82CE42681288CA4A00A73E9C /* NSURL+Base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSURL+Base.h"; path = "external/OAuthConsumer/NSURL+Base.h"; sourceTree = "<group>"; };
+ 82CE42691288CA4A00A73E9C /* NSURL+Base.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSURL+Base.m"; path = "external/OAuthConsumer/NSURL+Base.m"; sourceTree = "<group>"; };
+ 82CE426A1288CA4A00A73E9C /* OAAsynchronousDataFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAAsynchronousDataFetcher.h; path = external/OAuthConsumer/OAAsynchronousDataFetcher.h; sourceTree = "<group>"; };
+ 82CE426B1288CA4A00A73E9C /* OAAsynchronousDataFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAAsynchronousDataFetcher.m; path = external/OAuthConsumer/OAAsynchronousDataFetcher.m; sourceTree = "<group>"; };
+ 82CE426C1288CA4A00A73E9C /* OAConsumer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAConsumer.h; path = external/OAuthConsumer/OAConsumer.h; sourceTree = "<group>"; };
+ 82CE426D1288CA4A00A73E9C /* OAConsumer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAConsumer.m; path = external/OAuthConsumer/OAConsumer.m; sourceTree = "<group>"; };
+ 82CE426E1288CA4A00A73E9C /* OADataFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OADataFetcher.h; path = external/OAuthConsumer/OADataFetcher.h; sourceTree = "<group>"; };
+ 82CE426F1288CA4A00A73E9C /* OADataFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OADataFetcher.m; path = external/OAuthConsumer/OADataFetcher.m; sourceTree = "<group>"; };
+ 82CE42701288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAHMAC_SHA1SignatureProvider.h; path = external/OAuthConsumer/OAHMAC_SHA1SignatureProvider.h; sourceTree = "<group>"; };
+ 82CE42711288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAHMAC_SHA1SignatureProvider.m; path = external/OAuthConsumer/OAHMAC_SHA1SignatureProvider.m; sourceTree = "<group>"; };
+ 82CE42721288CA4A00A73E9C /* OAMutableURLRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAMutableURLRequest.h; path = external/OAuthConsumer/OAMutableURLRequest.h; sourceTree = "<group>"; };
+ 82CE42731288CA4A00A73E9C /* OAMutableURLRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAMutableURLRequest.m; path = external/OAuthConsumer/OAMutableURLRequest.m; sourceTree = "<group>"; };
+ 82CE42741288CA4A00A73E9C /* OAPlaintextSignatureProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAPlaintextSignatureProvider.h; path = external/OAuthConsumer/OAPlaintextSignatureProvider.h; sourceTree = "<group>"; };
+ 82CE42751288CA4A00A73E9C /* OAPlaintextSignatureProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAPlaintextSignatureProvider.m; path = external/OAuthConsumer/OAPlaintextSignatureProvider.m; sourceTree = "<group>"; };
+ 82CE42761288CA4A00A73E9C /* OARequestParameter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OARequestParameter.h; path = external/OAuthConsumer/OARequestParameter.h; sourceTree = "<group>"; };
+ 82CE42771288CA4A00A73E9C /* OARequestParameter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OARequestParameter.m; path = external/OAuthConsumer/OARequestParameter.m; sourceTree = "<group>"; };
+ 82CE42781288CA4A00A73E9C /* OAServiceTicket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAServiceTicket.h; path = external/OAuthConsumer/OAServiceTicket.h; sourceTree = "<group>"; };
+ 82CE42791288CA4A00A73E9C /* OAServiceTicket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAServiceTicket.m; path = external/OAuthConsumer/OAServiceTicket.m; sourceTree = "<group>"; };
+ 82CE427A1288CA4A00A73E9C /* OASignatureProviding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OASignatureProviding.h; path = external/OAuthConsumer/OASignatureProviding.h; sourceTree = "<group>"; };
+ 82CE427B1288CA4A00A73E9C /* OAToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAToken.h; path = external/OAuthConsumer/OAToken.h; sourceTree = "<group>"; };
+ 82CE427C1288CA4A00A73E9C /* OAToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OAToken.m; path = external/OAuthConsumer/OAToken.m; sourceTree = "<group>"; };
+ 82CE427D1288CA4A00A73E9C /* OAuthConsumer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OAuthConsumer.h; path = external/OAuthConsumer/OAuthConsumer.h; sourceTree = "<group>"; };
+ 82CE42991288CA6000A73E9C /* Base64Transcoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Base64Transcoder.c; path = external/OAuthConsumer/Crypto/Base64Transcoder.c; sourceTree = "<group>"; };
+ 82CE429A1288CA6000A73E9C /* Base64Transcoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Base64Transcoder.h; path = external/OAuthConsumer/Crypto/Base64Transcoder.h; sourceTree = "<group>"; };
+ 82CE429E1288CA7400A73E9C /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = external/reachability/Reachability.h; sourceTree = "<group>"; };
+ 82CE429F1288CA7400A73E9C /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = external/reachability/Reachability.m; sourceTree = "<group>"; };
+ 82CE42A31288CA9000A73E9C /* YAJLIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = YAJLIOS.framework; path = external/libraries/YAJLIOS.framework; sourceTree = "<group>"; };
+ 82CE42B31288CADC00A73E9C /* Constants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Constants.m; path = StackMob/Constants.m; sourceTree = "<group>"; };
+ 82CE42B51288CAE500A73E9C /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Constants.h; path = include/StackMob/Constants.h; sourceTree = "<group>"; };
+ 82CE43251288EF9100A73E9C /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };
+ 82CE432C1288EFB900A73E9C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 82CE43301288EFCE00A73E9C /* libz.1.2.3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.2.3.dylib; path = usr/lib/libz.1.2.3.dylib; sourceTree = SDKROOT; };
+ 82CE43341288EFE000A73E9C /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
+ 82CE433A1288F02E00A73E9C /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+ 82CE434F1288F0DA00A73E9C /* Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 82CE43501288F0DA00A73E9C /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = "<group>"; };
+ 82CE45F212892FFA00A73E9C /* APIRequestTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = APIRequestTests.m; path = tests/APIRequestTests.m; sourceTree = "<group>"; };
+ 82CE45F312892FFA00A73E9C /* APIRequestTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = APIRequestTests.h; path = tests/APIRequestTests.h; sourceTree = "<group>"; };
+ 82DFD9D0128CC45E008D20E2 /* StackMobSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StackMobSession.m; path = StackMob/StackMobSession.m; sourceTree = "<group>"; };
+ 82DFD9D2128CC46C008D20E2 /* StackMobSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StackMobSession.h; path = include/StackMob/StackMobSession.h; sourceTree = "<group>"; };
+ AA747D9E0F9514B9006C5449 /* StackMobiOS_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackMobiOS_Prefix.pch; sourceTree = SOURCE_ROOT; };
+ AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ D2AAC07E0554694100DB518D /* libStackMobiOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStackMobiOS.a; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 82CE434C1288F0DA00A73E9C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 82CE44881288F5CE00A73E9C /* YAJLIOS.framework in Frameworks */,
+ 82CE443E1288F17700A73E9C /* SystemConfiguration.framework in Frameworks */,
+ 82CE43E41288F16700A73E9C /* Foundation.framework in Frameworks */,
+ 82CE43DB1288F15500A73E9C /* CoreLocation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D2AAC07C0554694100DB518D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 82CE45151289025B00A73E9C /* UIKit.framework in Frameworks */,
+ AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */,
+ 82CE42A41288CA9000A73E9C /* YAJLIOS.framework in Frameworks */,
+ 82CE43D41288F14000A73E9C /* CoreLocation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 034768DFFF38A50411DB9C8B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D2AAC07E0554694100DB518D /* libStackMobiOS.a */,
+ 82CE434F1288F0DA00A73E9C /* Tests.octest */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 0867D691FE84028FC02AAC07 /* StackMobiOS */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE42D41288E4D200A73E9C /* Tests */,
+ 82CE42621288CA2B00A73E9C /* External */,
+ 08FB77AEFE84172EC02AAC07 /* Classes */,
+ 32C88DFF0371C24200C91783 /* Other Sources */,
+ 0867D69AFE84028FC02AAC07 /* Frameworks */,
+ 034768DFFF38A50411DB9C8B /* Products */,
+ 82CE43501288F0DA00A73E9C /* Tests-Info.plist */,
+ );
+ name = StackMobiOS;
+ sourceTree = "<group>";
+ };
+ 0867D69AFE84028FC02AAC07 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE433A1288F02E00A73E9C /* SystemConfiguration.framework */,
+ 82CE43341288EFE000A73E9C /* CoreLocation.framework */,
+ 82CE43301288EFCE00A73E9C /* libz.1.2.3.dylib */,
+ 82CE432C1288EFB900A73E9C /* UIKit.framework */,
+ 82CE43251288EF9100A73E9C /* CFNetwork.framework */,
+ 82CE42A31288CA9000A73E9C /* YAJLIOS.framework */,
+ AACBBE490F95108600F1A2B1 /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 08FB77AEFE84172EC02AAC07 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 8239D7C8129109F600F90A7B /* StackMobAdditions.h */,
+ 8239D7C9129109F600F90A7B /* StackMobAdditions.m */,
+ 82DFD9D2128CC46C008D20E2 /* StackMobSession.h */,
+ 82DFD9D0128CC45E008D20E2 /* StackMobSession.m */,
+ 82CE42B51288CAE500A73E9C /* Constants.h */,
+ 82CE42B31288CADC00A73E9C /* Constants.m */,
+ 82CE425E1288CA2600A73E9C /* StackMobClientData.h */,
+ 82CE42591288CA1B00A73E9C /* StackMobClientData.m */,
+ 82CE425F1288CA2600A73E9C /* StackMobRequest.h */,
+ 82CE425A1288CA1B00A73E9C /* StackMobRequest.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 32C88DFF0371C24200C91783 /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ AA747D9E0F9514B9006C5449 /* StackMobiOS_Prefix.pch */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 82CE42621288CA2B00A73E9C /* External */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE429D1288CA6400A73E9C /* Reachability */,
+ 82CE42631288CA3400A73E9C /* OAuthConsumer */,
+ );
+ name = External;
+ sourceTree = "<group>";
+ };
+ 82CE42631288CA3400A73E9C /* OAuthConsumer */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE42981288CA4C00A73E9C /* Crypto */,
+ 82CE42641288CA4A00A73E9C /* NSMutableURLRequest+Parameters.h */,
+ 82CE42651288CA4A00A73E9C /* NSMutableURLRequest+Parameters.m */,
+ 82CE42661288CA4A00A73E9C /* NSString+URLEncoding.h */,
+ 82CE42671288CA4A00A73E9C /* NSString+URLEncoding.m */,
+ 82CE42681288CA4A00A73E9C /* NSURL+Base.h */,
+ 82CE42691288CA4A00A73E9C /* NSURL+Base.m */,
+ 82CE426A1288CA4A00A73E9C /* OAAsynchronousDataFetcher.h */,
+ 82CE426B1288CA4A00A73E9C /* OAAsynchronousDataFetcher.m */,
+ 82CE426C1288CA4A00A73E9C /* OAConsumer.h */,
+ 82CE426D1288CA4A00A73E9C /* OAConsumer.m */,
+ 82CE426E1288CA4A00A73E9C /* OADataFetcher.h */,
+ 82CE426F1288CA4A00A73E9C /* OADataFetcher.m */,
+ 82CE42701288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.h */,
+ 82CE42711288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.m */,
+ 82CE42721288CA4A00A73E9C /* OAMutableURLRequest.h */,
+ 82CE42731288CA4A00A73E9C /* OAMutableURLRequest.m */,
+ 82CE42741288CA4A00A73E9C /* OAPlaintextSignatureProvider.h */,
+ 82CE42751288CA4A00A73E9C /* OAPlaintextSignatureProvider.m */,
+ 82CE42761288CA4A00A73E9C /* OARequestParameter.h */,
+ 82CE42771288CA4A00A73E9C /* OARequestParameter.m */,
+ 82CE42781288CA4A00A73E9C /* OAServiceTicket.h */,
+ 82CE42791288CA4A00A73E9C /* OAServiceTicket.m */,
+ 82CE427A1288CA4A00A73E9C /* OASignatureProviding.h */,
+ 82CE427B1288CA4A00A73E9C /* OAToken.h */,
+ 82CE427C1288CA4A00A73E9C /* OAToken.m */,
+ 82CE427D1288CA4A00A73E9C /* OAuthConsumer.h */,
+ );
+ name = OAuthConsumer;
+ sourceTree = "<group>";
+ };
+ 82CE42981288CA4C00A73E9C /* Crypto */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE42991288CA6000A73E9C /* Base64Transcoder.c */,
+ 82CE429A1288CA6000A73E9C /* Base64Transcoder.h */,
+ );
+ name = Crypto;
+ sourceTree = "<group>";
+ };
+ 82CE429D1288CA6400A73E9C /* Reachability */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE429E1288CA7400A73E9C /* Reachability.h */,
+ 82CE429F1288CA7400A73E9C /* Reachability.m */,
+ );
+ name = Reachability;
+ sourceTree = "<group>";
+ };
+ 82CE42D41288E4D200A73E9C /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 82CE45F312892FFA00A73E9C /* APIRequestTests.h */,
+ 82CE45F212892FFA00A73E9C /* APIRequestTests.m */,
+ );
+ name = Tests;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D2AAC07A0554694100DB518D /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AA747D9F0F9514B9006C5449 /* StackMobiOS_Prefix.pch in Headers */,
+ 82CE42601288CA2600A73E9C /* StackMobClientData.h in Headers */,
+ 82CE42611288CA2600A73E9C /* StackMobRequest.h in Headers */,
+ 82CE427E1288CA4A00A73E9C /* NSMutableURLRequest+Parameters.h in Headers */,
+ 82CE42801288CA4A00A73E9C /* NSString+URLEncoding.h in Headers */,
+ 82CE42821288CA4A00A73E9C /* NSURL+Base.h in Headers */,
+ 82CE42841288CA4A00A73E9C /* OAAsynchronousDataFetcher.h in Headers */,
+ 82CE42861288CA4A00A73E9C /* OAConsumer.h in Headers */,
+ 82CE42881288CA4A00A73E9C /* OADataFetcher.h in Headers */,
+ 82CE428A1288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.h in Headers */,
+ 82CE428C1288CA4A00A73E9C /* OAMutableURLRequest.h in Headers */,
+ 82CE428E1288CA4A00A73E9C /* OAPlaintextSignatureProvider.h in Headers */,
+ 82CE42901288CA4A00A73E9C /* OARequestParameter.h in Headers */,
+ 82CE42921288CA4A00A73E9C /* OAServiceTicket.h in Headers */,
+ 82CE42941288CA4A00A73E9C /* OASignatureProviding.h in Headers */,
+ 82CE42951288CA4A00A73E9C /* OAToken.h in Headers */,
+ 82CE42971288CA4A00A73E9C /* OAuthConsumer.h in Headers */,
+ 82CE429C1288CA6000A73E9C /* Base64Transcoder.h in Headers */,
+ 82CE42A01288CA7400A73E9C /* Reachability.h in Headers */,
+ 82CE42B61288CAE500A73E9C /* Constants.h in Headers */,
+ 82DFD9D3128CC46C008D20E2 /* StackMobSession.h in Headers */,
+ 8239D7CA129109F600F90A7B /* StackMobAdditions.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 82CE434E1288F0DA00A73E9C /* Tests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 82CE43531288F0DA00A73E9C /* Build configuration list for PBXNativeTarget "Tests" */;
+ buildPhases = (
+ 82CE434A1288F0DA00A73E9C /* Resources */,
+ 82CE434B1288F0DA00A73E9C /* Sources */,
+ 82CE434C1288F0DA00A73E9C /* Frameworks */,
+ 82CE434D1288F0DA00A73E9C /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Tests;
+ productName = Tests;
+ productReference = 82CE434F1288F0DA00A73E9C /* Tests.octest */;
+ productType = "com.apple.product-type.bundle";
+ };
+ D2AAC07D0554694100DB518D /* StackMob */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "StackMob" */;
+ buildPhases = (
+ D2AAC07A0554694100DB518D /* Headers */,
+ D2AAC07B0554694100DB518D /* Sources */,
+ D2AAC07C0554694100DB518D /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = StackMob;
+ productName = StackMobiOS;
+ productReference = D2AAC07E0554694100DB518D /* libStackMobiOS.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 0867D690FE84028FC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ ORGANIZATIONNAME = "StackMob, Inc.";
+ };
+ buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "StackMobiOS" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 0867D691FE84028FC02AAC07 /* StackMobiOS */;
+ productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D2AAC07D0554694100DB518D /* StackMob */,
+ 82CE42BA1288CB5300A73E9C /* Build Framework */,
+ 82CE434E1288F0DA00A73E9C /* Tests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 82CE434A1288F0DA00A73E9C /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 82CE42B91288CB5300A73E9C /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "cd scripts\nsource build.sh\nexit 0";
+ };
+ 82CE434D1288F0DA00A73E9C /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 82CE434B1288F0DA00A73E9C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 82CE45F412892FFA00A73E9C /* APIRequestTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D2AAC07B0554694100DB518D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 82CE425C1288CA1B00A73E9C /* StackMobClientData.m in Sources */,
+ 82CE425D1288CA1B00A73E9C /* StackMobRequest.m in Sources */,
+ 82CE427F1288CA4A00A73E9C /* NSMutableURLRequest+Parameters.m in Sources */,
+ 82CE42811288CA4A00A73E9C /* NSString+URLEncoding.m in Sources */,
+ 82CE42831288CA4A00A73E9C /* NSURL+Base.m in Sources */,
+ 82CE42851288CA4A00A73E9C /* OAAsynchronousDataFetcher.m in Sources */,
+ 82CE42871288CA4A00A73E9C /* OAConsumer.m in Sources */,
+ 82CE42891288CA4A00A73E9C /* OADataFetcher.m in Sources */,
+ 82CE428B1288CA4A00A73E9C /* OAHMAC_SHA1SignatureProvider.m in Sources */,
+ 82CE428D1288CA4A00A73E9C /* OAMutableURLRequest.m in Sources */,
+ 82CE428F1288CA4A00A73E9C /* OAPlaintextSignatureProvider.m in Sources */,
+ 82CE42911288CA4A00A73E9C /* OARequestParameter.m in Sources */,
+ 82CE42931288CA4A00A73E9C /* OAServiceTicket.m in Sources */,
+ 82CE42961288CA4A00A73E9C /* OAToken.m in Sources */,
+ 82CE429B1288CA6000A73E9C /* Base64Transcoder.c in Sources */,
+ 82CE42A11288CA7400A73E9C /* Reachability.m in Sources */,
+ 82CE42B41288CADC00A73E9C /* Constants.m in Sources */,
+ 82DFD9D1128CC45E008D20E2 /* StackMobSession.m in Sources */,
+ 8239D7CB129109F600F90A7B /* StackMobAdditions.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB921F08733DC00010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ COPY_PHASE_STRIP = NO;
+ DSTROOT = /tmp/StackMobiOS.dst;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/external/libraries\"",
+ "\"$(SRCROOT)/build/Framework\"",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = StackMobiOS_Prefix.pch;
+ INSTALL_PATH = /usr/local/lib;
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-all_load",
+ );
+ PRODUCT_NAME = StackMobiOS;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 1DEB922008733DC00010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ DSTROOT = /tmp/StackMobiOS.dst;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/external/libraries\"",
+ "\"$(SRCROOT)/build/Framework\"",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = StackMobiOS_Prefix.pch;
+ INSTALL_PATH = /usr/local/lib;
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-all_load",
+ );
+ PRODUCT_NAME = StackMobiOS;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 1DEB922308733DC00010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ OTHER_LDFLAGS = "-ObjC";
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 1DEB922408733DC00010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ OTHER_LDFLAGS = "-ObjC";
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 82CE42BB1288CB5300A73E9C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = "Build Framework";
+ };
+ name = Debug;
+ };
+ 82CE42BC1288CB5300A73E9C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ PRODUCT_NAME = "Build Framework";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 82CE43511288F0DA00A73E9C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"$(SDKROOT)/Developer/Library/Frameworks\"",
+ "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
+ "\"$(SRCROOT)/build/Framework\"",
+ "\"$(SRCROOT)/external/libraries\"",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INFOPLIST_FILE = "Tests-Info.plist";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ SenTestingKit,
+ "-framework",
+ UIKit,
+ "-ObjC",
+ "-all_load",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = Tests;
+ WRAPPER_EXTENSION = octest;
+ };
+ name = Debug;
+ };
+ 82CE43521288F0DA00A73E9C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"$(SDKROOT)/Developer/Library/Frameworks\"",
+ "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
+ "\"$(SRCROOT)/build/Framework\"",
+ "\"$(SRCROOT)/external/libraries\"",
+ );
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ INFOPLIST_FILE = "Tests-Info.plist";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ SenTestingKit,
+ "-framework",
+ UIKit,
+ "-ObjC",
+ "-all_load",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = Tests;
+ WRAPPER_EXTENSION = octest;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "StackMob" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB921F08733DC00010E9CD /* Debug */,
+ 1DEB922008733DC00010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "StackMobiOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB922308733DC00010E9CD /* Debug */,
+ 1DEB922408733DC00010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 82CE42C11288CBA200A73E9C /* Build configuration list for PBXAggregateTarget "Build Framework" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 82CE42BB1288CB5300A73E9C /* Debug */,
+ 82CE42BC1288CB5300A73E9C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 82CE43531288F0DA00A73E9C /* Build configuration list for PBXNativeTarget "Tests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 82CE43511288F0DA00A73E9C /* Debug */,
+ 82CE43521288F0DA00A73E9C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
1,369 StackMobiOS.xcodeproj/ty.mode1v3
@@ -0,0 +1,1369 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActivePerspectiveName</key>
+ <string>Project</string>
+ <key>AllowedModules</key>
+ <array>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Name</key>
+ <string>Groups and Files Outline View</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Name</key>
+ <string>Editor</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCTaskListModule</string>
+ <key>Name</key>
+ <string>Task List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Name</key>
+ <string>File and Smart Group Detail Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Name</key>
+ <string>Detailed Build Results Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Name</key>
+ <string>Project Batch Find Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Name</key>
+ <string>Project Format Conflicts List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Name</key>
+ <string>Bookmarks Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Name</key>
+ <string>Class Browser</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Name</key>
+ <string>Source Code Control Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXDebugBreakpointsModule</string>
+ <key>Name</key>
+ <string>Debug Breakpoints Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDockableInspector</string>
+ <key>Name</key>
+ <string>Inspector</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXOpenQuicklyModule</string>
+ <key>Name</key>
+ <string>Open Quickly Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Name</key>
+ <string>Debugger</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Name</key>
+ <string>Debug Console</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Name</key>
+ <string>Snapshots Tool</string>
+ </dict>
+ </array>
+ <key>BundlePath</key>
+ <string>/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources</string>
+ <key>Description</key>
+ <string>DefaultDescriptionKey</string>
+ <key>DockingSystemVisible</key>
+ <false/>
+ <key>Extension</key>
+ <string>mode1v3</string>
+ <key>FavBarConfig</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>10CF904212E50EC600AE4658</string>
+ <key>XCBarModuleItemNames</key>
+ <dict/>
+ <key>XCBarModuleItems</key>
+ <array/>
+ </dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>com.apple.perspectives.project.mode1v3</string>
+ <key>MajorVersion</key>
+ <integer>33</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>Default</string>
+ <key>Notifications</key>
+ <array/>
+ <key>OpenEditors</key>
+ <array/>
+ <key>PerspectiveWidths</key>
+ <array>
+ <integer>-1</integer>
+ <integer>-1</integer>
+ </array>
+ <key>Perspectives</key>
+ <array>
+ <dict>
+ <key>ChosenToolbarItems</key>
+ <array>
+ <string>active-combo-popup</string>
+ <string>action</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>debugger-enable-breakpoints</string>
+ <string>build-and-go</string>
+ <string>com.apple.ide.PBXToolbarStopButton</string>
+ <string>get-info</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>com.apple.pbx.toolbar.searchfield</string>
+ </array>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProjectWithEditor</string>
+ <key>Identifier</key>
+ <string>perspective.project</string>
+ <key>IsVertical</key>
+ <false/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <true/>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>358</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>0867D691FE84028FC02AAC07</string>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FABC05509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>10</integer>
+ <integer>8</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {358, 970}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <true/>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.GFSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {375, 988}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>358</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>501 389 1380 1029 0 0 2560 1418 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>375pt</string>
+ </dict>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20306471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>AES128CBC.java</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20406471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>AES128CBC.java</string>
+ <key>_historyCapacity</key>
+ <integer>0</integer>
+ <key>bookmark</key>
+ <string>1003FBD212E518BB002AB8CB</string>
+ <key>history</key>
+ <array>
+ <string>10CF903912E50EC600AE4658</string>
+ <string>10CF903A12E50EC600AE4658</string>
+ <string>10CF903E12E50EC600AE4658</string>
+ </array>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <true/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {1000, 476}}</string>
+ <key>RubberWindowFrame</key>
+ <string>501 389 1380 1029 0 0 2560 1418 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>476pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20506471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 481}, {1000, 507}}</string>
+ <key>RubberWindowFrame</key>
+ <string>501 389 1380 1029 0 0 2560 1418 </string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Proportion</key>
+ <string>507pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>1000pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCModuleDock</string>
+ <string>PBXNavigatorGroup</string>
+ <string>XCDetailModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>1003FBD312E518BB002AB8CB</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1003FBD412E518BB002AB8CB</string>
+ <string>1CE0B20306471E060097A5F4</string>
+ <string>1CE0B20506471E060097A5F4</string>
+ </array>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.defaultV3</string>
+ </dict>
+ <dict>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProject</string>
+ <key>Identifier</key>
+ <string>perspective.morph</string>
+ <key>IsVertical</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C08E77C0454961000C914BD</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>11E0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>186</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>29B97314FDCFA39411CA2CEA</string>
+ <string>1C37FABC05509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {186, 337}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <integer>1</integer>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.GFSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {203, 355}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>186</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>373 269 690 397 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Morph</string>
+ <key>PreferredWidth</key>
+ <integer>300</integer>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>11E0B1FE06471DED0097A5F4</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.default.shortV3</string>
+ </dict>
+ </array>
+ <key>PerspectivesBarVisible</key>
+ <false/>
+ <key>ShelfIsVisible</key>
+ <false/>
+ <key>SourceDescription</key>
+ <string>file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TimeStamp</key>
+ <real>0.0</real>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarDisplayMode</key>
+ <integer>1</integer>
+ <key>ToolbarIsVisible</key>
+ <true/>
+ <key>ToolbarSizeMode</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Perspectives</string>
+ <key>UpdateMessage</key>
+ <string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'?</string>
+ <key>WindowJustification</key>
+ <integer>5</integer>
+ <key>WindowOrderList</key>
+ <array>
+ <string>10CF904312E50EC600AE4658</string>
+ <string>/Users/ty/Documents/code/StackMobiOS/StackMobiOS.xcodeproj</string>
+ </array>
+ <key>WindowString</key>
+ <string>501 389 1380 1029 0 0 2560 1418 </string>
+ <key>WindowToolsV3</key>
+ <array>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.build</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528F0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string></string>
+ <key>StatusBarVisibility</key>
+ <true/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {500, 218}}</string>
+ <key>RubberWindowFrame</key>
+ <string>907 702 500 500 0 0 2560 1418 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>218pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>XCMainBuildResultsModuleGUID</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Build Results</string>
+ <key>XCBuildResultsTrigger_Collapse</key>
+ <integer>1021</integer>
+ <key>XCBuildResultsTrigger_Open</key>
+ <integer>1011</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 223}, {500, 236}}</string>
+ <key>RubberWindowFrame</key>
+ <string>907 702 500 500 0 0 2560 1418 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Proportion</key>
+ <string>236pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>459pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Build Results</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBuildResultsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>10CF904312E50EC600AE4658</string>
+ <string>1003FBD512E518BB002AB8CB</string>
+ <string>1CD0528F0623707200166675</string>
+ <string>XCMainBuildResultsModuleGUID</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.buildV3</string>
+ <key>WindowContentMinSize</key>
+ <string>486 300</string>
+ <key>WindowString</key>
+ <string>907 702 500 500 0 0 2560 1418 </string>
+ <key>WindowToolGUID</key>
+ <string>10CF904312E50EC600AE4658</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debugger</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>Debugger</key>
+ <dict>
+ <key>HorizontalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {317, 164}}</string>
+ <string>{{317, 0}, {377, 164}}</string>
+ </array>
+ </dict>
+ <key>VerticalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {694, 164}}</string>
+ <string>{{0, 164}, {694, 216}}</string>
+ </array>
+ </dict>
+ </dict>
+ <key>LauncherConfigVersion</key>
+ <string>8</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C162984064C10D400B95A72</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debug - GLUTExamples (Underwater)</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>DebugConsoleDrawerSize</key>
+ <string>{100, 120}</string>
+ <key>DebugConsoleVisible</key>
+ <string>None</string>
+ <key>DebugConsoleWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>DebugSTDIOWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>Frame</key>
+ <string>{{0, 0}, {694, 380}}</string>
+ <key>RubberWindowFrame</key>
+ <string>321 238 694 422 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugSessionModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <string>1C0AD2AB069F1E9B00FABCE6</string>
+ <string>1C162984064C10D400B95A72</string>
+ <string>1C0AD2AC069F1E9B00FABCE6</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugV3</string>
+ <key>WindowString</key>
+ <string>321 238 694 422 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.find</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CDD528C0622207200134675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528D0623707200166675</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {781, 167}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>781pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528E0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Project Find</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{8, 0}, {773, 254}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>428pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Find</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXProjectFindModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <string>1C530D58069F1CE1000CFCEE</string>
+ <string>1C530D59069F1CE1000CFCEE</string>
+ <string>1CDD528C0622207200134675</string>
+ <string>1C530D5A069F1CE1000CFCEE</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CD0528E0623707200166675</string>
+ </array>
+ <key>WindowString</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>MENUSEPARATOR</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debuggerConsole</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAAC065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debugger Console</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {650, 250}}</string>
+ <key>RubberWindowFrame</key>
+ <string>516 632 650 250 0 0 1680 1027 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Proportion</key>
+ <string>209pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>209pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger Console</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugCLIModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAAD065D492600B07095</string>
+ <string>1C78EAAE065D492600B07095</string>
+ <string>1C78EAAC065D492600B07095</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.consoleV3</string>
+ <key>WindowString</key>
+ <string>650 41 650 250 0 0 1280 1002 </string>
+ <key>WindowToolGUID</key>
+ <string>1C78EAAD065D492600B07095</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.snapshots</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Snapshots</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCSnapshotModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <string>Yes</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.snapshots</string>
+ <key>WindowString</key>
+ <string>315 824 300 550 0 0 1440 878 </string>
+ <key>WindowToolIsVisible</key>
+ <string>Yes</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.scm</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB2065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB3065D492600B07095</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {452, 0}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>0pt</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD052920623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>SCM</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ConsoleFrame</key>
+ <string>{{0, 259}, {452, 0}}</string>
+ <key>Frame</key>
+ <string>{{0, 7}, {452, 259}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ <key>TableConfiguration</key>
+ <array>
+ <string>Status</string>
+ <real>30</real>
+ <string>FileName</string>
+ <real>199</real>
+ <string>Path</string>
+ <real>197.0950012207031</real>
+ </array>
+ <key>TableFrame</key>
+ <string>{{0, 0}, {452, 250}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Proportion</key>
+ <string>262pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>266pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>SCM</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXCVSModule</string>