Anonymous avatar Anonymous committed 6f85bff

Fixed bootstrapper and Main to be much more intelligent.

Comments (0)

Files changed (2)

pyobjc/Examples/WebServicesTool/Main.py

-#!/usr/bin/python
-
 import sys
 import os.path
 
 import Foundation
 import AppKit
 
+# automatically load frameworks that were linked into the bootstrap tooll
+pyFrameworkPathsIndex = sys.argv.index("-PyFrameworkPaths")
+if not (pyFrameworkPathsIndex == -1):
+  import string
+  from Foundation import NSBundle
+  paths = string.split(sys.argv[pyFrameworkPathsIndex + 1], ":")
+  count = 0
+  for path in paths:
+    bundle = NSBundle.bundleWithPath_(path)
+    bundle.principalClass()
+    sys.path.insert(count, bundle.resourcePath())
+    count = count + 1
+    
+    initPath = bundle.pathForResource_ofType_( "Init", "py")
+    if initPath:
+      execfile(initPath, globals(), locals())
+
 import WSTApplicationDelegateClass
 import WSTConnectionWindowControllerClass
 

pyobjc/Examples/WebServicesTool/main-bin-python.m

 
 int pyobjc_main(int argc, char * const *argv, char *envp[])
 {
-  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-  const char **childArgv = alloca(sizeof(char *) * (argc + 3));
+  [[NSAutoreleasePool alloc] init];
+
+  const char **childArgv = alloca(sizeof(char *) * (argc + 5));
   const char *pythonBinPathPtr;
   const char *mainPyPathPtr;
+  NSEnumerator *bundleEnumerator = [[NSBundle allFrameworks] reverseObjectEnumerator];
+  NSBundle *aBundle;
+  NSMutableArray *bundlePaths = [[NSMutableArray array] retain];
   int i;
-  
+
+  while ( aBundle = [bundleEnumerator nextObject] ) {
+    if ( [[[aBundle bundlePath] pathExtension] isEqualToString: @"framework"] )
+      [bundlePaths addObject: [aBundle bundlePath]];
+  }
+
   NSString *pythonBinPath = [[NSUserDefaults standardUserDefaults] stringForKey: @"PythonBinPath"];
   pythonBinPath = pythonBinPath ? pythonBinPath : @"/usr/bin/python";
   [pythonBinPath retain];
   pythonBinPathPtr = [pythonBinPath UTF8String];
-  
+
   NSString *mainPyFile = [[[NSBundle mainBundle] infoDictionary] objectForKey: @"PrincipalPythonFile"];
   NSString *mainPyPath = nil;
 
   childArgv[0] = argv[0];
   childArgv[1] = mainPyPathPtr;
   for (i = 1; i<argc; i++)
-    childArgv[i+2] = argv[i];
-  childArgv[i+2] = NULL;
-  
-  [pool release];
+    childArgv[i+1] = argv[i];
+  childArgv[i+1] = "-PyFrameworkPaths";
+  childArgv[i+2] = [[bundlePaths componentsJoinedByString: @":"] UTF8String];
+  childArgv[i+3] = NULL;
 
   return execve(pythonBinPathPtr, (char **)childArgv, envp);
 }
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.