Skip to content

Commit

Permalink
Merge branch 'kod-helper-wait-param' of https://github.com/lucsky/kod
Browse files Browse the repository at this point in the history
…into lucsky-kod-helper-wait-param
  • Loading branch information
rsms committed Jan 19, 2011
2 parents fea5747 + 5ffe062 commit 7fc8fcc
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 15 deletions.
3 changes: 3 additions & 0 deletions src/KDocument.h
Expand Up @@ -43,6 +43,8 @@ extern NSString *const KDocumentDidLoadDataNotification;

// Internal state
hatomic_flags_t stateFlags_;

NSInvocation *closeCallback_;
}

@property(assign, nonatomic) BOOL isDirty;
Expand All @@ -65,6 +67,7 @@ extern NSString *const KDocumentDidLoadDataNotification;
// during a session (between starting and terminating Kod.app).
@property(readonly) uint64_t identifier;

@property(retain) NSInvocation *closeCallback;

/*!
* Monotonically incrementing version number which changes for each edit.
Expand Down
8 changes: 7 additions & 1 deletion src/KDocument.mm
Expand Up @@ -26,6 +26,7 @@
#import "node-module/ASTNodeWrapper.h"
#import "KASTViewerWindowController.h"
#import "KASTViewerController.h"
#import "KMachService-NSInvocation.h"

#import "NSImage-kod.h"
#import "CIImage-kod.h"
Expand Down Expand Up @@ -88,7 +89,8 @@ @implementation KDocument

@synthesize textEncoding = textEncoding_,
textView = textView_,
ast = ast_;
ast = ast_,
closeCallback = closeCallback_;

static NSImage* _kDefaultIcon = nil;
static NSString* _kDefaultTitle = @"Untitled";
Expand Down Expand Up @@ -174,6 +176,8 @@ - (id)initWithBaseTabContents:(CTTabContents*)baseContents {

// register as text storage delegate
textView_.textStorage.delegate = self;

closeCallback_ = nil;

return self;
}
Expand Down Expand Up @@ -560,6 +564,8 @@ - (void)tabWillCloseInBrowser:(CTBrowser*)browser atIndex:(NSInteger)index {
}
[[NSDocumentController sharedDocumentController] removeDocument:self];
[[NSNotificationCenter defaultCenter] removeObserver:self];

[closeCallback_ invokeKMachServiceCallbackWithArgument:nil];
}


Expand Down
12 changes: 12 additions & 0 deletions src/KDocumentController.h
Expand Up @@ -48,13 +48,25 @@ withWindowController:(KBrowserWindowController*)windowController
withWindowController:(KBrowserWindowController*)windowController
priority:(long)priority
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
closeCallbacks:(NSArray*)closeCallbacks
callback:(void(^)(NSError*))callback;

- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
withWindowController:(KBrowserWindowController*)windowController
priority:(long)priority
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
callback:(void(^)(NSError*))callback;

// Open |urls| in frontmost window with high priority
- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
closeCallbacks:(NSArray*)closeCallbacks
callback:(void(^)(NSError*))callback;

- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
callback:(void(^)(NSError*))callback;

// Open |urls| in frontmost window with high priority
- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
callback:(void(^)(NSError*))callback;
Expand Down
38 changes: 38 additions & 0 deletions src/KDocumentController.mm
Expand Up @@ -10,6 +10,7 @@
#import "KFileURLHandler.h"
#import "KHTTPURLHandler.h"
#import "KKodURLHandler.h"
#import "KMachService.h"
#import "HEventEmitter.h"
#import "kconf.h"
#import "kod_node_interface.h"
Expand Down Expand Up @@ -102,6 +103,21 @@ - (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
priority:(long)priority
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
callback:(void(^)(NSError*))callback {
[self openDocumentsWithContentsOfURLs:urls
withWindowController:windowController
priority:priority
nonExistingFilesAsNewDocuments:newDocForNewURLs
closeCallbacks:nil
callback:callback];
}


- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
withWindowController:(KBrowserWindowController*)windowController
priority:(long)priority
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
closeCallbacks:(NSArray*)closeCallbacks
callback:(void(^)(NSError*))callback {
DLOG("openDocumentsWithContentsOfURLs:%@", urls);
// countdown
NSUInteger i = urls ? urls.count : 0;
Expand Down Expand Up @@ -175,6 +191,11 @@ - (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
if (doc) doc.url = url;
if (countdown) countdown(error);
if (!doc) [windowController presentError:error];
else if (closeCallbacks != nil) {
NSInvocation *closeCallback =
[closeCallbacks objectAtIndex:[urls indexOfObject:url]];
doc.closeCallback = closeCallback;
}
} else {
url = [url copy];
dispatch_async(dispatchQueue, ^{
Expand All @@ -185,6 +206,11 @@ - (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
groupWithSiblings:YES
/* display last document opened: */ display:index==0
error:&error];
if (doc && closeCallbacks != nil) {
NSInvocation *closeCallback =
[closeCallbacks objectAtIndex:[urls indexOfObject:url]];
doc.closeCallback = closeCallback;
}
if (doc && doc.isLoading) {
if (countdown) {
[doc on:@"load" call:^(KDocument *doc2){
Expand All @@ -206,13 +232,25 @@ - (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
callback:(void(^)(NSError*))callback {
[self openDocumentsWithContentsOfURLs:urls
nonExistingFilesAsNewDocuments:newDocForNewURLs
closeCallbacks:nil
callback:callback];

}

- (void)openDocumentsWithContentsOfURLs:(NSArray*)urls
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
closeCallbacks:(NSArray*)closeCallbacks
callback:(void(^)(NSError*))callback {
// open the documents in the frontmost window controller
KBrowserWindowController *windowController = (KBrowserWindowController *)
[KBrowserWindowController mainBrowserWindowController];
[self openDocumentsWithContentsOfURLs:urls
withWindowController:windowController
priority:DISPATCH_QUEUE_PRIORITY_HIGH
nonExistingFilesAsNewDocuments:(BOOL)newDocForNewURLs
closeCallbacks:closeCallbacks
callback:callback];
}

Expand Down
21 changes: 15 additions & 6 deletions src/KMachService.mm
Expand Up @@ -61,7 +61,14 @@ - (BOOL)connection:(NSConnection *)parentConnection
}


- (void)openURLs:(NSArray*)urlStrings callback:(NSInvocation*)callback {
- (void)openURLs:(NSArray*)urlStrings closeCallbacks:(NSArray *)closeCallbacks
errorCallback:(NSInvocation *)errorCallback {
if ((closeCallbacks != nil) && (urlStrings.count != closeCallbacks.count)) {
NSError *err = [NSError kodErrorWithFormat:@"URLs array items count"
" does not match the close callbacks count"];
[errorCallback invokeKMachServiceCallbackWithArgument:err];
return;
}
NSMutableArray *absoluteURLs =
[NSMutableArray arrayWithCapacity:[urlStrings count]];
for (NSString *url in urlStrings) {
Expand All @@ -76,8 +83,9 @@ - (void)openURLs:(NSArray*)urlStrings callback:(NSInvocation*)callback {
kassert(documentController != nil);
[documentController openDocumentsWithContentsOfURLs:absoluteURLs
nonExistingFilesAsNewDocuments:YES
callback:^(NSError *err){
[callback invokeKMachServiceCallbackWithArgument:err];
closeCallbacks:closeCallbacks
callback:^(NSError *err) {
[errorCallback invokeKMachServiceCallbackWithArgument:err];
}];
}

Expand All @@ -96,7 +104,8 @@ - (void)openURLs:(NSArray*)urlStrings callback:(NSInvocation*)callback {

- (void)openNewDocumentWithData:(NSData*)data
ofType:(NSString*)typeName
callback:(NSInvocation*)callback {
closeCallback:(NSInvocation*)closeCallback
errorCallback:(NSInvocation*)errorCallback {
DLOG("%@ openNewDocumentWithData", self);

KDocumentController *documentController = [KDocumentController kodController];
Expand All @@ -118,8 +127,8 @@ - (void)openNewDocumentWithData:(NSData*)data
}

// invoke callback
if (callback)
[callback invokeKMachServiceCallbackWithArgument:error];
if (errorCallback)
[errorCallback invokeKMachServiceCallbackWithArgument:error];

/*
TODO(rsms): Pass the file descriptor by kernel FD delegation using sendmsg.
Expand Down
7 changes: 5 additions & 2 deletions src/KMachServiceProtocol.h
Expand Up @@ -6,10 +6,13 @@

@protocol KMachServiceProtocol

- (void)openURLs:(NSArray*)absoluteURLStrings callback:(NSInvocation*)callback;
- (void)openURLs:(NSArray*)absoluteURLStrings
closeCallbacks:(NSArray*)closeCallbacks
errorCallback:(NSInvocation*)errorCallback;

- (void)openNewDocumentWithData:(NSData*)data
ofType:(NSString*)typeName
callback:(NSInvocation*)callback;
closeCallback:(NSInvocation*)callback
errorCallback:(NSInvocation*)callback;

@end
1 change: 1 addition & 0 deletions src/kod_helper.h
Expand Up @@ -14,6 +14,7 @@
NSMutableDictionary *asyncWaitQueue_;
BOOL forceReadStdin_; // true if a "-" is passed in argv
int optNoWaitOpen_; // 1 if -n or --nowait-open
int optWaitForDocumentClose; // 1 if -w or --wait
}

@property(readonly) NSRunningApplication *kodApp;
Expand Down
32 changes: 26 additions & 6 deletions src/kod_helper.m
Expand Up @@ -63,12 +63,13 @@ - (void)parseOptionsOfLength:(int)argc argv:(char**)argv {
*/
struct option long_options[] = {
{"nowait-open", no_argument, &optNoWaitOpen_, 1},
{"wait", no_argument, &optWaitForDocumentClose, 1},
{"kod-app", required_argument, 0, 0},
{"version", no_argument, 0, 0},
{"help", no_argument, 0, 0},
{0, 0, 0, 0}
};
static const char *short_options = "nh";
static const char *short_options = "nhw";
int c;
while (1) {
int option_index = 0;
Expand All @@ -92,6 +93,9 @@ - (void)parseOptionsOfLength:(int)argc argv:(char**)argv {
case 'n':
optNoWaitOpen_ = 1;
break;
case 'w':
optWaitForDocumentClose = 1;
break;
case '?':
[self printUsageAndExit:1];
break;
Expand Down Expand Up @@ -260,8 +264,12 @@ - (void)openNewDocumentWithStdin {

DLOG("reading stdin [%d] until EOF...", [fh fileDescriptor]);
NSData *data = [fh readDataToEndOfFile];
[kodService_ openNewDocumentWithData:data ofType:nil callback:
[self registerCallback:^(NSError *err){
[kodService_ openNewDocumentWithData:data
ofType:nil
closeCallback:[self registerCallback:^(void) {
DLOG("close callback for piped document executed.");
}]
errorCallback:[self registerCallback:^(NSError *err) {
DLOG("openNewDocumentWithData callback executed. err: %@", err);
}]];
}
Expand All @@ -270,10 +278,22 @@ - (void)openNewDocumentWithStdin {
- (void)openAnyURLs {
if (!URLsToOpen_ || URLsToOpen_.count == 0) return;
DLOG("invoking openURLs:");
[kodService_ openURLs:URLsToOpen_ callback:[self registerCallback:
^(NSError *err){
NSInvocation *errorCallback = [self registerCallback:^(NSError *err) {
DLOG("openAnyURLs callback executed. err: %@", err);
}]];
}];
NSMutableArray *closeCallbacks = nil;
if (optWaitForDocumentClose) {
closeCallbacks = [NSMutableArray arrayWithCapacity:[URLsToOpen_ count]];
for (NSString *url in URLsToOpen_) {
NSInvocation *closeCallback = nil;
closeCallback = [self registerCallback:^{
DLOG("document close callback executed.");
}];
[closeCallbacks addObject:closeCallback];
}
}
[kodService_ openURLs:URLsToOpen_ closeCallbacks:closeCallbacks
errorCallback:errorCallback];
}


Expand Down

0 comments on commit 7fc8fcc

Please sign in to comment.