From 8ab9e6bac769354b29c9b51148e24a3592909c88 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Thu, 1 Oct 2015 12:36:57 +0200 Subject: [PATCH 1/3] NEW +sendAsynchronousRequest:queue:completionHandler: If queue is nil, run handler immediately. NEW: CPURLConnection -operation method, CPError CPURLErrorDomain constant. CPURLConnection -operation gives access to the operation generated by the new CPURLConnection creator. This allows to create dependencies between operations and setup priorities early. When the connection fails with a status code 404 or is cancelled, the operation is also cancelled and the next operation in the queue is started. --- Foundation/CPURLConnection.j | 165 +++++++++++++++++++++++++++++------ 1 file changed, 138 insertions(+), 27 deletions(-) diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index cd195b04a..d1b9a6838 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; @@ -244,6 +286,9 @@ var CPURLConnectionDelegate = nil; try { _HTTPRequest.abort(); + + if (_connectionOperation) + [_connectionOperation cancel]; } // We expect an exception in some browsers like FireFox. catch (anException) @@ -267,7 +312,6 @@ var CPURLConnectionDelegate = nil; [self _sendDelegateDidFailWithError:exception]; } - /* @ignore */ - (void)_readyStateDidChange { @@ -280,23 +324,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:)]) + if (_connectionOperation !== nil) + [self _connectionOperationDidReceiveResponse:response data:_HTTPRequest.responseText() error:nil]; + else if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) [_delegate connection:self didReceiveData:_HTTPRequest.responseText()]; + if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)]) [_delegate connectionDidFinishLoading:self]; } @@ -312,6 +360,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) From e8da7baee2078e56cab09eef406f2ef1f1b2a1a3 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Thu, 1 Oct 2015 13:19:40 +0200 Subject: [PATCH 2/3] Perform operation on network error (try/catch). --- Foundation/CPURLConnection.j | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index d1b9a6838..52df11606 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -274,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]; } /* @@ -340,10 +342,10 @@ var CPURLConnectionDelegate = nil; if (!_isCanceled) { - if (_connectionOperation !== nil) - [self _connectionOperationDidReceiveResponse:response data:_HTTPRequest.responseText() error:nil]; - else if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) + 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]; From 13e1be1f7472fc55ee0d1057e528ecf2ad7554c4 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Wed, 7 Oct 2015 11:48:34 +0200 Subject: [PATCH 3/3] CPURLConnectionAsyncTest manual test. --- .../CPURLConnectionAsyncTest/AppController.j | 212 ++++++++++++++++++ .../CPURLConnectionAsyncTest/Info.plist | 10 + .../Manual/CPURLConnectionAsyncTest/Jakefile | 94 ++++++++ .../Resources/MainMenu.cib | 1 + .../Resources/MainMenu.xib | 121 ++++++++++ .../Resources/delayed.php | 17 ++ .../Resources/spinner.gif | Bin 0 -> 1849 bytes .../CPURLConnectionAsyncTest/index-debug.html | 103 +++++++++ .../CPURLConnectionAsyncTest/index.html | 77 +++++++ Tests/Manual/CPURLConnectionAsyncTest/main.j | 18 ++ 10 files changed, 653 insertions(+) create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/AppController.j create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/Info.plist create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/Jakefile create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/Resources/MainMenu.xib create mode 100755 Tests/Manual/CPURLConnectionAsyncTest/Resources/delayed.php create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/Resources/spinner.gif create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/index-debug.html create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/index.html create mode 100644 Tests/Manual/CPURLConnectionAsyncTest/main.j 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 0000000000000000000000000000000000000000..06dbc2bc21dddcf0e09b566d5b211aee89570f52 GIT binary patch literal 1849 zcma*odr(tX9tZHtz31lM+(&Y`A`Ou`NeG&R#DrIfV%?hng21vs6v>ooRQQFbk7E_K!V( z{?5!fpZWgIZ%*d6t%i*j24bL}AZUJm9)h6R*;%L4IWse3G#VWaN1#$zSSXcBhlYlH zJ|D}n{r&w2f+Qp)SS*&n?*G4}{}!h?td_mjU6Kad-rW*QwWYCUk7d^e+sjpZAn6kT z5rM;`{~_}-wm+L@%+E;JphLm}C3WzQAQD0wBoY|rOTQX{(@pp-WAA8Iw0HKl|15j) zhGh(SFWu#5zUCw^T!}C~eC}~?{xG-r7ugQC>taC+|L^xr&a%{#cgUOZXIM&v?)k^2 z1i5%0!U00wq)r4vlAwXBA_m5J5WNeuBm-XJQ5pG4GD%vc|K){+TJ{AkHqN@SJKczX zU}QRd9n*_bf^h94)6Ctv{CUfz_;qs#RDuQ$DR%y1&5G-a6rhf*4Y zl+UOD1*GE{GQ7vv;c-tTIMkz0ovO>9j%b5hpa@a*CBJ#W!0@ndSwF|%hMkdFtXiU) z`BEp+yhkt8ZY>tg&uyH@%^%K4jDrbA;et&vnnzZ3z22@e6<27z2Vk13kb7OtISyxv z(XoO-LNQCZe3lfzc%*pNqU<9T+p~teThOEB+~e&U0mC|zS{Q)dJZ)!^1f7L(zg*L> z*vSW%?dR~@@0(}x6-V^A`~ImD;)NaBUnP8;RH=bS2@pk`wp>>8r&jGjmGPy%1BW}v zoPo}ca$~bze@efc3kapuEVW1!%teOZT3j2Tw5=hjiAf02d}7dL0oFC%@=RXp5Ow#% z@a>+AM|YWt$n&e`>sB-32gBcuTi>R>*|8@lp`y6thc7ydyqDsuUn~YzZf|{-R@-3y zL#wx{Ii}xxL_csiW*LBn0-A$>zp4WOmkf6=ilrjlW?-l9+bCd7|i?*b5NTmy<<6NZ0T8$SN@mwdC2f z6jqK=N@bS@!=YSj%>h0}*4p+%0HbTIrE$w7UMT6+AZZ&DAo*qZAAi(OtNbIfl#Dw^ zJWeiCp~zi#&t6x}m9)O^eR4HiLV3QA<<0>HZ8%$^lrSE94Wb}=+MM^!b>n#5&-JQR zkr-CEu9C;_F*7DqDisulV6Pmg$nFL0TPn%~*m^-`Z3^BgU(sNpnx%nW(!eV9A&FvI zHL3X3lw8Wji^6=8KbQDE-e%b?svdFxxdh$8r97@7$ojeI`6AL8Ob6QC$qh&>ZWVDX1F{0vJnT%%mE;GveKWR%C} zM&4d;Jf3s9|HAA)yVUPo`Aq;0do#)uHSXi5*QF*)x@MVVHr+cN)uMZ__F|&Ta#p8d z53TOKtce!PJUuie8UWol-S(`c2nH?UGqJP{!4RR4u$LCfn)q-hj0^f=h(VYy)T6eN zhRO!ja-aDBTcgeyP(8Ua4IdiOog^*CQa?R(cP#9AgL9`j>EX-6Yf1lzX(!~``M1XC zNmM<4<6d~wWZ$Xrk0K}UteTrq@LBBk#MsjkK;pbuVhe)NI7(7Pf(l?lxC7=1Z7Pzl zMbS;nV4NI5_N{1$P)&XC)huOGQ+h^zpYUZfb*1n6>!`#*b3y52LGmi+<4sY5jyD#- zw&$d}DTguLAfnRtjrM*JfqtHqUu6rQoU=g%1E9xk%;)TDm^2<8n-0IhTsQFaek)MY}>PK4;nBk=ow4pF>vzkO& gna%Org-kgQCf=+BeMi^RbuY;YE~rTjend;_cdi8t>i_@% literal 0 HcmV?d00001 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); +}