Permalink
Browse files

Changed resume progress behaviour so that the resumed part of a downl…

…oad is included in the progress update

Removed sharedNetworkQueue - thinking about it, this is potentially dangerous
  • Loading branch information...
1 parent 23f06a5 commit 26fa4d46834099001c941042362307e179729182 @pokeb committed Mar 22, 2009
View
4 Classes/ASIHTTPRequest.h
@@ -122,6 +122,9 @@ typedef enum _ASINetworkErrorType {
// Size of the response
unsigned long long contentLength;
+ // Size of the partially downloaded content
+ unsigned long long partialDownloadSize;
+
// Size of the POST payload
unsigned long long postLength;
@@ -335,6 +338,7 @@ typedef enum _ASINetworkErrorType {
@property (retain) NSString *requestMethod;
@property (retain,setter=setPostBody:) NSData *postBody;
@property (assign) unsigned long long contentLength;
+@property (assign) unsigned long long partialDownloadSize;
@property (assign) unsigned long long postLength;
@property (assign) BOOL shouldResetProgressIndicators;
@property (retain) ASIHTTPRequest *mainRequest;
View
15 Classes/ASIHTTPRequest.m
@@ -79,6 +79,8 @@ - (id)initWithURL:(NSURL *)newURL
[self setAllowCompressedResponse:YES];
[self setDefaultResponseEncoding:NSISOLatin1StringEncoding];
[self setUploadBufferSize:0];
+ [self setContentLength:0];
+ [self setPartialDownloadSize:0];
[self setResponseHeaders:nil];
[self setTimeOutSeconds:10];
[self setAllowResumeForFileDownloads:NO];
@@ -277,8 +279,8 @@ - (void)main
// Should this request resume an existing download?
if ([self allowResumeForFileDownloads] && [self downloadDestinationPath] && [self temporaryFileDownloadPath] && [[NSFileManager defaultManager] fileExistsAtPath:[self temporaryFileDownloadPath]]) {
- unsigned long long downloadedSoFar = [[[NSFileManager defaultManager] fileAttributesAtPath:[self temporaryFileDownloadPath] traverseLink:NO] fileSize];
- [self addRequestHeader:@"Range" value:[NSString stringWithFormat:@"bytes=%llu-",downloadedSoFar]];
+ [self setPartialDownloadSize:[[[NSFileManager defaultManager] fileAttributesAtPath:[self temporaryFileDownloadPath] traverseLink:NO] fileSize]];
+ [self addRequestHeader:@"Range" value:[NSString stringWithFormat:@"bytes=%llu-",partialDownloadSize]];
}
// Add custom headers
@@ -622,7 +624,7 @@ - (void)updateDownloadProgress
// We won't update download progress until we've examined the headers, since we might need to authenticate
if (responseHeaders) {
- unsigned long long bytesReadSoFar = totalBytesRead;
+ unsigned long long bytesReadSoFar = totalBytesRead+partialDownloadSize;
if (bytesReadSoFar > lastBytesRead) {
[self setLastActivityTime:[NSDate date]];
@@ -644,8 +646,6 @@ - (void)updateDownloadProgress
updatedProgress = YES;
}
-
-
SEL selector = @selector(incrementDownloadProgressBy:);
NSMethodSignature *signature = [[downloadProgressDelegate class] instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
@@ -658,7 +658,7 @@ - (void)updateDownloadProgress
// We aren't using a queue, we should just set progress of the indicator to 0
} else if (contentLength > 0) {
- [ASIHTTPRequest setProgress:(double)(1.0*bytesReadSoFar/contentLength) forProgressIndicator:downloadProgressDelegate];
+ [ASIHTTPRequest setProgress:(double)(1.0*bytesReadSoFar/(contentLength+partialDownloadSize)) forProgressIndicator:downloadProgressDelegate];
}
}
@@ -789,7 +789,7 @@ - (BOOL)readResponseHeadersReturningAuthenticationFailure
[mainRequest setContentLength:contentLength];
}
if (downloadProgressDelegate && showAccurateProgress && shouldResetProgressIndicators) {
- [self resetDownloadProgress:contentLength];
+ [self resetDownloadProgress:contentLength+partialDownloadSize];
}
}
@@ -1453,6 +1453,7 @@ + (int)uncompressZippedDataFromSource:(FILE *)source toDestination:(FILE *)dest
@synthesize requestMethod;
@synthesize postBody;
@synthesize contentLength;
+@synthesize partialDownloadSize;
@synthesize postLength;
@synthesize shouldResetProgressIndicators;
@synthesize mainRequest;
View
2 Classes/ASINetworkQueue.h
@@ -83,8 +83,6 @@
// This method will start the queue
- (void)go;
-// A globally available network queue, created the first time it is requested
-+ (ASINetworkQueue *)sharedNetworkQueue;
@property (assign,setter=setUploadProgressDelegate:) id uploadProgressDelegate;
@property (assign,setter=setDownloadProgressDelegate:) id downloadProgressDelegate;
View
14 Classes/ASINetworkQueue.m
@@ -140,13 +140,6 @@ - (void)addOperation:(NSOperation *)operation
if ([[request requestMethod] isEqualToString:@"GET"]) {
ASIHTTPRequest *HEADRequest = [[[ASIHTTPRequest alloc] initWithURL:[request url]] autorelease];
[HEADRequest setMainRequest:request];
-
- //If we're downloading to a file, and we already have a partial download to start from
- if ([request allowResumeForFileDownloads] && [request downloadDestinationPath] && [request temporaryFileDownloadPath] && [[NSFileManager defaultManager] fileExistsAtPath:[request temporaryFileDownloadPath]]) {
- unsigned long long downloadedSoFar = [[[NSFileManager defaultManager] fileAttributesAtPath:[request temporaryFileDownloadPath] traverseLink:NO] fileSize];
- [HEADRequest addRequestHeader:@"Range" value:[NSString stringWithFormat:@"bytes=%llu-",downloadedSoFar]];
- }
-
[self addHEADOperation:HEADRequest];
//Tell the request not to reset the progress indicator when it gets a content-length, as we will get the length from the HEAD request
@@ -289,13 +282,6 @@ - (BOOL)respondsToSelector:(SEL)selector
}
-+ (ASINetworkQueue *)sharedNetworkQueue
-{
- if (!sharedNetworkQueue) {
- sharedNetworkQueue = [[ASINetworkQueue alloc] init];
- }
- return sharedNetworkQueue;
-}
@synthesize uploadProgressDelegate;
View
1 Classes/Tests/ASIFormDataRequestTests.m
@@ -11,7 +11,6 @@
@implementation ASIFormDataRequestTests
-
- (void)testPostWithFileUpload
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/post"];
View
6 Classes/Tests/ASIHTTPRequestTests.m
@@ -511,12 +511,15 @@ - (void)testPartialFetch
NSString *partialContent = @"This file should be exactly 163 bytes long when encoded as UTF8, Unix line breaks with no BOM.\n";
[partialContent writeToFile:tempPath atomically:NO encoding:NSASCIIStringEncoding error:nil];
+ progress = 0;
NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com/ASIHTTPRequest/Tests/test_partial_download.txt"] autorelease];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];
[request setDownloadDestinationPath:downloadPath];
[request setTemporaryFileDownloadPath:tempPath];
[request setAllowResumeForFileDownloads:YES];
+ [request setDownloadProgressDelegate:self];
[request start];
+
BOOL success = ([request contentLength] == 68);
GHAssertTrue(success,@"Failed to download a segment of the data");
@@ -527,6 +530,9 @@ - (void)testPartialFetch
success = ([newPartialContent isEqualToString:@"This is the content we ought to be getting if we start from byte 95."]);
GHAssertTrue(success,@"Failed to append the correct data to the end of the file?");
+ success = (progress == 1);
+ GHAssertTrue(success,@"Failed to correctly display increment progress for a partial download");
}
+
@end
View
37 Classes/Tests/ASINetworkQueueTests.m
@@ -13,8 +13,6 @@
@implementation ASINetworkQueueTests
-static CFStringRef ASIHTTPRequestTestsRunMode = CFSTR("ASIHTTPRequestTestsRunMode");
-
- (void)testProgress
{
complete = NO;
@@ -40,10 +38,10 @@ - (void)testProgress
[networkQueue addOperation:request3];
[networkQueue go];
-
- while (!complete) {
- CFRunLoopRunInMode(ASIHTTPRequestTestsRunMode,0.25,YES);
- }
+
+ while (!complete) {
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
+ }
BOOL success = (progress == 1.0);
GHAssertTrue(success,@"Failed to increment progress properly");
@@ -80,7 +78,7 @@ - (void)testProgress
}
-
+
- (void)setProgress:(float)newProgress
{
@@ -213,6 +211,7 @@ - (void)queueFinished:(ASINetworkQueue *)queue
}
+
- (void)testProgressWithAuthentication
{
complete = NO;
@@ -234,7 +233,7 @@ - (void)testProgressWithAuthentication
while (!complete) {
- CFRunLoopRunInMode(ASIHTTPRequestTestsRunMode,0.25,YES);
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
NSError *error = [request error];
@@ -256,7 +255,7 @@ - (void)testProgressWithAuthentication
[networkQueue go];
while (!complete) {
- CFRunLoopRunInMode(ASIHTTPRequestTestsRunMode,0.25,YES);
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
error = [request error];
@@ -265,6 +264,8 @@ - (void)testProgressWithAuthentication
}
+
+
- (void)requestFailedExpectedly:(ASIHTTPRequest *)request
{
request_didfail = YES;
@@ -306,6 +307,7 @@ - (void)testWithNoListener
- (void)testPartialResume
{
complete = NO;
+ progress = 0;
NSString *temporaryPath = [[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip.download"];
if ([[NSFileManager defaultManager] fileExistsAtPath:temporaryPath]) {
@@ -339,8 +341,13 @@ - (void)testPartialResume
[networkQueue release];
networkQueue = [[ASINetworkQueue alloc] init];
+ [networkQueue setDownloadProgressDelegate:self];
+ [networkQueue setShowAccurateProgress:YES];
+ [networkQueue setDelegate:self];
+ [networkQueue setQueueDidFinishSelector:@selector(queueFinished:)];
-
+ complete = NO;
+ progress = 0;
unsigned long long downloadedSoFar = [[[NSFileManager defaultManager] fileAttributesAtPath:temporaryPath traverseLink:NO] fileSize];
BOOL success = (downloadedSoFar > 0);
GHAssertTrue(success,@"Failed to download part of the file, so we can't proceed with this test");
@@ -351,14 +358,19 @@ - (void)testPartialResume
[request setAllowResumeForFileDownloads:YES];
[networkQueue addOperation:request];
+
[networkQueue go];
-
- [networkQueue waitUntilAllOperationsAreFinished];
+
+ while (!complete) {
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
+ }
unsigned long long amountDownloaded = [[[NSFileManager defaultManager] fileAttributesAtPath:downloadPath traverseLink:NO] fileSize];
success = (amountDownloaded == 9145357);
GHAssertTrue(success,@"Failed to complete the download");
+ success = (progress == 1.0);
+ GHAssertTrue(success,@"Failed to increment progress properly");
[networkQueue release];
@@ -372,4 +384,5 @@ - (void)stopQueue:(id)sender
}
+
@end
View
6 Mac Sample/AppDelegate.h
@@ -29,11 +29,15 @@
IBOutlet NSImageView *imageView1;
IBOutlet NSImageView *imageView2;
IBOutlet NSImageView *imageView3;
+
+ IBOutlet NSButton *startButton;
+ IBOutlet NSButton *resumeButton;
}
- (IBAction)simpleURLFetch:(id)sender;
- (IBAction)URLFetchWithProgress:(id)sender;
-
+- (IBAction)stopURLFetchWithProgress:(id)sender;
+- (IBAction)resumeURLFetchWithProgress:(id)sender;
- (IBAction)fetchThreeImages:(id)sender;
View
30 Mac Sample/AppDelegate.m
@@ -42,6 +42,32 @@ - (IBAction)simpleURLFetch:(id)sender
- (IBAction)URLFetchWithProgress:(id)sender
{
+ [startButton setTitle:@"Stop"];
+ [startButton setAction:@selector(stopURLFetchWithProgress:)];
+
+ NSString *tempFile = [[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip.download"];
+ if ([[NSFileManager defaultManager] fileExistsAtPath:tempFile]) {
+ [[NSFileManager defaultManager] removeItemAtPath:tempFile error:nil];
+ }
+
+ [self resumeURLFetchWithProgress:self];
+}
+
+
+- (IBAction)stopURLFetchWithProgress:(id)sender
+{
+ [startButton setTitle:@"Start"];
+ [startButton setAction:@selector(URLFetchWithProgress:)];
+ [networkQueue cancelAllOperations];
+ [resumeButton setEnabled:YES];
+}
+
+- (IBAction)resumeURLFetchWithProgress:(id)sender
+{
+ [resumeButton setEnabled:NO];
+ [startButton setTitle:@"Stop"];
+ [startButton setAction:@selector(stopURLFetchWithProgress:)];
+
[networkQueue cancelAllOperations];
[networkQueue setShowAccurateProgress:YES];
[networkQueue setDownloadProgressDelegate:progressIndicator];
@@ -50,6 +76,8 @@ - (IBAction)URLFetchWithProgress:(id)sender
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://trails-network.net/Downloads/MemexTrails_1.0b1.zip"]] autorelease];
[request setDownloadDestinationPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip"]];
+ [request setTemporaryFileDownloadPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip.download"]];
+ [request setAllowResumeForFileDownloads:YES];
[networkQueue addOperation:request];
[networkQueue go];
}
@@ -61,6 +89,8 @@ - (void)URLFetchWithProgressComplete:(ASIHTTPRequest *)request
} else {
[fileLocation setStringValue:[NSString stringWithFormat:@"File downloaded to %@",[request downloadDestinationPath]]];
}
+ [startButton setTitle:@"Start"];
+ [startButton setAction:@selector(URLFetchWithProgress:)];
}
- (IBAction)fetchThreeImages:(id)sender
View
148 Mac Sample/English.lproj/MainMenu.xib
@@ -8,7 +8,7 @@
<string key="IBDocument.HIToolboxVersion">353.00</string>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="444"/>
+ <integer value="372"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -998,20 +998,20 @@ cmVhZC4</string>
<object class="NSTabViewItem" id="851846996">
<string key="NSIdentifier">2</string>
<object class="NSView" key="NSView" id="439832260">
- <nil key="NSNextResponder"/>
+ <reference key="NSNextResponder" ref="495298985"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSButton" id="965613416">
<reference key="NSNextResponder" ref="439832260"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{11, 161}, {62, 32}}</string>
+ <string key="NSFrame">{{11, 98}, {74, 32}}</string>
<reference key="NSSuperview" ref="439832260"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="621876787">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134217728</int>
- <string key="NSContents">Go!</string>
+ <string key="NSContents">Start</string>
<reference key="NSSupport" ref="584670792"/>
<reference key="NSControlView" ref="965613416"/>
<int key="NSButtonFlags">-2038284033</int>
@@ -1022,16 +1022,39 @@ cmVhZC4</string>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
+ <object class="NSButton" id="108683710">
+ <reference key="NSNextResponder" ref="439832260"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{85, 98}, {90, 32}}</string>
+ <reference key="NSSuperview" ref="439832260"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="492130991">
+ <int key="NSCellFlags">604110336</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Resume</string>
+ <reference key="NSSupport" ref="584670792"/>
+ <reference key="NSControlView" ref="108683710"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
<object class="NSTextField" id="908965746">
<reference key="NSNextResponder" ref="439832260"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{14, 196}, {405, 40}}</string>
+ <string key="NSFrame">{{14, 144}, {405, 92}}</string>
<reference key="NSSuperview" ref="439832260"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1014251870">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
- <string key="NSContents">Demonstrates fetching a large file directly to disk, updating the progress bar below to show how much has been downloaded.</string>
+ <string type="base64-UTF8" key="NSContents">RGVtb25zdHJhdGVzIGZldGNoaW5nIGEgbGFyZ2UgZmlsZSBkaXJlY3RseSB0byBkaXNrLCB1cGRhdGlu
+ZyB0aGUgcHJvZ3Jlc3MgYmFyIGJlbG93IHRvIHNob3cgaG93IG11Y2ggaGFzIGJlZW4gZG93bmxvYWRl
+ZC4KCklmIHRoZSByZXF1ZXN0IGlzIHN0b3BwZWQgcGFydCB3YXkgdGhyb3VnaCwgdXNlIHRoZSByZXN1
+bWUgYnV0dG9uIHRvIHBpY2sgdXAgd2hlcmUgd2UgbGVmdCBvZmYuA</string>
<reference key="NSSupport" ref="584670792"/>
<reference key="NSControlView" ref="908965746"/>
<reference key="NSBackgroundColor" ref="482475293"/>
@@ -1041,7 +1064,7 @@ cmVhZC4</string>
<object class="NSTextField" id="530508561">
<reference key="NSNextResponder" ref="439832260"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{14, 112}, {405, 40}}</string>
+ <string key="NSFrame">{{14, 52}, {405, 40}}</string>
<reference key="NSSuperview" ref="439832260"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="117831065">
@@ -1056,6 +1079,7 @@ cmVhZC4</string>
</object>
</object>
<string key="NSFrame">{{10, 33}, {441, 243}}</string>
+ <reference key="NSSuperview" ref="495298985"/>
</object>
<string key="NSLabel">File</string>
<reference key="NSColor" ref="482475293"/>
@@ -1331,7 +1355,7 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<object class="NSTabViewItem" id="409502867">
<string key="NSIdentifier">Item 4</string>
<object class="NSView" key="NSView" id="408528501">
- <reference key="NSNextResponder" ref="495298985"/>
+ <nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1373,21 +1397,20 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
</object>
</object>
<string key="NSFrame">{{10, 33}, {441, 243}}</string>
- <reference key="NSSuperview" ref="495298985"/>
</object>
<string key="NSLabel">Upload</string>
<reference key="NSColor" ref="482475293"/>
<reference key="NSTabView" ref="495298985"/>
</object>
</object>
- <reference key="NSSelectedTabViewItem" ref="409502867"/>
+ <reference key="NSSelectedTabViewItem" ref="851846996"/>
<reference key="NSFont" ref="584670792"/>
<int key="NSTvFlags">0</int>
<bool key="NSAllowTruncatedLabels">YES</bool>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="408528501"/>
+ <reference ref="439832260"/>
</object>
</object>
</object>
@@ -2093,6 +2116,30 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
</object>
<int key="connectionID">515</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">resumeButton</string>
+ <reference key="source" ref="1010338297"/>
+ <reference key="destination" ref="108683710"/>
+ </object>
+ <int key="connectionID">522</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">startButton</string>
+ <reference key="source" ref="1010338297"/>
+ <reference key="destination" ref="965613416"/>
+ </object>
+ <int key="connectionID">523</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">resumeURLFetchWithProgress:</string>
+ <reference key="source" ref="1010338297"/>
+ <reference key="destination" ref="108683710"/>
+ </object>
+ <int key="connectionID">524</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -2918,8 +2965,9 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="908965746"/>
- <reference ref="965613416"/>
<reference ref="530508561"/>
+ <reference ref="965613416"/>
+ <reference ref="108683710"/>
</object>
<reference key="parent" ref="851846996"/>
</object>
@@ -3285,6 +3333,20 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<reference key="object" ref="588048761"/>
<reference key="parent" ref="986741348"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">520</int>
+ <reference key="object" ref="108683710"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="492130991"/>
+ </object>
+ <reference key="parent" ref="439832260"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">521</int>
+ <reference key="object" ref="492130991"/>
+ <reference key="parent" ref="108683710"/>
+ </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -3513,6 +3575,8 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<string>505.IBPluginDependency</string>
<string>513.IBPluginDependency</string>
<string>514.IBPluginDependency</string>
+ <string>520.IBPluginDependency</string>
+ <string>521.IBPluginDependency</string>
<string>56.IBPluginDependency</string>
<string>56.ImportedFromIB2</string>
<string>57.IBPluginDependency</string>
@@ -3771,6 +3835,8 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="9"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="9"/>
@@ -3824,7 +3890,7 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">515</int>
+ <int key="maxID">524</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -3841,7 +3907,9 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<string>fetchThreeImages:</string>
<string>fetchTopSecretInformation:</string>
<string>postWithProgress:</string>
+ <string>resumeURLFetchWithProgress:</string>
<string>simpleURLFetch:</string>
+ <string>stopURLFetchWithProgress:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3851,6 +3919,8 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<string>id</string>
<string>id</string>
<string>id</string>
+ <string>id</string>
+ <string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
@@ -3868,7 +3938,9 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<string>password</string>
<string>progressIndicator</string>
<string>realm</string>
+ <string>resumeButton</string>
<string>showAccurateProgress</string>
+ <string>startButton</string>
<string>topSecretInfo</string>
<string>username</string>
<string>window</string>
@@ -3887,20 +3959,66 @@ c3N3b3JkLCBlbnRlciAndG9wc2VjcmV0JyBmb3IgYm90aC4</string>
<string>NSProgressIndicator</string>
<string>NSTextField</string>
<string>NSButton</string>
+ <string>NSButton</string>
+ <string>NSButton</string>
<string>NSTextField</string>
<string>NSTextField</string>
<string>NSWindow</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
- <string key="minorKey">AppDelegate.h</string>
+ <string key="minorKey">Mac Sample/AppDelegate.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">GHTestViewController</string>
+ <string key="superclassName">NSViewController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">copy:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>detailsView</string>
+ <string>outlineView</string>
+ <string>progressIndicator</string>
+ <string>splitView</string>
+ <string>statusLabel</string>
+ <string>statusView</string>
+ <string>textSegmentedControl</string>
+ <string>textView</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSView</string>
+ <string>NSOutlineView</string>
+ <string>NSProgressIndicator</string>
+ <string>NSSplitView</string>
+ <string>NSTextField</string>
+ <string>NSView</string>
+ <string>NSSegmentedControl</string>
+ <string>NSTextView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../Downloads/gabriel-gh-unit-02ab4e28177c2b63a9aaddafbd9b43a5c53f042b/Classes-MacOSX/UI/GHTestViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../Downloads/gabriel-gh-unit-02ab4e28177c2b63a9aaddafbd9b43a5c53f042b/Libraries/GHKit/GHNSObject+Invocation.h</string>
</object>
</object>
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.LastKnownRelativeProjectPath">../asi-http-request.xcodeproj</string>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../../Mac.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
</data>
</archive>

0 comments on commit 26fa4d4

Please sign in to comment.