From e7daad7dce9ea1bd8cc00443fe2d099fd2a170c6 Mon Sep 17 00:00:00 2001 From: David Rose Date: Sat, 15 Aug 2009 18:59:53 +0000 Subject: [PATCH] some fixes --- direct/src/plugin/p3dInstance.cxx | 2 ++ direct/src/plugin/p3dPackage.cxx | 24 ++++++++++++++---- direct/src/plugin_standalone/panda3d.cxx | 18 +++++++++++--- direct/src/showutil/FreezeTool.py | 31 +++++++++++++++++++++++- direct/src/showutil/Packager.py | 9 ++++++- direct/src/showutil/runp3d.py | 4 +-- 6 files changed, 75 insertions(+), 13 deletions(-) diff --git a/direct/src/plugin/p3dInstance.cxx b/direct/src/plugin/p3dInstance.cxx index 26c5e0583f..b186c4932a 100644 --- a/direct/src/plugin/p3dInstance.cxx +++ b/direct/src/plugin/p3dInstance.cxx @@ -1236,6 +1236,8 @@ report_package_progress(P3DPackage *package, double progress) { //////////////////////////////////////////////////////////////////// void P3DInstance:: report_package_done(P3DPackage *package, bool success) { + nout << "Done downloading " << package->get_package_name() + << ": success = " << success << "\n"; if (success) { report_package_progress(package, 1.0); start_next_download(); diff --git a/direct/src/plugin/p3dPackage.cxx b/direct/src/plugin/p3dPackage.cxx index 597bc0aee6..984558471d 100755 --- a/direct/src/plugin/p3dPackage.cxx +++ b/direct/src/plugin/p3dPackage.cxx @@ -231,7 +231,7 @@ download_desc_file() { // Attempt to check the desc file for freshness. If it already // exists, and is consistent with the server contents file, we don't // need to re-download it. - string root_dir = inst_mgr->get_root_dir(); + string root_dir = inst_mgr->get_root_dir() + "/packages"; FileSpec desc_file; if (!inst_mgr->get_package_desc_file(desc_file, _package_name, _package_version)) { nout << "Couldn't find package " << _package_fullname @@ -242,7 +242,7 @@ download_desc_file() { << desc_file.get_pathname(root_dir) << " instead of " << _desc_file_pathname << "\n"; - } else if (!desc_file.quick_verify(root_dir)) { + } else if (!desc_file.full_verify(root_dir)) { nout << _desc_file_pathname << " is stale.\n"; } else { @@ -337,6 +337,7 @@ got_desc_file(TiXmlDocument *doc, bool freshly_downloaded) { Extracts::iterator ci; for (ci = _extracts.begin(); ci != _extracts.end(); ++ci) { if (!(*ci).quick_verify(_package_dir)) { + nout << "File is incorrect: " << (*ci).get_filename() << "\n"; all_extracts_ok = false; break; } @@ -664,9 +665,22 @@ report_done(bool success) { _failed = true; } - Instances::iterator ii; - for (ii = _instances.begin(); ii != _instances.end(); ++ii) { - (*ii)->report_package_done(this, success); + if (!_allow_data_download && success) { + // If we haven't been authorized to start downloading yet, just + // report that we're ready to start, but that we don't have to + // download anything. + _download_size = 0; + Instances::iterator ii; + for (ii = _instances.begin(); ii != _instances.end(); ++ii) { + (*ii)->report_package_info_ready(this); + } + + } else { + // Otherwise, we can report that we're fully downloaded. + Instances::iterator ii; + for (ii = _instances.begin(); ii != _instances.end(); ++ii) { + (*ii)->report_package_done(this, success); + } } } diff --git a/direct/src/plugin_standalone/panda3d.cxx b/direct/src/plugin_standalone/panda3d.cxx index 975325187f..cffcf0682f 100644 --- a/direct/src/plugin_standalone/panda3d.cxx +++ b/direct/src/plugin_standalone/panda3d.cxx @@ -325,12 +325,22 @@ get_plugin(const string &download_url, const string &this_platform, bool force_d HTTPClient *http = HTTPClient::get_global_ptr(); PT(HTTPChannel) channel = http->get_document(url); - contents_filename.make_dir(); - if (!channel->download_to_file(contents_filename)) { + + // First, download it to a temporary file. + Filename tempfile = Filename::temporary("", "p3d_"); + if (!channel->download_to_file(tempfile)) { cerr << "Unable to download " << url << "\n"; - return false; + tempfile.unlink(); + + // Couldn't download, but fall through and try to read the + // contents.xml file anyway. Maybe it's good enough. + } else { + // Successfully downloaded; move the temporary file into place. + contents_filename.make_dir(); + contents_filename.unlink(); + tempfile.rename_to(contents_filename); } - + return read_contents_file(contents_filename, download_url, this_platform); } diff --git a/direct/src/showutil/FreezeTool.py b/direct/src/showutil/FreezeTool.py index d3026c5eea..1606e60c4c 100644 --- a/direct/src/showutil/FreezeTool.py +++ b/direct/src/showutil/FreezeTool.py @@ -11,6 +11,7 @@ from distutils.sysconfig import PREFIX, get_python_inc, get_python_version import direct from pandac.PandaModules import * +from pandac.extension_native_helpers import dll_suffix, dll_ext # Check to see if we are running python_d, which implies we have a # debug build, and we have to build the module with debug options. @@ -654,7 +655,7 @@ class Freezer: excludes.append(mdef.moduleName) excludeDict[mdef.moduleName] = token - self.mf = modulefinder.ModuleFinder(excludes = excludes) + self.mf = PandaModuleFinder(excludes = excludes) # Attempt to import the explicit modules into the modulefinder. for mdef in includes: @@ -1148,3 +1149,31 @@ class Freezer: return False return True + +class PandaModuleFinder(modulefinder.ModuleFinder): + """ We subclass ModuleFinder here, to add functionality for + finding the libpandaexpress etc. modules that interrogate + produces. """ + + def find_module(self, name, path, parent=None): + try: + return modulefinder.ModuleFinder.find_module(self, name, path, parent = parent) + except ImportError: + # It wasn't found. Maybe it's one of ours. + if path: + # Only if we're not looking on a particular path, + # though. + raise + + # This loop is roughly lifted from + # extension_native_helpers.Dtool_PreloadDLL(). + filename = name + dll_suffix + dll_ext + for dir in sys.path + [sys.prefix]: + lib = os.path.join(dir, filename) + if os.path.exists(lib): + file = open(lib, 'rb') + return (file, lib, (dll_ext, 'rb', 3)) + + message = "DLL loader cannot find %s." % (name) + raise ImportError, message + diff --git a/direct/src/showutil/Packager.py b/direct/src/showutil/Packager.py index 61644746f5..43b4a34b58 100644 --- a/direct/src/showutil/Packager.py +++ b/direct/src/showutil/Packager.py @@ -325,6 +325,13 @@ class Packager: # Don't bother, it's already here. return + if file.newName in self.targetFilenames: + # Another file is already in the same place. + file2 = self.targetFilenames[file.newName] + self.packager.notify.warning( + "%s is shadowing %s" % (file2.filename, file.filename)) + return + self.sourceFilenames[file.filename] = file if not file.filename.exists(): @@ -1035,7 +1042,7 @@ class Packager: 'dciman32.dll', 'comdlg32.dll', 'comctl32.dll', 'ole32.dll', 'oleaut32.dll', 'gdiplus.dll', 'winmm.dll', - 'libSystem.B.dylib', 'libmathCommon.A.dylib', 'libmx.A.dylib', + 'libsystem.b.dylib', 'libmathcommon.a.dylib', 'libmx.a.dylib', 'libstdc++.6.dylib', ] diff --git a/direct/src/showutil/runp3d.py b/direct/src/showutil/runp3d.py index d92050c927..bacedbba05 100755 --- a/direct/src/showutil/runp3d.py +++ b/direct/src/showutil/runp3d.py @@ -22,7 +22,7 @@ See pack3d.py for a script that generates these p3d files. import sys from direct.showbase import VFSImporter from direct.showbase.DirectObject import DirectObject -from pandac.PandaModules import VirtualFileSystem, Filename, Multifile, loadPrcFileData, unloadPrcFile, getModelPath, HTTPClient, Thread, WindowProperties, readXmlStream +from pandac.PandaModules import VirtualFileSystem, Filename, Multifile, loadPrcFileData, unloadPrcFile, getModelPath, HTTPClient, Thread, WindowProperties, readXmlStream, ExecutionEnvironment from direct.stdpy import file from direct.task.TaskManagerGlobal import taskMgr from direct.showbase.MessengerGlobal import messenger @@ -291,7 +291,7 @@ class AppRunner(DirectObject): if self.p3dPackage: fullDiskAccess = self.p3dPackage.Attribute('full_disk_access') try: - self.fullDiskAccess = int(fullDiskAccess) + self.fullDiskAccess = int(fullDiskAccess or '') except ValueError: pass