From 9a5eca3984d4f14c1171e293069e02bf98bcc9a3 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Sun, 15 Dec 2013 18:32:16 +0000 Subject: [PATCH 01/15] Inform file manager's delegate of the operation that is adding to the transcript --- ConnectionKit/CK2FileManager.h | 4 +++- ConnectionKit/CK2FileOperation.m | 2 +- ConnectionKit/CK2OpenPanelController.m | 2 +- ConnectionKit/CKUploader.m | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ConnectionKit/CK2FileManager.h b/ConnectionKit/CK2FileManager.h index d1612624c..c8050d772 100644 --- a/ConnectionKit/CK2FileManager.h +++ b/ConnectionKit/CK2FileManager.h @@ -445,7 +445,9 @@ typedef NS_ENUM(NSUInteger, CK2TranscriptType) { @param info The received transcript line(s). Should end in a newline character. @param transcript The type of transcript received. */ -- (void)fileManager:(CK2FileManager *)manager appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation + appendString:(NSString *)info + toTranscript:(CK2TranscriptType)transcript; /** * Sent as the last message related to a specific operation. Error may be diff --git a/ConnectionKit/CK2FileOperation.m b/ConnectionKit/CK2FileOperation.m index 80bb35bcf..c52b3d7d9 100644 --- a/ConnectionKit/CK2FileOperation.m +++ b/ConnectionKit/CK2FileOperation.m @@ -544,7 +544,7 @@ - (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscr // Pass straight onto delegate and trust it not to take too long handling it // We used to dispatch off onto one of the global queues, but that does have the nasty downside of messages sometimes arriving out-of-order or concurrently [self tryToMessageDelegateSelector:@selector(fileManager:appendString:toTranscript:) usingBlock:^(id delegate) { - [delegate fileManager:self.fileManager appendString:info toTranscript:transcript]; + [delegate fileManager:self.fileManager operation:self appendString:info toTranscript:transcript]; }]; } diff --git a/ConnectionKit/CK2OpenPanelController.m b/ConnectionKit/CK2OpenPanelController.m index 210dd4b6f..e7fe064e8 100644 --- a/ConnectionKit/CK2OpenPanelController.m +++ b/ConnectionKit/CK2OpenPanelController.m @@ -1215,7 +1215,7 @@ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)oper } } -- (void)fileManager:(CK2FileManager *)manager appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; { id delegate; diff --git a/ConnectionKit/CKUploader.m b/ConnectionKit/CKUploader.m index f9f43a081..75a1b31d4 100644 --- a/ConnectionKit/CKUploader.m +++ b/ConnectionKit/CKUploader.m @@ -433,7 +433,7 @@ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)oper } } -- (void)fileManager:(CK2FileManager *)manager appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; { [[self delegate] uploader:self appendString:info toTranscript:transcript]; } From 1bab8a294cb3ecdc7c7d8c3eaa3588725b4ee901 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Mon, 16 Dec 2013 09:22:58 +0000 Subject: [PATCH 02/15] Update delegate check too! --- ConnectionKit/CK2FileOperation.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ConnectionKit/CK2FileOperation.m b/ConnectionKit/CK2FileOperation.m index c52b3d7d9..43db4eee2 100644 --- a/ConnectionKit/CK2FileOperation.m +++ b/ConnectionKit/CK2FileOperation.m @@ -543,7 +543,7 @@ - (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscr // Pass straight onto delegate and trust it not to take too long handling it // We used to dispatch off onto one of the global queues, but that does have the nasty downside of messages sometimes arriving out-of-order or concurrently - [self tryToMessageDelegateSelector:@selector(fileManager:appendString:toTranscript:) usingBlock:^(id delegate) { + [self tryToMessageDelegateSelector:@selector(fileManager:operation:appendString:toTranscript:) usingBlock:^(id delegate) { [delegate fileManager:self.fileManager operation:self appendString:info toTranscript:transcript]; }]; } From 7356b3ba8ed8692e7398618609f9ea7273007184 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Mon, 16 Dec 2013 13:58:16 +0000 Subject: [PATCH 03/15] Switch transcript type over to be NSString --- ConnectionKit/CK2CURLBasedProtocol.m | 10 +++++----- ConnectionKit/CK2FileManager.h | 10 ++++------ ConnectionKit/CK2FileManager.m | 4 ++++ ConnectionKit/CK2FileOperation.m | 2 +- ConnectionKit/CK2OpenPanel.h | 2 +- ConnectionKit/CK2OpenPanelController.m | 2 +- ConnectionKit/CK2Protocol.h | 2 +- ConnectionKit/CKUploader.h | 2 +- ConnectionKit/CKUploader.m | 2 +- 9 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ConnectionKit/CK2CURLBasedProtocol.m b/ConnectionKit/CK2CURLBasedProtocol.m index 2ba2d837e..716948e59 100644 --- a/ConnectionKit/CK2CURLBasedProtocol.m +++ b/ConnectionKit/CK2CURLBasedProtocol.m @@ -685,26 +685,26 @@ - (void)transfer:(CURLTransfer *)transfer didCompleteWithError:(NSError *)error; - (void)transfer:(CURLTransfer *)transfer didReceiveDebugInformation:(NSString *)string ofType:(curl_infotype)type; { - CK2TranscriptType ckType; + NSString *transcript; switch (type) { case CURLINFO_HEADER_IN: - ckType = CK2TranscriptHeaderIn; + transcript = CK2TranscriptHeaderIn; break; case CURLINFO_HEADER_OUT: - ckType = CK2TranscriptHeaderOut; + transcript = CK2TranscriptHeaderOut; break; case CURLINFO_TEXT: - ckType = CK2TranscriptText; + transcript = CK2TranscriptText; break; default: return; } - [[self client] protocol:self appendString:string toTranscript:ckType]; + [[self client] protocol:self appendString:string toTranscript:transcript]; } #pragma mark Customization diff --git a/ConnectionKit/CK2FileManager.h b/ConnectionKit/CK2FileManager.h index c8050d772..89659347f 100644 --- a/ConnectionKit/CK2FileManager.h +++ b/ConnectionKit/CK2FileManager.h @@ -432,11 +432,9 @@ typedef NS_ENUM(NSInteger, CK2AuthChallengeDisposition) { totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToSend; -typedef NS_ENUM(NSUInteger, CK2TranscriptType) { - CK2TranscriptText, - CK2TranscriptHeaderIn, - CK2TranscriptHeaderOut, -}; // deliberately aligned with curl_infotype for convenience +extern NSString * const CK2TranscriptText; +extern NSString * const CK2TranscriptHeaderIn; +extern NSString * const CK2TranscriptHeaderOut; /** Reports received transcript info. @@ -447,7 +445,7 @@ typedef NS_ENUM(NSUInteger, CK2TranscriptType) { */ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info - toTranscript:(CK2TranscriptType)transcript; + toTranscript:(NSString *)transcript; /** * Sent as the last message related to a specific operation. Error may be diff --git a/ConnectionKit/CK2FileManager.m b/ConnectionKit/CK2FileManager.m index 7cb7f6abd..ebeeec628 100644 --- a/ConnectionKit/CK2FileManager.m +++ b/ConnectionKit/CK2FileManager.m @@ -15,6 +15,10 @@ NSString * const CK2FileMIMEType = @"CK2FileMIMEType"; +NSString * const CK2TranscriptText = @"Info"; +NSString * const CK2TranscriptHeaderIn = @"Received"; +NSString * const CK2TranscriptHeaderOut = @"Sent"; + #pragma mark - diff --git a/ConnectionKit/CK2FileOperation.m b/ConnectionKit/CK2FileOperation.m index 43db4eee2..e4f7b534f 100644 --- a/ConnectionKit/CK2FileOperation.m +++ b/ConnectionKit/CK2FileOperation.m @@ -536,7 +536,7 @@ - (void)protocol:(CK2Protocol *)protocol didReceiveChallenge:(NSURLAuthenticatio // TODO: Cache credentials per protection space } -- (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscript:(NSString *)transcript; { NSAssert(protocol == _protocol, @"Message received from unexpected protocol: %@ (should be %@)", protocol, _protocol); diff --git a/ConnectionKit/CK2OpenPanel.h b/ConnectionKit/CK2OpenPanel.h index ffdc6888f..40c77b799 100644 --- a/ConnectionKit/CK2OpenPanel.h +++ b/ConnectionKit/CK2OpenPanel.h @@ -179,7 +179,7 @@ - (void)panelSelectionDidChange:(CK2OpenPanel *)sender; - (void)panel:(CK2OpenPanel *)sender didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(CK2AuthChallengeDisposition, NSURLCredential *))completionHandler; -- (void)panel:(CK2OpenPanel *)sender appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)panel:(CK2OpenPanel *)sender appendString:(NSString *)info toTranscript:(NSString *)transcript; - (void)panel:(CK2OpenPanel *)sender didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge __attribute((deprecated("implement -panel:didReceiveChallenge:completionHandler instead"))); diff --git a/ConnectionKit/CK2OpenPanelController.m b/ConnectionKit/CK2OpenPanelController.m index e7fe064e8..7c04db54e 100644 --- a/ConnectionKit/CK2OpenPanelController.m +++ b/ConnectionKit/CK2OpenPanelController.m @@ -1215,7 +1215,7 @@ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)oper } } -- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(NSString *)transcript; { id delegate; diff --git a/ConnectionKit/CK2Protocol.h b/ConnectionKit/CK2Protocol.h index edb646053..5a111ae69 100644 --- a/ConnectionKit/CK2Protocol.h +++ b/ConnectionKit/CK2Protocol.h @@ -162,7 +162,7 @@ */ - (void)protocol:(CK2Protocol *)protocol didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(CK2AuthChallengeDisposition, NSURLCredential*))completionHandler; -- (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscript:(NSString *)transcript; #pragma mark Operation-Specific diff --git a/ConnectionKit/CKUploader.h b/ConnectionKit/CKUploader.h index 86d4041f9..27ed6d67b 100644 --- a/ConnectionKit/CKUploader.h +++ b/ConnectionKit/CKUploader.h @@ -91,7 +91,7 @@ typedef NSUInteger CKUploadingOptions; @required - (void)uploader:(CKUploader *)uploader didBeginUploadToPath:(NSString *)path; -- (void)uploader:(CKUploader *)uploader appendString:(NSString *)string toTranscript:(CK2TranscriptType)transcript; +- (void)uploader:(CKUploader *)uploader appendString:(NSString *)string toTranscript:(NSString *)transcript; @optional - (void)uploader:(CKUploader *)uploader transferRecord:(CKTransferRecord *)record diff --git a/ConnectionKit/CKUploader.m b/ConnectionKit/CKUploader.m index 75a1b31d4..f59733fed 100644 --- a/ConnectionKit/CKUploader.m +++ b/ConnectionKit/CKUploader.m @@ -433,7 +433,7 @@ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)oper } } -- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(CK2TranscriptType)transcript; +- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(NSString *)transcript; { [[self delegate] uploader:self appendString:info toTranscript:transcript]; } From 306828b86fb3f916400e28660421b929e69da0c7 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 12:37:56 +0000 Subject: [PATCH 04/15] First pass at CK2Transcript (and Entry) Existing transcript info is dumped into there too --- Connection.xcodeproj/project.pbxproj | 8 ++ ConnectionKit/CK2FileOperation.m | 3 + ConnectionKit/CK2Transcript.h | 62 ++++++++++++++ ConnectionKit/CK2Transcript.m | 118 +++++++++++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 ConnectionKit/CK2Transcript.h create mode 100644 ConnectionKit/CK2Transcript.m diff --git a/Connection.xcodeproj/project.pbxproj b/Connection.xcodeproj/project.pbxproj index 3f146c054..a1f30b39d 100644 --- a/Connection.xcodeproj/project.pbxproj +++ b/Connection.xcodeproj/project.pbxproj @@ -56,6 +56,8 @@ 22FEB6691680818800BB778B /* KMSTranscriptEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 22FEB6671680818800BB778B /* KMSTranscriptEntry.m */; }; 271059521671334500E20511 /* DAVKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 27448C371458100D00EB086F /* DAVKit.framework */; }; 27105953167143D800E20511 /* CURLHandle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 220526E8165E96AA00A2BBC9 /* CURLHandle.framework */; }; + 273605911869A93600A32419 /* CK2Transcript.h in Headers */ = {isa = PBXBuildFile; fileRef = 2736058F1869A93600A32419 /* CK2Transcript.h */; }; + 273605921869A93600A32419 /* CK2Transcript.m in Sources */ = {isa = PBXBuildFile; fileRef = 273605901869A93600A32419 /* CK2Transcript.m */; }; 27431CA01630381D00F6FB58 /* CK2FileProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 27431C9E1630381D00F6FB58 /* CK2FileProtocol.h */; }; 27431CA11630381D00F6FB58 /* CK2FileProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 27431C9F1630381D00F6FB58 /* CK2FileProtocol.m */; }; 2743E8091622E47600019979 /* CK2FileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2743E8071622E47600019979 /* CK2FileManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -340,6 +342,8 @@ 22FEB6671680818800BB778B /* KMSTranscriptEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMSTranscriptEntry.m; sourceTree = ""; }; 22FEB6681680818800BB778B /* KMSTranscriptEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMSTranscriptEntry.h; sourceTree = ""; }; 2702E4671459D0F50085BBC4 /* libssh2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libssh2.dylib; path = CurlHandle/SFTP/libssh2.dylib; sourceTree = ""; }; + 2736058F1869A93600A32419 /* CK2Transcript.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CK2Transcript.h; sourceTree = ""; }; + 273605901869A93600A32419 /* CK2Transcript.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CK2Transcript.m; sourceTree = ""; }; 27431C9E1630381D00F6FB58 /* CK2FileProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CK2FileProtocol.h; sourceTree = ""; }; 27431C9F1630381D00F6FB58 /* CK2FileProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CK2FileProtocol.m; sourceTree = ""; }; 2743E8071622E47600019979 /* CK2FileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CK2FileManager.h; sourceTree = ""; }; @@ -529,6 +533,8 @@ 278D8B78167FF35D00622468 /* CK2Authentication.m */, 27993E8216FCB30D008DC1B0 /* CK2FileOperation.h */, 27993E8316FCB30D008DC1B0 /* CK2FileOperation.m */, + 2736058F1869A93600A32419 /* CK2Transcript.h */, + 273605901869A93600A32419 /* CK2Transcript.m */, ); name = Public; path = ConnectionKit; @@ -996,6 +1002,7 @@ 79CFD89509F704F400172CDD /* ConnectionKit.h in Headers */, 7983DF8E0B0C0FAC00F5078E /* CKTransferRecord.h in Headers */, 798313C90B0D67E000F5078E /* CKTransferProgressCell.h in Headers */, + 273605911869A93600A32419 /* CK2Transcript.h in Headers */, 27D03B421471787000FEA588 /* CKUploader.h in Headers */, 2743E8091622E47600019979 /* CK2FileManager.h in Headers */, 2790A8291627636E000C9D9F /* CK2Protocol.h in Headers */, @@ -1429,6 +1436,7 @@ 27F394F6162C162900944F43 /* CK2SFTPProtocol.m in Sources */, 27431CA11630381D00F6FB58 /* CK2FileProtocol.m in Sources */, 2288CD76165A99FC00F34E24 /* CK2WebDAVProtocol.m in Sources */, + 273605921869A93600A32419 /* CK2Transcript.m in Sources */, 27A2072C1671634800D8284D /* CK2CURLBasedProtocol.m in Sources */, 278D8B7A167FF35D00622468 /* CK2Authentication.m in Sources */, 27993E8516FCB30D008DC1B0 /* CK2FileOperation.m in Sources */, diff --git a/ConnectionKit/CK2FileOperation.m b/ConnectionKit/CK2FileOperation.m index e4f7b534f..a0a39b67a 100644 --- a/ConnectionKit/CK2FileOperation.m +++ b/ConnectionKit/CK2FileOperation.m @@ -8,6 +8,7 @@ #import "CK2FileOperation.h" #import "CK2Protocol.h" +#import "CK2Transcript.h" #import // so icon handling can use NSImage and NSWorkspace for now @@ -541,6 +542,8 @@ - (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscr NSAssert(protocol == _protocol, @"Message received from unexpected protocol: %@ (should be %@)", protocol, _protocol); + [[CK2Transcript sharedTranscript] addEntryOfType:transcript text:info]; + // Pass straight onto delegate and trust it not to take too long handling it // We used to dispatch off onto one of the global queues, but that does have the nasty downside of messages sometimes arriving out-of-order or concurrently [self tryToMessageDelegateSelector:@selector(fileManager:operation:appendString:toTranscript:) usingBlock:^(id delegate) { diff --git a/ConnectionKit/CK2Transcript.h b/ConnectionKit/CK2Transcript.h new file mode 100644 index 000000000..30df6b109 --- /dev/null +++ b/ConnectionKit/CK2Transcript.h @@ -0,0 +1,62 @@ +// +// CK2Transcript.h +// Connection +// +// Created by Mike on 24/12/2013. +// +// + +#import + + +/** + All safe to access from multiple threads. Be a bit wary that new entries might + arrive while removing existing ones though, if you have any UI code around it. + */ + + +@interface CK2TranscriptEntry : NSObject +{ + @private + NSString *_text; + NSString *_type; +} + +@property(nonatomic, copy, readonly) NSString *text; +@property(nonatomic, copy, readonly) NSString *entryType; + +@end + + +@interface CK2Transcript : NSObject +{ + @private + NSMutableArray *_entries; + dispatch_queue_t _queue; +} + +#pragma mark Shared Transcript ++ (CK2Transcript *)sharedTranscript; + + +#pragma mark Retrieving Entries +- (NSArray *)entries; +- (NSUInteger)countOfEntries; +- (CK2TranscriptEntry *)entryAtIndex:(NSUInteger)index; + + +#pragma mark Adding Entries +- (void)addEntryOfType:(NSString *)type text:(NSString *)format; + + +#pragma mark Removing Entries +- (void)removeAllEntries; + + +@end + + +/** + Posted on whichever thread modified the transcript + */ +extern NSString * const CK2TranscriptChangedNotification; diff --git a/ConnectionKit/CK2Transcript.m b/ConnectionKit/CK2Transcript.m new file mode 100644 index 000000000..d149b41fc --- /dev/null +++ b/ConnectionKit/CK2Transcript.m @@ -0,0 +1,118 @@ +// +// CK2Transcript.m +// Connection +// +// Created by Mike on 24/12/2013. +// +// + +#import "CK2Transcript.h" + + +@implementation CK2TranscriptEntry + +- initWithText:(NSString *)text type:(NSString *)type; +{ + if (self = [self init]) + { + _text = [text copy]; + _type = [type copy]; + } + return self; +} + +- (void)dealloc; +{ + [_text release]; + [_type release]; + + [super dealloc]; +} + +@synthesize text = _text; +@synthesize entryType = _type; + +@end + + +@implementation CK2Transcript + ++ (CK2Transcript *)sharedTranscript; +{ + static CK2Transcript *transcript; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + transcript = [[CK2Transcript alloc] init]; + }); + return transcript; +} + +- init +{ + if (self = [super init]) + { + _entries = [[NSMutableArray alloc] init]; + _queue = dispatch_queue_create("com.karelia.ConnectionKit.transcript", NULL); + } + return self; +} + +- (void)dealloc; +{ + [_entries release]; + dispatch_release(_queue); + + [super dealloc]; +} + +- (NSArray *)entries; +{ + __block NSArray *result; + dispatch_sync(_queue, ^{ + result = [_entries copy]; + }); + return [result autorelease]; +} + +- (NSUInteger)countOfEntries; +{ + __block NSUInteger result; + dispatch_sync(_queue, ^{ + result = _entries.count; + }); + return result; +} + +- (CK2TranscriptEntry *)entryAtIndex:(NSUInteger)index; +{ + __block CK2TranscriptEntry *result; + dispatch_sync(_queue, ^{ + result = [[_entries objectAtIndex:index] retain]; + }); + return [result autorelease]; +} + +- (void)addEntryOfType:(NSString *)type text:(NSString *)text; +{ + dispatch_async(_queue, ^{ + CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text type:type]; + [_entries addObject:entry]; + [entry release]; + }); + + [[NSNotificationCenter defaultCenter] postNotificationName:CK2TranscriptChangedNotification object:self]; +} + +- (void)removeAllEntries; +{ + dispatch_async(_queue, ^{ + [_entries removeAllObjects]; + }); + + [[NSNotificationCenter defaultCenter] postNotificationName:CK2TranscriptChangedNotification object:self]; +} + +@end + + +NSString * const CK2TranscriptChangedNotification = @"CK2TranscriptChanged"; From aa7fe09f37ffd24d3027cc23301c4659b66e3a81 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 12:57:07 +0000 Subject: [PATCH 05/15] Make CK2Transcript public --- Connection.xcodeproj/project.pbxproj | 2 +- ConnectionKit/ConnectionKit.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Connection.xcodeproj/project.pbxproj b/Connection.xcodeproj/project.pbxproj index a1f30b39d..60ca935fc 100644 --- a/Connection.xcodeproj/project.pbxproj +++ b/Connection.xcodeproj/project.pbxproj @@ -56,7 +56,7 @@ 22FEB6691680818800BB778B /* KMSTranscriptEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 22FEB6671680818800BB778B /* KMSTranscriptEntry.m */; }; 271059521671334500E20511 /* DAVKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 27448C371458100D00EB086F /* DAVKit.framework */; }; 27105953167143D800E20511 /* CURLHandle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 220526E8165E96AA00A2BBC9 /* CURLHandle.framework */; }; - 273605911869A93600A32419 /* CK2Transcript.h in Headers */ = {isa = PBXBuildFile; fileRef = 2736058F1869A93600A32419 /* CK2Transcript.h */; }; + 273605911869A93600A32419 /* CK2Transcript.h in Headers */ = {isa = PBXBuildFile; fileRef = 2736058F1869A93600A32419 /* CK2Transcript.h */; settings = {ATTRIBUTES = (Public, ); }; }; 273605921869A93600A32419 /* CK2Transcript.m in Sources */ = {isa = PBXBuildFile; fileRef = 273605901869A93600A32419 /* CK2Transcript.m */; }; 27431CA01630381D00F6FB58 /* CK2FileProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 27431C9E1630381D00F6FB58 /* CK2FileProtocol.h */; }; 27431CA11630381D00F6FB58 /* CK2FileProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 27431C9F1630381D00F6FB58 /* CK2FileProtocol.m */; }; diff --git a/ConnectionKit/ConnectionKit.h b/ConnectionKit/ConnectionKit.h index b4baddc5f..784e50c21 100644 --- a/ConnectionKit/ConnectionKit.h +++ b/ConnectionKit/ConnectionKit.h @@ -31,6 +31,7 @@ #import #import #import +#import // Legacy #import From ea5d365f2ddde1f6f5a771f75584b1f34d2dc666 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 13:58:40 +0000 Subject: [PATCH 06/15] Inform observers of the added transcript entry --- ConnectionKit/CK2Transcript.h | 8 ++++++++ ConnectionKit/CK2Transcript.m | 11 ++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ConnectionKit/CK2Transcript.h b/ConnectionKit/CK2Transcript.h index 30df6b109..412cf2a18 100644 --- a/ConnectionKit/CK2Transcript.h +++ b/ConnectionKit/CK2Transcript.h @@ -60,3 +60,11 @@ Posted on whichever thread modified the transcript */ extern NSString * const CK2TranscriptChangedNotification; + + +/** + Key in `CK2TranscriptChangedNotification`'s `userInfo` for the entry (if there + was one) that was added. + */ +extern NSString * const CK2TranscriptAddedEntryKey; + diff --git a/ConnectionKit/CK2Transcript.m b/ConnectionKit/CK2Transcript.m index d149b41fc..3bb3d83c3 100644 --- a/ConnectionKit/CK2Transcript.m +++ b/ConnectionKit/CK2Transcript.m @@ -94,13 +94,17 @@ - (CK2TranscriptEntry *)entryAtIndex:(NSUInteger)index; - (void)addEntryOfType:(NSString *)type text:(NSString *)text; { + CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text type:type]; + dispatch_async(_queue, ^{ - CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text type:type]; [_entries addObject:entry]; - [entry release]; }); - [[NSNotificationCenter defaultCenter] postNotificationName:CK2TranscriptChangedNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:CK2TranscriptChangedNotification + object:self + userInfo:@{ CK2TranscriptAddedEntryKey : entry }]; + + [entry release]; } - (void)removeAllEntries; @@ -116,3 +120,4 @@ - (void)removeAllEntries; NSString * const CK2TranscriptChangedNotification = @"CK2TranscriptChanged"; +NSString * const CK2TranscriptAddedEntryKey = @"entry"; From 960a37c17626f364fb22f9f9cd6770e76d1f4f90 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 15:19:27 +0000 Subject: [PATCH 07/15] Rip out transcript delegation from uploader --- ConnectionKit/CKUploader.h | 2 -- ConnectionKit/CKUploader.m | 5 ----- 2 files changed, 7 deletions(-) diff --git a/ConnectionKit/CKUploader.h b/ConnectionKit/CKUploader.h index 27ed6d67b..2e6490f32 100644 --- a/ConnectionKit/CKUploader.h +++ b/ConnectionKit/CKUploader.h @@ -91,8 +91,6 @@ typedef NSUInteger CKUploadingOptions; @required - (void)uploader:(CKUploader *)uploader didBeginUploadToPath:(NSString *)path; -- (void)uploader:(CKUploader *)uploader appendString:(NSString *)string toTranscript:(NSString *)transcript; - @optional - (void)uploader:(CKUploader *)uploader transferRecord:(CKTransferRecord *)record didWriteBodyData:(int64_t)bytesSent diff --git a/ConnectionKit/CKUploader.m b/ConnectionKit/CKUploader.m index f59733fed..af5b5acc6 100644 --- a/ConnectionKit/CKUploader.m +++ b/ConnectionKit/CKUploader.m @@ -433,10 +433,5 @@ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)oper } } -- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(NSString *)transcript; -{ - [[self delegate] uploader:self appendString:info toTranscript:transcript]; -} - @end From a6ae93f865ff8102234b130b6612eb5ece6f1b0f Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 16:59:56 +0000 Subject: [PATCH 08/15] Remove transcript delegate method --- ConnectionKit/CK2FileManager.h | 15 --------------- ConnectionKit/CK2FileOperation.m | 6 ------ 2 files changed, 21 deletions(-) diff --git a/ConnectionKit/CK2FileManager.h b/ConnectionKit/CK2FileManager.h index 89659347f..74bb4c702 100644 --- a/ConnectionKit/CK2FileManager.h +++ b/ConnectionKit/CK2FileManager.h @@ -432,21 +432,6 @@ typedef NS_ENUM(NSInteger, CK2AuthChallengeDisposition) { totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToSend; -extern NSString * const CK2TranscriptText; -extern NSString * const CK2TranscriptHeaderIn; -extern NSString * const CK2TranscriptHeaderOut; - -/** - Reports received transcript info. - - @param manager The file manager. - @param info The received transcript line(s). Should end in a newline character. - @param transcript The type of transcript received. - */ -- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation - appendString:(NSString *)info - toTranscript:(NSString *)transcript; - /** * Sent as the last message related to a specific operation. Error may be * `nil`, which implies that no error occurred and this operation is finished. diff --git a/ConnectionKit/CK2FileOperation.m b/ConnectionKit/CK2FileOperation.m index a0a39b67a..fb1fad3f4 100644 --- a/ConnectionKit/CK2FileOperation.m +++ b/ConnectionKit/CK2FileOperation.m @@ -543,12 +543,6 @@ - (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscr [[CK2Transcript sharedTranscript] addEntryOfType:transcript text:info]; - - // Pass straight onto delegate and trust it not to take too long handling it - // We used to dispatch off onto one of the global queues, but that does have the nasty downside of messages sometimes arriving out-of-order or concurrently - [self tryToMessageDelegateSelector:@selector(fileManager:operation:appendString:toTranscript:) usingBlock:^(id delegate) { - [delegate fileManager:self.fileManager operation:self appendString:info toTranscript:transcript]; - }]; } - (void)protocol:(CK2Protocol *)protocol didDiscoverItemAtURL:(NSURL *)url; From 0ea27445c952c140710527e63a6cb3e79b87f1dd Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 17:15:10 +0000 Subject: [PATCH 09/15] Pare concept of transcript down to commands and everything else Stop dumping out deep info on the internals of libcurl --- ConnectionKit/CK2CURLBasedProtocol.m | 13 +++---------- ConnectionKit/CK2FileOperation.m | 4 ++-- ConnectionKit/CK2Protocol.h | 2 +- ConnectionKit/CK2SFTPProtocol.m | 2 +- ConnectionKit/CK2Transcript.h | 6 +++--- ConnectionKit/CK2Transcript.m | 12 +++++------- ConnectionKit/CK2WebDAVProtocol.m | 2 +- 7 files changed, 16 insertions(+), 25 deletions(-) diff --git a/ConnectionKit/CK2CURLBasedProtocol.m b/ConnectionKit/CK2CURLBasedProtocol.m index 716948e59..5af531c12 100644 --- a/ConnectionKit/CK2CURLBasedProtocol.m +++ b/ConnectionKit/CK2CURLBasedProtocol.m @@ -685,26 +685,19 @@ - (void)transfer:(CURLTransfer *)transfer didCompleteWithError:(NSError *)error; - (void)transfer:(CURLTransfer *)transfer didReceiveDebugInformation:(NSString *)string ofType:(curl_infotype)type; { - NSString *transcript; switch (type) { case CURLINFO_HEADER_IN: - transcript = CK2TranscriptHeaderIn; + [self.client protocol:self appendStringToTranscript:string isCommand:NO]; break; case CURLINFO_HEADER_OUT: - transcript = CK2TranscriptHeaderOut; - break; - - case CURLINFO_TEXT: - transcript = CK2TranscriptText; + [self.client protocol:self appendStringToTranscript:string isCommand:YES]; break; default: - return; + break; } - - [[self client] protocol:self appendString:string toTranscript:transcript]; } #pragma mark Customization diff --git a/ConnectionKit/CK2FileOperation.m b/ConnectionKit/CK2FileOperation.m index fb1fad3f4..ba11442bf 100644 --- a/ConnectionKit/CK2FileOperation.m +++ b/ConnectionKit/CK2FileOperation.m @@ -537,12 +537,12 @@ - (void)protocol:(CK2Protocol *)protocol didReceiveChallenge:(NSURLAuthenticatio // TODO: Cache credentials per protection space } -- (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscript:(NSString *)transcript; +- (void)protocol:(CK2Protocol *)protocol appendStringToTranscript:(NSString *)info isCommand:(BOOL)isCommand; { NSAssert(protocol == _protocol, @"Message received from unexpected protocol: %@ (should be %@)", protocol, _protocol); - [[CK2Transcript sharedTranscript] addEntryOfType:transcript text:info]; + [[CK2Transcript sharedTranscript] addEntryWithText:info isCommand:isCommand]; } - (void)protocol:(CK2Protocol *)protocol didDiscoverItemAtURL:(NSURL *)url; diff --git a/ConnectionKit/CK2Protocol.h b/ConnectionKit/CK2Protocol.h index 5a111ae69..b95012025 100644 --- a/ConnectionKit/CK2Protocol.h +++ b/ConnectionKit/CK2Protocol.h @@ -162,7 +162,7 @@ */ - (void)protocol:(CK2Protocol *)protocol didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(CK2AuthChallengeDisposition, NSURLCredential*))completionHandler; -- (void)protocol:(CK2Protocol *)protocol appendString:(NSString *)info toTranscript:(NSString *)transcript; +- (void)protocol:(CK2Protocol *)protocol appendStringToTranscript:(NSString *)info isCommand:(BOOL)isCommand; #pragma mark Operation-Specific diff --git a/ConnectionKit/CK2SFTPProtocol.m b/ConnectionKit/CK2SFTPProtocol.m index 2d448a0d8..e48952abb 100644 --- a/ConnectionKit/CK2SFTPProtocol.m +++ b/ConnectionKit/CK2SFTPProtocol.m @@ -230,7 +230,7 @@ - (void)start; // Note what we're up to if (_transcriptMessage) { - [self.client protocol:self appendString:_transcriptMessage toTranscript:CK2TranscriptHeaderOut]; + [self.client protocol:self appendStringToTranscript:_transcriptMessage isCommand:YES]; [_transcriptMessage release]; _transcriptMessage = nil; } diff --git a/ConnectionKit/CK2Transcript.h b/ConnectionKit/CK2Transcript.h index 412cf2a18..d58d5726e 100644 --- a/ConnectionKit/CK2Transcript.h +++ b/ConnectionKit/CK2Transcript.h @@ -19,11 +19,11 @@ { @private NSString *_text; - NSString *_type; + BOOL _isCommand; } @property(nonatomic, copy, readonly) NSString *text; -@property(nonatomic, copy, readonly) NSString *entryType; +@property(nonatomic, readonly) BOOL isCommand; @end @@ -46,7 +46,7 @@ #pragma mark Adding Entries -- (void)addEntryOfType:(NSString *)type text:(NSString *)format; +- (void)addEntryWithText:(NSString *)text isCommand:(BOOL)command; #pragma mark Removing Entries diff --git a/ConnectionKit/CK2Transcript.m b/ConnectionKit/CK2Transcript.m index 3bb3d83c3..57b3bb55e 100644 --- a/ConnectionKit/CK2Transcript.m +++ b/ConnectionKit/CK2Transcript.m @@ -11,12 +11,12 @@ @implementation CK2TranscriptEntry -- initWithText:(NSString *)text type:(NSString *)type; +- initWithText:(NSString *)text isCommand:(BOOL)isCommand; { if (self = [self init]) { _text = [text copy]; - _type = [type copy]; + _isCommand = isCommand; } return self; } @@ -24,13 +24,11 @@ @implementation CK2TranscriptEntry - (void)dealloc; { [_text release]; - [_type release]; - [super dealloc]; } @synthesize text = _text; -@synthesize entryType = _type; +@synthesize isCommand = _isCommand; @end @@ -92,9 +90,9 @@ - (CK2TranscriptEntry *)entryAtIndex:(NSUInteger)index; return [result autorelease]; } -- (void)addEntryOfType:(NSString *)type text:(NSString *)text; +- (void)addEntryWithText:(NSString *)text isCommand:(BOOL)command; { - CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text type:type]; + CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text isCommand:command]; dispatch_async(_queue, ^{ [_entries addObject:entry]; diff --git a/ConnectionKit/CK2WebDAVProtocol.m b/ConnectionKit/CK2WebDAVProtocol.m index 6d12fd9fb..9cd5bdbe4 100644 --- a/ConnectionKit/CK2WebDAVProtocol.m +++ b/ConnectionKit/CK2WebDAVProtocol.m @@ -412,7 +412,7 @@ - (void)webDAVSession:(DAVSession *)session appendStringToTranscript:(NSString * // Tack on a newline to match libcurl output string = [string stringByAppendingString:@"\n"]; - [[self client] protocol:self appendString:string toTranscript:(sent ? CK2TranscriptHeaderOut : CK2TranscriptHeaderIn)]; + [[self client] protocol:self appendStringToTranscript:string isCommand:sent]; } #pragma mark - Utilities From ead9b9e08cf76e820be71c0c3c28a1ee3f0dbc9b Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 17:19:04 +0000 Subject: [PATCH 10/15] Remove the transcript type strings --- ConnectionKit/CK2FileManager.m | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ConnectionKit/CK2FileManager.m b/ConnectionKit/CK2FileManager.m index ebeeec628..7cb7f6abd 100644 --- a/ConnectionKit/CK2FileManager.m +++ b/ConnectionKit/CK2FileManager.m @@ -15,10 +15,6 @@ NSString * const CK2FileMIMEType = @"CK2FileMIMEType"; -NSString * const CK2TranscriptText = @"Info"; -NSString * const CK2TranscriptHeaderIn = @"Received"; -NSString * const CK2TranscriptHeaderOut = @"Sent"; - #pragma mark - From f99258d89cbe2aa0d31801d1cf028aa49f4ee763 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 17:24:01 +0000 Subject: [PATCH 11/15] Remove transcript API from CK2OpenPanel too --- ConnectionKit/CK2OpenPanel.h | 1 - ConnectionKit/CK2OpenPanelController.m | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/ConnectionKit/CK2OpenPanel.h b/ConnectionKit/CK2OpenPanel.h index 40c77b799..fae4059ce 100644 --- a/ConnectionKit/CK2OpenPanel.h +++ b/ConnectionKit/CK2OpenPanel.h @@ -179,7 +179,6 @@ - (void)panelSelectionDidChange:(CK2OpenPanel *)sender; - (void)panel:(CK2OpenPanel *)sender didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(CK2AuthChallengeDisposition, NSURLCredential *))completionHandler; -- (void)panel:(CK2OpenPanel *)sender appendString:(NSString *)info toTranscript:(NSString *)transcript; - (void)panel:(CK2OpenPanel *)sender didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge __attribute((deprecated("implement -panel:didReceiveChallenge:completionHandler instead"))); diff --git a/ConnectionKit/CK2OpenPanelController.m b/ConnectionKit/CK2OpenPanelController.m index 7c04db54e..c0b9a0689 100644 --- a/ConnectionKit/CK2OpenPanelController.m +++ b/ConnectionKit/CK2OpenPanelController.m @@ -1215,16 +1215,4 @@ - (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)oper } } -- (void)fileManager:(CK2FileManager *)manager operation:(CK2FileOperation *)operation appendString:(NSString *)info toTranscript:(NSString *)transcript; -{ - id delegate; - - delegate = [[self openPanel] delegate]; - - if ([delegate respondsToSelector:@selector(panel:appendString:toTranscript:)]) - { - [delegate panel:[self openPanel] appendString:info toTranscript:transcript]; - } -} - @end From 1aa3e66e4740b84c2de64551f7b4f0c4f1d91d82 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 18:28:08 +0000 Subject: [PATCH 12/15] Include info about host machine at start of transcript --- ConnectionKit/CK2Transcript.m | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ConnectionKit/CK2Transcript.m b/ConnectionKit/CK2Transcript.m index 57b3bb55e..7513a12eb 100644 --- a/ConnectionKit/CK2Transcript.m +++ b/ConnectionKit/CK2Transcript.m @@ -49,7 +49,6 @@ + (CK2Transcript *)sharedTranscript; { if (self = [super init]) { - _entries = [[NSMutableArray alloc] init]; _queue = dispatch_queue_create("com.karelia.ConnectionKit.transcript", NULL); } return self; @@ -95,6 +94,25 @@ - (void)addEntryWithText:(NSString *)text isCommand:(BOOL)command; CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text isCommand:command]; dispatch_async(_queue, ^{ + + if (!_entries) + { + _entries = [[NSMutableArray alloc] init]; + + // Start off with details of the host machine + NSBundle *bundle = [NSBundle mainBundle]; + NSString *transcriptHeader = [NSString stringWithFormat: + @"%@ %@ (architecture unknown) Session Transcript [%@] (%@)", + [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey], + [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey], + [[NSProcessInfo processInfo] operatingSystemVersionString], + [NSDate date]]; + + CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:transcriptHeader isCommand:NO]; + [_entries addObject:entry]; + [entry release]; + } + [_entries addObject:entry]; }); From ded5a96de1ce019789af87788195376a9ec53d0e Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Tue, 24 Dec 2013 19:02:04 +0000 Subject: [PATCH 13/15] Revert "Inform observers of the added transcript entry" This reverts commit ea5d365f2ddde1f6f5a771f75584b1f34d2dc666. Conflicts: ConnectionKit/CK2Transcript.m --- ConnectionKit/CK2Transcript.h | 8 -------- ConnectionKit/CK2Transcript.m | 11 +++-------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/ConnectionKit/CK2Transcript.h b/ConnectionKit/CK2Transcript.h index d58d5726e..86764526a 100644 --- a/ConnectionKit/CK2Transcript.h +++ b/ConnectionKit/CK2Transcript.h @@ -60,11 +60,3 @@ Posted on whichever thread modified the transcript */ extern NSString * const CK2TranscriptChangedNotification; - - -/** - Key in `CK2TranscriptChangedNotification`'s `userInfo` for the entry (if there - was one) that was added. - */ -extern NSString * const CK2TranscriptAddedEntryKey; - diff --git a/ConnectionKit/CK2Transcript.m b/ConnectionKit/CK2Transcript.m index 7513a12eb..0dbd7ca6a 100644 --- a/ConnectionKit/CK2Transcript.m +++ b/ConnectionKit/CK2Transcript.m @@ -91,8 +91,6 @@ - (CK2TranscriptEntry *)entryAtIndex:(NSUInteger)index; - (void)addEntryWithText:(NSString *)text isCommand:(BOOL)command; { - CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text isCommand:command]; - dispatch_async(_queue, ^{ if (!_entries) @@ -113,14 +111,12 @@ - (void)addEntryWithText:(NSString *)text isCommand:(BOOL)command; [entry release]; } + CK2TranscriptEntry *entry = [[CK2TranscriptEntry alloc] initWithText:text isCommand:command]; [_entries addObject:entry]; + [entry release]; }); - [[NSNotificationCenter defaultCenter] postNotificationName:CK2TranscriptChangedNotification - object:self - userInfo:@{ CK2TranscriptAddedEntryKey : entry }]; - - [entry release]; + [[NSNotificationCenter defaultCenter] postNotificationName:CK2TranscriptChangedNotification object:self]; } - (void)removeAllEntries; @@ -136,4 +132,3 @@ - (void)removeAllEntries; NSString * const CK2TranscriptChangedNotification = @"CK2TranscriptChanged"; -NSString * const CK2TranscriptAddedEntryKey = @"entry"; From 2da6997bdedc2c111b577ac2ccf7bb4a7f596caf Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Thu, 26 Dec 2013 13:28:55 +0000 Subject: [PATCH 14/15] Note directory listing commands in the transcript --- ConnectionKit/CK2SFTPProtocol.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ConnectionKit/CK2SFTPProtocol.m b/ConnectionKit/CK2SFTPProtocol.m index e48952abb..4202cd7e2 100644 --- a/ConnectionKit/CK2SFTPProtocol.m +++ b/ConnectionKit/CK2SFTPProtocol.m @@ -53,6 +53,16 @@ + (NSString *)pathOfURLRelativeToHomeDirectory:(NSURL *)URL; #pragma mark Operations +- (id)initForEnumeratingDirectoryWithRequest:(NSURLRequest *)request includingPropertiesForKeys:(NSArray *)keys options:(NSDirectoryEnumerationOptions)mask client:(id)client; +{ + if (self = [super initForEnumeratingDirectoryWithRequest:request includingPropertiesForKeys:keys options:mask client:client]) + { + NSString *path = [self.class pathOfURLRelativeToHomeDirectory:request.URL]; + _transcriptMessage = [[NSString alloc] initWithFormat:@"Listing %@", path]; + } + return self; +} + - (id)initForCreatingDirectoryWithRequest:(NSURLRequest *)request withIntermediateDirectories:(BOOL)createIntermediates openingAttributes:(NSDictionary *)attributes client:(id)client; { NSMutableURLRequest *mutableRequest = [request mutableCopy]; From 97cf5ba0bb42b7b90bad5a10b16d57aeadbad3e8 Mon Sep 17 00:00:00 2001 From: Mike Abdullah Date: Thu, 26 Dec 2013 13:38:56 +0000 Subject: [PATCH 15/15] Add incoming directory listing contents to transcript too --- ConnectionKit/CK2CURLBasedProtocol.m | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ConnectionKit/CK2CURLBasedProtocol.m b/ConnectionKit/CK2CURLBasedProtocol.m index 5af531c12..23d87c70f 100644 --- a/ConnectionKit/CK2CURLBasedProtocol.m +++ b/ConnectionKit/CK2CURLBasedProtocol.m @@ -112,6 +112,19 @@ - (BOOL)shouldEnumerateFilename:(NSString *)name options:(NSDirectoryEnumeration - (NSError*)processData:(NSMutableData*)data request:(NSURLRequest *)request url:(NSURL*)directoryURL path:(NSString*)directoryPath keys:(NSArray*)keys options:(NSDirectoryEnumerationOptions)mask { + NSString *listing = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + if (listing) + { + [self.client protocol:self appendStringToTranscript:listing isCommand:NO]; + } + else + { + listing = [[NSString alloc] initWithFormat:@"Unable to stringify listing: %@", data]; + [self.client protocol:self appendStringToTranscript:listing isCommand:NO]; + } + [listing release]; + + NSError* result = nil; // Process the data to make a directory listing