diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index cd195b04a..52df11606 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -25,6 +25,8 @@ @import "CPRunLoop.j" @import "CPURLRequest.j" @import "CPURLResponse.j" +@import "CPOperationQueue.j" +@import "CPOperation.j" @protocol CPURLConnectionDelegate @@ -93,6 +95,9 @@ var CPURLConnectionDelegate = nil; BOOL _isLocalFileConnection; HTTPRequest _HTTPRequest; + + CPOperationQueue _operationQueue; + CPOperation _connectionOperation @accessors(readonly, getter=operation); } + (void)setClassDelegate:(id )delegate @@ -137,6 +142,18 @@ var CPURLConnectionDelegate = nil; return nil; } +/* + Loads the data for a URL request and executes a function on an operation queue when the request completes or fails. + @param aRequest contains the URL to obtain data from. + @param aQueue The operation queue to which the function is dispatched when the request completes or failed. + @param aHandler The function to execute. + @discussion If the request completes successfully, the data parameter of the function contains the resource data, and the error parameter is nil. If the request fails, the data parameter is nil and the error parameter contain information about the failure. +*/ ++ (CPURLConnection)sendAsynchronousRequest:(CPURLRequest)aRequest queue:(CPOperationQueue)aQueue completionHandler:(Function)aHandler +{ + return [[self alloc] _initWithRequest:aRequest queue:aQueue completionHandler:aHandler]; +} + /* Creates a url connection with a delegate to monitor the request progress. @param aRequest contains the URL to obtain data from @@ -161,26 +178,51 @@ var CPURLConnectionDelegate = nil; if (self) { - _request = aRequest; - _originalRequest = [aRequest copy]; _delegate = aDelegate; - _isCanceled = NO; + _operationQueue = nil; + _connectionOperation = nil; - var URL = [_request URL], - scheme = [URL scheme]; + [self _initWithRequest:aRequest]; + } - // Browsers use "file:", Titanium uses "app:" - _isLocalFileConnection = scheme === "file" || - ((scheme === "http" || scheme === "https") && - window.location && - (window.location.protocol === "file:" || window.location.protocol === "app:")); + if (shouldStartImmediately) + [self start]; - _HTTPRequest = new CFHTTPRequest(); - _HTTPRequest.setTimeout([aRequest timeoutInterval] * 1000); - _HTTPRequest.setWithCredentials([aRequest withCredentials]); + return self; +} - if (shouldStartImmediately) - [self start]; +- (void)_initWithRequest:(CPURLRequest)aRequest +{ + _request = aRequest; + _originalRequest = [aRequest copy]; + _isCanceled = NO; + + var URL = [_request URL], + scheme = [URL scheme]; + + // Browsers use "file:", Titanium uses "app:" + _isLocalFileConnection = scheme === "file" || + ((scheme === "http" || scheme === "https") && + window.location && + (window.location.protocol === "file:" || window.location.protocol === "app:")); + + _HTTPRequest = new CFHTTPRequest(); + _HTTPRequest.setTimeout([aRequest timeoutInterval] * 1000); + _HTTPRequest.setWithCredentials([aRequest withCredentials]); +} + +- (id)_initWithRequest:(CPURLRequest)aRequest queue:(CPOperationQueue)aQueue completionHandler:(Function)aHandler +{ + self = [super init]; + + if (self) + { + _delegate = nil; + _operationQueue = aQueue; + _connectionOperation = [[_AsynchronousConnectionOperation alloc] initWithFunction:aHandler]; + + [self _initWithRequest:aRequest]; + [self start]; } return self; @@ -232,6 +274,8 @@ var CPURLConnectionDelegate = nil; { if ([_delegate respondsToSelector:@selector(connection:didFailWithError:)]) [_delegate connection:self didFailWithError:anException]; + else if (_connectionOperation !== nil) + [self _connectionOperationDidReceiveResponse:nil data:nil error:anException]; } /* @@ -244,6 +288,9 @@ var CPURLConnectionDelegate = nil; try { _HTTPRequest.abort(); + + if (_connectionOperation) + [_connectionOperation cancel]; } // We expect an exception in some browsers like FireFox. catch (anException) @@ -267,7 +314,6 @@ var CPURLConnectionDelegate = nil; [self _sendDelegateDidFailWithError:exception]; } - /* @ignore */ - (void)_readyStateDidChange { @@ -280,23 +326,27 @@ var CPURLConnectionDelegate = nil; [CPURLConnectionDelegate connectionDidReceiveAuthenticationChallenge:self]; else { - if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) + var response; + + if (_isLocalFileConnection) + response = [[CPURLResponse alloc] initWithURL:URL]; + else { - if (_isLocalFileConnection) - [_delegate connection:self didReceiveResponse:[[CPURLResponse alloc] initWithURL:URL]]; - else - { - var response = [[CPHTTPURLResponse alloc] initWithURL:URL]; - [response _setStatusCode:statusCode]; - [response _setAllResponseHeaders:_HTTPRequest.getAllResponseHeaders()]; - [_delegate connection:self didReceiveResponse:response]; - } + response = [[CPHTTPURLResponse alloc] initWithURL:URL]; + [response _setStatusCode:statusCode]; + [response _setAllResponseHeaders:_HTTPRequest.getAllResponseHeaders()]; } + if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) + [_delegate connection:self didReceiveResponse:response]; + if (!_isCanceled) { if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) [_delegate connection:self didReceiveData:_HTTPRequest.responseText()]; + else if (_connectionOperation !== nil) + [self _connectionOperationDidReceiveResponse:response data:_HTTPRequest.responseText() error:nil]; + if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)]) [_delegate connectionDidFinishLoading:self]; } @@ -312,6 +362,69 @@ var CPURLConnectionDelegate = nil; return _HTTPRequest; } +- (void)_connectionOperationDidReceiveResponse:(CPURLResponse)aResponse data:(CPData)aData error:(CPError)anError +{ + [_connectionOperation _setResponse:aResponse data:aData error:anError]; + + if (_operationQueue) + [_operationQueue addOperation:_connectionOperation]; + else + { + // Do we need to send CPOperation KVO notifications ? + [_connectionOperation main]; + } +} + +@end + +/* @ignore */ +@implementation _AsynchronousConnectionOperation : CPOperation +{ + BOOL _didReceiveResponse; + + CPURLResponse _response; + CPData _data; + CPError _error; + Function _operationFunction; +} + +/* @ignore */ +- (id)initWithFunction:(Function)aFunction +{ + self = [super init]; + + if (self) + { + _didReceiveResponse = NO; + _response = nil; + _data = nil; + _error = nil; + _operationFunction = aFunction; + } + + return self; +} + +- (void)_setResponse:(CPURLResponse)aResponse data:(CPData)aData error:(CPError)anError +{ + _didReceiveResponse = YES; + _response = aResponse; + _data = aData; + _error = anError; +} + +/* @ignore */ +- (void)main +{ + _operationFunction(_response, _data, _error); +} + +/* @ignore */ +- (BOOL)isReady +{ + return (_didReceiveResponse && [super isReady]); +} + @end @implementation CPURLConnection (Deprecated) diff --git a/Tests/Manual/CPURLConnectionAsyncTest/AppController.j b/Tests/Manual/CPURLConnectionAsyncTest/AppController.j new file mode 100644 index 000000000..1138a8578 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/AppController.j @@ -0,0 +1,212 @@ +/* + * AppController.j + * CPURLConnectionAsyncTest + * + * Created by You on February 1, 2012. + * Copyright 2012, Your Company All rights reserved. + + This test needs to be at the root of your Web Server (http://localhost/CPURLConnectionAsyncTest/) and with php enabled. + For each test, we start 3 async connections and we setup the resulting operations to be dependant one from each other. The connection received after the smallest delay is dependant on a connection received with a longer delay. + We test that dedendant operations are perfomed before their dependencies. + We also test that in the completionHandler(response, data, error), the data and error params are mututally exclusive.*/ + +@import +@import +CPLogRegister(CPLogConsole); + +@implementation AppController : CPObject +{ + @outlet CPTextField testField; + CPWindow theWindow; //this "outlet" is connected automatically by the Cib + CPOperationQueue queue; + CPArray results; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (CPURLConnection)startAsyncConnection:(CPInteger)idx responseStatus:(CPInteger)aStatus delay:(CPInteger)aDelay isLast:(BOOL)isLast +{ + var resourcePath = [[CPBundle mainBundle] resourcePath], + url = [CPURL URLWithString:[CPString stringWithFormat:@"%@delayed.php?sleep=%@&status=%@", resourcePath, aDelay, aStatus]]; + + var request = [CPURLRequest requestWithURL:url]; + + return [self startAsyncConnection:idx request:request isLast:isLast]; +} + +- (CPURLConnection)startAsyncConnection:(CPInteger)idx request:(CPURLRequest)request isLast:(BOOL)isLast +{ + var connection = [CPURLConnection sendAsynchronousRequest:request queue:queue completionHandler:function (response, data, error) + { + var status; + + if (error == nil) + error = [CPNull null]; + + if (data == nil) + data = [CPNull null]; + + if (response == nil) + status = -1; + else + status = [response statusCode]; + + CPLog.debug([request URL] + "\nRESPONSE:" + response + "\nDATA:" + data + "\nERROR:" + [error description]); + + [results addObject:@{"conn_id":idx, "data":data, "status":status, "error":error}]; + + // We received all the responses to the connections we launched (3). + if ([results count] == 3) + { + var test = [self testResults]; + [testField setStringValue:((test) ? "Test passed" : @"Test failed")]; + } + }]; + + return connection; +} + +- (BOOL)testResults +{ + if ([results count] !== 3) + return NO; + + // In theses tests, we send connections 1,2,3 and we expect the operations to be performed in reverse order: 3,2,1 because of the dependencies we set up. + if (![[results valueForKey:@"conn_id"] isEqualToArray:@[3,2,1]]) + return NO; + + var nul = [CPNull null]; + + for (var i = 0; i < [results count]; i++) + { + var res = [results objectAtIndex:i], + noData = [res objectForKey:@"data"] == nul, + noError = [res objectForKey:@"error"] == nul; + + if (noData == noError) + return NO; + } + + return YES; +} + +- (IBAction)test1:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 responseStatus:200 delay:2 isLast:NO]; + var connection3 = [self startAsyncConnection:3 responseStatus:200 delay:3 isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (IBAction)test2:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 responseStatus:404 delay:2 isLast:NO]; + var connection3 = [self startAsyncConnection:3 responseStatus:200 delay:3 isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (IBAction)test3:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 responseStatus:200 delay:2 isLast:NO]; + var connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (IBAction)test4:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 responseStatus:403 delay:2 isLast:NO]; + var connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (IBAction)test5:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:404 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 responseStatus:1000 delay:2 isLast:NO]; + var connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (IBAction)test6:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + var request = [CPURLRequest requestWithURL:"dummy"]; + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 request:request isLast:NO]; + var connection3 = [self startAsyncConnection:3 request:request isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (IBAction)test7:(id)sender +{ + results = @[]; + queue = [[CPOperationQueue alloc] init]; + + var resourcePath = [[CPBundle mainBundle] resourcePath], + url = [CPURL URLWithString:[CPString stringWithFormat:@"%@delayed.php?sleep=%@&status=%@", resourcePath, 10, 200]]; + var timeoutrequest = [CPURLRequest requestWithURL:url cachePolicy:CPURLRequestUseProtocolCachePolicy timeoutInterval:3]; + + var nourl = [CPURLRequest requestWithURL:@"nourl"]; + + [testField setStringValue:@"Waiting for response ..."]; + + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; + var connection2 = [self startAsyncConnection:2 request:nourl isLast:NO]; + var connection3 = [self startAsyncConnection:3 request:timeoutrequest isLast:NO]; + + [[connection1 operation] addDependency:[connection2 operation]]; + [[connection2 operation] addDependency:[connection3 operation]]; +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +@end \ No newline at end of file diff --git a/Tests/Manual/CPURLConnectionAsyncTest/Info.plist b/Tests/Manual/CPURLConnectionAsyncTest/Info.plist new file mode 100644 index 000000000..8abee9439 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/Info.plist @@ -0,0 +1,10 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPURLConnectionAsyncTest + + diff --git a/Tests/Manual/CPURLConnectionAsyncTest/Jakefile b/Tests/Manual/CPURLConnectionAsyncTest/Jakefile new file mode 100644 index 000000000..8012b7016 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/Jakefile @@ -0,0 +1,94 @@ +/* + * Jakefile + * CPURLConnectionAsyncTest + * + * Created by You on February 1, 2012. + * Copyright 2012, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"); + +app ("CPURLConnectionAsyncTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "CPURLConnectionAsyncTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPURLConnectionAsyncTest"); + task.setIdentifier("com.yourcompany.CPURLConnectionAsyncTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPURLConnectionAsyncTest"); + task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + task.setNib2CibFlags("-R Resources/"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["CPURLConnectionAsyncTest"], function() +{ + printResults(configuration); +}); + +task ("build", ["default"]); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", "CPURLConnectionAsyncTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CPURLConnectionAsyncTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CPURLConnectionAsyncTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CPURLConnectionAsyncTest"), FILE.join("Build", "Deployment", "CPURLConnectionAsyncTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CPURLConnectionAsyncTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPURLConnectionAsyncTest"), FILE.join("Build", "Desktop", "CPURLConnectionAsyncTest", "CPURLConnectionAsyncTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CPURLConnectionAsyncTest", "CPURLConnectionAsyncTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPURLConnectionAsyncTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.cib b/Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.cib new file mode 100644 index 000000000..51021f140 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;43E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;45E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;34E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;49E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;38E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;51E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;39E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;40E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;53E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;54E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;55E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;56E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;57E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;58E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;59E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;60E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;30E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;62E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;62E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;63E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;67E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;2;76E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;79E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;83E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;2;84E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;85E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;86E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;2;87E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;88E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;89E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;2;90E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;91E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;92E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;93E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;95E;K;11;$aalignmentD;K;6;CP$UIDd;2;77E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;72E;K;6;$afontD;K;6;CP$UIDd;2;96E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;80E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;66E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;66E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;66E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;98E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;77E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;66E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;66E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;99E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;3;100E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;101E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;3;103E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;104E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;61E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;105E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;11;$aalignmentD;K;6;CP$UIDd;2;72E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;61E;K;6;$afontD;K;6;CP$UIDd;2;74E;K;7;$aimageD;K;6;CP$UIDd;3;106E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;65E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;61E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;77E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;61E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;107E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;80E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;66E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;81E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;61E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;82E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;72E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;61E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;108E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;E;E;S;8;delegateS;9;testFieldS;9;theWindowS;6;test1:S;6;test2:S;6;test3:S;6;test4:S;6;test5:S;6;test6:S;6;test7:S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;24;{{335, 171}, {934, 466}}S;22;{{0, 0}, {1680, 1027}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {934, 466}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;E;E;S;6;normalS;6;{1, 1}F;S;20;{{23, 20}, {65, 25}}S;18;{{0, 0}, {65, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegulard;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;73E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;109E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;110E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;66E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;d;1;4d;2;-1S;6;Test 1S;0;d;2;14T;S;20;{{23, 53}, {65, 25}}D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;S;6;Test 2S;20;{{23, 86}, {65, 25}}D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;S;6;Test 3S;21;{{23, 119}, {65, 25}}D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;S;6;Test 4S;22;{{136, 22}, {308, 17}}S;19;{{0, 0}, {308, 17}}S;9;textfieldS;30;controlSizeRegular+placeholderD;K;6;$classD;K;6;CP$UIDd;2;73E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;109E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;110E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;82E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;66E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;114E;E;S;21;{{23, 152}, {65, 25}}D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;S;6;Test 5S;21;{{23, 185}, {65, 25}}D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;S;6;Test 6S;21;{{23, 217}, {65, 25}}D;K;6;$classD;K;6;CP$UIDd;2;75E;K;4;nameD;K;6;CP$UIDd;3;111E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;112E;K;5;valueD;K;6;CP$UIDd;3;113E;E;S;6;Test 7S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;73E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;109E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;110E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;66E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;E;E;f;18;0.6862745098039216d;1;1E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.xib b/Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.xib new file mode 100644 index 000000000..e00e18294 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.xib @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/CPURLConnectionAsyncTest/Resources/delayed.php b/Tests/Manual/CPURLConnectionAsyncTest/Resources/delayed.php new file mode 100755 index 000000000..b8bffe20a --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/Resources/delayed.php @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/Tests/Manual/CPURLConnectionAsyncTest/Resources/spinner.gif b/Tests/Manual/CPURLConnectionAsyncTest/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/CPURLConnectionAsyncTest/Resources/spinner.gif differ diff --git a/Tests/Manual/CPURLConnectionAsyncTest/index-debug.html b/Tests/Manual/CPURLConnectionAsyncTest/index-debug.html new file mode 100644 index 000000000..a441ea9b2 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/index-debug.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + CPURLConnectionAsyncTest + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPURLConnectionAsyncTest/index.html b/Tests/Manual/CPURLConnectionAsyncTest/index.html new file mode 100644 index 000000000..0bc96c02b --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + CPURLConnectionAsyncTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPURLConnectionAsyncTest/main.j b/Tests/Manual/CPURLConnectionAsyncTest/main.j new file mode 100644 index 000000000..8c25d0a18 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPURLConnectionAsyncTest + * + * Created by You on February 1, 2012. + * Copyright 2012, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}