more fixes

This commit is contained in:
David Rose 2009-08-19 00:01:50 +00:00
parent 3002e8b571
commit 3329c91dba
7 changed files with 86 additions and 20 deletions

View File

@ -264,6 +264,10 @@ read_xml(istream &in, ostream &logfile) {
// standard ASCII read.
TiXmlDocument *doc = new TiXmlDocument;
in >> *doc;
if (in.fail() || in.eof()) {
delete doc;
return NULL;
}
#endif
if (debug_xml_output) {

View File

@ -836,12 +836,17 @@ make_xml() {
////////////////////////////////////////////////////////////////////
void P3DInstance::
scan_app_desc_file(TiXmlDocument *doc) {
P3DInstanceManager *inst_mgr = P3DInstanceManager::get_global_ptr();
TiXmlElement *xpackage = doc->FirstChildElement("package");
if (xpackage == NULL) {
return;
}
P3DInstanceManager *inst_mgr = P3DInstanceManager::get_global_ptr();
const char *log_basename = xpackage->Attribute("log");
if (log_basename != NULL) {
_log_basename = log_basename;
}
TiXmlElement *xrequires = xpackage->FirstChildElement("requires");
while (xrequires != NULL) {

View File

@ -154,6 +154,7 @@ private:
int _instance_id;
string _session_key;
string _python_version;
string _log_basename;
// Not ref-counted: session is the parent.
P3DSession *_session;

View File

@ -520,7 +520,20 @@ delete_global_ptr() {
bool P3DInstanceManager::
copy_file(const string &from_filename, const string &to_filename) {
ifstream in(from_filename.c_str(), ios::in | ios::binary);
ofstream out(to_filename.c_str(), ios::out | ios::binary);
// Copy to a temporary file first, in case (a) the filenames
// actually refer to the same file, or (b) in case we have different
// processes writing to the same file, and (c) to prevent
// partially overwriting the file should something go wrong.
ostringstream strm;
strm << to_filename << ".t";
#ifdef _WIN32
strm << GetCurrentProcessId() << "_" << GetCurrentThreadId();
#else
strm << getpid();
#endif
string temp_filename = strm.str();
ofstream out(temp_filename.c_str(), ios::out | ios::binary);
static const size_t buffer_size = 4096;
char buffer[buffer_size];
@ -530,6 +543,7 @@ copy_file(const string &from_filename, const string &to_filename) {
while (count != 0) {
out.write(buffer, count);
if (out.fail()) {
unlink(temp_filename.c_str());
return false;
}
in.read(buffer, buffer_size);
@ -537,10 +551,16 @@ copy_file(const string &from_filename, const string &to_filename) {
}
if (!in.eof()) {
unlink(temp_filename.c_str());
return false;
}
return true;
if (rename(temp_filename.c_str(), to_filename.c_str()) == 0) {
return true;
}
unlink(temp_filename.c_str());
return false;
}
////////////////////////////////////////////////////////////////////

View File

@ -58,17 +58,6 @@ P3DSession(P3DInstance *inst) {
_started_read_thread = false;
_read_thread_continue = false;
#ifdef _WIN32
static const size_t buffer_size = 4096;
char buffer[buffer_size];
if (GetTempPath(buffer_size, buffer) != 0) {
_output_filename = buffer;
_output_filename += "panda3d.3.log";
}
#else
_output_filename = "/tmp/panda3d.3.log";
#endif // _WIN32
INIT_LOCK(_instances_lock);
INIT_THREAD(_read_thread);
}
@ -761,6 +750,44 @@ start_p3dpython(P3DInstance *inst) {
env += '\0';
}
// Get the log filename from the p3d_info.xml file.
string log_basename = inst->_log_basename;
// But we also let it be overridden by the tokens.
if (inst->get_fparams().has_token("log")) {
log_basename = inst->get_fparams().lookup_token("log");
}
// However, it is always written into the temp directory only; the
// user may not override the log file to put it anywhere else.
size_t slash = log_basename.rfind('/');
if (slash != string::npos) {
log_basename = log_basename.substr(slash + 1);
}
#ifdef _WIN32
slash = log_basename.rfind('\\');
if (slash != string::npos) {
log_basename = log_basename.substr(slash + 1);
}
#endif // _WIN32
if (!log_basename.empty()) {
#ifdef _WIN32
static const size_t buffer_size = 4096;
char buffer[buffer_size];
if (GetTempPath(buffer_size, buffer) != 0) {
_output_filename = buffer;
}
#else
_output_filename = "/tmp/";
#endif // _WIN32
_output_filename += log_basename;
// We always tack on the extension ".log", to make it even more
// difficult to overwrite a system file.
_output_filename += ".log";
}
nout << "Attempting to start python from " << p3dpython << "\n";
#ifdef _WIN32
_p3dpython_handle = win_create_process
@ -860,7 +887,7 @@ rt_thread_run() {
rt_handle_request(doc);
}
logfile << "Exiting rt_thread_run in " << this << "\n";
nout << "Exiting rt_thread_run in " << this << "\n";
}
////////////////////////////////////////////////////////////////////

View File

@ -192,7 +192,8 @@ class Packager:
raise PackagerError, message
if self.mainModule:
moduleName, newName = self.mainModule
self.freezer.addModule(moduleName, newName = newName)
if newName not in self.freezer.modules:
self.freezer.addModule(moduleName, newName = newName)
# Now all module files have been added. Exclude modules
# already imported in a required package, and not
@ -1911,7 +1912,7 @@ class Packager:
self.currentPackage.freezer.excludeModule(moduleName, forbid = forbid)
def mainModule(self, moduleName, newName = None):
def mainModule(self, moduleName, newName = None, filename = None):
""" Names the indicated module as the "main" module of the
application or exe. """
@ -1924,6 +1925,13 @@ class Packager:
if not newName:
newName = moduleName
if filename:
newFilename = Filename('/'.join(moduleName.split('.')))
newFilename.setExtension(filename.getExtension())
package.addFile(filename, newName = newFilename.cStr(),
deleteTemp = True, explicit = True, extract = True)
self.currentPackage.mainModule = (moduleName, newName)
def freeze(self, filename, compileToExe = False):

View File

@ -111,9 +111,10 @@ def makePackedApp(args):
main = os.path.split(main[0])[1]
main = Filename.fromOsSpecific(main)
main.setExtension('')
mainModule = Filename(main)
mainModule.setExtension('')
mainModule = main.cStr().replace('/', '.')
mainModule = mainModule.cStr().replace('/', '.')
packager.installDir = appDir
getModelPath().appendDirectory(root)
@ -124,7 +125,7 @@ def makePackedApp(args):
packager.require(requireName)
packager.dir(root)
packager.mainModule(mainModule)
packager.mainModule(mainModule, filename = main)
packager.endPackage(appBase, p3dApplication = True)