MacOSX shell integration code plus icons.
10
shell_integration/MacOSX/LiferayNativity.xcworkspace/contents.xcworkspacedata
generated
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:LiferayNativityFinder/LiferayNativityFinder.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:LiferayNativityInjector/LiferayNativityInjector.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Bucket
|
||||
type = "0"
|
||||
version = "1.0">
|
||||
<FileBreakpoints>
|
||||
<FileBreakpoint
|
||||
shouldBeEnabled = "Yes"
|
||||
ignoreCount = "0"
|
||||
continueAfterRunningActions = "No"
|
||||
filePath = "LiferayNativityFinder/ContentManager.m"
|
||||
timestampString = "426161859.780288"
|
||||
startingColumnNumber = "9223372036854775807"
|
||||
endingColumnNumber = "9223372036854775807"
|
||||
startingLineNumber = "90"
|
||||
endingLineNumber = "90"
|
||||
landmarkName = "-setResultForPath:result:"
|
||||
landmarkType = "5">
|
||||
</FileBreakpoint>
|
||||
</FileBreakpoints>
|
||||
</Bucket>
|
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface ContentManager : NSObject
|
||||
{
|
||||
NSMutableDictionary* _fileNamesCache;
|
||||
BOOL _fileIconsEnabled;
|
||||
}
|
||||
|
||||
+ (ContentManager*)sharedInstance;
|
||||
|
||||
- (void)enableFileIcons:(BOOL)enable;
|
||||
- (NSNumber*)iconByPath:(NSString*)path;
|
||||
- (void)removeAllIcons;
|
||||
- (void)removeIcons:(NSArray*)paths;
|
||||
- (void)setIcons:(NSDictionary*)iconDictionary filterByFolder:(NSString*)filterFolder;
|
||||
- (void)setResultForPath:(NSString*)path result:(NSString*)result;
|
||||
|
||||
@end
|
292
shell_integration/MacOSX/LiferayNativityFinder/ContentManager.m
Normal file
|
@ -0,0 +1,292 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <AppKit/NSApplication.h>
|
||||
#import <AppKit/NSWindow.h>
|
||||
#import <objc/runtime.h>
|
||||
#import "ContentManager.h"
|
||||
#import "MenuManager.h"
|
||||
#import "RequestManager.h"
|
||||
#import "IconCache.h"
|
||||
|
||||
static ContentManager* sharedInstance = nil;
|
||||
|
||||
@implementation ContentManager
|
||||
- init
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_fileNamesCache = [[NSMutableDictionary alloc] init];
|
||||
_fileIconsEnabled = TRUE;
|
||||
|
||||
[[IconCache sharedInstance] registerIcon:@"/Users/mackie/owncloud.com/mirall/shell_integration/icons/128x128/OK_128.png"];
|
||||
[[IconCache sharedInstance] registerIcon:@"/Users/mackie/owncloud.com/mirall/shell_integration/icons/128x128/Sync_128.png"];
|
||||
[[IconCache sharedInstance] registerIcon:@"/Users/mackie/owncloud.com/mirall/shell_integration/icons/128x128/Warning_128.png"];
|
||||
[[IconCache sharedInstance] registerIcon:@"/Users/mackie/owncloud.com/mirall/shell_integration/icons/128x128/Error_128.png"];
|
||||
[[IconCache sharedInstance] registerIcon:@"/Users/mackie/owncloud.com/mirall/shell_integration/icons/128x128/OK_Shared_128.png"];
|
||||
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[self removeAllIcons];
|
||||
[_fileNamesCache release];
|
||||
sharedInstance = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
+ (ContentManager*)sharedInstance
|
||||
{
|
||||
@synchronized(self)
|
||||
{
|
||||
if (sharedInstance == nil)
|
||||
{
|
||||
sharedInstance = [[self alloc] init];
|
||||
}
|
||||
}
|
||||
|
||||
return sharedInstance;
|
||||
}
|
||||
|
||||
- (void)enableFileIcons:(BOOL)enable
|
||||
{
|
||||
_fileIconsEnabled = enable;
|
||||
|
||||
[self repaintAllWindows];
|
||||
}
|
||||
|
||||
- (void)setResultForPath:(NSString*)path result:(NSString*)result
|
||||
{
|
||||
int res = 0; // NOP
|
||||
if( [result isEqualToString:@"OK"] ) {
|
||||
res = 1;
|
||||
} else if( [result isEqualToString:@"NEED_SYNC"]) {
|
||||
res = 2;
|
||||
} else if( [result isEqualToString:@"IGNORE"]) {
|
||||
res = 3;
|
||||
} else if( [result isEqualToString:@"ERROR"]) {
|
||||
res = 4;
|
||||
}else if( [result isEqualToString:@"SHARED"]) {
|
||||
res = 5;
|
||||
}else if( [result isEqualToString:@"NOP"]) {
|
||||
// Nothing.
|
||||
} else {
|
||||
NSLog(@"Unknown status code %@", result);
|
||||
}
|
||||
NSString* normalizedPath = [path decomposedStringWithCanonicalMapping];
|
||||
[_fileNamesCache setObject:[NSNumber numberWithInt:res] forKey:normalizedPath];
|
||||
NSLog(@"SET value %d", res);
|
||||
|
||||
[self repaintAllWindows];
|
||||
}
|
||||
|
||||
- (NSNumber*)iconByPath:(NSString*)path
|
||||
{
|
||||
if (!_fileIconsEnabled)
|
||||
{
|
||||
NSLog(@"Icons are NOT ENABLED!");
|
||||
// return nil;
|
||||
}
|
||||
|
||||
NSString* normalizedPath = [path decomposedStringWithCanonicalMapping];
|
||||
|
||||
NSNumber* result = [_fileNamesCache objectForKey:normalizedPath];
|
||||
NSLog(@"XXXXXXX Asking for icon for path %@ = %d",path, [result intValue]);
|
||||
|
||||
if( result != nil ) {
|
||||
NSLog(@"Found icon index %d", [result intValue]);
|
||||
// there is a proper icon index
|
||||
} else {
|
||||
NSLog(@"Need to query for icon");
|
||||
// start the async call
|
||||
NSNumber *minusOne = -1;
|
||||
[_fileNamesCache setObject:minusOne forKey:normalizedPath];
|
||||
[[RequestManager sharedInstance] askForIcon:normalizedPath];
|
||||
result = [NSNumber numberWithInt:0];
|
||||
}
|
||||
NSLog(@"iconByPath return value %d", [result intValue]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (void)removeAllIcons
|
||||
{
|
||||
[_fileNamesCache removeAllObjects];
|
||||
|
||||
[self repaintAllWindows];
|
||||
}
|
||||
|
||||
- (void)removeIcons:(NSArray*)paths
|
||||
{
|
||||
for (NSString* path in paths)
|
||||
{
|
||||
NSString* normalizedPath = [path decomposedStringWithCanonicalMapping];
|
||||
|
||||
[_fileNamesCache removeObjectForKey:normalizedPath];
|
||||
}
|
||||
|
||||
[self repaintAllWindows];
|
||||
}
|
||||
|
||||
- (void)repaintAllWindows
|
||||
{
|
||||
NSArray* windows = [[NSApplication sharedApplication] windows];
|
||||
|
||||
for (int i = 0; i < [windows count]; i++)
|
||||
{
|
||||
NSWindow* window = [windows objectAtIndex:i];
|
||||
|
||||
if (![window isVisible])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
RequestManager* requestManager = [RequestManager sharedInstance];
|
||||
|
||||
if ([[window className] isEqualToString:@"TBrowserWindow"])
|
||||
{
|
||||
NSObject* browserWindowController = [window browserWindowController];
|
||||
|
||||
BOOL repaintWindow = YES;
|
||||
|
||||
NSString* filterFolder = [requestManager filterFolder];
|
||||
|
||||
if (filterFolder)
|
||||
{
|
||||
repaintWindow = NO;
|
||||
|
||||
struct TFENodeVector* targetPath;
|
||||
|
||||
if ([browserWindowController respondsToSelector:@selector(targetPath)])
|
||||
{
|
||||
// 10.7 & 10.8
|
||||
targetPath = [browserWindowController targetPath];
|
||||
}
|
||||
else if ([browserWindowController respondsToSelector:@selector(activeContainer)])
|
||||
{
|
||||
// 10.9
|
||||
targetPath = [[browserWindowController activeContainer] targetPath];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"LiferayNativityFinder: refreshing icon badges failed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NSArray* folderPaths = [menuManager pathsForNodes:targetPath];
|
||||
|
||||
for (NSString* folderPath in folderPaths)
|
||||
{
|
||||
if ([folderPath hasPrefix:filterFolder] || [filterFolder hasPrefix:folderPath])
|
||||
{
|
||||
repaintWindow = YES;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (repaintWindow)
|
||||
{
|
||||
if ([browserWindowController respondsToSelector:@selector(browserViewController)])
|
||||
{
|
||||
// 10.7 & 10.8
|
||||
NSObject* browserViewController = [browserWindowController browserViewController];
|
||||
|
||||
NSObject* browserView = [browserViewController browserView];
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{[browserView setNeedsDisplay:YES];});
|
||||
}
|
||||
else if ([browserWindowController respondsToSelector:@selector(activeBrowserViewController)])
|
||||
{
|
||||
// 10.9
|
||||
NSObject* browserViewController = [browserWindowController activeBrowserViewController];
|
||||
|
||||
NSObject* browserView = [browserViewController browserView];
|
||||
|
||||
if ([browserView isKindOfClass:(id)objc_getClass("TListView")])
|
||||
{
|
||||
// List or Coverflow View
|
||||
[self setNeedsDisplayForListView:browserView];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Icon or Column View
|
||||
dispatch_async(dispatch_get_main_queue(), ^{[browserView setNeedsDisplay:YES];});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"LiferayNativityFinder: refreshing icon badges failed");
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setIcons:(NSDictionary*)iconDictionary filterByFolder:(NSString*)filterFolder
|
||||
{
|
||||
for (NSString* path in iconDictionary)
|
||||
{
|
||||
if (filterFolder && ![path hasPrefix:filterFolder])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NSString* normalizedPath = [path decomposedStringWithCanonicalMapping];
|
||||
NSNumber* iconId = [iconDictionary objectForKey:path];
|
||||
|
||||
if ([iconId intValue] == -1)
|
||||
{
|
||||
[_fileNamesCache removeObjectForKey:normalizedPath];
|
||||
}
|
||||
else
|
||||
{
|
||||
[_fileNamesCache setObject:iconId forKey:normalizedPath];
|
||||
}
|
||||
}
|
||||
|
||||
[self repaintAllWindows];
|
||||
}
|
||||
|
||||
- (void)setNeedsDisplayForListView:(NSView*)view
|
||||
{
|
||||
NSArray* subviews = [view subviews];
|
||||
|
||||
for (int i = 0; i < [subviews count]; i++)
|
||||
{
|
||||
NSView* subview = [subviews objectAtIndex:i];
|
||||
|
||||
if ([subview isKindOfClass:(id)objc_getClass("TListRowView")])
|
||||
{
|
||||
[self setNeedsDisplayForListView:subview];
|
||||
}
|
||||
else if ([subview isKindOfClass:(id)objc_getClass("TListNameCellView")])
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{[subview setNeedsDisplay:YES];});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,28 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface NSObject (ContextMenuHandlers)
|
||||
|
||||
struct TFENodeVector;
|
||||
|
||||
+ (void)ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 view:(id)arg4 browserController:(id)arg5 addPlugIns:(BOOL)arg6;
|
||||
+ (void)ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 view:(id)arg4 windowController:(id)arg5 addPlugIns:(BOOL)arg6;
|
||||
+ (void)ContextMenuHandlers_addViewSpecificStuffToMenu:(id)arg1 browserViewController:(id)arg2 context:(unsigned int)arg3;
|
||||
|
||||
- (void)ContextMenuHandlers_configureWithNodes:(const struct TFENodeVector*)arg1 browserController:(id)arg2 container:(BOOL)arg3;
|
||||
- (void)ContextMenuHandlers_configureWithNodes:(const struct TFENodeVector*)arg1 windowController:(id)arg2 container:(BOOL)arg3;
|
||||
|
||||
@end
|
|
@ -0,0 +1,106 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import "ContextMenuHandlers.h"
|
||||
#import "MenuManager.h"
|
||||
|
||||
@implementation NSObject (ContextMenuHandlers)
|
||||
|
||||
+ (void)ContextMenuHandlers_addViewSpecificStuffToMenu:(id)arg1 browserViewController:(id)arg2 context:(unsigned int)arg3 // 10.7 & 10.8
|
||||
{
|
||||
[self ContextMenuHandlers_addViewSpecificStuffToMenu:arg1 browserViewController:arg2 context:arg3];
|
||||
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
if (menuManager.menuItems.count > 0)
|
||||
{
|
||||
[menuManager addItemsToMenu:arg1 forFiles:menuManager.menuItems];
|
||||
[menuManager.menuItems removeAllObjects];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)ContextMenuHandlers_addViewSpecificStuffToMenu:(id)arg1 clickedView:(id)arg2 browserViewController:(id)arg3 context:(unsigned int)arg4 // 10.9
|
||||
{
|
||||
[self ContextMenuHandlers_addViewSpecificStuffToMenu:arg1 clickedView:arg2 browserViewController:arg3 context:arg4];
|
||||
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
if (menuManager.menuItems.count > 0)
|
||||
{
|
||||
[menuManager addItemsToMenu:arg1 forFiles:menuManager.menuItems];
|
||||
[menuManager.menuItems removeAllObjects];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 view:(id)arg4 windowController:(id)arg5 addPlugIns:(BOOL)arg6 // 10.7
|
||||
{
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
menuManager.menuItems = (NSMutableArray*)[menuManager pathsForNodes:arg2];
|
||||
|
||||
[self ContextMenuHandlers_handleContextMenuCommon:arg1 nodes:arg2 event:arg3 view:arg4 windowController:arg5 addPlugIns:arg6];
|
||||
}
|
||||
|
||||
+ (void)ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 view:(id)arg4 browserController:(id)arg5 addPlugIns:(BOOL)arg6 // 10.8
|
||||
{
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
menuManager.menuItems = (NSMutableArray*)[menuManager pathsForNodes:arg2];
|
||||
|
||||
[self ContextMenuHandlers_handleContextMenuCommon:arg1 nodes:arg2 event:arg3 view:arg4 browserController:arg5 addPlugIns:arg6];
|
||||
}
|
||||
|
||||
+ (void)ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 clickedView:(id)arg4 browserViewController:(id)arg5 addPlugIns:(BOOL)arg6 // 10.9
|
||||
{
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
menuManager.menuItems = (NSMutableArray*)[menuManager pathsForNodes:arg2];
|
||||
|
||||
[self ContextMenuHandlers_handleContextMenuCommon:arg1 nodes:arg2 event:arg3 clickedView:arg4 browserViewController:arg5 addPlugIns:arg6];
|
||||
}
|
||||
|
||||
- (void)ContextMenuHandlers_configureWithNodes:(const struct TFENodeVector*)arg1 windowController:(id)arg2 container:(BOOL)arg3 // 10.7
|
||||
{
|
||||
[self ContextMenuHandlers_configureWithNodes:arg1 windowController:arg2 container:arg3];
|
||||
|
||||
TContextMenu* realSelf = (TContextMenu*)self;
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
NSArray* selectedItems = [menuManager pathsForNodes:arg1];
|
||||
[menuManager addItemsToMenu:realSelf forFiles:selectedItems];
|
||||
}
|
||||
|
||||
- (void)ContextMenuHandlers_configureWithNodes:(const struct TFENodeVector*)arg1 browserController:(id)arg2 container:(BOOL)arg3 // 10.8
|
||||
{
|
||||
[self ContextMenuHandlers_configureWithNodes:arg1 browserController:arg2 container:arg3];
|
||||
|
||||
TContextMenu* realSelf = (TContextMenu*)self;
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
NSArray* selectedItems = [menuManager pathsForNodes:arg1];
|
||||
[menuManager addItemsToMenu:realSelf forFiles:selectedItems];
|
||||
}
|
||||
|
||||
- (void)ContextMenuHandlers_configureFromMenuNeedsUpdate:(id)arg1 clickedView:(id)arg2 container:(BOOL)arg3 event:(id)arg4 selectedNodes:(const struct TFENodeVector *)arg5 // 10.9
|
||||
{
|
||||
[self ContextMenuHandlers_configureFromMenuNeedsUpdate:arg1 clickedView:arg2 container:arg3 event:arg4 selectedNodes:arg5]; // 10.8
|
||||
|
||||
TContextMenu* realSelf = (TContextMenu*)self;
|
||||
MenuManager* menuManager = [MenuManager sharedInstance];
|
||||
|
||||
NSArray* selectedItems = [menuManager pathsForNodes:arg5];
|
||||
[menuManager addItemsToMenu:realSelf forFiles:selectedItems];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,74 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import "ContextMenuHandlers.h"
|
||||
#import "Finder/Finder.h"
|
||||
#import "MenuManager.h"
|
||||
|
||||
@implementation NSObject (ContextMenuHandlers)
|
||||
|
||||
+ (void) ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 view:(id)arg4 windowController:(id)arg5 addPlugIns:(BOOL)arg6 // Lion
|
||||
{
|
||||
MenuManager* contextMenuUtils = [MenuManager sharedInstance];
|
||||
|
||||
contextMenuUtils.menuItems = (NSMutableArray*)[contextMenuUtils pathsForNodes:arg2];
|
||||
|
||||
[self ContextMenuHandlers_handleContextMenuCommon:arg1 nodes:arg2 event:arg3 view:arg4 windowController:arg5 addPlugIns:arg6];
|
||||
}
|
||||
|
||||
+ (void) ContextMenuHandlers_handleContextMenuCommon:(unsigned int)arg1 nodes:(const struct TFENodeVector*)arg2 event:(id)arg3 view:(id)arg4 browserController:(id)arg5 addPlugIns:(BOOL)arg6 // Mountain Lion
|
||||
{
|
||||
MenuManager* contextMenuUtils = [MenuManager sharedInstance];
|
||||
|
||||
contextMenuUtils.menuItems = (NSMutableArray*)[contextMenuUtils pathsForNodes:arg2];
|
||||
|
||||
[self ContextMenuHandlers_handleContextMenuCommon:arg1 nodes:arg2 event:arg3 view:arg4 browserController:arg5 addPlugIns:arg6];
|
||||
}
|
||||
|
||||
+ (void) ContextMenuHandlers_addViewSpecificStuffToMenu:(id)arg1 browserViewController:(id)arg2 context:(unsigned int)arg3
|
||||
{
|
||||
[self ContextMenuHandlers_addViewSpecificStuffToMenu:arg1 browserViewController:arg2 context:arg3];
|
||||
|
||||
if ([MenuManager sharedInstance].menuItems.count > 0)
|
||||
{
|
||||
MenuManager* contextMenuUtils = [MenuManager sharedInstance];
|
||||
[contextMenuUtils addItemsToMenu:arg1 forPaths:contextMenuUtils.menuItems];
|
||||
[contextMenuUtils.menuItems removeAllObjects];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) ContextMenuHandlers_configureWithNodes:(const struct TFENodeVector*)arg1 windowController:(id)arg2 container:(BOOL)arg3 // Lion
|
||||
{
|
||||
[self ContextMenuHandlers_configureWithNodes:arg1 windowController:arg2 container:arg3];
|
||||
|
||||
TContextMenu* realSelf = (TContextMenu*)self;
|
||||
MenuManager* contextMenuUtils = [MenuManager sharedInstance];
|
||||
|
||||
NSArray* selectedItems = [contextMenuUtils pathsForNodes:arg1];
|
||||
[contextMenuUtils addItemsToMenu:realSelf forPaths:selectedItems];
|
||||
}
|
||||
|
||||
- (void) ContextMenuHandlers_configureWithNodes:(const struct TFENodeVector*)arg1 browserController:(id)arg2 container:(BOOL)arg3 // Mountain Lion
|
||||
{
|
||||
[self ContextMenuHandlers_configureWithNodes:arg1 browserController:arg2 container:arg3];
|
||||
|
||||
TContextMenu* realSelf = (TContextMenu*)self;
|
||||
MenuManager* contextMenuUtils = [MenuManager sharedInstance];
|
||||
|
||||
NSArray* selectedItems = [contextMenuUtils pathsForNodes:arg1];
|
||||
[contextMenuUtils addItemsToMenu:realSelf forPaths:selectedItems];
|
||||
}
|
||||
|
||||
|
||||
@end
|
BIN
shell_integration/MacOSX/LiferayNativityFinder/English.lproj/.DS_Store
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/* Localized versions of Info.plist keys */
|
||||
|
BIN
shell_integration/MacOSX/LiferayNativityFinder/Finder/.DS_Store
vendored
Normal file
1016
shell_integration/MacOSX/LiferayNativityFinder/Finder/Finder.h
Normal file
22
shell_integration/MacOSX/LiferayNativityFinder/FinderHook.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface FinderHook : NSObject
|
||||
|
||||
+ (void)hookClassMethod:(SEL)oldSelector inClass:(NSString*)className toCallToTheNewMethod:(SEL)newSelector;
|
||||
+ (void)hookMethod:(SEL)oldSelector inClass:(NSString*)className toCallToTheNewMethod:(SEL)newSelector;
|
||||
|
||||
@end
|
125
shell_integration/MacOSX/LiferayNativityFinder/FinderHook.m
Normal file
|
@ -0,0 +1,125 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import "ContentManager.h"
|
||||
#import "FinderHook.h"
|
||||
#import "IconCache.h"
|
||||
#import "objc/objc-class.h"
|
||||
#import "RequestManager.h"
|
||||
|
||||
static BOOL installed = NO;
|
||||
|
||||
@implementation FinderHook
|
||||
|
||||
+ (void)hookClassMethod:(SEL)oldSelector inClass:(NSString*)className toCallToTheNewMethod:(SEL)newSelector
|
||||
{
|
||||
Class hookedClass = NSClassFromString(className);
|
||||
Method oldMethod = class_getClassMethod(hookedClass, oldSelector);
|
||||
Method newMethod = class_getClassMethod(hookedClass, newSelector);
|
||||
|
||||
method_exchangeImplementations(newMethod, oldMethod);
|
||||
}
|
||||
|
||||
+ (void)hookMethod:(SEL)oldSelector inClass:(NSString*)className toCallToTheNewMethod:(SEL)newSelector
|
||||
{
|
||||
Class hookedClass = NSClassFromString(className);
|
||||
Method oldMethod = class_getInstanceMethod(hookedClass, oldSelector);
|
||||
Method newMethod = class_getInstanceMethod(hookedClass, newSelector);
|
||||
|
||||
method_exchangeImplementations(newMethod, oldMethod);
|
||||
}
|
||||
|
||||
+ (void)install
|
||||
{
|
||||
if (installed)
|
||||
{
|
||||
NSLog(@"LiferayNativityFinder: already installed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NSLog(@"LiferayNativityFinder: installing ownCloud Shell extension");
|
||||
|
||||
[RequestManager sharedInstance];
|
||||
|
||||
// Icons
|
||||
[self hookMethod:@selector(drawImage:) inClass:@"IKImageBrowserCell" toCallToTheNewMethod:@selector(IconOverlayHandlers_IKImageBrowserCell_drawImage:)]; // 10.7 & 10.8 & 10.9 (Icon View arrange by name)
|
||||
|
||||
[self hookMethod:@selector(drawImage:) inClass:@"IKFinderReflectiveIconCell" toCallToTheNewMethod:@selector(IconOverlayHandlers_IKFinderReflectiveIconCell_drawImage:)]; // 10.7 & 10.8 & 10.9 (Icon View arrange by everything else)
|
||||
|
||||
[self hookMethod:@selector(drawIconWithFrame:) inClass:@"TListViewIconAndTextCell" toCallToTheNewMethod:@selector(IconOverlayHandlers_drawIconWithFrame:)]; // 10.7 & 10.8 & 10.9 Column View
|
||||
|
||||
[self hookMethod:@selector(drawRect:) inClass:@"TDimmableIconImageView" toCallToTheNewMethod:@selector(IconOverlayHandlers_drawRect:)]; // 10.9 (List and Coverflow Views)
|
||||
|
||||
// Context Menus
|
||||
[self hookClassMethod:@selector(addViewSpecificStuffToMenu:browserViewController:context:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_addViewSpecificStuffToMenu:browserViewController:context:)]; // 10.7 & 10.8
|
||||
|
||||
[self hookClassMethod:@selector(addViewSpecificStuffToMenu:clickedView:browserViewController:context:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_addViewSpecificStuffToMenu:clickedView:browserViewController:context:)]; // 10.9
|
||||
|
||||
[self hookClassMethod:@selector(handleContextMenuCommon:nodes:event:view:windowController:addPlugIns:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_handleContextMenuCommon:nodes:event:view:windowController:addPlugIns:)]; // 10.7
|
||||
|
||||
[self hookClassMethod:@selector(handleContextMenuCommon:nodes:event:view:browserController:addPlugIns:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_handleContextMenuCommon:nodes:event:view:browserController:addPlugIns:)]; // 10.8
|
||||
|
||||
[self hookClassMethod:@selector(handleContextMenuCommon:nodes:event:clickedView:browserViewController:addPlugIns:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_handleContextMenuCommon:nodes:event:clickedView:browserViewController:addPlugIns:)]; // 10.9
|
||||
|
||||
[self hookMethod:@selector(configureWithNodes:windowController:container:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_configureWithNodes:windowController:container:)]; // 10.7
|
||||
|
||||
[self hookMethod:@selector(configureWithNodes:browserController:container:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_configureWithNodes:browserController:container:)]; // 10.8
|
||||
|
||||
[self hookMethod:@selector(configureFromMenuNeedsUpdate:clickedView:container:event:selectedNodes:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(ContextMenuHandlers_configureFromMenuNeedsUpdate:clickedView:container:event:selectedNodes:)]; // 10.9
|
||||
|
||||
installed = YES;
|
||||
|
||||
NSLog(@"LiferayNativityFinder: installed");
|
||||
}
|
||||
|
||||
+ (void)uninstall
|
||||
{
|
||||
if (!installed)
|
||||
{
|
||||
NSLog(@"LiferayNativityFinder: not installed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NSLog(@"LiferayNativityFinder: uninstalling");
|
||||
|
||||
[[ContentManager sharedInstance] dealloc];
|
||||
|
||||
[[IconCache sharedInstance] dealloc];
|
||||
|
||||
[[RequestManager sharedInstance] dealloc];
|
||||
|
||||
// Icons
|
||||
[self hookMethod:@selector(IconOverlayHandlers_drawImage:) inClass:@"TIconViewCell" toCallToTheNewMethod:@selector(drawImage:)]; // 10.7 & 10.8 & 10.9
|
||||
|
||||
[self hookMethod:@selector(IconOverlayHandlers_drawIconWithFrame:) inClass:@"TListViewIconAndTextCell" toCallToTheNewMethod:@selector(drawIconWithFrame:)]; // 10.7 & 10.8 & 10.9
|
||||
|
||||
// Context Menus
|
||||
[self hookClassMethod:@selector(ContextMenuHandlers_addViewSpecificStuffToMenu:browserViewController:context:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(addViewSpecificStuffToMenu:browserViewController:context:)]; // 10.7 & 10.8
|
||||
|
||||
[self hookClassMethod:@selector(ContextMenuHandlers_handleContextMenuCommon:nodes:event:view:windowController:addPlugIns:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(handleContextMenuCommon:nodes:event:view:windowController:addPlugIns:)]; // 10.7
|
||||
|
||||
[self hookMethod:@selector(ContextMenuHandlers_configureWithNodes:windowController:container:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(configureWithNodes:windowController:container:)]; // 10.7
|
||||
|
||||
[self hookClassMethod:@selector(ContextMenuHandlers_handleContextMenuCommon:nodes:event:view:browserController:addPlugIns:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(handleContextMenuCommon:nodes:event:view:browserController:addPlugIns:)]; // 10.8
|
||||
|
||||
[self hookMethod:@selector(ContextMenuHandlers_configureWithNodes:browserController:container:) inClass:@"TContextMenu" toCallToTheNewMethod:@selector(configureWithNodes:browserController:container:)]; // 10.8
|
||||
|
||||
installed = NO;
|
||||
|
||||
NSLog(@"LiferayNativityFinder: uninstalled");
|
||||
}
|
||||
|
||||
@end
|
963
shell_integration/MacOSX/LiferayNativityFinder/GCDAsyncSocket.h
Normal file
|
@ -0,0 +1,963 @@
|
|||
//
|
||||
// GCDAsyncSocket.h
|
||||
//
|
||||
// This class is in the public domain.
|
||||
// Originally created by Robbie Hanson in Q3 2010.
|
||||
// Updated and maintained by Deusty LLC and the Mac development community.
|
||||
//
|
||||
// http://code.google.com/p/cocoaasyncsocket/
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Security/Security.h>
|
||||
#import <dispatch/dispatch.h>
|
||||
|
||||
@class GCDAsyncReadPacket;
|
||||
@class GCDAsyncWritePacket;
|
||||
|
||||
extern NSString *const GCDAsyncSocketException;
|
||||
extern NSString *const GCDAsyncSocketErrorDomain;
|
||||
|
||||
#if !TARGET_OS_IPHONE
|
||||
extern NSString *const GCDAsyncSocketSSLCipherSuites;
|
||||
extern NSString *const GCDAsyncSocketSSLDiffieHellmanParameters;
|
||||
#endif
|
||||
|
||||
enum GCDAsyncSocketError
|
||||
{
|
||||
GCDAsyncSocketNoError = 0, // Never used
|
||||
GCDAsyncSocketBadConfigError, // Invalid configuration
|
||||
GCDAsyncSocketBadParamError, // Invalid parameter was passed
|
||||
GCDAsyncSocketConnectTimeoutError, // A connect operation timed out
|
||||
GCDAsyncSocketReadTimeoutError, // A read operation timed out
|
||||
GCDAsyncSocketWriteTimeoutError, // A write operation timed out
|
||||
GCDAsyncSocketReadMaxedOutError, // Reached set maxLength without completing
|
||||
GCDAsyncSocketClosedError, // The remote peer closed the connection
|
||||
GCDAsyncSocketOtherError, // Description provided in userInfo
|
||||
};
|
||||
typedef enum GCDAsyncSocketError GCDAsyncSocketError;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark -
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@interface GCDAsyncSocket : NSObject
|
||||
{
|
||||
uint32_t flags;
|
||||
uint16_t config;
|
||||
|
||||
id delegate;
|
||||
dispatch_queue_t delegateQueue;
|
||||
|
||||
int socket4FD;
|
||||
int socket6FD;
|
||||
int connectIndex;
|
||||
NSData * connectInterface4;
|
||||
NSData * connectInterface6;
|
||||
|
||||
dispatch_queue_t socketQueue;
|
||||
|
||||
dispatch_source_t accept4Source;
|
||||
dispatch_source_t accept6Source;
|
||||
dispatch_source_t connectTimer;
|
||||
dispatch_source_t readSource;
|
||||
dispatch_source_t writeSource;
|
||||
dispatch_source_t readTimer;
|
||||
dispatch_source_t writeTimer;
|
||||
|
||||
NSMutableArray *readQueue;
|
||||
NSMutableArray *writeQueue;
|
||||
|
||||
GCDAsyncReadPacket *currentRead;
|
||||
GCDAsyncWritePacket *currentWrite;
|
||||
|
||||
unsigned long socketFDBytesAvailable;
|
||||
|
||||
NSMutableData *partialReadBuffer;
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
CFStreamClientContext streamContext;
|
||||
CFReadStreamRef readStream;
|
||||
CFWriteStreamRef writeStream;
|
||||
#else
|
||||
SSLContextRef sslContext;
|
||||
NSMutableData *sslReadBuffer;
|
||||
size_t sslWriteCachedLength;
|
||||
#endif
|
||||
|
||||
id userData;
|
||||
}
|
||||
|
||||
/**
|
||||
* GCDAsyncSocket uses the standard delegate paradigm,
|
||||
* but executes all delegate callbacks on a given delegate dispatch queue.
|
||||
* This allows for maximum concurrency, while at the same time providing easy thread safety.
|
||||
*
|
||||
* You MUST set a delegate AND delegate dispatch queue before attempting to
|
||||
* use the socket, or you will get an error.
|
||||
*
|
||||
* The socket queue is optional.
|
||||
* If you pass NULL, GCDAsyncSocket will automatically create it's own socket queue.
|
||||
* If you choose to provide a socket queue, the socket queue must not be a concurrent queue.
|
||||
*
|
||||
* The delegate queue and socket queue can optionally be the same.
|
||||
**/
|
||||
- (id)init;
|
||||
- (id)initWithSocketQueue:(dispatch_queue_t)sq;
|
||||
- (id)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq;
|
||||
- (id)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq socketQueue:(dispatch_queue_t)sq;
|
||||
|
||||
#pragma mark Configuration
|
||||
|
||||
- (id)delegate;
|
||||
- (void)setDelegate:(id)delegate;
|
||||
- (void)synchronouslySetDelegate:(id)delegate;
|
||||
|
||||
- (dispatch_queue_t)delegateQueue;
|
||||
- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;
|
||||
- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)delegateQueue;
|
||||
|
||||
- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr;
|
||||
- (void)setDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
|
||||
- (void)synchronouslySetDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
|
||||
|
||||
/**
|
||||
* Traditionally sockets are not closed until the conversation is over.
|
||||
* However, it is technically possible for the remote enpoint to close its write stream.
|
||||
* Our socket would then be notified that there is no more data to be read,
|
||||
* but our socket would still be writeable and the remote endpoint could continue to receive our data.
|
||||
*
|
||||
* The argument for this confusing functionality stems from the idea that a client could shut down its
|
||||
* write stream after sending a request to the server, thus notifying the server there are to be no further requests.
|
||||
* In practice, however, this technique did little to help server developers.
|
||||
*
|
||||
* To make matters worse, from a TCP perspective there is no way to tell the difference from a read stream close
|
||||
* and a full socket close. They both result in the TCP stack receiving a FIN packet. The only way to tell
|
||||
* is by continuing to write to the socket. If it was only a read stream close, then writes will continue to work.
|
||||
* Otherwise an error will be occur shortly (when the remote end sends us a RST packet).
|
||||
*
|
||||
* In addition to the technical challenges and confusion, many high level socket/stream API's provide
|
||||
* no support for dealing with the problem. If the read stream is closed, the API immediately declares the
|
||||
* socket to be closed, and shuts down the write stream as well. In fact, this is what Apple's CFStream API does.
|
||||
* It might sound like poor design at first, but in fact it simplifies development.
|
||||
*
|
||||
* The vast majority of the time if the read stream is closed it's because the remote endpoint closed its socket.
|
||||
* Thus it actually makes sense to close the socket at this point.
|
||||
* And in fact this is what most networking developers want and expect to happen.
|
||||
* However, if you are writing a server that interacts with a plethora of clients,
|
||||
* you might encounter a client that uses the discouraged technique of shutting down its write stream.
|
||||
* If this is the case, you can set this property to NO,
|
||||
* and make use of the socketDidCloseReadStream delegate method.
|
||||
*
|
||||
* The default value is YES.
|
||||
**/
|
||||
- (BOOL)autoDisconnectOnClosedReadStream;
|
||||
- (void)setAutoDisconnectOnClosedReadStream:(BOOL)flag;
|
||||
|
||||
/**
|
||||
* By default, both IPv4 and IPv6 are enabled.
|
||||
*
|
||||
* For accepting incoming connections, this means GCDAsyncSocket automatically supports both protocols,
|
||||
* and can simulataneously accept incoming connections on either protocol.
|
||||
*
|
||||
* For outgoing connections, this means GCDAsyncSocket can connect to remote hosts running either protocol.
|
||||
* If a DNS lookup returns only IPv4 results, GCDAsyncSocket will automatically use IPv4.
|
||||
* If a DNS lookup returns only IPv6 results, GCDAsyncSocket will automatically use IPv6.
|
||||
* If a DNS lookup returns both IPv4 and IPv6 results, the preferred protocol will be chosen.
|
||||
* By default, the preferred protocol is IPv4, but may be configured as desired.
|
||||
**/
|
||||
- (BOOL)isIPv4Enabled;
|
||||
- (void)setIPv4Enabled:(BOOL)flag;
|
||||
|
||||
- (BOOL)isIPv6Enabled;
|
||||
- (void)setIPv6Enabled:(BOOL)flag;
|
||||
|
||||
- (BOOL)isIPv4PreferredOverIPv6;
|
||||
- (void)setPreferIPv4OverIPv6:(BOOL)flag;
|
||||
|
||||
/**
|
||||
* User data allows you to associate arbitrary information with the socket.
|
||||
* This data is not used internally by socket in any way.
|
||||
**/
|
||||
- (id)userData;
|
||||
- (void)setUserData:(id)arbitraryUserData;
|
||||
|
||||
#pragma mark Accepting
|
||||
|
||||
/**
|
||||
* Tells the socket to begin listening and accepting connections on the given port.
|
||||
* When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it,
|
||||
* and the socket:didAcceptNewSocket: delegate method will be invoked.
|
||||
*
|
||||
* The socket will listen on all available interfaces (e.g. wifi, ethernet, etc)
|
||||
**/
|
||||
- (BOOL)acceptOnPort:(uint16_t)port error:(NSError **)errPtr;
|
||||
|
||||
/**
|
||||
* This method is the same as acceptOnPort:error: with the
|
||||
* additional option of specifying which interface to listen on.
|
||||
*
|
||||
* For example, you could specify that the socket should only accept connections over ethernet,
|
||||
* and not other interfaces such as wifi.
|
||||
*
|
||||
* The interface may be specified by name (e.g. "en1" or "lo0") or by IP address (e.g. "192.168.4.34").
|
||||
* You may also use the special strings "localhost" or "loopback" to specify that
|
||||
* the socket only accept connections from the local machine.
|
||||
*
|
||||
* You can see the list of interfaces via the command line utility "ifconfig",
|
||||
* or programmatically via the getifaddrs() function.
|
||||
*
|
||||
* To accept connections on any interface pass nil, or simply use the acceptOnPort:error: method.
|
||||
**/
|
||||
- (BOOL)acceptOnInterface:(NSString *)interface port:(uint16_t)port error:(NSError **)errPtr;
|
||||
|
||||
#pragma mark Connecting
|
||||
|
||||
/**
|
||||
* Connects to the given host and port.
|
||||
*
|
||||
* This method invokes connectToHost:onPort:viaInterface:withTimeout:error:
|
||||
* and uses the default interface, and no timeout.
|
||||
**/
|
||||
- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr;
|
||||
|
||||
/**
|
||||
* Connects to the given host and port with an optional timeout.
|
||||
*
|
||||
* This method invokes connectToHost:onPort:viaInterface:withTimeout:error: and uses the default interface.
|
||||
**/
|
||||
- (BOOL)connectToHost:(NSString *)host
|
||||
onPort:(uint16_t)port
|
||||
withTimeout:(NSTimeInterval)timeout
|
||||
error:(NSError **)errPtr;
|
||||
|
||||
/**
|
||||
* Connects to the given host & port, via the optional interface, with an optional timeout.
|
||||
*
|
||||
* The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2").
|
||||
* The host may also be the special strings "localhost" or "loopback" to specify connecting
|
||||
* to a service on the local machine.
|
||||
*
|
||||
* The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35").
|
||||
* The interface may also be used to specify the local port (see below).
|
||||
*
|
||||
* To not time out use a negative time interval.
|
||||
*
|
||||
* This method will return NO if an error is detected, and set the error pointer (if one was given).
|
||||
* Possible errors would be a nil host, invalid interface, or socket is already connected.
|
||||
*
|
||||
* If no errors are detected, this method will start a background connect operation and immediately return YES.
|
||||
* The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable.
|
||||
*
|
||||
* Since this class supports queued reads and writes, you can immediately start reading and/or writing.
|
||||
* All read/write operations will be queued, and upon socket connection,
|
||||
* the operations will be dequeued and processed in order.
|
||||
*
|
||||
* The interface may optionally contain a port number at the end of the string, separated by a colon.
|
||||
* This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end)
|
||||
* To specify both interface and local port: "en1:8082" or "192.168.4.35:2424".
|
||||
* To specify only local port: ":8082".
|
||||
* Please note this is an advanced feature, and is somewhat hidden on purpose.
|
||||
* You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection.
|
||||
* If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere.
|
||||
* Local ports do NOT need to match remote ports. In fact, they almost never do.
|
||||
* This feature is here for networking professionals using very advanced techniques.
|
||||
**/
|
||||
- (BOOL)connectToHost:(NSString *)host
|
||||
onPort:(uint16_t)port
|
||||
viaInterface:(NSString *)interface
|
||||
withTimeout:(NSTimeInterval)timeout
|
||||
error:(NSError **)errPtr;
|
||||
|
||||
/**
|
||||
* Connects to the given address, specified as a sockaddr structure wrapped in a NSData object.
|
||||
* For example, a NSData object returned from NSNetService's addresses method.
|
||||
*
|
||||
* If you have an existing struct sockaddr you can convert it to a NSData object like so:
|
||||
* struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
|
||||
* struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
|
||||
*
|
||||
* This method invokes connectToAdd
|
||||
**/
|
||||
- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr;
|
||||
|
||||
/**
|
||||
* This method is the same as connectToAddress:error: with an additional timeout option.
|
||||
* To not time out use a negative time interval, or simply use the connectToAddress:error: method.
|
||||
**/
|
||||
- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;
|
||||
|
||||
/**
|
||||
* Connects to the given address, using the specified interface and timeout.
|
||||
*
|
||||
* The address is specified as a sockaddr structure wrapped in a NSData object.
|
||||
* For example, a NSData object returned from NSNetService's addresses method.
|
||||
*
|
||||
* If you have an existing struct sockaddr you can convert it to a NSData object like so:
|
||||
* struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
|
||||
* struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
|
||||
*
|
||||
* The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35").
|
||||
* The interface may also be used to specify the local port (see below).
|
||||
*
|
||||
* The timeout is optional. To not time out use a negative time interval.
|
||||
*
|
||||
* This method will return NO if an error is detected, and set the error pointer (if one was given).
|
||||
* Possible errors would be a nil host, invalid interface, or socket is already connected.
|
||||
*
|
||||
* If no errors are detected, this method will start a background connect operation and immediately return YES.
|
||||
* The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable.
|
||||
*
|
||||
* Since this class supports queued reads and writes, you can immediately start reading and/or writing.
|
||||
* All read/write operations will be queued, and upon socket connection,
|
||||
* the operations will be dequeued and processed in order.
|
||||
*
|
||||
* The interface may optionally contain a port number at the end of the string, separated by a colon.
|
||||
* This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end)
|
||||
* To specify both interface and local port: "en1:8082" or "192.168.4.35:2424".
|
||||
* To specify only local port: ":8082".
|
||||
* Please note this is an advanced feature, and is somewhat hidden on purpose.
|
||||
* You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection.
|
||||
* If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere.
|
||||
* Local ports do NOT need to match remote ports. In fact, they almost never do.
|
||||
* This feature is here for networking professionals using very advanced techniques.
|
||||
**/
|
||||
- (BOOL)connectToAddress:(NSData *)remoteAddr
|
||||
viaInterface:(NSString *)interface
|
||||
withTimeout:(NSTimeInterval)timeout
|
||||
error:(NSError **)errPtr;
|
||||
|
||||
#pragma mark Disconnecting
|
||||
|
||||
/**
|
||||
* Disconnects immediately (synchronously). Any pending reads or writes are dropped.
|
||||
*
|
||||
* If the socket is not already disconnected, an invocation to the socketDidDisconnect:withError: delegate method
|
||||
* will be queued onto the delegateQueue asynchronously (behind any previously queued delegate methods).
|
||||
* In other words, the disconnected delegate method will be invoked sometime shortly after this method returns.
|
||||
*
|
||||
* Please note the recommended way of releasing a GCDAsyncSocket instance (e.g. in a dealloc method)
|
||||
* [asyncSocket setDelegate:nil];
|
||||
* [asyncSocket disconnect];
|
||||
* [asyncSocket release];
|
||||
*
|
||||
* If you plan on disconnecting the socket, and then immediately asking it to connect again,
|
||||
* you'll likely want to do so like this:
|
||||
* [asyncSocket setDelegate:nil];
|
||||
* [asyncSocket disconnect];
|
||||
* [asyncSocket setDelegate:self];
|
||||
* [asyncSocket connect...];
|
||||
**/
|
||||
- (void)disconnect;
|
||||
|
||||
/**
|
||||
* Disconnects after all pending reads have completed.
|
||||
* After calling this, the read and write methods will do nothing.
|
||||
* The socket will disconnect even if there are still pending writes.
|
||||
**/
|
||||
- (void)disconnectAfterReading;
|
||||
|
||||
/**
|
||||
* Disconnects after all pending writes have completed.
|
||||
* After calling this, the read and write methods will do nothing.
|
||||
* The socket will disconnect even if there are still pending reads.
|
||||
**/
|
||||
- (void)disconnectAfterWriting;
|
||||
|
||||
/**
|
||||
* Disconnects after all pending reads and writes have completed.
|
||||
* After calling this, the read and write methods will do nothing.
|
||||
**/
|
||||
- (void)disconnectAfterReadingAndWriting;
|
||||
|
||||
#pragma mark Diagnostics
|
||||
|
||||
/**
|
||||
* Returns whether the socket is disconnected or connected.
|
||||
*
|
||||
* A disconnected socket may be recycled.
|
||||
* That is, it can used again for connecting or listening.
|
||||
*
|
||||
* If a socket is in the process of connecting, it may be neither disconnected nor connected.
|
||||
**/
|
||||
- (BOOL)isDisconnected;
|
||||
- (BOOL)isConnected;
|
||||
|
||||
/**
|
||||
* Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected.
|
||||
* The host will be an IP address.
|
||||
**/
|
||||
- (NSString *)connectedHost;
|
||||
- (uint16_t)connectedPort;
|
||||
|
||||
- (NSString *)localHost;
|
||||
- (uint16_t)localPort;
|
||||
|
||||
/**
|
||||
* Returns the local or remote address to which this socket is connected,
|
||||
* specified as a sockaddr structure wrapped in a NSData object.
|
||||
*
|
||||
* See also the connectedHost, connectedPort, localHost and localPort methods.
|
||||
**/
|
||||
- (NSData *)connectedAddress;
|
||||
- (NSData *)localAddress;
|
||||
|
||||
/**
|
||||
* Returns whether the socket is IPv4 or IPv6.
|
||||
* An accepting socket may be both.
|
||||
**/
|
||||
- (BOOL)isIPv4;
|
||||
- (BOOL)isIPv6;
|
||||
|
||||
/**
|
||||
* Returns whether or not the socket has been secured via SSL/TLS.
|
||||
*
|
||||
* See also the startTLS method.
|
||||
**/
|
||||
- (BOOL)isSecure;
|
||||
|
||||
#pragma mark Reading
|
||||
|
||||
// The readData and writeData methods won't block (they are asynchronous).
|
||||
//
|
||||
// When a read is complete the socket:didReadData:withTag: delegate method is dispatched on the delegateQueue.
|
||||
// When a write is complete the socket:didWriteDataWithTag: delegate method is dispatched on the delegateQueue.
|
||||
//
|
||||
// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.)
|
||||
// If a read/write opertion times out, the corresponding "socket:shouldTimeout..." delegate method
|
||||
// is called to optionally allow you to extend the timeout.
|
||||
// Upon a timeout, the "socket:didDisconnectWithError:" method is called
|
||||
//
|
||||
// The tag is for your convenience.
|
||||
// You can use it as an array index, step number, state id, pointer, etc.
|
||||
|
||||
/**
|
||||
* Reads the first available bytes that become available on the socket.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
**/
|
||||
- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads the first available bytes that become available on the socket.
|
||||
* The bytes will be appended to the given byte buffer starting at the given offset.
|
||||
* The given buffer will automatically be increased in size if needed.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
* If the buffer if nil, the socket will create a buffer for you.
|
||||
*
|
||||
* If the bufferOffset is greater than the length of the given buffer,
|
||||
* the method will do nothing, and the delegate will not be called.
|
||||
*
|
||||
* If you pass a buffer, you must not alter it in any way while the socket is using it.
|
||||
* After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
|
||||
* That is, it will reference the bytes that were appended to the given buffer via
|
||||
* the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
|
||||
**/
|
||||
- (void)readDataWithTimeout:(NSTimeInterval)timeout
|
||||
buffer:(NSMutableData *)buffer
|
||||
bufferOffset:(NSUInteger)offset
|
||||
tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads the first available bytes that become available on the socket.
|
||||
* The bytes will be appended to the given byte buffer starting at the given offset.
|
||||
* The given buffer will automatically be increased in size if needed.
|
||||
* A maximum of length bytes will be read.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
* If the buffer if nil, a buffer will automatically be created for you.
|
||||
* If maxLength is zero, no length restriction is enforced.
|
||||
*
|
||||
* If the bufferOffset is greater than the length of the given buffer,
|
||||
* the method will do nothing, and the delegate will not be called.
|
||||
*
|
||||
* If you pass a buffer, you must not alter it in any way while the socket is using it.
|
||||
* After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
|
||||
* That is, it will reference the bytes that were appended to the given buffer via
|
||||
* the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
|
||||
**/
|
||||
- (void)readDataWithTimeout:(NSTimeInterval)timeout
|
||||
buffer:(NSMutableData *)buffer
|
||||
bufferOffset:(NSUInteger)offset
|
||||
maxLength:(NSUInteger)length
|
||||
tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads the given number of bytes.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
*
|
||||
* If the length is 0, this method does nothing and the delegate is not called.
|
||||
**/
|
||||
- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads the given number of bytes.
|
||||
* The bytes will be appended to the given byte buffer starting at the given offset.
|
||||
* The given buffer will automatically be increased in size if needed.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
* If the buffer if nil, a buffer will automatically be created for you.
|
||||
*
|
||||
* If the length is 0, this method does nothing and the delegate is not called.
|
||||
* If the bufferOffset is greater than the length of the given buffer,
|
||||
* the method will do nothing, and the delegate will not be called.
|
||||
*
|
||||
* If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
|
||||
* After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
|
||||
* That is, it will reference the bytes that were appended to the given buffer via
|
||||
* the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
|
||||
**/
|
||||
- (void)readDataToLength:(NSUInteger)length
|
||||
withTimeout:(NSTimeInterval)timeout
|
||||
buffer:(NSMutableData *)buffer
|
||||
bufferOffset:(NSUInteger)offset
|
||||
tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
*
|
||||
* If you pass nil or zero-length data as the "data" parameter,
|
||||
* the method will do nothing (except maybe print a warning), and the delegate will not be called.
|
||||
*
|
||||
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
|
||||
* If you're developing your own custom protocol, be sure your separator can not occur naturally as
|
||||
* part of the data between separators.
|
||||
* For example, imagine you want to send several small documents over a socket.
|
||||
* Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
|
||||
* In this particular example, it would be better to use a protocol similar to HTTP with
|
||||
* a header that includes the length of the document.
|
||||
* Also be careful that your separator cannot occur naturally as part of the encoding for a character.
|
||||
*
|
||||
* The given data (separator) parameter should be immutable.
|
||||
* For performance reasons, the socket will retain it, not copy it.
|
||||
* So if it is immutable, don't modify it while the socket is using it.
|
||||
**/
|
||||
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
|
||||
* The bytes will be appended to the given byte buffer starting at the given offset.
|
||||
* The given buffer will automatically be increased in size if needed.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
* If the buffer if nil, a buffer will automatically be created for you.
|
||||
*
|
||||
* If the bufferOffset is greater than the length of the given buffer,
|
||||
* the method will do nothing (except maybe print a warning), and the delegate will not be called.
|
||||
*
|
||||
* If you pass a buffer, you must not alter it in any way while the socket is using it.
|
||||
* After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
|
||||
* That is, it will reference the bytes that were appended to the given buffer via
|
||||
* the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
|
||||
*
|
||||
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
|
||||
* If you're developing your own custom protocol, be sure your separator can not occur naturally as
|
||||
* part of the data between separators.
|
||||
* For example, imagine you want to send several small documents over a socket.
|
||||
* Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
|
||||
* In this particular example, it would be better to use a protocol similar to HTTP with
|
||||
* a header that includes the length of the document.
|
||||
* Also be careful that your separator cannot occur naturally as part of the encoding for a character.
|
||||
*
|
||||
* The given data (separator) parameter should be immutable.
|
||||
* For performance reasons, the socket will retain it, not copy it.
|
||||
* So if it is immutable, don't modify it while the socket is using it.
|
||||
**/
|
||||
- (void)readDataToData:(NSData *)data
|
||||
withTimeout:(NSTimeInterval)timeout
|
||||
buffer:(NSMutableData *)buffer
|
||||
bufferOffset:(NSUInteger)offset
|
||||
tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
*
|
||||
* If maxLength is zero, no length restriction is enforced.
|
||||
* Otherwise if maxLength bytes are read without completing the read,
|
||||
* it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError.
|
||||
* The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end.
|
||||
*
|
||||
* If you pass nil or zero-length data as the "data" parameter,
|
||||
* the method will do nothing (except maybe print a warning), and the delegate will not be called.
|
||||
* If you pass a maxLength parameter that is less than the length of the data parameter,
|
||||
* the method will do nothing (except maybe print a warning), and the delegate will not be called.
|
||||
*
|
||||
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
|
||||
* If you're developing your own custom protocol, be sure your separator can not occur naturally as
|
||||
* part of the data between separators.
|
||||
* For example, imagine you want to send several small documents over a socket.
|
||||
* Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
|
||||
* In this particular example, it would be better to use a protocol similar to HTTP with
|
||||
* a header that includes the length of the document.
|
||||
* Also be careful that your separator cannot occur naturally as part of the encoding for a character.
|
||||
*
|
||||
* The given data (separator) parameter should be immutable.
|
||||
* For performance reasons, the socket will retain it, not copy it.
|
||||
* So if it is immutable, don't modify it while the socket is using it.
|
||||
**/
|
||||
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
|
||||
* The bytes will be appended to the given byte buffer starting at the given offset.
|
||||
* The given buffer will automatically be increased in size if needed.
|
||||
*
|
||||
* If the timeout value is negative, the read operation will not use a timeout.
|
||||
* If the buffer if nil, a buffer will automatically be created for you.
|
||||
*
|
||||
* If maxLength is zero, no length restriction is enforced.
|
||||
* Otherwise if maxLength bytes are read without completing the read,
|
||||
* it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError.
|
||||
* The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end.
|
||||
*
|
||||
* If you pass a maxLength parameter that is less than the length of the data (separator) parameter,
|
||||
* the method will do nothing (except maybe print a warning), and the delegate will not be called.
|
||||
* If the bufferOffset is greater than the length of the given buffer,
|
||||
* the method will do nothing (except maybe print a warning), and the delegate will not be called.
|
||||
*
|
||||
* If you pass a buffer, you must not alter it in any way while the socket is using it.
|
||||
* After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer.
|
||||
* That is, it will reference the bytes that were appended to the given buffer via
|
||||
* the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO].
|
||||
*
|
||||
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
|
||||
* If you're developing your own custom protocol, be sure your separator can not occur naturally as
|
||||
* part of the data between separators.
|
||||
* For example, imagine you want to send several small documents over a socket.
|
||||
* Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents.
|
||||
* In this particular example, it would be better to use a protocol similar to HTTP with
|
||||
* a header that includes the length of the document.
|
||||
* Also be careful that your separator cannot occur naturally as part of the encoding for a character.
|
||||
*
|
||||
* The given data (separator) parameter should be immutable.
|
||||
* For performance reasons, the socket will retain it, not copy it.
|
||||
* So if it is immutable, don't modify it while the socket is using it.
|
||||
**/
|
||||
- (void)readDataToData:(NSData *)data
|
||||
withTimeout:(NSTimeInterval)timeout
|
||||
buffer:(NSMutableData *)buffer
|
||||
bufferOffset:(NSUInteger)offset
|
||||
maxLength:(NSUInteger)length
|
||||
tag:(long)tag;
|
||||
|
||||
#pragma mark Writing
|
||||
|
||||
/**
|
||||
* Writes data to the socket, and calls the delegate when finished.
|
||||
*
|
||||
* If you pass in nil or zero-length data, this method does nothing and the delegate will not be called.
|
||||
* If the timeout value is negative, the write operation will not use a timeout.
|
||||
*
|
||||
* Thread-Safety Note:
|
||||
* If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while
|
||||
* the socket is writing it. In other words, it's not safe to alter the data until after the delegate method
|
||||
* socket:didWriteDataWithTag: is invoked signifying that this particular write operation has completed.
|
||||
* This is due to the fact that GCDAsyncSocket does NOT copy the data. It simply retains it.
|
||||
* This is for performance reasons. Often times, if NSMutableData is passed, it is because
|
||||
* a request/response was built up in memory. Copying this data adds an unwanted/unneeded overhead.
|
||||
* If you need to write data from an immutable buffer, and you need to alter the buffer before the socket
|
||||
* completes writing the bytes (which is NOT immediately after this method returns, but rather at a later time
|
||||
* when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method.
|
||||
**/
|
||||
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
|
||||
|
||||
#pragma mark Security
|
||||
|
||||
/**
|
||||
* Secures the connection using SSL/TLS.
|
||||
*
|
||||
* This method may be called at any time, and the TLS handshake will occur after all pending reads and writes
|
||||
* are finished. This allows one the option of sending a protocol dependent StartTLS message, and queuing
|
||||
* the upgrade to TLS at the same time, without having to wait for the write to finish.
|
||||
* Any reads or writes scheduled after this method is called will occur over the secured connection.
|
||||
*
|
||||
* The possible keys and values for the TLS settings are well documented.
|
||||
* Some possible keys are:
|
||||
* - kCFStreamSSLLevel
|
||||
* - kCFStreamSSLAllowsExpiredCertificates
|
||||
* - kCFStreamSSLAllowsExpiredRoots
|
||||
* - kCFStreamSSLAllowsAnyRoot
|
||||
* - kCFStreamSSLValidatesCertificateChain
|
||||
* - kCFStreamSSLPeerName
|
||||
* - kCFStreamSSLCertificates
|
||||
* - kCFStreamSSLIsServer
|
||||
*
|
||||
* Please refer to Apple's documentation for associated values, as well as other possible keys.
|
||||
*
|
||||
* If you pass in nil or an empty dictionary, the default settings will be used.
|
||||
*
|
||||
* The default settings will check to make sure the remote party's certificate is signed by a
|
||||
* trusted 3rd party certificate agency (e.g. verisign) and that the certificate is not expired.
|
||||
* However it will not verify the name on the certificate unless you
|
||||
* give it a name to verify against via the kCFStreamSSLPeerName key.
|
||||
* The security implications of this are important to understand.
|
||||
* Imagine you are attempting to create a secure connection to MySecureServer.com,
|
||||
* but your socket gets directed to MaliciousServer.com because of a hacked DNS server.
|
||||
* If you simply use the default settings, and MaliciousServer.com has a valid certificate,
|
||||
* the default settings will not detect any problems since the certificate is valid.
|
||||
* To properly secure your connection in this particular scenario you
|
||||
* should set the kCFStreamSSLPeerName property to "MySecureServer.com".
|
||||
* If you do not know the peer name of the remote host in advance (for example, you're not sure
|
||||
* if it will be "domain.com" or "www.domain.com"), then you can use the default settings to validate the
|
||||
* certificate, and then use the X509Certificate class to verify the issuer after the socket has been secured.
|
||||
* The X509Certificate class is part of the CocoaAsyncSocket open source project.
|
||||
**/
|
||||
- (void)startTLS:(NSDictionary *)tlsSettings;
|
||||
|
||||
#pragma mark Advanced
|
||||
|
||||
/**
|
||||
* It's not thread-safe to access certain variables from outside the socket's internal queue.
|
||||
*
|
||||
* For example, the socket file descriptor.
|
||||
* File descriptors are simply integers which reference an index in the per-process file table.
|
||||
* However, when one requests a new file descriptor (by opening a file or socket),
|
||||
* the file descriptor returned is guaranteed to be the lowest numbered unused descriptor.
|
||||
* So if we're not careful, the following could be possible:
|
||||
*
|
||||
* - Thread A invokes a method which returns the socket's file descriptor.
|
||||
* - The socket is closed via the socket's internal queue on thread B.
|
||||
* - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD.
|
||||
* - Thread A is now accessing/altering the file instead of the socket.
|
||||
*
|
||||
* In addition to this, other variables are not actually objects,
|
||||
* and thus cannot be retained/released or even autoreleased.
|
||||
* An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct.
|
||||
*
|
||||
* Although there are internal variables that make it difficult to maintain thread-safety,
|
||||
* it is important to provide access to these variables
|
||||
* to ensure this class can be used in a wide array of environments.
|
||||
* This method helps to accomplish this by invoking the current block on the socket's internal queue.
|
||||
* The methods below can be invoked from within the block to access
|
||||
* those generally thread-unsafe internal variables in a thread-safe manner.
|
||||
* The given block will be invoked synchronously on the socket's internal queue.
|
||||
*
|
||||
* If you save references to any protected variables and use them outside the block, you do so at your own peril.
|
||||
**/
|
||||
- (void)performBlock:(dispatch_block_t)block;
|
||||
|
||||
/**
|
||||
* These methods are only available from within the context of a performBlock: invocation.
|
||||
* See the documentation for the performBlock: method above.
|
||||
*
|
||||
* Provides access to the socket's file descriptor(s).
|
||||
* If the socket is a server socket (is accepting incoming connections),
|
||||
* it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6.
|
||||
**/
|
||||
- (int)socketFD;
|
||||
- (int)socket4FD;
|
||||
- (int)socket6FD;
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
|
||||
/**
|
||||
* These methods are only available from within the context of a performBlock: invocation.
|
||||
* See the documentation for the performBlock: method above.
|
||||
*
|
||||
* Provides access to the socket's internal CFReadStream/CFWriteStream.
|
||||
*
|
||||
* These streams are only used as workarounds for specific iOS shortcomings:
|
||||
*
|
||||
* - Apple has decided to keep the SecureTransport framework private is iOS.
|
||||
* This means the only supplied way to do SSL/TLS is via CFStream or some other API layered on top of it.
|
||||
* Thus, in order to provide SSL/TLS support on iOS we are forced to rely on CFStream,
|
||||
* instead of the preferred and faster and more powerful SecureTransport.
|
||||
*
|
||||
* - If a socket doesn't have backgrounding enabled, and that socket is closed while the app is backgrounded,
|
||||
* Apple only bothers to notify us via the CFStream API.
|
||||
* The faster and more powerful GCD API isn't notified properly in this case.
|
||||
*
|
||||
* See also: (BOOL)enableBackgroundingOnSocket
|
||||
**/
|
||||
- (CFReadStreamRef)readStream;
|
||||
- (CFWriteStreamRef)writeStream;
|
||||
|
||||
/**
|
||||
* This method is only available from within the context of a performBlock: invocation.
|
||||
* See the documentation for the performBlock: method above.
|
||||
*
|
||||
* Configures the socket to allow it to operate when the iOS application has been backgrounded.
|
||||
* In other words, this method creates a read & write stream, and invokes:
|
||||
*
|
||||
* CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
|
||||
* CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
|
||||
*
|
||||
* Returns YES if successful, NO otherwise.
|
||||
*
|
||||
* Note: Apple does not officially support backgrounding server sockets.
|
||||
* That is, if your socket is accepting incoming connections, Apple does not officially support
|
||||
* allowing iOS applications to accept incoming connections while an app is backgrounded.
|
||||
*
|
||||
* Example usage:
|
||||
*
|
||||
* - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
|
||||
* {
|
||||
* [asyncSocket performBlock:^{
|
||||
* [asyncSocket enableBackgroundingOnSocket];
|
||||
* }];
|
||||
* }
|
||||
**/
|
||||
- (BOOL)enableBackgroundingOnSocket;
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* This method is only available from within the context of a performBlock: invocation.
|
||||
* See the documentation for the performBlock: method above.
|
||||
*
|
||||
* Provides access to the socket's SSLContext, if SSL/TLS has been started on the socket.
|
||||
**/
|
||||
- (SSLContextRef)sslContext;
|
||||
|
||||
#endif
|
||||
|
||||
#pragma mark Utilities
|
||||
|
||||
/**
|
||||
* Extracting host and port information from raw address data.
|
||||
**/
|
||||
+ (NSString *)hostFromAddress:(NSData *)address;
|
||||
+ (uint16_t)portFromAddress:(NSData *)address;
|
||||
+ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr fromAddress:(NSData *)address;
|
||||
|
||||
/**
|
||||
* A few common line separators, for use with the readDataToData:... methods.
|
||||
**/
|
||||
+ (NSData *)CRLFData; // 0x0D0A
|
||||
+ (NSData *)CRData; // 0x0D
|
||||
+ (NSData *)LFData; // 0x0A
|
||||
+ (NSData *)ZeroData; // 0x00
|
||||
|
||||
@end
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark -
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@protocol GCDAsyncSocketDelegate
|
||||
@optional
|
||||
|
||||
/**
|
||||
* This method is called immediately prior to socket:didAcceptNewSocket:.
|
||||
* It optionally allows a listening socket to specify the socketQueue for a new accepted socket.
|
||||
* If this method is not implemented, or returns NULL, the new accepted socket will create its own default queue.
|
||||
*
|
||||
* Since you cannot autorelease a dispatch_queue,
|
||||
* this method uses the "new" prefix in its name to specify that the returned queue has been retained.
|
||||
*
|
||||
* Thus you could do something like this in the implementation:
|
||||
* return dispatch_queue_create("MyQueue", NULL);
|
||||
*
|
||||
* If you are placing multiple sockets on the same queue,
|
||||
* then care should be taken to increment the retain count each time this method is invoked.
|
||||
*
|
||||
* For example, your implementation might look something like this:
|
||||
* dispatch_retain(myExistingQueue);
|
||||
* return myExistingQueue;
|
||||
**/
|
||||
- (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock;
|
||||
|
||||
/**
|
||||
* Called when a socket accepts a connection.
|
||||
* Another socket is automatically spawned to handle it.
|
||||
*
|
||||
* You must retain the newSocket if you wish to handle the connection.
|
||||
* Otherwise the newSocket instance will be released and the spawned connection will be closed.
|
||||
*
|
||||
* By default the new socket will have the same delegate and delegateQueue.
|
||||
* You may, of course, change this at any time.
|
||||
**/
|
||||
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket;
|
||||
|
||||
/**
|
||||
* Called when a socket connects and is ready for reading and writing.
|
||||
* The host parameter will be an IP address, not a DNS name.
|
||||
**/
|
||||
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
|
||||
|
||||
/**
|
||||
* Called when a socket has completed reading the requested data into memory.
|
||||
* Not called if there is an error.
|
||||
**/
|
||||
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
|
||||
|
||||
/**
|
||||
* Called when a socket has read in data, but has not yet completed the read.
|
||||
* This would occur if using readToData: or readToLength: methods.
|
||||
* It may be used to for things such as updating progress bars.
|
||||
**/
|
||||
- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Called when a socket has completed writing the requested data. Not called if there is an error.
|
||||
**/
|
||||
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
|
||||
|
||||
/**
|
||||
* Called when a socket has written some data, but has not yet completed the entire write.
|
||||
* It may be used to for things such as updating progress bars.
|
||||
**/
|
||||
- (void)socket:(GCDAsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
|
||||
|
||||
/**
|
||||
* Called if a read operation has reached its timeout without completing.
|
||||
* This method allows you to optionally extend the timeout.
|
||||
* If you return a positive time interval (> 0) the read's timeout will be extended by the given amount.
|
||||
* If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual.
|
||||
*
|
||||
* The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.
|
||||
* The length parameter is the number of bytes that have been read so far for the read operation.
|
||||
*
|
||||
* Note that this method may be called multiple times for a single read if you return positive numbers.
|
||||
**/
|
||||
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag
|
||||
elapsed:(NSTimeInterval)elapsed
|
||||
bytesDone:(NSUInteger)length;
|
||||
|
||||
/**
|
||||
* Called if a write operation has reached its timeout without completing.
|
||||
* This method allows you to optionally extend the timeout.
|
||||
* If you return a positive time interval (> 0) the write's timeout will be extended by the given amount.
|
||||
* If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual.
|
||||
*
|
||||
* The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.
|
||||
* The length parameter is the number of bytes that have been written so far for the write operation.
|
||||
*
|
||||
* Note that this method may be called multiple times for a single write if you return positive numbers.
|
||||
**/
|
||||
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag
|
||||
elapsed:(NSTimeInterval)elapsed
|
||||
bytesDone:(NSUInteger)length;
|
||||
|
||||
/**
|
||||
* Conditionally called if the read stream closes, but the write stream may still be writeable.
|
||||
*
|
||||
* This delegate method is only called if autoDisconnectOnClosedReadStream has been set to NO.
|
||||
* See the discussion on the autoDisconnectOnClosedReadStream method for more information.
|
||||
**/
|
||||
- (void)socketDidCloseReadStream:(GCDAsyncSocket *)sock;
|
||||
|
||||
/**
|
||||
* Called when a socket disconnects with or without error.
|
||||
*
|
||||
* If you call the disconnect method, and the socket wasn't already disconnected,
|
||||
* this delegate method will be called before the disconnect method returns.
|
||||
**/
|
||||
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;
|
||||
|
||||
/**
|
||||
* Called after the socket has successfully completed SSL/TLS negotiation.
|
||||
* This method is not called unless you use the provided startTLS method.
|
||||
*
|
||||
* If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close,
|
||||
* and the socketDidDisconnect:withError: delegate method will be called with the specific SSL error code.
|
||||
**/
|
||||
- (void)socketDidSecure:(GCDAsyncSocket *)sock;
|
||||
|
||||
@end
|
6969
shell_integration/MacOSX/LiferayNativityFinder/GCDAsyncSocket.m
Normal file
29
shell_integration/MacOSX/LiferayNativityFinder/IconCache.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface IconCache : NSObject {
|
||||
int _currentIconId;
|
||||
NSMutableDictionary* _iconIdDictionary;
|
||||
NSMutableDictionary* _iconPathDictionary;
|
||||
}
|
||||
|
||||
+ (IconCache*)sharedInstance;
|
||||
|
||||
- (NSImage*)getIcon:(NSNumber*)iconId;
|
||||
- (NSNumber*)registerIcon:(NSString*)path;
|
||||
- (void)unregisterIcon:(NSNumber*)iconId;
|
||||
|
||||
@end
|
115
shell_integration/MacOSX/LiferayNativityFinder/IconCache.m
Normal file
|
@ -0,0 +1,115 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import "IconCache.h"
|
||||
|
||||
@implementation IconCache
|
||||
|
||||
static IconCache* sharedInstance = nil;
|
||||
|
||||
- init
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_iconIdDictionary = [[NSMutableDictionary alloc] init];
|
||||
_iconPathDictionary = [[NSMutableDictionary alloc] init];
|
||||
_currentIconId = 0;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_iconIdDictionary release];
|
||||
[_iconPathDictionary release];
|
||||
sharedInstance = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
+ (IconCache*)sharedInstance
|
||||
{
|
||||
@synchronized(self)
|
||||
{
|
||||
if (sharedInstance == nil)
|
||||
{
|
||||
sharedInstance = [[self alloc] init];
|
||||
}
|
||||
}
|
||||
return sharedInstance;
|
||||
}
|
||||
|
||||
- (NSImage*)getIcon:(NSNumber*)iconId
|
||||
{
|
||||
NSImage* image = [_iconIdDictionary objectForKey:iconId];
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
- (NSNumber*)registerIcon:(NSString*)path
|
||||
{
|
||||
if (path == nil)
|
||||
{
|
||||
return [NSNumber numberWithInt:-1];
|
||||
}
|
||||
|
||||
NSImage* image = [[NSImage alloc]initWithContentsOfFile:path];
|
||||
|
||||
if (image == nil)
|
||||
{
|
||||
return [NSNumber numberWithInt:-1];
|
||||
}
|
||||
|
||||
NSNumber* iconId = [_iconPathDictionary objectForKey:path];
|
||||
|
||||
if (iconId == nil)
|
||||
{
|
||||
_currentIconId++;
|
||||
|
||||
iconId = [NSNumber numberWithInt:_currentIconId];
|
||||
|
||||
[_iconPathDictionary setObject:iconId forKey:path];
|
||||
}
|
||||
|
||||
[_iconIdDictionary setObject:image forKey:iconId];
|
||||
[image release];
|
||||
|
||||
return iconId;
|
||||
}
|
||||
|
||||
- (void)unregisterIcon:(NSNumber*)iconId
|
||||
{
|
||||
NSString* path = @"";
|
||||
|
||||
for (NSString* key in _iconPathDictionary)
|
||||
{
|
||||
NSNumber* value = [_iconPathDictionary objectForKey:key];
|
||||
|
||||
if ([value isEqualToNumber:iconId])
|
||||
{
|
||||
path = key;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
[_iconPathDictionary removeObjectForKey:path];
|
||||
|
||||
[_iconIdDictionary removeObjectForKey:iconId];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface NSObject (IconOverlayHandlers)
|
||||
|
||||
- (void)IconOverlayHandlers_drawIconWithFrame:(struct CGRect)arg1;
|
||||
- (void)IconOverlayHandlers_drawImage:(id)arg1;
|
||||
- (void)IconOverlayHandlers_drawRect:(struct CGRect)arg1;
|
||||
|
||||
@end
|
|
@ -0,0 +1,140 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <objc/runtime.h>
|
||||
#import "ContentManager.h"
|
||||
#import "IconCache.h"
|
||||
#import "IconOverlayHandlers.h"
|
||||
#import "Finder/Finder.h"
|
||||
|
||||
@implementation NSObject (IconOverlayHandlers)
|
||||
|
||||
- (void)IconOverlayHandlers_drawIconWithFrame:(struct CGRect)arg1
|
||||
{
|
||||
[self IconOverlayHandlers_drawIconWithFrame:arg1];
|
||||
|
||||
NSURL* url = [[NSClassFromString(@"FINode") nodeFromNodeRef:[(TIconAndTextCell*)self node]->fNodeRef] previewItemURL];
|
||||
|
||||
NSNumber* imageIndex = [[ContentManager sharedInstance] iconByPath:[url path]];
|
||||
|
||||
NSLog(@"The icon index is %d", [imageIndex intValue]);
|
||||
if ([imageIndex intValue] > 0)
|
||||
{
|
||||
NSImage* image = [[IconCache sharedInstance] getIcon:imageIndex];
|
||||
|
||||
if (image != nil)
|
||||
{
|
||||
struct CGRect arg2 = [(TIconViewCell*)self imageRectForBounds:arg1];
|
||||
|
||||
[image drawInRect:NSMakeRect(arg2.origin.x, arg2.origin.y, arg2.size.width, arg2.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:TRUE hints:nil];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)IconOverlayHandlers_IKImageBrowserCell_drawImage:(id)arg1
|
||||
{
|
||||
IKImageWrapper*imageWrapper = [self IconOverlayHandlers_imageWrapper:arg1];
|
||||
|
||||
[self IconOverlayHandlers_IKImageBrowserCell_drawImage:imageWrapper];
|
||||
}
|
||||
|
||||
- (void)IconOverlayHandlers_IKFinderReflectiveIconCell_drawImage:(id)arg1
|
||||
{
|
||||
IKImageWrapper*imageWrapper = [self IconOverlayHandlers_imageWrapper:arg1];
|
||||
|
||||
[self IconOverlayHandlers_IKFinderReflectiveIconCell_drawImage:imageWrapper];
|
||||
}
|
||||
|
||||
- (IKImageWrapper*)IconOverlayHandlers_imageWrapper:(id)arg1
|
||||
{
|
||||
TIconViewCell* realSelf = (TIconViewCell*)self;
|
||||
FINode* node = (FINode*)[realSelf representedItem];
|
||||
|
||||
NSURL* url = [node previewItemURL];
|
||||
|
||||
NSNumber* imageIndex = [[ContentManager sharedInstance] iconByPath:[url path]];
|
||||
NSLog(@"The icon index is %d", [imageIndex intValue]);
|
||||
|
||||
if ([imageIndex intValue] > 0)
|
||||
{
|
||||
NSImage* icon = [arg1 _nsImage];
|
||||
|
||||
[icon lockFocus];
|
||||
|
||||
CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort];
|
||||
|
||||
NSImage* iconimage = [[IconCache sharedInstance] getIcon:[NSNumber numberWithInt:[imageIndex intValue]]];
|
||||
|
||||
if (iconimage != nil)
|
||||
{
|
||||
CGImageSourceRef source;
|
||||
NSData* data = [iconimage TIFFRepresentation];
|
||||
|
||||
source = CGImageSourceCreateWithData((CFDataRef)data, NULL);
|
||||
CGImageRef maskRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
|
||||
CGContextDrawImage(myContext, CGRectMake(0, 0, [icon size].width, [icon size].height), maskRef);
|
||||
CFRelease(source);
|
||||
CFRelease(maskRef);
|
||||
}
|
||||
|
||||
[icon unlockFocus];
|
||||
|
||||
return [[[IKImageWrapper alloc] initWithNSImage:icon] autorelease];
|
||||
}
|
||||
else
|
||||
{
|
||||
return arg1;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)IconOverlayHandlers_drawRect:(struct CGRect)arg1
|
||||
{
|
||||
[self IconOverlayHandlers_drawRect:arg1];
|
||||
|
||||
NSView* supersuperview = [[(NSView*)self superview] superview];
|
||||
|
||||
if ([supersuperview isKindOfClass:(id)objc_getClass("TListRowView")])
|
||||
{
|
||||
TListRowView *listRowView = (TListRowView*) supersuperview;
|
||||
FINode *fiNode;
|
||||
|
||||
object_getInstanceVariable(listRowView, "_node", (void**)&fiNode);
|
||||
|
||||
NSURL *url;
|
||||
|
||||
if ([fiNode respondsToSelector:@selector(previewItemURL)])
|
||||
{
|
||||
url = [fiNode previewItemURL];
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
|
||||
NSNumber* imageIndex = [[ContentManager sharedInstance] iconByPath:[url path]];
|
||||
NSLog(@"The icon index is %d", [imageIndex intValue]);
|
||||
|
||||
if ([imageIndex intValue] > 0)
|
||||
{
|
||||
NSImage* image = [[IconCache sharedInstance] getIcon:imageIndex];
|
||||
|
||||
if (image != nil)
|
||||
{
|
||||
[image drawInRect:NSMakeRect(arg1.origin.x, arg1.origin.y, arg1.size.width, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:TRUE hints:nil];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
46
shell_integration/MacOSX/LiferayNativityFinder/Info.plist
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>FinderHook</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.liferay.nativity</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>NVTY</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFPlugInDynamicRegisterFunction</key>
|
||||
<string></string>
|
||||
<key>CFPlugInDynamicRegistration</key>
|
||||
<string>NO</string>
|
||||
<key>CFPlugInFactories</key>
|
||||
<dict>
|
||||
<key>00000000-0000-0000-0000-000000000000</key>
|
||||
<string>MyFactoryFunction</string>
|
||||
</dict>
|
||||
<key>CFPlugInTypes</key>
|
||||
<dict>
|
||||
<key>00000000-0000-0000-0000-000000000000</key>
|
||||
<array>
|
||||
<string>00000000-0000-0000-0000-000000000000</string>
|
||||
</array>
|
||||
</dict>
|
||||
<key>CFPlugInUnloadFunction</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
251
shell_integration/MacOSX/LiferayNativityFinder/JSONKit.h
Normal file
|
@ -0,0 +1,251 @@
|
|||
//
|
||||
// JSONKit.h
|
||||
// http://github.com/johnezang/JSONKit
|
||||
// Dual licensed under either the terms of the BSD License, or alternatively
|
||||
// under the terms of the Apache License, Version 2.0, as specified below.
|
||||
//
|
||||
|
||||
/*
|
||||
Copyright (c) 2011, John Engelhart
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the Zang Industries nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2011 John Engelhart
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <limits.h>
|
||||
#include <TargetConditionals.h>
|
||||
#include <AvailabilityMacros.h>
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSError.h>
|
||||
#import <Foundation/NSObjCRuntime.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#endif // __OBJC__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// For Mac OS X < 10.5.
|
||||
#ifndef NSINTEGER_DEFINED
|
||||
#define NSINTEGER_DEFINED
|
||||
#if defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)
|
||||
typedef long NSInteger;
|
||||
typedef unsigned long NSUInteger;
|
||||
#define NSIntegerMin LONG_MIN
|
||||
#define NSIntegerMax LONG_MAX
|
||||
#define NSUIntegerMax ULONG_MAX
|
||||
#else // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)
|
||||
typedef int NSInteger;
|
||||
typedef unsigned int NSUInteger;
|
||||
#define NSIntegerMin INT_MIN
|
||||
#define NSIntegerMax INT_MAX
|
||||
#define NSUIntegerMax UINT_MAX
|
||||
#endif // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)
|
||||
#endif // NSINTEGER_DEFINED
|
||||
|
||||
|
||||
#ifndef _JSONKIT_H_
|
||||
#define _JSONKIT_H_
|
||||
|
||||
#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__APPLE_CC__) && (__APPLE_CC__ >= 5465)
|
||||
#define JK_DEPRECATED_ATTRIBUTE __attribute__((deprecated))
|
||||
#else
|
||||
#define JK_DEPRECATED_ATTRIBUTE
|
||||
#endif
|
||||
|
||||
#define JSONKIT_VERSION_MAJOR 1
|
||||
#define JSONKIT_VERSION_MINOR 4
|
||||
|
||||
typedef NSUInteger JKFlags;
|
||||
|
||||
/*
|
||||
JKParseOptionComments : Allow C style // and /_* ... *_/ (without a _, obviously) comments in JSON.
|
||||
JKParseOptionUnicodeNewlines : Allow Unicode recommended (?:\r\n|[\n\v\f\r\x85\p{Zl}\p{Zp}]) newlines.
|
||||
JKParseOptionLooseUnicode : Normally the decoder will stop with an error at any malformed Unicode.
|
||||
This option allows JSON with malformed Unicode to be parsed without reporting an error.
|
||||
Any malformed Unicode is replaced with \uFFFD, or "REPLACEMENT CHARACTER".
|
||||
*/
|
||||
|
||||
enum {
|
||||
JKParseOptionNone = 0,
|
||||
JKParseOptionStrict = 0,
|
||||
JKParseOptionComments = (1 << 0),
|
||||
JKParseOptionUnicodeNewlines = (1 << 1),
|
||||
JKParseOptionLooseUnicode = (1 << 2),
|
||||
JKParseOptionPermitTextAfterValidJSON = (1 << 3),
|
||||
JKParseOptionValidFlags = (JKParseOptionComments | JKParseOptionUnicodeNewlines | JKParseOptionLooseUnicode | JKParseOptionPermitTextAfterValidJSON),
|
||||
};
|
||||
typedef JKFlags JKParseOptionFlags;
|
||||
|
||||
enum {
|
||||
JKSerializeOptionNone = 0,
|
||||
JKSerializeOptionPretty = (1 << 0),
|
||||
JKSerializeOptionEscapeUnicode = (1 << 1),
|
||||
JKSerializeOptionEscapeForwardSlashes = (1 << 4),
|
||||
JKSerializeOptionValidFlags = (JKSerializeOptionPretty | JKSerializeOptionEscapeUnicode | JKSerializeOptionEscapeForwardSlashes),
|
||||
};
|
||||
typedef JKFlags JKSerializeOptionFlags;
|
||||
|
||||
#ifdef __OBJC__
|
||||
|
||||
typedef struct JKParseState JKParseState; // Opaque internal, private type.
|
||||
|
||||
// As a general rule of thumb, if you use a method that doesn't accept a JKParseOptionFlags argument, it defaults to JKParseOptionStrict
|
||||
|
||||
@interface JSONDecoder : NSObject {
|
||||
JKParseState *parseState;
|
||||
}
|
||||
+ (id)decoder;
|
||||
+ (id)decoderWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
|
||||
- (id)initWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
|
||||
- (void)clearCache;
|
||||
|
||||
// The parse... methods were deprecated in v1.4 in favor of the v1.4 objectWith... methods.
|
||||
- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4. Use objectWithUTF8String:length: instead.
|
||||
- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length error:(NSError **)error JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4. Use objectWithUTF8String:length:error: instead.
|
||||
// The NSData MUST be UTF8 encoded JSON.
|
||||
- (id)parseJSONData:(NSData *)jsonData JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4. Use objectWithData: instead.
|
||||
- (id)parseJSONData:(NSData *)jsonData error:(NSError **)error JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4. Use objectWithData:error: instead.
|
||||
|
||||
// Methods that return immutable collection objects.
|
||||
- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length;
|
||||
- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error;
|
||||
// The NSData MUST be UTF8 encoded JSON.
|
||||
- (id)objectWithData:(NSData *)jsonData;
|
||||
- (id)objectWithData:(NSData *)jsonData error:(NSError **)error;
|
||||
|
||||
// Methods that return mutable collection objects.
|
||||
- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length;
|
||||
- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error;
|
||||
// The NSData MUST be UTF8 encoded JSON.
|
||||
- (id)mutableObjectWithData:(NSData *)jsonData;
|
||||
- (id)mutableObjectWithData:(NSData *)jsonData error:(NSError **)error;
|
||||
|
||||
@end
|
||||
|
||||
////////////
|
||||
#pragma mark Deserializing methods
|
||||
////////////
|
||||
|
||||
@interface NSString (JSONKitDeserializing)
|
||||
- (id)objectFromJSONString;
|
||||
- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
|
||||
- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
|
||||
- (id)mutableObjectFromJSONString;
|
||||
- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
|
||||
- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
|
||||
@end
|
||||
|
||||
@interface NSData (JSONKitDeserializing)
|
||||
// The NSData MUST be UTF8 encoded JSON.
|
||||
- (id)objectFromJSONData;
|
||||
- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
|
||||
- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
|
||||
- (id)mutableObjectFromJSONData;
|
||||
- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
|
||||
- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
|
||||
@end
|
||||
|
||||
////////////
|
||||
#pragma mark Serializing methods
|
||||
////////////
|
||||
|
||||
@interface NSString (JSONKitSerializing)
|
||||
// Convenience methods for those that need to serialize the receiving NSString (i.e., instead of having to serialize a NSArray with a single NSString, you can "serialize to JSON" just the NSString).
|
||||
// Normally, a string that is serialized to JSON has quotation marks surrounding it, which you may or may not want when serializing a single string, and can be controlled with includeQuotes:
|
||||
// includeQuotes:YES `a "test"...` -> `"a \"test\"..."`
|
||||
// includeQuotes:NO `a "test"...` -> `a \"test\"...`
|
||||
- (NSData *)JSONData; // Invokes JSONDataWithOptions:JKSerializeOptionNone includeQuotes:YES
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;
|
||||
- (NSString *)JSONString; // Invokes JSONStringWithOptions:JKSerializeOptionNone includeQuotes:YES
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;
|
||||
@end
|
||||
|
||||
@interface NSArray (JSONKitSerializing)
|
||||
- (NSData *)JSONData;
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
|
||||
- (NSString *)JSONString;
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
|
||||
@end
|
||||
|
||||
@interface NSDictionary (JSONKitSerializing)
|
||||
- (NSData *)JSONData;
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
|
||||
- (NSString *)JSONString;
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
|
||||
@end
|
||||
|
||||
#ifdef __BLOCKS__
|
||||
|
||||
@interface NSArray (JSONKitSerializingBlockAdditions)
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;
|
||||
@end
|
||||
|
||||
@interface NSDictionary (JSONKitSerializingBlockAdditions)
|
||||
- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;
|
||||
- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;
|
||||
@end
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif // __OBJC__
|
||||
|
||||
#endif // _JSONKIT_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
3065
shell_integration/MacOSX/LiferayNativityFinder/JSONKit.m
Normal file
|
@ -0,0 +1,339 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
0B13ECAE173C687400548DA1 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B13ECAD173C686A00548DA1 /* GCDAsyncSocket.m */; };
|
||||
0B13ECAF173C687900548DA1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BFC9ACB173C57E400CDD329 /* Security.framework */; };
|
||||
0BFAF21C16F8E6C10017EA7E /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BFAF21B16F8E6C10017EA7E /* JSONKit.m */; };
|
||||
692C18A516660C4700BF6A53 /* ContextMenuHandlers.m in Sources */ = {isa = PBXBuildFile; fileRef = 692C18A416660C4600BF6A53 /* ContextMenuHandlers.m */; };
|
||||
692C18A9166617F500BF6A53 /* IconOverlayHandlers.m in Sources */ = {isa = PBXBuildFile; fileRef = 692C18A8166617F500BF6A53 /* IconOverlayHandlers.m */; };
|
||||
692C18AC1666392700BF6A53 /* MenuManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 692C18AB1666392700BF6A53 /* MenuManager.m */; };
|
||||
6993878616494C000044E4DF /* RequestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6993878516494C000044E4DF /* RequestManager.m */; };
|
||||
69948B361636D50E0093B6CE /* ContentManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 69948B351636D50E0093B6CE /* ContentManager.m */; };
|
||||
8C37DD9F161593BD00016A95 /* FinderHook.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C37DD9A161593BD00016A95 /* FinderHook.m */; };
|
||||
8C37DDB2161593FF00016A95 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C37DDB1161593FF00016A95 /* Cocoa.framework */; };
|
||||
8C37DDBA161594B400016A95 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C37DDB9161594B400016A95 /* Quartz.framework */; };
|
||||
8C99F6941622D145002D2135 /* IconCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C99F6931622D145002D2135 /* IconCache.m */; };
|
||||
8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };
|
||||
8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
|
||||
0B13ECAC173C686900548DA1 /* GCDAsyncSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GCDAsyncSocket.h; sourceTree = "<group>"; };
|
||||
0B13ECAD173C686A00548DA1 /* GCDAsyncSocket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GCDAsyncSocket.m; sourceTree = "<group>"; };
|
||||
0B2BF60B176A43DB001246CD /* Finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Finder.h; sourceTree = "<group>"; };
|
||||
0BFAF21A16F8E6C10017EA7E /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = "<group>"; };
|
||||
0BFAF21B16F8E6C10017EA7E /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = "<group>"; };
|
||||
0BFC9ACB173C57E400CDD329 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
|
||||
692C18A316660C4600BF6A53 /* ContextMenuHandlers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextMenuHandlers.h; sourceTree = "<group>"; };
|
||||
692C18A416660C4600BF6A53 /* ContextMenuHandlers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContextMenuHandlers.m; sourceTree = "<group>"; };
|
||||
692C18A7166617F500BF6A53 /* IconOverlayHandlers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconOverlayHandlers.h; sourceTree = "<group>"; };
|
||||
692C18A8166617F500BF6A53 /* IconOverlayHandlers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IconOverlayHandlers.m; sourceTree = "<group>"; };
|
||||
692C18AA1666392700BF6A53 /* MenuManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuManager.h; sourceTree = "<group>"; };
|
||||
692C18AB1666392700BF6A53 /* MenuManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuManager.m; sourceTree = "<group>"; };
|
||||
6993878416494C000044E4DF /* RequestManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RequestManager.h; sourceTree = "<group>"; };
|
||||
6993878516494C000044E4DF /* RequestManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RequestManager.m; sourceTree = "<group>"; usesTabs = 1; };
|
||||
69948B341636D50E0093B6CE /* ContentManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentManager.h; sourceTree = "<group>"; };
|
||||
69948B351636D50E0093B6CE /* ContentManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContentManager.m; sourceTree = "<group>"; };
|
||||
8C37DD99161593BD00016A95 /* FinderHook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderHook.h; sourceTree = "<group>"; };
|
||||
8C37DD9A161593BD00016A95 /* FinderHook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FinderHook.m; sourceTree = "<group>"; };
|
||||
8C37DDB1161593FF00016A95 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
8C37DDB9161594B400016A95 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; };
|
||||
8C99F6921622D145002D2135 /* IconCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconCache.h; sourceTree = "<group>"; };
|
||||
8C99F6931622D145002D2135 /* IconCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IconCache.m; sourceTree = "<group>"; };
|
||||
8D576316048677EA00EA77CD /* LiferayNativityFinder.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LiferayNativityFinder.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
8D576313048677EA00EA77CD /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0B13ECAF173C687900548DA1 /* Security.framework in Frameworks */,
|
||||
8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,
|
||||
8C37DDB2161593FF00016A95 /* Cocoa.framework in Frameworks */,
|
||||
8C37DDBA161594B400016A95 /* Quartz.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
089C166AFE841209C02AAC07 /* LiferayNativityFinder */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
08FB77AFFE84173DC02AAC07 /* Source */,
|
||||
089C167CFE841241C02AAC07 /* Resources */,
|
||||
089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,
|
||||
19C28FB6FE9D52B211CA2CBB /* Products */,
|
||||
);
|
||||
name = LiferayNativityFinder;
|
||||
sourceTree = "<group>";
|
||||
usesTabs = 1;
|
||||
};
|
||||
089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0BFC9ACB173C57E400CDD329 /* Security.framework */,
|
||||
8C37DDB9161594B400016A95 /* Quartz.framework */,
|
||||
0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,
|
||||
8C37DDB1161593FF00016A95 /* Cocoa.framework */,
|
||||
);
|
||||
name = "External Frameworks and Libraries";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
089C167CFE841241C02AAC07 /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8D576317048677EA00EA77CD /* Info.plist */,
|
||||
8D5B49A704867FD3000E48DA /* InfoPlist.strings */,
|
||||
);
|
||||
name = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
08FB77AFFE84173DC02AAC07 /* Source */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0B2BF60A176A43DB001246CD /* Finder */,
|
||||
0B08BAC21759627700C8351E /* GCDAsyncSocket */,
|
||||
0BFAF21916F8E6910017EA7E /* JSONKit */,
|
||||
8C37DD99161593BD00016A95 /* FinderHook.h */,
|
||||
8C37DD9A161593BD00016A95 /* FinderHook.m */,
|
||||
692C18A316660C4600BF6A53 /* ContextMenuHandlers.h */,
|
||||
692C18A416660C4600BF6A53 /* ContextMenuHandlers.m */,
|
||||
692C18A7166617F500BF6A53 /* IconOverlayHandlers.h */,
|
||||
692C18A8166617F500BF6A53 /* IconOverlayHandlers.m */,
|
||||
6993878416494C000044E4DF /* RequestManager.h */,
|
||||
6993878516494C000044E4DF /* RequestManager.m */,
|
||||
69948B341636D50E0093B6CE /* ContentManager.h */,
|
||||
69948B351636D50E0093B6CE /* ContentManager.m */,
|
||||
8C99F6921622D145002D2135 /* IconCache.h */,
|
||||
8C99F6931622D145002D2135 /* IconCache.m */,
|
||||
692C18AA1666392700BF6A53 /* MenuManager.h */,
|
||||
692C18AB1666392700BF6A53 /* MenuManager.m */,
|
||||
);
|
||||
name = Source;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
0B08BAC21759627700C8351E /* GCDAsyncSocket */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0B13ECAC173C686900548DA1 /* GCDAsyncSocket.h */,
|
||||
0B13ECAD173C686A00548DA1 /* GCDAsyncSocket.m */,
|
||||
);
|
||||
name = GCDAsyncSocket;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
0B2BF60A176A43DB001246CD /* Finder */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0B2BF60B176A43DB001246CD /* Finder.h */,
|
||||
);
|
||||
path = Finder;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
0BFAF21916F8E6910017EA7E /* JSONKit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0BFAF21A16F8E6C10017EA7E /* JSONKit.h */,
|
||||
0BFAF21B16F8E6C10017EA7E /* JSONKit.m */,
|
||||
);
|
||||
name = JSONKit;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
19C28FB6FE9D52B211CA2CBB /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8D576316048677EA00EA77CD /* LiferayNativityFinder.bundle */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
8D57630D048677EA00EA77CD /* LiferayNativityFinder */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 1DEB911A08733D790010E9CD /* Build configuration list for PBXNativeTarget "LiferayNativityFinder" */;
|
||||
buildPhases = (
|
||||
8D57630F048677EA00EA77CD /* Resources */,
|
||||
8D576311048677EA00EA77CD /* Sources */,
|
||||
8D576313048677EA00EA77CD /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = LiferayNativityFinder;
|
||||
productInstallPath = "$(HOME)/Library/Bundles";
|
||||
productName = LiferayNativityFinder;
|
||||
productReference = 8D576316048677EA00EA77CD /* LiferayNativityFinder.bundle */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
089C1669FE841209C02AAC07 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0460;
|
||||
};
|
||||
buildConfigurationList = 1DEB911E08733D790010E9CD /* Build configuration list for PBXProject "LiferayNativityFinder" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 1;
|
||||
knownRegions = (
|
||||
English,
|
||||
Japanese,
|
||||
French,
|
||||
German,
|
||||
);
|
||||
mainGroup = 089C166AFE841209C02AAC07 /* LiferayNativityFinder */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
8D57630D048677EA00EA77CD /* LiferayNativityFinder */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
8D57630F048677EA00EA77CD /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
8D576311048677EA00EA77CD /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0B13ECAE173C687400548DA1 /* GCDAsyncSocket.m in Sources */,
|
||||
8C37DD9F161593BD00016A95 /* FinderHook.m in Sources */,
|
||||
8C99F6941622D145002D2135 /* IconCache.m in Sources */,
|
||||
69948B361636D50E0093B6CE /* ContentManager.m in Sources */,
|
||||
6993878616494C000044E4DF /* RequestManager.m in Sources */,
|
||||
692C18A516660C4700BF6A53 /* ContextMenuHandlers.m in Sources */,
|
||||
692C18A9166617F500BF6A53 /* IconOverlayHandlers.m in Sources */,
|
||||
692C18AC1666392700BF6A53 /* MenuManager.m in Sources */,
|
||||
0BFAF21C16F8E6C10017EA7E /* JSONKit.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
089C167EFE841241C02AAC07 /* English */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
1DEB911B08733D790010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_LINK_OBJC_RUNTIME = NO;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "$(HOME)/Library/Bundles";
|
||||
PRODUCT_NAME = LiferayNativityFinder;
|
||||
WRAPPER_EXTENSION = bundle;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB911C08733D790010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_LINK_OBJC_RUNTIME = NO;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_MODEL_TUNING = G5;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "$(HOME)/Library/Bundles";
|
||||
PRODUCT_NAME = LiferayNativityFinder;
|
||||
WRAPPER_EXTENSION = bundle;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
1DEB911F08733D790010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = _DEBUG_LOG;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB912008733D790010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
1DEB911A08733D790010E9CD /* Build configuration list for PBXNativeTarget "LiferayNativityFinder" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB911B08733D790010E9CD /* Debug */,
|
||||
1DEB911C08733D790010E9CD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
1DEB911E08733D790010E9CD /* Build configuration list for PBXProject "LiferayNativityFinder" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB911F08733D790010E9CD /* Debug */,
|
||||
1DEB912008733D790010E9CD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 089C1669FE841209C02AAC07 /* Project object */;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:LiferayNativityFinder.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>8D57630D048677EA00EA77CD</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
29
shell_integration/MacOSX/LiferayNativityFinder/MenuManager.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class TContextMenu;
|
||||
struct TFENodeVector;
|
||||
|
||||
@interface MenuManager : NSObject
|
||||
|
||||
@property (nonatomic, strong) NSMutableArray* menuItems;
|
||||
|
||||
+ (MenuManager*)sharedInstance;
|
||||
|
||||
- (void)addItemsToMenu:(TContextMenu*)menu forFiles:(NSArray*)files;
|
||||
- (NSArray*)pathsForNodes:(const struct TFENodeVector*)nodes;
|
||||
|
||||
@end
|
184
shell_integration/MacOSX/LiferayNativityFinder/MenuManager.m
Normal file
|
@ -0,0 +1,184 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import "MenuManager.h"
|
||||
#import "Finder/Finder.h"
|
||||
#import "RequestManager.h"
|
||||
|
||||
@implementation MenuManager
|
||||
|
||||
static MenuManager* sharedInstance = nil;
|
||||
|
||||
+ (MenuManager*)sharedInstance
|
||||
{
|
||||
@synchronized(self)
|
||||
{
|
||||
if (sharedInstance == nil)
|
||||
{
|
||||
sharedInstance = [[self alloc] init];
|
||||
}
|
||||
}
|
||||
return sharedInstance;
|
||||
}
|
||||
|
||||
- init
|
||||
{
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (void)addChildrenSubMenuItems:(NSMenuItem*)parentMenuItem withChildren:(NSArray*)menuItemsDictionaries forFiles:(NSArray*)files
|
||||
{
|
||||
NSMenu* menu = [[NSMenu alloc] init];
|
||||
|
||||
for (int i = 0; i < [menuItemsDictionaries count]; ++i)
|
||||
{
|
||||
NSDictionary* menuItemDictionary = [menuItemsDictionaries objectAtIndex:i];
|
||||
|
||||
NSString* submenuTitle = [menuItemDictionary objectForKey:@"title"];
|
||||
BOOL enabled = [[menuItemDictionary objectForKey:@"enabled"] boolValue];
|
||||
NSString* uuid = [menuItemDictionary objectForKey:@"uuid"];
|
||||
NSArray* childrenSubMenuItems = (NSArray*)[menuItemDictionary objectForKey:@"contextMenuItems"];
|
||||
|
||||
if ([submenuTitle isEqualToString:@"_SEPARATOR_"])
|
||||
{
|
||||
[menu addItem:[NSMenuItem separatorItem]];
|
||||
}
|
||||
else if (childrenSubMenuItems != nil && [childrenSubMenuItems count] != 0)
|
||||
{
|
||||
NSMenuItem* submenuItem = [menu addItemWithTitle:submenuTitle action:nil keyEquivalent:@""];
|
||||
|
||||
[self addChildrenSubMenuItems:submenuItem withChildren:childrenSubMenuItems forFiles:files];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self createActionMenuItemIn:menu withTitle:submenuTitle withIndex:i enabled:enabled withUuid:uuid forFiles:files];
|
||||
}
|
||||
}
|
||||
|
||||
[parentMenuItem setSubmenu:menu];
|
||||
|
||||
[menu release];
|
||||
}
|
||||
|
||||
- (void)addItemsToMenu:(TContextMenu*)menu forFiles:(NSArray*)files
|
||||
{
|
||||
NSArray* menuItemsArray = [[RequestManager sharedInstance] menuItemsForFiles:files];
|
||||
|
||||
if (menuItemsArray == nil)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ([menuItemsArray count] == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
NSInteger menuIndex = 4;
|
||||
|
||||
BOOL hasSeparatorBefore = [[menu itemAtIndex:menuIndex - 1] isSeparatorItem];
|
||||
|
||||
if (!hasSeparatorBefore)
|
||||
{
|
||||
[menu insertItem:[NSMenuItem separatorItem] atIndex:menuIndex];
|
||||
}
|
||||
|
||||
for (int i = 0; i < [menuItemsArray count]; ++i)
|
||||
{
|
||||
NSDictionary* menuItemDictionary = [menuItemsArray objectAtIndex:i];
|
||||
|
||||
NSString* mainMenuTitle = [menuItemDictionary objectForKey:@"title"];
|
||||
|
||||
if ([mainMenuTitle isEqualToString:@""])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
menuIndex++;
|
||||
|
||||
BOOL enabled = [[menuItemDictionary objectForKey:@"enabled"] boolValue];
|
||||
NSString* uuid = [menuItemDictionary objectForKey:@"uuid"];
|
||||
NSArray* childrenSubMenuItems = (NSArray*)[menuItemDictionary objectForKey:@"contextMenuItems"];
|
||||
|
||||
if (childrenSubMenuItems != nil && [childrenSubMenuItems count] != 0)
|
||||
{
|
||||
NSMenuItem* mainMenuItem = [menu insertItemWithTitle:mainMenuTitle action:nil keyEquivalent:@"" atIndex:menuIndex];
|
||||
|
||||
[self addChildrenSubMenuItems:mainMenuItem withChildren:childrenSubMenuItems forFiles:files];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self createActionMenuItemIn:menu withTitle:mainMenuTitle withIndex:menuIndex enabled:enabled withUuid:uuid forFiles:files];
|
||||
}
|
||||
}
|
||||
|
||||
BOOL hasSeparatorAfter = [[menu itemAtIndex:menuIndex + 1] isSeparatorItem];
|
||||
|
||||
if (!hasSeparatorAfter)
|
||||
{
|
||||
[menu insertItem:[NSMenuItem separatorItem] atIndex:menuIndex + 1];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)createActionMenuItemIn:(NSMenu*)menu withTitle:(NSString*)title withIndex:(NSInteger*)index enabled:(BOOL)enabled withUuid:(NSString*)uuid forFiles:(NSArray*)files
|
||||
{
|
||||
NSMenuItem* mainMenuItem = [menu insertItemWithTitle:title action:@selector(menuItemClicked:) keyEquivalent:@"" atIndex:index];
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
[mainMenuItem setTarget:self];
|
||||
}
|
||||
|
||||
NSDictionary* menuActionDictionary = [[NSMutableDictionary alloc] init];
|
||||
[menuActionDictionary setValue:uuid forKey:@"uuid"];
|
||||
NSMutableArray* filesArray = [files copy];
|
||||
[menuActionDictionary setValue:filesArray forKey:@"files"];
|
||||
|
||||
[mainMenuItem setRepresentedObject:menuActionDictionary];
|
||||
|
||||
[filesArray release];
|
||||
[menuActionDictionary release];
|
||||
}
|
||||
|
||||
- (void)menuItemClicked:(id)param
|
||||
{
|
||||
[[RequestManager sharedInstance] menuItemClicked:[param representedObject]];
|
||||
}
|
||||
|
||||
- (NSArray*)pathsForNodes:(const struct TFENodeVector*)nodes
|
||||
{
|
||||
struct TFENode* start = nodes->_M_impl._M_start;
|
||||
struct TFENode* end = nodes->_M_impl._M_finish;
|
||||
|
||||
int count = end - start;
|
||||
|
||||
NSMutableArray* selectedItems = [[NSMutableArray alloc] initWithCapacity:count];
|
||||
struct TFENode* current;
|
||||
|
||||
for (current = start; current < end; ++current)
|
||||
{
|
||||
FINode* node = (FINode*)[NSClassFromString(@"FINode") nodeFromNodeRef:current->fNodeRef];
|
||||
|
||||
NSString* path = [[node previewItemURL] path];
|
||||
|
||||
if (path)
|
||||
{
|
||||
[selectedItems addObject:path];
|
||||
}
|
||||
}
|
||||
|
||||
return [selectedItems autorelease];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,48 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "GCDAsyncSocket.h"
|
||||
#import "RequestManager.h"
|
||||
|
||||
@interface RequestManager : NSObject
|
||||
{
|
||||
dispatch_queue_t _listenQueue;
|
||||
dispatch_queue_t _callbackQueue;
|
||||
|
||||
GCDAsyncSocket* _socket;
|
||||
|
||||
NSMutableArray* _connectedListenSockets;
|
||||
NSMutableArray* _connectedCallbackSockets;
|
||||
NSMutableDictionary* _callbackMsgs;
|
||||
|
||||
NSMutableArray* _requestQueue;
|
||||
|
||||
NSString* _filterFolder;
|
||||
|
||||
BOOL _isRunning;
|
||||
BOOL _isConnected;
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) NSString* filterFolder;
|
||||
|
||||
+ (RequestManager*)sharedInstance;
|
||||
|
||||
- (void)askOnSocket:(NSString*)path;
|
||||
- (void)askForIcon:(NSString*)path;
|
||||
- (void)menuItemClicked:(NSDictionary*)actionDictionary;
|
||||
- (NSArray*)menuItemsForFiles:(NSArray*)files;
|
||||
- (void)start;
|
||||
|
||||
@end
|
170
shell_integration/MacOSX/LiferayNativityFinder/RequestManager.m
Normal file
|
@ -0,0 +1,170 @@
|
|||
/**
|
||||
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Lesser General Public License as published by the Free
|
||||
* Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
#import "ContentManager.h"
|
||||
#import "IconCache.h"
|
||||
#import "JSONKit.h"
|
||||
#import "RequestManager.h"
|
||||
|
||||
#define READ_TAG 2422
|
||||
|
||||
static RequestManager* sharedInstance = nil;
|
||||
|
||||
@implementation RequestManager
|
||||
|
||||
- (id)init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
|
||||
|
||||
_filterFolder = nil;
|
||||
|
||||
_isRunning = NO;
|
||||
_isConnected = NO;
|
||||
|
||||
[self start];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_socket setDelegate:nil delegateQueue:NULL];
|
||||
[_socket disconnect];
|
||||
[_socket release];
|
||||
|
||||
// dispatch_release(_listenQueue);
|
||||
|
||||
// [_callbackMsgs release];
|
||||
|
||||
// [_filterFolder release];
|
||||
|
||||
sharedInstance = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
+ (RequestManager*)sharedInstance
|
||||
{
|
||||
@synchronized(self)
|
||||
{
|
||||
if (sharedInstance == nil)
|
||||
{
|
||||
sharedInstance = [[self alloc] init];
|
||||
}
|
||||
}
|
||||
|
||||
return sharedInstance;
|
||||
}
|
||||
|
||||
|
||||
- (void)askOnSocket:(NSString*)path
|
||||
{
|
||||
NSLog(@"XX on Socket for %@", path);
|
||||
NSData* data = [[NSString stringWithFormat:@"RETRIEVE_FILE_STATUS:%@\n", path] dataUsingEncoding:NSUTF8StringEncoding];
|
||||
[_socket writeData:data withTimeout:5 tag:4711];
|
||||
|
||||
NSData* stop = [@"\n" dataUsingEncoding:NSUTF8StringEncoding];
|
||||
[_socket readDataToData:stop withTimeout:-1 tag:READ_TAG];
|
||||
}
|
||||
|
||||
|
||||
- (void)askForIcon:(NSString*)path
|
||||
{
|
||||
if( _isConnected ) {
|
||||
[self askOnSocket:path];
|
||||
} else {
|
||||
[_requestQueue addObject:path];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)socket:(GCDAsyncSocket*)socket didConnectToHost:(NSString*)host port:(UInt16)port
|
||||
{
|
||||
// [socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
|
||||
|
||||
NSLog( @"Connected to host successfully!");
|
||||
_isConnected = YES;
|
||||
|
||||
if( [_requestQueue count] > 0 ) {
|
||||
NSLog( @"We have to empty the queue");
|
||||
for( NSString *path in _requestQueue ) {
|
||||
[self askOnSocket:path];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)socket:(GCDAsyncSocket*)socket didReadData:(NSData*)data withTag:(long)tag
|
||||
{
|
||||
|
||||
if( tag == READ_TAG) {
|
||||
NSString* a1 = [NSString stringWithUTF8String:[data bytes]];
|
||||
|
||||
NSString *answer = [a1 stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
|
||||
NSLog(@"READ from socket (%ld): AA%@OO", tag, answer);
|
||||
|
||||
if( answer != nil ) {
|
||||
NSArray *chunks = [answer componentsSeparatedByString: @":"];
|
||||
// FIXME: Check if chunks[0] equals "STATUS"
|
||||
if( [chunks count] > 0 && [[chunks objectAtIndex:0] isEqualToString:@"STATUS"] ) {
|
||||
ContentManager *contentman = [ContentManager sharedInstance];
|
||||
[contentman setResultForPath:[chunks objectAtIndex:2] result:[chunks objectAtIndex:1]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (NSTimeInterval)socket:(GCDAsyncSocket*)socket shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length
|
||||
{
|
||||
// Called if a read operation has reached its timeout without completing.
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
- (void)socketDidDisconnect:(GCDAsyncSocket*)socket withError:(NSError*)err
|
||||
{
|
||||
if ([_connectedListenSockets containsObject:socket])
|
||||
{
|
||||
[_connectedListenSockets removeObject:socket];
|
||||
|
||||
[[ContentManager sharedInstance] enableFileIcons:false];
|
||||
}
|
||||
|
||||
if ([_connectedCallbackSockets containsObject:socket])
|
||||
{
|
||||
[_connectedCallbackSockets removeObject:socket];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)start
|
||||
{
|
||||
if (!_isRunning)
|
||||
{
|
||||
NSLog(@"Connect Socket!");
|
||||
NSError *err = nil;
|
||||
if (![_socket connectToHost:@"localhost" onPort:33001 error:&err]) // Asynchronous!
|
||||
{
|
||||
// If there was an error, it's likely something like "already connected" or "no delegate set"
|
||||
NSLog(@"I goofed: %@", err);
|
||||
}
|
||||
NSLog(@"Socket Connected!");
|
||||
|
||||
_isRunning = YES;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,2 @@
|
|||
/* Localized versions of Info.plist keys */
|
||||
|
59
shell_integration/MacOSX/LiferayNativityInjector/Info.plist
Normal file
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.liferay.nativity</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>LiferayNativityInjector</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>osax</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>NVTY</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0.2</string>
|
||||
<key>OSAScriptingDefinition</key>
|
||||
<string>LiferayNativityInjector.sdef</string>
|
||||
<key>OSAXHandlers</key>
|
||||
<dict>
|
||||
<key>Events</key>
|
||||
<dict>
|
||||
<key>NVTYload</key>
|
||||
<dict>
|
||||
<key>Handler</key>
|
||||
<string>HandleLoadEvent</string>
|
||||
<key>ThreadSafe</key>
|
||||
<false/>
|
||||
<key>Context</key>
|
||||
<string>Process</string>
|
||||
</dict>
|
||||
<key>NVTYunld</key>
|
||||
<dict>
|
||||
<key>Handler</key>
|
||||
<string>HandleUnloadEvent</string>
|
||||
<key>ThreadSafe</key>
|
||||
<false/>
|
||||
<key>Context</key>
|
||||
<string>Process</string>
|
||||
</dict>
|
||||
<key>NVTYlded</key>
|
||||
<dict>
|
||||
<key>Handler</key>
|
||||
<string>HandleLoadedEvent</string>
|
||||
<key>ThreadSafe</key>
|
||||
<false/>
|
||||
<key>Context</key>
|
||||
<string>Process</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,35 @@
|
|||
//
|
||||
// LNStandardVersionComparator.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 12/21/07.
|
||||
// Copyright 2007 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef LNSTANDARDVERSIONCOMPARATOR_H
|
||||
#define LNSTANDARDVERSIONCOMPARATOR_H
|
||||
|
||||
#import "LNVersionComparisonProtocol.h"
|
||||
|
||||
/*!
|
||||
@class
|
||||
@abstract Sparkle's default version comparator.
|
||||
@discussion This comparator is adapted from MacPAD, by Kevin Ballard. It's "dumb" in that it does essentially string comparison, in components split by character type.
|
||||
*/
|
||||
@interface LNStandardVersionComparator : NSObject<LNVersionComparison> { }
|
||||
|
||||
/*!
|
||||
@method
|
||||
@abstract Returns a singleton instance of the comparator.
|
||||
*/
|
||||
+(LNStandardVersionComparator*)defaultComparator;
|
||||
|
||||
/*!
|
||||
@method
|
||||
@abstract Compares version strings through textual analysis.
|
||||
@discussion See the implementation for more details.
|
||||
*/
|
||||
-(NSComparisonResult)compareVersion:(NSString*)versionA toVersion:(NSString*)versionB;
|
||||
@end
|
||||
|
||||
#endif
|
|
@ -0,0 +1,158 @@
|
|||
//
|
||||
// LNStandardVersionComparator.m
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 12/21/07.
|
||||
// Copyright 2007 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import "LNStandardVersionComparator.h"
|
||||
|
||||
@implementation LNStandardVersionComparator
|
||||
|
||||
+(LNStandardVersionComparator*) defaultComparator {
|
||||
static LNStandardVersionComparator* defaultComparator = nil;
|
||||
|
||||
if (defaultComparator == nil) defaultComparator = [[LNStandardVersionComparator alloc] init];
|
||||
return defaultComparator;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
kNumberType,
|
||||
kStringType,
|
||||
kPeriodType
|
||||
} SUCharacterType;
|
||||
|
||||
-(SUCharacterType) typeOfCharacter:(NSString*)character {
|
||||
if ([character isEqualToString:@"."]) {
|
||||
return kPeriodType;
|
||||
} else if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[character characterAtIndex:0]]) {
|
||||
return kNumberType;
|
||||
} else {
|
||||
return kStringType;
|
||||
}
|
||||
}
|
||||
|
||||
-(NSArray*) splitVersionString:(NSString*)version {
|
||||
NSString* character;
|
||||
NSMutableString* s;
|
||||
NSUInteger i, n;
|
||||
SUCharacterType oldType, newType;
|
||||
NSMutableArray* parts = [NSMutableArray array];
|
||||
|
||||
if ([version length] == 0) {
|
||||
// Nothing to do here
|
||||
return parts;
|
||||
}
|
||||
s = [[[version substringToIndex:1] mutableCopy] autorelease];
|
||||
oldType = [self typeOfCharacter:s];
|
||||
n = [version length] - 1;
|
||||
for (i = 1; i <= n; ++i) {
|
||||
character = [version substringWithRange:NSMakeRange(i, 1)];
|
||||
newType = [self typeOfCharacter:character];
|
||||
if ((oldType != newType) || (oldType == kPeriodType)) {
|
||||
// We've reached a new segment
|
||||
NSString* aPart = [[[NSString alloc] initWithString:s] autorelease];
|
||||
[parts addObject:aPart];
|
||||
[s setString:character];
|
||||
} else {
|
||||
// Add character to string and continue
|
||||
[s appendString:character];
|
||||
}
|
||||
oldType = newType;
|
||||
}
|
||||
|
||||
// Add the last part onto the array
|
||||
[parts addObject:[NSString stringWithString:s]];
|
||||
return parts;
|
||||
}
|
||||
|
||||
-(NSComparisonResult) compareVersion:(NSString*)versionA toVersion:(NSString*)versionB;
|
||||
{
|
||||
NSArray* partsA = [self splitVersionString:versionA];
|
||||
NSArray* partsB = [self splitVersionString:versionB];
|
||||
|
||||
NSString* partA, * partB;
|
||||
NSUInteger i, n;
|
||||
int intA, intB;
|
||||
SUCharacterType typeA, typeB;
|
||||
|
||||
n = MIN([partsA count], [partsB count]);
|
||||
for (i = 0; i < n; ++i) {
|
||||
partA = [partsA objectAtIndex:i];
|
||||
partB = [partsB objectAtIndex:i];
|
||||
|
||||
typeA = [self typeOfCharacter:partA];
|
||||
typeB = [self typeOfCharacter:partB];
|
||||
|
||||
// Compare types
|
||||
if (typeA == typeB) {
|
||||
// Same type; we can compare
|
||||
if (typeA == kNumberType) {
|
||||
intA = [partA intValue];
|
||||
intB = [partB intValue];
|
||||
if (intA > intB) {
|
||||
return NSOrderedDescending;
|
||||
} else if (intA < intB) {
|
||||
return NSOrderedAscending;
|
||||
}
|
||||
} else if (typeA == kStringType) {
|
||||
NSComparisonResult result = [partA compare:partB];
|
||||
if (result != NSOrderedSame) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Not the same type? Now we have to do some validity checking
|
||||
if ((typeA != kStringType) && (typeB == kStringType)) {
|
||||
// typeA wins
|
||||
return NSOrderedDescending;
|
||||
} else if ((typeA == kStringType) && (typeB != kStringType)) {
|
||||
// typeB wins
|
||||
return NSOrderedAscending;
|
||||
} else {
|
||||
// One is a number and the other is a period. The period is invalid
|
||||
if (typeA == kNumberType) {
|
||||
return NSOrderedDescending;
|
||||
} else {
|
||||
return NSOrderedAscending;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// The versions are equal up to the point where they both still have parts
|
||||
// Lets check to see if one is larger than the other
|
||||
if ([partsA count] != [partsB count]) {
|
||||
// Yep. Lets get the next part of the larger
|
||||
// n holds the index of the part we want.
|
||||
NSString* missingPart;
|
||||
SUCharacterType missingType;
|
||||
NSComparisonResult shorterResult, largerResult;
|
||||
|
||||
if ([partsA count] > [partsB count]) {
|
||||
missingPart = [partsA objectAtIndex:n];
|
||||
shorterResult = NSOrderedAscending;
|
||||
largerResult = NSOrderedDescending;
|
||||
} else {
|
||||
missingPart = [partsB objectAtIndex:n];
|
||||
shorterResult = NSOrderedDescending;
|
||||
largerResult = NSOrderedAscending;
|
||||
}
|
||||
|
||||
missingType = [self typeOfCharacter:missingPart];
|
||||
// Check the type
|
||||
if (missingType == kStringType) {
|
||||
// It's a string. Shorter version wins
|
||||
return shorterResult;
|
||||
} else {
|
||||
// It's a number/period. Larger version wins
|
||||
return largerResult;
|
||||
}
|
||||
}
|
||||
|
||||
// The 2 strings are identical
|
||||
return NSOrderedSame;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,27 @@
|
|||
//
|
||||
// LNVersionComparisonProtocol.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 12/21/07.
|
||||
// Copyright 2007 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef LNVERSIONCOMPARISONPROTOCOL_H
|
||||
#define LNVERSIONCOMPARISONPROTOCOL_H
|
||||
|
||||
/*!
|
||||
@protocol
|
||||
@abstract Implement this protocol to provide version comparison facilities for Sparkle.
|
||||
*/
|
||||
@protocol LNVersionComparison
|
||||
|
||||
/*!
|
||||
@method
|
||||
@abstract An abstract method to compare two version strings.
|
||||
@discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.
|
||||
*/
|
||||
-(NSComparisonResult)compareVersion:(NSString*)versionA toVersion:(NSString*)versionB;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
|
@ -0,0 +1,270 @@
|
|||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "LNStandardVersionComparator.h"
|
||||
|
||||
#define EXPORT __attribute__((visibility("default")))
|
||||
|
||||
#define WAIT_FOR_APPLE_EVENT_TO_ENTER_HANDLER_IN_SECONDS 1.0
|
||||
#define FINDER_MIN_TESTED_VERSION @"10.7"
|
||||
#define FINDER_MAX_TESTED_VERSION @"10.8.5"
|
||||
#define LIFERAYNATIVITY_INJECTED_NOTIFICATION @"LiferayNativityInjectedNotification"
|
||||
|
||||
EXPORT OSErr HandleLoadEvent(const AppleEvent* ev, AppleEvent* reply, long refcon);
|
||||
|
||||
static NSString* globalLock = @"I'm the global lock to prevent concruent handler executions";
|
||||
|
||||
// SIMBL-compatible interface
|
||||
@interface LiferayNativityShell : NSObject { }
|
||||
-(void) install;
|
||||
-(void) uninstall;
|
||||
@end
|
||||
|
||||
// just a dummy class for locating our bundle
|
||||
@interface LiferayNativityInjector : NSObject { }
|
||||
@end
|
||||
|
||||
@implementation LiferayNativityInjector { }
|
||||
@end
|
||||
|
||||
static bool liferayNativityLoaded = false;
|
||||
static NSString* liferayNativityBundleName = @"LiferayNativityFinder";
|
||||
|
||||
typedef struct {
|
||||
NSString* location;
|
||||
} configuration;
|
||||
|
||||
static OSErr AEPutParamString(AppleEvent* event, AEKeyword keyword, NSString* string) {
|
||||
UInt8* textBuf;
|
||||
CFIndex length, maxBytes, actualBytes;
|
||||
|
||||
length = CFStringGetLength((CFStringRef)string);
|
||||
maxBytes = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8);
|
||||
textBuf = malloc(maxBytes);
|
||||
if (textBuf) {
|
||||
CFStringGetBytes((CFStringRef)string, CFRangeMake(0, length), kCFStringEncodingUTF8, 0, true, (UInt8*)textBuf, maxBytes, &actualBytes);
|
||||
OSErr err = AEPutParamPtr(event, keyword, typeUTF8Text, textBuf, actualBytes);
|
||||
free(textBuf);
|
||||
return err;
|
||||
} else {
|
||||
return memFullErr;
|
||||
}
|
||||
}
|
||||
|
||||
static void reportError(AppleEvent* reply, NSString* msg) {
|
||||
NSLog(@"LiferayNativityInjector: %@", msg);
|
||||
AEPutParamString(reply, keyErrorString, msg);
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
InvalidBundleType,
|
||||
LiferayNativityBundleType,
|
||||
} LNBundleType;
|
||||
|
||||
static OSErr loadBundle(LNBundleType type, AppleEvent* reply, long refcon) {
|
||||
bool isLoaded = false;
|
||||
NSString* bundleName = nil;
|
||||
NSString* targetAppName = nil;
|
||||
NSString* versionCheckKey = nil;
|
||||
NSString* maxVersion = nil;
|
||||
NSString* minVersion = nil;
|
||||
|
||||
switch (type) {
|
||||
case LiferayNativityBundleType:
|
||||
isLoaded = liferayNativityLoaded;
|
||||
bundleName = liferayNativityBundleName;
|
||||
targetAppName = @"Finder";
|
||||
versionCheckKey = @"LiferayNativityFinderVersionCheck";
|
||||
maxVersion = FINDER_MAX_TESTED_VERSION;
|
||||
minVersion = FINDER_MIN_TESTED_VERSION;
|
||||
break;
|
||||
default:
|
||||
NSLog(@"Failed to load bundle for type %d", type);
|
||||
return 8;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (isLoaded) {
|
||||
NSLog(@"LiferayNativityInjector: %@ already loaded.", bundleName);
|
||||
return noErr;
|
||||
}
|
||||
|
||||
@try {
|
||||
NSBundle* mainBundle = [NSBundle mainBundle];
|
||||
if (!mainBundle) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to locate main %@ bundle!", targetAppName]);
|
||||
return 4;
|
||||
}
|
||||
|
||||
NSString* mainVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"];
|
||||
if (!mainVersion || ![mainVersion isKindOfClass:[NSString class]]) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to determine %@ version!", targetAppName]);
|
||||
return 5;
|
||||
}
|
||||
|
||||
// future compatibility check
|
||||
if (type == LiferayNativityBundleType) {
|
||||
// in Dock we cannot use NSAlert and similar UI stuff - this would hang the Dock process and cause 100% CPU load
|
||||
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
|
||||
if ([defaults boolForKey:versionCheckKey]) {
|
||||
LNStandardVersionComparator* comparator = [LNStandardVersionComparator defaultComparator];
|
||||
if (([comparator compareVersion:mainVersion toVersion:maxVersion] == NSOrderedDescending) ||
|
||||
([comparator compareVersion:mainVersion toVersion:minVersion] == NSOrderedAscending)) {
|
||||
NSAlert* alert = [NSAlert new];
|
||||
[alert setMessageText:[NSString stringWithFormat:@"You have %@ version %@", targetAppName, mainVersion]];
|
||||
[alert setInformativeText:[NSString stringWithFormat:@"But %@ was properly tested only with %@ versions in range %@ - %@\n\nYou have probably updated your system and %@ version got bumped by Apple developers.\n\nYou may expect a new LiferayNativity release soon.", bundleName, targetAppName, targetAppName, minVersion, maxVersion]];
|
||||
[alert setShowsSuppressionButton:YES];
|
||||
[alert addButtonWithTitle:@"Launch LiferayNativity anyway"];
|
||||
[alert addButtonWithTitle:@"Cancel"];
|
||||
NSInteger res = [alert runModal];
|
||||
if ([[alert suppressionButton] state] == NSOnState) {
|
||||
[defaults setBool:NO forKey:versionCheckKey];
|
||||
}
|
||||
if (res != NSAlertFirstButtonReturn) {
|
||||
// cancel
|
||||
return noErr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NSBundle* liferayNativityInjectorBundle = [NSBundle bundleForClass:[LiferayNativityInjector class]];
|
||||
NSString* liferayNativityLocation = [liferayNativityInjectorBundle pathForResource:bundleName ofType:@"bundle"];
|
||||
NSBundle* pluginBundle = [NSBundle bundleWithPath:liferayNativityLocation];
|
||||
if (!pluginBundle) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to create bundle from path: %@ [%@]", liferayNativityLocation, liferayNativityInjectorBundle]);
|
||||
return 2;
|
||||
}
|
||||
|
||||
NSError* error;
|
||||
if (![pluginBundle loadAndReturnError:&error]) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to load bundle from path: %@ error: %@", liferayNativityLocation, [error localizedDescription]]);
|
||||
return 6;
|
||||
}
|
||||
|
||||
Class principalClass = [pluginBundle principalClass];
|
||||
if (!principalClass) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to retrieve principalClass for bundle: %@", pluginBundle]);
|
||||
return 3;
|
||||
}
|
||||
id principalClassObject = NSClassFromString(NSStringFromClass(principalClass));
|
||||
if ([principalClassObject respondsToSelector:@selector(install)]) {
|
||||
NSLog(@"LiferayNativityInjector: Installing %@ ...", bundleName);
|
||||
[principalClassObject install];
|
||||
}
|
||||
|
||||
return noErr;
|
||||
} @catch (NSException* exception) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Failed to load %@ with exception: %@", bundleName, exception]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static LNBundleType mainBundleType(AppleEvent* reply) {
|
||||
@try {
|
||||
NSBundle* mainBundle = [NSBundle mainBundle];
|
||||
if (!mainBundle) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to locate main bundle!"]);
|
||||
return InvalidBundleType;
|
||||
}
|
||||
|
||||
if ([[mainBundle bundleIdentifier] isEqualToString:@"com.apple.finder"]) {
|
||||
return LiferayNativityBundleType;
|
||||
}
|
||||
} @catch (NSException* exception) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Failed to load main bundle with exception: %@", exception]);
|
||||
}
|
||||
|
||||
return InvalidBundleType;
|
||||
}
|
||||
|
||||
EXPORT OSErr HandleLoadEvent(const AppleEvent* ev, AppleEvent* reply, long refcon) {
|
||||
@synchronized(globalLock) {
|
||||
@autoreleasepool {
|
||||
NSBundle* injectorBundle = [NSBundle bundleForClass:[LiferayNativityInjector class]];
|
||||
NSString* injectorVersion = [injectorBundle objectForInfoDictionaryKey:@"CFBundleVersion"];
|
||||
|
||||
if (!injectorVersion || ![injectorVersion isKindOfClass:[NSString class]]) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to determine LiferayNativityInjector version!"]);
|
||||
return 7;
|
||||
}
|
||||
|
||||
@try {
|
||||
OSErr err = loadBundle(mainBundleType(reply), reply, refcon);
|
||||
|
||||
if (err != noErr)
|
||||
{
|
||||
return err;
|
||||
}
|
||||
|
||||
pid_t pid = [[NSProcessInfo processInfo] processIdentifier];
|
||||
|
||||
[[NSDistributedNotificationCenter defaultCenter]postNotificationName:LIFERAYNATIVITY_INJECTED_NOTIFICATION object:[[NSBundle mainBundle]bundleIdentifier] userInfo:@{@"pid": @(pid)}];
|
||||
|
||||
liferayNativityLoaded = true;
|
||||
|
||||
return noErr;
|
||||
} @catch (NSException* exception) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Failed to load LiferayNativity with exception: %@", exception]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT OSErr HandleLoadedEvent(const AppleEvent* ev, AppleEvent* reply, long refcon) {
|
||||
@synchronized(globalLock) {
|
||||
@autoreleasepool {
|
||||
LNBundleType type = mainBundleType(reply);
|
||||
if ((type == LiferayNativityBundleType) && liferayNativityLoaded) {
|
||||
return noErr;
|
||||
}
|
||||
reportError(reply, @"LiferayNativity not loaded");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT OSErr HandleUnloadEvent(const AppleEvent* ev, AppleEvent* reply, long refcon) {
|
||||
@synchronized(globalLock) {
|
||||
@autoreleasepool {
|
||||
@try {
|
||||
if (!liferayNativityLoaded) {
|
||||
NSLog(@"LiferayNativityInjector: not loaded.");
|
||||
return noErr;
|
||||
}
|
||||
|
||||
NSString* bundleName = liferayNativityBundleName;
|
||||
|
||||
NSBundle* liferayNativityInjectorBundle = [NSBundle bundleForClass:[LiferayNativityInjector class]];
|
||||
NSString* liferayNativityLocation = [liferayNativityInjectorBundle pathForResource:bundleName ofType:@"bundle"];
|
||||
NSBundle* pluginBundle = [NSBundle bundleWithPath:liferayNativityLocation];
|
||||
if (!pluginBundle) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to create bundle from path: %@ [%@]", liferayNativityLocation, liferayNativityInjectorBundle]);
|
||||
return 2;
|
||||
}
|
||||
|
||||
Class principalClass = [pluginBundle principalClass];
|
||||
if (!principalClass) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Unable to retrieve principalClass for bundle: %@", pluginBundle]);
|
||||
return 3;
|
||||
}
|
||||
id principalClassObject = NSClassFromString(NSStringFromClass(principalClass));
|
||||
if ([principalClassObject respondsToSelector:@selector(uninstall)]) {
|
||||
NSLog(@"LiferayNativityInjector: Uninstalling %@ ...", bundleName);
|
||||
[principalClassObject uninstall];
|
||||
}
|
||||
|
||||
liferayNativityLoaded = false;
|
||||
|
||||
return noErr;
|
||||
} @catch (NSException* exception) {
|
||||
reportError(reply, [NSString stringWithFormat:@"Failed to unload LiferayNativity with exception: %@", exception]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
|
||||
<dictionary title="LiferayNativityInjector Terminology">
|
||||
<suite name="LiferayNativityInjector Suite" code="NVTY" description="LiferayNativity Injector commands">
|
||||
<command name="install LiferayNativity" code="NVTYload" description="Loads LiferayNativity into the Finder process"/>
|
||||
<command name="uninstall LiferayNativity" code="NVTYunld" description="Unloads LiferayNativity from the Finder process"/>
|
||||
<command name="check LiferayNativity" code="NVTYlded" description="Checks if LiferayNativity is loaded in Finder process"/>
|
||||
</suite>
|
||||
</dictionary>
|
|
@ -0,0 +1,269 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
0B36CB92182461A10039B237 /* LiferayNativityFinder.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0B36CB91182461A10039B237 /* LiferayNativityFinder.bundle */; };
|
||||
0BD9C38E1778EF450094CF5D /* license.txt in Resources */ = {isa = PBXBuildFile; fileRef = 0BD9C38D1778EF450094CF5D /* license.txt */; };
|
||||
8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };
|
||||
8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };
|
||||
D6ACBEA2117B7D5600F6691C /* LiferayNativityInjector.m in Sources */ = {isa = PBXBuildFile; fileRef = D6ACBE9E117B7D5600F6691C /* LiferayNativityInjector.m */; };
|
||||
D6ACBEA3117B7D5600F6691C /* LNStandardVersionComparator.m in Sources */ = {isa = PBXBuildFile; fileRef = D6ACBEA0117B7D5600F6691C /* LNStandardVersionComparator.m */; };
|
||||
D6ACBEA5117B7D6100F6691C /* LiferayNativityInjector.sdef in Resources */ = {isa = PBXBuildFile; fileRef = D6ACBEA4117B7D6100F6691C /* LiferayNativityInjector.sdef */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
|
||||
0B36CB91182461A10039B237 /* LiferayNativityFinder.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = LiferayNativityFinder.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
0BD9C38D1778EF450094CF5D /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license.txt; sourceTree = "<group>"; };
|
||||
8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
D60A992314CE37030061AD6D /* LiferayNativity.osax */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LiferayNativity.osax; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D6ACBE9E117B7D5600F6691C /* LiferayNativityInjector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiferayNativityInjector.m; sourceTree = "<group>"; };
|
||||
D6ACBE9F117B7D5600F6691C /* LNVersionComparisonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNVersionComparisonProtocol.h; sourceTree = "<group>"; };
|
||||
D6ACBEA0117B7D5600F6691C /* LNStandardVersionComparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNStandardVersionComparator.m; sourceTree = "<group>"; };
|
||||
D6ACBEA1117B7D5600F6691C /* LNStandardVersionComparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNStandardVersionComparator.h; sourceTree = "<group>"; };
|
||||
D6ACBEA4117B7D6100F6691C /* LiferayNativityInjector.sdef */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = LiferayNativityInjector.sdef; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
8D576313048677EA00EA77CD /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
089C166AFE841209C02AAC07 /* TotalFinder-osax */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
08FB77AFFE84173DC02AAC07 /* Source */,
|
||||
089C167CFE841241C02AAC07 /* Resources */,
|
||||
089C1671FE841209C02AAC07 /* Dependencies */,
|
||||
D60A992414CE37030061AD6D /* Products */,
|
||||
);
|
||||
indentWidth = 2;
|
||||
name = "TotalFinder-osax";
|
||||
sourceTree = "<group>";
|
||||
tabWidth = 2;
|
||||
usesTabs = 0;
|
||||
};
|
||||
089C1671FE841209C02AAC07 /* Dependencies */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,
|
||||
);
|
||||
name = Dependencies;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
089C167CFE841241C02AAC07 /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0B36CB91182461A10039B237 /* LiferayNativityFinder.bundle */,
|
||||
D6ACBEA4117B7D6100F6691C /* LiferayNativityInjector.sdef */,
|
||||
8D576317048677EA00EA77CD /* Info.plist */,
|
||||
8D5B49A704867FD3000E48DA /* InfoPlist.strings */,
|
||||
0BD9C38D1778EF450094CF5D /* license.txt */,
|
||||
);
|
||||
name = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
08FB77AFFE84173DC02AAC07 /* Source */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D6ACBE9E117B7D5600F6691C /* LiferayNativityInjector.m */,
|
||||
D6ACBE9F117B7D5600F6691C /* LNVersionComparisonProtocol.h */,
|
||||
D6ACBEA0117B7D5600F6691C /* LNStandardVersionComparator.m */,
|
||||
D6ACBEA1117B7D5600F6691C /* LNStandardVersionComparator.h */,
|
||||
);
|
||||
name = Source;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D60A992414CE37030061AD6D /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D60A992314CE37030061AD6D /* LiferayNativity.osax */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
8D57630D048677EA00EA77CD /* LiferayNativity.osax */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 1DEB911A08733D790010E9CD /* Build configuration list for PBXNativeTarget "LiferayNativity.osax" */;
|
||||
buildPhases = (
|
||||
8D57630F048677EA00EA77CD /* Resources */,
|
||||
8D576311048677EA00EA77CD /* Sources */,
|
||||
8D576313048677EA00EA77CD /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = LiferayNativity.osax;
|
||||
productInstallPath = "$(HOME)/Library/Bundles";
|
||||
productName = "TotalFinder-osax";
|
||||
productReference = D60A992314CE37030061AD6D /* LiferayNativity.osax */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
089C1669FE841209C02AAC07 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastUpgradeCheck = 0460;
|
||||
ORGANIZATIONNAME = BinaryAge;
|
||||
};
|
||||
buildConfigurationList = 1DEB911E08733D790010E9CD /* Build configuration list for PBXProject "LiferayNativityInjector" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 1;
|
||||
knownRegions = (
|
||||
en,
|
||||
English,
|
||||
);
|
||||
mainGroup = 089C166AFE841209C02AAC07 /* TotalFinder-osax */;
|
||||
productRefGroup = D60A992414CE37030061AD6D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
8D57630D048677EA00EA77CD /* LiferayNativity.osax */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
8D57630F048677EA00EA77CD /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0B36CB92182461A10039B237 /* LiferayNativityFinder.bundle in Resources */,
|
||||
8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,
|
||||
D6ACBEA5117B7D6100F6691C /* LiferayNativityInjector.sdef in Resources */,
|
||||
0BD9C38E1778EF450094CF5D /* license.txt in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
8D576311048677EA00EA77CD /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D6ACBEA2117B7D5600F6691C /* LiferayNativityInjector.m in Sources */,
|
||||
D6ACBEA3117B7D5600F6691C /* LNStandardVersionComparator.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
089C167EFE841241C02AAC07 /* English */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
1DEB911B08733D790010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
Foundation,
|
||||
"-framework",
|
||||
AppKit,
|
||||
);
|
||||
PRODUCT_NAME = LiferayNativity;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = osax;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB911C08733D790010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
Foundation,
|
||||
"-framework",
|
||||
AppKit,
|
||||
);
|
||||
PRODUCT_NAME = LiferayNativity;
|
||||
WRAPPER_EXTENSION = osax;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
1DEB911F08733D790010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CONFIGURATION_TEMP_DIR = "$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB912008733D790010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
1DEB911A08733D790010E9CD /* Build configuration list for PBXNativeTarget "LiferayNativity.osax" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB911B08733D790010E9CD /* Debug */,
|
||||
1DEB911C08733D790010E9CD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
1DEB911E08733D790010E9CD /* Build configuration list for PBXProject "LiferayNativityInjector" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB911F08733D790010E9CD /* Debug */,
|
||||
1DEB912008733D790010E9CD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 089C1669FE841209C02AAC07 /* Project object */;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:LiferayNativityInjector.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "NO"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "8D57630D048677EA00EA77CD"
|
||||
BuildableName = "LiferayNativityFinder.bundle"
|
||||
BlueprintName = "LiferayNativityFinder"
|
||||
ReferencedContainer = "container:../LiferayNativityFinder/LiferayNativityFinder.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "8D57630D048677EA00EA77CD"
|
||||
BuildableName = "LiferayNativity.osax"
|
||||
BlueprintName = "LiferayNativity.osax"
|
||||
ReferencedContainer = "container:LiferayNativityInjector.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
buildConfiguration = "Debug">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Debug"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
allowLocationSimulation = "YES">
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>8D57630D048677EA00EA77CD</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
25
shell_integration/MacOSX/LiferayNativityInjector/license.txt
Normal file
|
@ -0,0 +1,25 @@
|
|||
Copyright (c) 2010-2013, BinaryAge Limited
|
||||
Contributors: https://github.com/binaryage/totalfinder-osax/contributors
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of Antonin Hildebrand nor the
|
||||
names of other contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY BINARYAGE LIMITED ``AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL Antonin Hildebrand BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
9
shell_integration/MacOSX/check.scpt
Normal file
|
@ -0,0 +1,9 @@
|
|||
tell application "Finder"
|
||||
try
|
||||
«event NVTYlded»
|
||||
set the result to 0
|
||||
on error msg number code
|
||||
set the result to code
|
||||
end try
|
||||
end tell
|
||||
|
11
shell_integration/MacOSX/deploy.sh
Normal file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
# osascript $HOME/owncloud.com/mirall/shell_integration/MacOSX/unload.scpt
|
||||
|
||||
sudo rm -rf /Library/ScriptingAdditions/LiferayNativity.osax
|
||||
sudo cp -r $HOME/Library/Developer/Xcode/DerivedData/LiferayNativity-flulyntyemvwtcgiriaddqfewwvc/Build/Products/Debug/LiferayNativity.osax /Library/ScriptingAdditions/
|
||||
|
||||
sudo killall Finder
|
||||
sleep 1
|
||||
osascript $HOME/owncloud.com/mirall/shell_integration/MacOSX/load.scpt
|
||||
osascript $HOME/owncloud.com/mirall/shell_integration/MacOSX/check.scpt
|
||||
|
6
shell_integration/MacOSX/load.scpt
Normal file
|
@ -0,0 +1,6 @@
|
|||
tell application "Finder"
|
||||
try
|
||||
«event NVTYload»
|
||||
end try
|
||||
end tell
|
||||
|
8
shell_integration/MacOSX/loadPlugin.sh
Executable file
|
@ -0,0 +1,8 @@
|
|||
#!/bin/sh
|
||||
|
||||
osascript -e 'tell application "Finder" \
|
||||
try \
|
||||
«event NVTYload» \
|
||||
end try \
|
||||
end tell'
|
||||
|
6
shell_integration/MacOSX/unload.scpt
Normal file
|
@ -0,0 +1,6 @@
|
|||
tell application "Finder"
|
||||
try
|
||||
«event NVTYunld»
|
||||
end try
|
||||
end tell
|
||||
|
BIN
shell_integration/icons/.DS_Store
vendored
Normal file
BIN
shell_integration/icons/1024x1024/Error_1024.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
shell_integration/icons/1024x1024/Error_Shared_1024.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
shell_integration/icons/1024x1024/OK_1024.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
shell_integration/icons/1024x1024/OK_Shared_1024.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
shell_integration/icons/1024x1024/Sync_1024.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
shell_integration/icons/1024x1024/Sync_Shared_1024.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
shell_integration/icons/1024x1024/Warning_1024.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
shell_integration/icons/1024x1024/Warning_Shared_1024.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
shell_integration/icons/128x128/.DS_Store
vendored
Normal file
BIN
shell_integration/icons/128x128/Error_128.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
shell_integration/icons/128x128/Error_Shared_128.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
shell_integration/icons/128x128/OK_128.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
shell_integration/icons/128x128/OK_Shared_128.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
shell_integration/icons/128x128/Sync_128.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
shell_integration/icons/128x128/Sync_Shared_128.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
shell_integration/icons/128x128/Warning_128.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
shell_integration/icons/128x128/Warning_Shared_128.png
Normal file
After Width: | Height: | Size: 3 KiB |
BIN
shell_integration/icons/16x16/Error_16.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
shell_integration/icons/16x16/Error_Shared_16.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
shell_integration/icons/16x16/OK_16.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
shell_integration/icons/16x16/OK_Shared_16.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
shell_integration/icons/16x16/Sync_16.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
shell_integration/icons/16x16/Sync_Shared_16.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
shell_integration/icons/16x16/Warning_16.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
shell_integration/icons/16x16/Warning_Shared_16.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
shell_integration/icons/256x256/Error_256.png
Normal file
After Width: | Height: | Size: 4 KiB |
BIN
shell_integration/icons/256x256/Error_Shared_256.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
shell_integration/icons/256x256/OK_256.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
shell_integration/icons/256x256/OK_Shared_256.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
shell_integration/icons/256x256/Sync_256.png
Normal file
After Width: | Height: | Size: 5 KiB |
BIN
shell_integration/icons/256x256/Sync_Shared_256.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
shell_integration/icons/256x256/Warning_256.png
Normal file
After Width: | Height: | Size: 4 KiB |
BIN
shell_integration/icons/256x256/Warning_Shared_256.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
shell_integration/icons/32x32/.DS_Store
vendored
Normal file
BIN
shell_integration/icons/32x32/Error_32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
shell_integration/icons/32x32/Error_Shared_32.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
shell_integration/icons/32x32/OK_32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
shell_integration/icons/32x32/OK_Shared_32.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
shell_integration/icons/32x32/Sync_32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
shell_integration/icons/32x32/Sync_Shared_32.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
shell_integration/icons/32x32/Warning_32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
shell_integration/icons/32x32/Warning_Shared_32.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
shell_integration/icons/48x48/Error_48.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
shell_integration/icons/48x48/Error_Shared_48.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
shell_integration/icons/48x48/OK_48.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
shell_integration/icons/48x48/OK_Shared_48.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
shell_integration/icons/48x48/Sync_48.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
shell_integration/icons/48x48/Sync_Shared_48.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
shell_integration/icons/48x48/Warning_48.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
shell_integration/icons/48x48/Warning_Shared_48.png
Normal file
After Width: | Height: | Size: 3.1 KiB |