root/trunk/Plug-Ins/Ruby Support/JVRubyPluginLoader.m

Revision 3263, 5.9 kB (checked in by timothy, 2 years ago)

More warning fixes that Xcode never mentioned until I build universal. Thanks Xcode. :P

Line 
1 #import "JVRubyPluginLoader.h"
2 #import "JVRubyChatPlugin.h"
3 #import "MVChatConnection.h"
4 #import "JVChatWindowController.h"
5
6 @implementation JVRubyPluginLoader
7 - (id) initWithManager:(MVChatPluginManager *) manager {
8         if( ( self = [super init] ) ) {
9                 _manager = manager;
10                 _rubyCocoaInstalled = ( RBRubyCocoaInit != NULL ? YES : NO );
11         }
12
13         return self;
14 }
15
16 - (void) dealloc {
17         [[NSNotificationCenter defaultCenter] removeObserver:self];
18         _manager = nil;
19         [super dealloc];
20 }
21
22 - (void) displayInstallationWarning {
23         NSRunCriticalAlertPanel( NSLocalizedStringFromTableInBundle( @"RubyCocoa Required", nil, [NSBundle bundleForClass:[self class]], "RubyCocoa required error title" ), NSLocalizedStringFromTableInBundle( @"RubyCocoa was not found. The Ruby console and any Ruby plugins will not work during this session. For the latest version of RubyCocoa visit http://rubycocoa.sourceforge.net.", nil, [NSBundle bundleForClass:[self class]], "RubyCocoa required error message" ), nil, nil, nil );
24 }
25
26 - (BOOL) processUserCommand:(NSString *) command withArguments:(NSAttributedString *) arguments toConnection:(MVChatConnection *) connection inView:(id <JVChatViewController>) view {
27         if( ! [command caseInsensitiveCompare:@"ruby"] || ! [command caseInsensitiveCompare:@"rb"] ) {
28                 if( ! _rubyCocoaInstalled ) {
29                         [self displayInstallationWarning];
30                         return YES;
31                 }
32
33                 NSArray *args = [[[arguments string] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsSeparatedByString:@" "];
34                 NSString *subcmd = ( [args count] ? [args objectAtIndex:0] : nil );
35                 /* if( [args count] == 1 ) {
36                         if( view && ! [subcmd caseInsensitiveCompare:@"console"] ) {
37                                 JVRubyConsolePanel *console = [[[JVRubyConsolePanel alloc] init] autorelease];
38                                 [[view windowController] addChatViewController:console];
39                                 [[view windowController] performSelector:@selector( showChatViewController: ) withObject:console afterDelay:0];
40                         }
41                 } else */ if( [args count] > 1 ) {
42                         NSString *path = [[args subarrayWithRange:NSMakeRange( 1, ( [args count] - 1 ) )] componentsJoinedByString:@" "];
43                         path = [path stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
44                         if( path ) {
45                                 path = [path stringByStandardizingPath];
46
47                                 NSEnumerator *pluginEnum = [_manager enumeratorOfPluginsOfClass:[JVRubyChatPlugin class] thatRespondToSelector:@selector( init )];
48                                 JVRubyChatPlugin *plugin = nil;
49
50                                 while( ( plugin = [pluginEnum nextObject] ) )
51                                         if( [[[plugin scriptFilePath] stringByDeletingPathExtension] isEqualToString:[path stringByDeletingPathExtension]] || [[[[plugin scriptFilePath] lastPathComponent] stringByDeletingPathExtension] isEqualToString:path] )
52                                                 break;
53
54                                 if( ! plugin ) {
55                                         if( ! [subcmd caseInsensitiveCompare:@"load"] ) {
56                                                 [self loadPluginNamed:path];
57                                         } else if( ! [subcmd caseInsensitiveCompare:@"create"] ) {
58                                                 path = [[path stringByDeletingPathExtension] stringByAppendingPathExtension:@"rb"];
59                                                 if( ! [path isAbsolutePath] )
60                                                         path = [[[[_manager class] pluginSearchPaths] objectAtIndex:0] stringByAppendingPathComponent:path];
61                                                 if( ! [[NSFileManager defaultManager] fileExistsAtPath:path] ) {
62                                                         if( [[NSFileManager defaultManager] createFileAtPath:path contents:[NSData data] attributes:nil] )
63                                                                 [[NSWorkspace sharedWorkspace] openFile:path];
64                                                 }
65                                         }
66                                 } else if( plugin ) {
67                                         if( ! [subcmd caseInsensitiveCompare:@"reload"] || ! [subcmd caseInsensitiveCompare:@"load"] ) {
68                                                 [plugin reloadFromDisk];
69                                         } else if( ! [subcmd caseInsensitiveCompare:@"unload"] ) {
70                                                 [_manager removePlugin:plugin];
71                                         /* } else if( view && ! [subcmd caseInsensitiveCompare:@"console"] ) {
72                                                 JVRubyConsolePanel *console = [[[JVRubyConsolePanel alloc] initWithRubyChatPlugin:plugin] autorelease];
73                                                 [[view windowController] addChatViewController:console];
74                                                 [[view windowController] showChatViewController:console]; */
75                                         } else if( ! [subcmd caseInsensitiveCompare:@"edit"] ) {
76                                                 [[NSWorkspace sharedWorkspace] openFile:[plugin scriptFilePath]];
77                                         }
78                                 }
79                         }
80                 }
81
82                 return YES;
83         }
84
85         return NO;
86 }
87
88 - (void) loadPluginNamed:(NSString *) name {
89         // Look through the standard plugin paths
90         if( ! _manager ) return;
91
92         if( ! [name isAbsolutePath] ) {
93                 NSArray *paths = [[_manager class] pluginSearchPaths];
94                 NSFileManager *fm = [NSFileManager defaultManager];
95
96                 NSEnumerator *enumerator = [paths objectEnumerator];
97                 NSString *path = nil;
98                 while( ( path = [enumerator nextObject] ) ) {
99                         path = [path stringByAppendingPathComponent:[name stringByDeletingPathExtension]];
100                         path = [path stringByAppendingPathExtension:@"rb"];
101
102                         if( [fm fileExistsAtPath:path] ) {
103                                 if( ! _rubyCocoaInstalled ) {
104                                         [self displayInstallationWarning];
105                                         return;
106                                 }
107
108                                 JVRubyChatPlugin *plugin = [[[JVRubyChatPlugin alloc] initWithScriptAtPath:path withManager:_manager] autorelease];
109                                 if( plugin ) [_manager addPlugin:plugin];
110                                 return;
111                         }
112                 }
113         }
114
115         JVRubyChatPlugin *plugin = [[[JVRubyChatPlugin alloc] initWithScriptAtPath:name withManager:_manager] autorelease];
116         if( plugin ) [_manager addPlugin:plugin];
117 }
118
119 - (void) reloadPlugins {
120         if( ! _manager ) return;
121
122         NSArray *paths = [[_manager class] pluginSearchPaths];
123         NSString *file = nil, *path = nil;
124         NSFileManager *fm = [NSFileManager defaultManager];
125
126         NSEnumerator *enumerator = [paths objectEnumerator];
127         while( ( path = [enumerator nextObject] ) ) {
128                 NSEnumerator *denumerator = [[fm directoryContentsAtPath:path] objectEnumerator];
129                 while( ( file = [denumerator nextObject] ) ) {
130                         if( [[file pathExtension] isEqualToString:@"rb"] ) {
131                                 if( ! _rubyCocoaInstalled ) {
132                                         [self displayInstallationWarning];
133                                         return;
134                                 }
135
136                                 file = [path stringByAppendingPathComponent:file];
137
138                                 JVRubyChatPlugin *plugin = [[[JVRubyChatPlugin alloc] initWithScriptAtPath:file withManager:_manager] autorelease];
139                                 if( plugin ) [_manager addPlugin:plugin];
140                         }
141                 }
142         }
143 }
144
145 - (void) load {
146         [self reloadPlugins];
147 }
148 @end
Note: See TracBrowser for help on using the browser.