pythonloader.py (a0428e9e) pythonloader.py (d912c6c5)
1#**************************************************************
2#
3# Licensed to the Apache Software Foundation (ASF) under one
4# or more contributor license agreements. See the NOTICE file
5# distributed with this work for additional information
6# regarding copyright ownership. The ASF licenses this file
7# to you under the Apache License, Version 2.0 (the
8# "License"); you may not use this file except in compliance

--- 20 unchanged lines hidden (view full) ---

29
30MODULE_PROTOCOL = "vnd.openoffice.pymodule:"
31DEBUG = 0
32
33g_supportedServices = "com.sun.star.loader.Python", # referenced by the native C++ loader !
34g_implementationName = "org.openoffice.comp.pyuno.Loader" # referenced by the native C++ loader !
35
36def splitUrl( url ):
1#**************************************************************
2#
3# Licensed to the Apache Software Foundation (ASF) under one
4# or more contributor license agreements. See the NOTICE file
5# distributed with this work for additional information
6# regarding copyright ownership. The ASF licenses this file
7# to you under the Apache License, Version 2.0 (the
8# "License"); you may not use this file except in compliance

--- 20 unchanged lines hidden (view full) ---

29
30MODULE_PROTOCOL = "vnd.openoffice.pymodule:"
31DEBUG = 0
32
33g_supportedServices = "com.sun.star.loader.Python", # referenced by the native C++ loader !
34g_implementationName = "org.openoffice.comp.pyuno.Loader" # referenced by the native C++ loader !
35
36def splitUrl( url ):
37 nColon = url.find( ":" )
38 if -1 == nColon:
39 raise RuntimeException( "PythonLoader: No protocol in url " + url, None )
40 return url[0:nColon], url[nColon+1:len(url)]
37 nColon = url.find( ":" )
38 if -1 == nColon:
39 raise RuntimeException( "PythonLoader: No protocol in url " + url, None )
40 return url[0:nColon], url[nColon+1:len(url)]
41
42g_loadedComponents = {}
43def checkForPythonPathBesideComponent( url ):
41
42g_loadedComponents = {}
43def checkForPythonPathBesideComponent( url ):
44 path = unohelper.fileUrlToSystemPath( url+"/pythonpath.zip" );
45 if DEBUG == 1:
46 print "checking for existence of " + encfile( path )
47 if 1 == os.access( encfile( path ), os.F_OK) and not path in sys.path:
48 if DEBUG == 1:
49 print "adding " + encfile( path ) + " to sys.path"
50 sys.path.append( path )
44 path = unohelper.fileUrlToSystemPath( url+"/pythonpath.zip" );
45 if DEBUG == 1:
46 print("checking for existence of " + encfile( path ))
47 if 1 == os.access( encfile( path ), os.F_OK) and not path in sys.path:
48 if DEBUG == 1:
49 print("adding " + encfile( path ) + " to sys.path")
50 sys.path.append( path )
51
51
52 path = unohelper.fileUrlToSystemPath( url+"/pythonpath" );
53 if 1 == os.access( encfile( path ), os.F_OK) and not path in sys.path:
54 if DEBUG == 1:
55 print "adding " + encfile( path ) + " to sys.path"
56 sys.path.append( path )
52 path = unohelper.fileUrlToSystemPath( url+"/pythonpath" );
53 if 1 == os.access( encfile( path ), os.F_OK) and not path in sys.path:
54 if DEBUG == 1:
55 print("adding " + encfile( path ) + " to sys.path")
56 sys.path.append( path )
57
58def encfile(uni):
59 return uni.encode( sys.getfilesystemencoding())
60
61class Loader( XImplementationLoader, XServiceInfo, unohelper.Base ):
57
58def encfile(uni):
59 return uni.encode( sys.getfilesystemencoding())
60
61class Loader( XImplementationLoader, XServiceInfo, unohelper.Base ):
62 def __init__(self, ctx ):
63 if DEBUG:
64 print "pythonloader.Loader ctor"
65 self.ctx = ctx
62 def __init__(self, ctx ):
63 if DEBUG:
64 print("pythonloader.Loader ctor")
65 self.ctx = ctx
66
66
67 def getModuleFromUrl( self, url ):
68 if DEBUG:
69 print "pythonloader: interpreting url " +url
70 protocol, dependent = splitUrl( url )
71 if "vnd.sun.star.expand" == protocol:
72 exp = self.ctx.getValueByName( "/singletons/com.sun.star.util.theMacroExpander" )
73 url = exp.expandMacros(dependent)
74 protocol,dependent = splitUrl( url )
67 def getModuleFromUrl( self, url ):
68 if DEBUG:
69 print("pythonloader: interpreting url " +url)
70 protocol, dependent = splitUrl( url )
71 if "vnd.sun.star.expand" == protocol:
72 exp = self.ctx.getValueByName( "/singletons/com.sun.star.util.theMacroExpander" )
73 url = exp.expandMacros(dependent)
74 protocol,dependent = splitUrl( url )
75
75
76 if DEBUG:
77 print "pythonloader: after expansion " +protocol +":" + dependent
78
79 try:
80 if "file" == protocol:
81 # remove \..\ sequence, which may be useful e.g. in the build env
82 url = unohelper.absolutize( url, url )
76 if DEBUG:
77 print("pythonloader: after expansion " +protocol +":" + dependent)
83
78
84 # did we load the module already ?
85 mod = g_loadedComponents.get( url )
86 if not mod:
87 mod = imp.new_module("uno_component")
79 try:
80 if "file" == protocol:
81 # remove \..\ sequence, which may be useful e.g. in the build env
82 url = unohelper.absolutize( url, url )
88
83
89 # check for pythonpath.zip beside .py files
90 checkForPythonPathBesideComponent( url[0:url.rfind('/')] )
91
92 # read the file
93 filename = unohelper.fileUrlToSystemPath( url )
94 fileHandle = file( filename )
95 src = fileHandle.read().replace("\r","")
96 if not src.endswith( "\n" ):
97 src = src + "\n"
84 # did we load the module already ?
85 mod = g_loadedComponents.get( url )
86 if not mod:
87 mod = imp.new_module("uno_component")
98
88
99 # compile and execute the module
100 codeobject = compile( src, encfile(filename), "exec" )
101 exec codeobject in mod.__dict__
102 mod.__file__ = encfile(filename)
103 g_loadedComponents[url] = mod
104 return mod
105 elif "vnd.openoffice.pymodule" == protocol:
106 return __import__( dependent )
107 else:
108 raise RuntimeException( "PythonLoader: Unknown protocol " +
109 protocol + " in url " +url, self )
110 except ImportError, e:
111 raise RuntimeException( "Couldn't load "+url+ " for reason "+str(e), None)
112 return None
113
114 def activate( self, implementationName, dummy, locationUrl, regKey ):
115 if DEBUG:
116 print "pythonloader.Loader.activate"
89 # check for pythonpath.zip beside .py files
90 checkForPythonPathBesideComponent( url[0:url.rfind('/')] )
117
91
118 mod = self.getModuleFromUrl( locationUrl )
119 implHelper = mod.__dict__.get( "g_ImplementationHelper" , None )
120 if implHelper == None:
121 return mod.getComponentFactory( implementationName, self.ctx.ServiceManager, regKey )
122 else:
123 return implHelper.getComponentFactory( implementationName,regKey,self.ctx.ServiceManager)
124
125 def writeRegistryInfo( self, regKey, dummy, locationUrl ):
126 if DEBUG:
127 print "pythonloader.Loader.writeRegistryInfo"
128
129 mod = self.getModuleFromUrl( locationUrl )
130 implHelper = mod.__dict__.get( "g_ImplementationHelper" , None )
131 if implHelper == None:
132 return mod.writeRegistryInfo( self.ctx.ServiceManager, regKey )
133 else:
134 return implHelper.writeRegistryInfo( regKey, self.ctx.ServiceManager )
92 # read the file
93 filename = unohelper.fileUrlToSystemPath( url )
94 fileHandle = file( filename )
95 src = fileHandle.read().replace("\r","")
96 if not src.endswith( "\n" ):
97 src = src + "\n"
135
98
136 def getImplementationName( self ):
137 return g_implementationName
99 # compile and execute the module
100 codeobject = compile( src, encfile(filename), "exec" )
101 exec(codeobject, mod.__dict__)
102 mod.__file__ = encfile(filename)
103 g_loadedComponents[url] = mod
104 return mod
105 elif "vnd.openoffice.pymodule" == protocol:
106 return __import__( dependent )
107 else:
108 raise RuntimeException( "PythonLoader: Unknown protocol " +
109 protocol + " in url " +url, self )
110 except ImportError as e:
111 raise RuntimeException( "Couldn't load "+url+ " for reason "+str(e), None)
112 return None
138
113
139 def supportsService( self, ServiceName ):
140 return ServiceName in self.serviceNames
114 def activate( self, implementationName, dummy, locationUrl, regKey ):
115 if DEBUG:
116 print("pythonloader.Loader.activate")
141
117
142 def getSupportedServiceNames( self ):
143 return g_supportedServices
118 mod = self.getModuleFromUrl( locationUrl )
119 implHelper = mod.__dict__.get( "g_ImplementationHelper" , None )
120 if implHelper == None:
121 return mod.getComponentFactory( implementationName, self.ctx.ServiceManager, regKey )
122 else:
123 return implHelper.getComponentFactory( implementationName,regKey,self.ctx.ServiceManager)
144
124
125 def writeRegistryInfo( self, regKey, dummy, locationUrl ):
126 if DEBUG:
127 print("pythonloader.Loader.writeRegistryInfo")
145
128
129 mod = self.getModuleFromUrl( locationUrl )
130 implHelper = mod.__dict__.get( "g_ImplementationHelper" , None )
131 if implHelper == None:
132 return mod.writeRegistryInfo( self.ctx.ServiceManager, regKey )
133 else:
134 return implHelper.writeRegistryInfo( regKey, self.ctx.ServiceManager )
135
136 def getImplementationName( self ):
137 return g_implementationName
138
139 def supportsService( self, ServiceName ):
140 return ServiceName in self.serviceNames
141
142 def getSupportedServiceNames( self ):
143 return g_supportedServices