From 0843a791948fd91f5770dc932147edd2c4e80503 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 11 Nov 2008 03:02:01 +0000 Subject: [PATCH] *** empty log message *** --- direct/src/showbase/StartMF.py | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 direct/src/showbase/StartMF.py diff --git a/direct/src/showbase/StartMF.py b/direct/src/showbase/StartMF.py new file mode 100644 index 0000000000..930d38a9fa --- /dev/null +++ b/direct/src/showbase/StartMF.py @@ -0,0 +1,82 @@ +""" This module can serve as a startup script to play a Panda +application packed within a .mf file. Run via: + +python StartMF.py app.mf + +This is currently experimental, but the intent is to work towards a +prepackaged Panda distributable, designed to run applications exactly +like this. + +""" + +import sys +from direct.showbase import VFSImporter +from pandac.PandaModules import VirtualFileSystem, Filename, Multifile, ConfigPageManager, getModelPath +from direct.stdpy.file import file, open +import __builtin__ + +MultifileRoot = '/mf' + +def runPackedApp(args): + if not args: + print "No Panda app specified. Use:" + print "python StartMF.py app.mf" + sys.exit(1) + + vfs = VirtualFileSystem.getGlobalPtr() + + fname = Filename.fromOsSpecific(args[0]) + if not vfs.exists(fname): + print "No such file: %s" % (args[0]) + sys.exit(1) + + mf = Multifile() + if not mf.openRead(fname): + print "Not a Panda Multifile: %s" % (args[0]) + sys.exit(1) + + # Clear *all* the mount points, including "/", so that we no + # longer access the disk directly. + vfs.unmountAll() + + # Mount the Multifile under /mf, by convention, and make that our + # "current directory". + vfs.mount(mf, MultifileRoot, vfs.MFReadOnly) + vfs.chdir(MultifileRoot) + + # Make sure the directories on our standard Python path are mounted + # read-only, so we can still load Python. + for dirname in sys.path: + vfs.mount(dirname, dirname, vfs.MFReadOnly) + + # Also mount some standard directories read-write (temporary and + # app-data directories). + tdir = Filename.temporary('', '') + for dirname in set([ tdir.getDirname(), + Filename.getTempDirectory().cStr(), + Filename.getUserAppdataDirectory().cStr(), + Filename.getCommonAppdataDirectory().cStr() ]): + vfs.mount(dirname, dirname, 0) + + # Now set up Python to import this stuff. + VFSImporter.register() + sys.path = [ MultifileRoot ] + sys.path + + # Put our root directory on the model-path and prc-path, too. + getModelPath().prependDirectory(MultifileRoot) + + cpMgr = ConfigPageManager.getGlobalPtr() + cpMgr.getSearchPath().prependDirectory(MultifileRoot) + cpMgr.reloadImplicitPages() + + # Replace the builtin open and file symbols so code will get our + # versions by default, which can open and read files out of the + # multifile. + __builtin__.file = file + __builtin__.open = open + + import main + +if __name__ == '__main__': + runPackedApp(sys.argv[1:]) +