--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanamdw/codescanner/pyinstaller/MakeComServer.py Thu Feb 18 12:29:02 2010 +0530
@@ -0,0 +1,166 @@
+# Copyright (C) 2005, Giovanni Bajo
+# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+import string, os, sys, win32api, Makespec
+
+tmplt = """\
+import sys
+import string
+import os
+import pythoncom
+pythoncom.frozen = 1
+inprocess = getattr(sys, 'frozen', None)
+
+%(modules)s
+klasses = (%(klasses)s,)
+
+def DllRegisterServer():
+ import win32com.server.register
+ win32com.server.register.RegisterClasses(*klasses)
+ return 0
+
+def DllUnregisterServer():
+ import win32com.server.register
+ win32com.server.register.UnregisterClasses(*klasses)
+ return 0
+
+if sys.frozen!="dll":
+ import win32com.server.localserver
+ for i in range(1, len(sys.argv)):
+ arg = string.lower(sys.argv[i])
+ if string.find(arg, "/reg") > -1 or string.find(arg, "--reg") > -1:
+ DllRegisterServer()
+ break
+
+ if string.find(arg, "/unreg") > -1 or string.find(arg, "--unreg") > -1:
+ DllUnregisterServer()
+ break
+
+ # MS seems to like /automate to run the class factories.
+ if string.find(arg, "/automate") > -1:
+ clsids = []
+ for k in klasses:
+ clsids.append(k._reg_clsid_)
+ win32com.server.localserver.serve(clsids)
+ break
+ else:
+ # You could do something else useful here.
+ import win32api
+ win32api.MessageBox(0, "This program hosts a COM Object and\\r\\nis started automatically", "COM Object")
+"""
+
+def create(scripts, debug, verbosity, workdir, ascii=0):
+ infos = [] # (path, module, klasses)
+ for script in scripts:
+ infos.append(analscriptname(script))
+ if not os.path.exists(workdir):
+ os.makedirs(workdir)
+ outfnm = 'drive%s.py' % infos[0][1]
+ outfnm = os.path.join(workdir, outfnm)
+ outf = open(outfnm, 'w')
+ klassspecs = []
+ modimports = []
+ flags = 'debug=%s, quiet=%s' % (debug, verbosity==0)
+ paths = []
+ for path, module, klasses in infos:
+ if path:
+ paths.append(path)
+ modimports.append("import %s" % (module,))
+ for klass in klasses:
+ klassspecs.append("%s.%s" % (module, klass))
+ for i in range(len(paths)):
+ path = paths[i]
+ paths[i] = win32api.GetShortPathName(os.path.normpath(path))
+ modimports = string.join(modimports, '\n')
+ klassspecs = string.join(klassspecs, ', ')
+ d = { 'modules':modimports,
+ 'klasses':klassspecs,
+ }
+ outf.write( tmplt % d )
+ outf.close()
+ print "**********************************"
+ print "Driver script %s created" % outfnm
+ specfnm = Makespec.main([outfnm], console=debug, debug=debug,
+ workdir=workdir, pathex=paths, comserver=1, ascii=ascii)
+ print "Spec file %s created" % specfnm
+
+def analscriptname(script):
+ # return (path, module, klasses)
+ path, basename = os.path.split(script)
+ module = os.path.splitext(basename)[0]
+ while ispkgdir(path):
+ path, basename = os.path.split(path)
+ module = '%s.%s' % (basename, module)
+ try:
+ __import__(module)
+ except ImportError:
+ oldpath = sys.path[:]
+ sys.path.insert(0, path)
+ try:
+ __import__(module)
+ finally:
+ sys.path = oldpath
+ else:
+ path = None
+ m = sys.modules[module]
+ klasses = []
+ for nm, thing in m.__dict__.items():
+ if hasattr(thing, '_reg_clsid_'):
+ klasses.append(nm)
+ return (path, module, klasses)
+
+def ispkgdir(path):
+ try:
+ open(os.path.join(path, '__init__.py'), 'r')
+ except IOError:
+ try:
+ open(os.path.join(path, '__init__.pyc'), 'rb')
+ except IOError:
+ return 0
+ return 1
+
+usage = """\
+Usage: python %s [options] <scriptname>.py [<scriptname>.py ...]
+ --debug -> use debug console build and register COM servers with debug
+ --verbose -> use verbose flag in COM server registration
+ --out dir -> generate script and spec file in dir
+
+The next step is to run Build.py against the generated spec file.
+See doc/Tutorial.html for details.
+"""
+
+if __name__ == '__main__':
+ #scripts, debug, verbosity, workdir
+ debug = verbosity = ascii = 0
+ workdir = '.'
+ import getopt
+ opts, args = getopt.getopt(sys.argv[1:], '', ['debug', 'verbose', 'ascii', 'out='])
+ for opt, val in opts:
+ if opt == '--debug':
+ debug = 1
+ elif opt == '--verbose':
+ verbosity = 1
+ elif opt == '--out':
+ workdir = val
+ elif opt == '--ascii':
+ ascii = 1
+ else:
+ print usage % sys.argv[0]
+ sys.exit(1)
+ if not args:
+ print usage % sys.argv[0]
+ else:
+ create(args, debug, verbosity, workdir, ascii)