Browse Source

still working on it

David Rose 16 years ago
parent
commit
ae3d2aceb4

+ 2 - 2
direct/src/plugin/Sources.pp

@@ -1,9 +1,9 @@
 // This directory is still experimental.  Define HAVE_P3D_PLUGIN in
 // your Config.pp to build it.
-#define BUILD_DIRECTORY $[and $[HAVE_P3D_PLUGIN],$[HAVE_PYTHON],$[HAVE_TINYXML],$[HAVE_OPENSSL],$[HAVE_ZLIB]]
+#define BUILD_DIRECTORY $[and $[HAVE_P3D_PLUGIN],$[HAVE_PYTHON],$[HAVE_TINYXML],$[HAVE_OPENSSL],$[HAVE_ZLIB],$[HAVE_TAR]]
 
 #begin lib_target
-  #define USE_PACKAGES tinyxml openssl zlib
+  #define USE_PACKAGES tinyxml openssl zlib tar
   #define TARGET p3d_plugin
 
   #define COMBINED_SOURCES \

+ 1 - 2
direct/src/plugin/p3dFileDownload.cxx

@@ -44,8 +44,7 @@ set_filename(const string &filename) {
 ////////////////////////////////////////////////////////////////////
 bool P3DFileDownload::
 open_file() {
-  unlink(_filename.c_str());
-  _file.open(_filename.c_str(), ios::out | ios::trunc | ios::binary);
+  _file.open(_filename.c_str(), ios::out | ios::ate | ios::binary);
   if (!_file) {
     return false;
   }

+ 5 - 0
direct/src/plugin/p3dInstanceManager.cxx

@@ -73,8 +73,13 @@ P3DInstanceManager::
 ////////////////////////////////////////////////////////////////////
 bool P3DInstanceManager::
 initialize() {
+#ifdef _WIN32
   _root_dir = "c:/cygwin/home/drose/p3ddir";
   _download_url = "http://10.196.143.118/~drose/";
+#else
+  _root_dir = "/Users/drose/p3ddir";
+  _download_url = "http://orpheus.ddrose.com/~drose/";
+#endif
   return true;
 }
 

+ 11 - 0
direct/src/plugin/p3dPackage.I

@@ -36,6 +36,17 @@ get_failed() const {
   return _failed;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: P3DPackage::get_package_dir
+//       Access: Public
+//  Description: Returns the directory into which this package is
+//               installed.
+////////////////////////////////////////////////////////////////////
+inline const string &P3DPackage::
+get_package_dir() const {
+  return _package_dir;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: P3DPackage::decode_hexdigit
 //       Access: Private

+ 31 - 4
direct/src/plugin/p3dPackage.cxx

@@ -17,9 +17,11 @@
 
 #include "openssl/md5.h"
 #include "zlib.h"
+#include "libtar.h"
 
 #include <algorithm>
 #include <fstream>
+#include <fcntl.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -110,6 +112,7 @@ set_callback(Callback *callback) {
   if (_ready || _failed) {
     // Actually, we're already done.  Signal the callback immediately.
     callback->package_ready(this, _ready);
+    delete callback;
   } else {
     // Bootstrap still in progress.  Save the callback.
     _callbacks.push_back(callback);
@@ -360,6 +363,28 @@ void P3DPackage::
 extract_archive() {
   cerr << "extracting " << _uncompressed_archive._filename << "\n";
 
+  string source_pathname = _package_dir + "/" + _uncompressed_archive._filename;
+
+  TAR *tar = NULL;
+  int result = tar_open
+    (&tar, (char *)source_pathname.c_str(), NULL, O_RDONLY, 0666, TAR_VERBOSE);
+  if (result != 0) {
+    cerr << "Unable to open " << source_pathname << "\n";
+    report_done(false);
+    return;
+  }
+
+  while (th_read(tar) == 0) {
+    string basename = th_get_pathname(tar);
+    cerr << basename << "\n";
+    string pathname = _package_dir + "/" + basename;
+    tar_extract_file(tar, (char *)pathname.c_str());
+  }
+
+  tar_close(tar);
+
+  cerr << "done extracting\n";
+  report_done(true);
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -371,6 +396,7 @@ extract_archive() {
 ////////////////////////////////////////////////////////////////////
 void P3DPackage::
 report_done(bool success) {
+  cerr << "report_done(" << success << ")\n";
   if (success) {
     _ready = true;
     _failed = false;
@@ -384,6 +410,7 @@ report_done(bool success) {
   Callbacks::iterator ci;
   for (ci = orig_callbacks.begin(); ci != orig_callbacks.end(); ++ci) {
     (*ci)->package_ready(this, _ready);
+    delete (*ci);
   }
 
   // We shouldn't have added any more callbacks during the above loop.
@@ -400,6 +427,10 @@ start_download(P3DPackage::DownloadType dtype, const string &url,
                const string &pathname, bool allow_partial) {
   // Only one download should be active at a time
   assert(_active_download == NULL);
+  
+  if (!allow_partial) {
+    unlink(pathname.c_str());
+  }
 
   Download *download = new Download(this, dtype);
   download->set_url(url);
@@ -407,10 +438,6 @@ start_download(P3DPackage::DownloadType dtype, const string &url,
 
   // TODO: implement partial file re-download.
   allow_partial = false;
-  
-  if (!allow_partial) {
-    unlink(pathname.c_str());
-  }
 
   _active_download = download;
   _partial_download = false;

+ 1 - 0
direct/src/plugin/p3dPackage.h

@@ -42,6 +42,7 @@ public:
 
   inline bool get_ready() const;
   inline bool get_failed() const;
+  inline const string &get_package_dir() const;
 
   void set_callback(Callback *callback);
   void cancel_callback(Callback *callback);

+ 45 - 38
direct/src/plugin/p3dSession.cxx

@@ -34,18 +34,18 @@ P3DSession(P3DInstance *inst) {
   _session_key = inst->get_session_key();
   _python_version = inst->get_python_version();
 
-#ifdef _WIN32
-  _python_root_dir = "C:/p3drun";
-#else
-  _python_root_dir = "/Users/drose/p3drun";
-#endif
-
-  _python_state = PS_init;
+  _p3dpython_running = false;
   _started_read_thread = false;
   _read_thread_continue = false;
 
   _output_filename = inst->lookup_token("output_filename");
 
+  P3DInstanceManager *inst_mgr = P3DInstanceManager::get_global_ptr();
+
+  _panda3d = inst_mgr->get_package("panda3d", "dev");
+  _panda3d_callback = NULL;
+  _python_root_dir = _panda3d->get_package_dir();
+
   INIT_LOCK(_instances_lock);
 }
 
@@ -58,7 +58,12 @@ P3DSession(P3DInstance *inst) {
 ////////////////////////////////////////////////////////////////////
 P3DSession::
 ~P3DSession() {
-  if (_python_state == PS_running) {
+  if (_panda3d_callback != NULL) {
+    _panda3d->cancel_callback(_panda3d_callback);
+    delete _panda3d_callback;
+  }
+
+  if (_p3dpython_running) {
     // Tell the process we're going away.
     TiXmlDocument doc;
     TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "", "");
@@ -131,9 +136,16 @@ start_instance(P3DInstance *inst) {
 
   send_command(doc);
 
-  P3DInstanceManager *inst_mgr = P3DInstanceManager::get_global_ptr();
-  //  P3DPackage *panda = inst_mgr->get_package("panda3d", "dev");
-  start_p3dpython();
+  if (_panda3d->get_ready()) {
+    // If it's ready immediately, go ahead and start.
+    start_p3dpython();
+  } else {
+    // Otherwise, set a callback, so we'll know when it is ready.
+    if (_panda3d_callback != NULL) {
+      _panda3d_callback = new PackageCallback(this);
+      _panda3d->set_callback(_panda3d_callback);
+    }
+  }
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -177,7 +189,7 @@ terminate_instance(P3DInstance *inst) {
 ////////////////////////////////////////////////////////////////////
 void P3DSession::
 send_command(TiXmlDocument *command) {
-  if (_python_state == PS_running) {
+  if (_p3dpython_running) {
     // Python is running.  Send the command.
     _pipe_write << *command << flush;
     delete command;
@@ -187,31 +199,6 @@ send_command(TiXmlDocument *command) {
   }
 }
 
-////////////////////////////////////////////////////////////////////
-//     Function: P3DSession::download_p3dpython
-//       Access: Private
-//  Description: Starts the Python package downloading.  Once it is
-//               fully downloaded and unpacked, automatically calls
-//               start_p3dpython.
-////////////////////////////////////////////////////////////////////
-void P3DSession::
-download_p3dpython(P3DInstance *inst) {
-  /*
-  P3DFileDownload *download = new P3DFileDownload();
-  download->set_url("http://fewmet/~drose/p3drun.tgz");
-
-  string local_filename = "temp.tgz";
-  if (!download->set_filename(local_filename)) {
-    cerr << "Could not open " << local_filename << "\n";
-    return;
-  }
-
-  inst->start_download(download);
-  */
-
-  //  start_p3dpython();
-}
-
 ////////////////////////////////////////////////////////////////////
 //     Function: P3DSession::start_p3dpython
 //       Access: Private
@@ -281,7 +268,7 @@ start_p3dpython() {
     cerr << "Failed to create process.\n";
     return;
   }
-  _python_state = PS_running;
+  _p3dpython_running = true;
 
   cerr << "Created child process\n";
 
@@ -640,3 +627,23 @@ posix_create_process(const string &program, const string &start_dir,
   return child;
 }
 #endif  // _WIN32
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: P3DSession::PackageCallback::Constructor
+//       Access: Public
+//  Description: 
+////////////////////////////////////////////////////////////////////
+P3DSession::PackageCallback::
+PackageCallback(P3DSession *session) {
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: P3DSession::PackageCallback::package_ready
+//       Access: Public, Virtual
+//  Description: 
+////////////////////////////////////////////////////////////////////
+void P3DSession::PackageCallback::
+package_ready(P3DPackage *package, bool success) {
+}
+

+ 16 - 9
direct/src/plugin/p3dSession.h

@@ -17,6 +17,7 @@
 
 #include "p3d_plugin_common.h"
 #include "handleStream.h"
+#include "p3dPackage.h"
 
 #include <map>
 #include <vector>
@@ -46,7 +47,6 @@ public:
 
 private:
   void send_command(TiXmlDocument *command);
-  void download_p3dpython(P3DInstance *inst);
   void start_p3dpython();
 
   void spawn_read_thread();
@@ -76,14 +76,6 @@ private:
 #endif
 
 private:
-  enum PythonState {
-    PS_init,
-    PS_downloading,
-    PS_running,
-    PS_done,
-  };
-  PythonState _python_state;
-
   string _session_key;
   string _python_version;
   string _output_filename;
@@ -100,12 +92,25 @@ private:
   typedef vector<TiXmlDocument *> Commands;
   Commands _commands;
 
+  class PackageCallback : public P3DPackage::Callback {
+  public:
+    PackageCallback(P3DSession *session);
+    virtual void package_ready(P3DPackage *package, bool success);
+    
+  private:
+    P3DSession *_session;
+  };
+
+  P3DPackage *_panda3d;
+  PackageCallback *_panda3d_callback;
+
   // Members for communicating with the p3dpython child process.
 #ifdef _WIN32
   HANDLE _p3dpython_handle;
 #else
   int _p3dpython_pid;
 #endif
+  bool _p3dpython_running;
 
   // The remaining members are manipulated by or for the read thread.
   bool _started_read_thread;
@@ -118,6 +123,8 @@ private:
 #else
   pthread_t _read_thread;
 #endif
+
+  friend class PackageCallback;
 };
 
 #include "p3dSession.I"