From 83938771a133aa01c56ba9d2ded2bf120356ca93 Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 12 Jun 2009 02:11:26 +0000 Subject: [PATCH] new files --- direct/src/plugin/p3dDownload.I | 85 ++++++++++++++++++ direct/src/plugin/p3dDownload.cxx | 123 ++++++++++++++++++++++++++ direct/src/plugin/p3dDownload.h | 71 +++++++++++++++ direct/src/plugin/p3dFileDownload.I | 24 +++++ direct/src/plugin/p3dFileDownload.cxx | 85 ++++++++++++++++++ direct/src/plugin/p3dFileDownload.h | 50 +++++++++++ 6 files changed, 438 insertions(+) create mode 100755 direct/src/plugin/p3dDownload.I create mode 100755 direct/src/plugin/p3dDownload.cxx create mode 100755 direct/src/plugin/p3dDownload.h create mode 100755 direct/src/plugin/p3dFileDownload.I create mode 100755 direct/src/plugin/p3dFileDownload.cxx create mode 100755 direct/src/plugin/p3dFileDownload.h diff --git a/direct/src/plugin/p3dDownload.I b/direct/src/plugin/p3dDownload.I new file mode 100755 index 0000000000..994e7788e0 --- /dev/null +++ b/direct/src/plugin/p3dDownload.I @@ -0,0 +1,85 @@ +// Filename: p3dDownload.I +// Created by: drose (11Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::get_url +// Access: Public +// Description: Returns the URL that we are querying. +//////////////////////////////////////////////////////////////////// +const string &P3DDownload:: +get_url() const { + return _url; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::get_download_progress +// Access: Public +// Description: Returns an indication of the progress through the +// download file, 0.0 to 1.0. Returns -1 if the size of +// the file is not known. +//////////////////////////////////////////////////////////////////// +inline double P3DDownload:: +get_download_progress() const { + if (_total_expected_data == 0) { + return -1.0; + } + + return (double)_total_data / (double)_total_expected_data; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::get_download_finished +// Access: Public +// Description: Returns true if the download has finished, either +// successfully or otherwise, or false if it is still in +// progress. +//////////////////////////////////////////////////////////////////// +inline bool P3DDownload:: +get_download_finished() const { + return _status != P3D_RC_in_progress; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::get_download_success +// Access: Public +// Description: Returns true if the download has finished +// successfully, or false if it is still in progress or +// if it has failed. +//////////////////////////////////////////////////////////////////// +inline bool P3DDownload:: +get_download_success() const { + return _status == P3D_RC_done; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::set_download_id +// Access: Public +// Description: Called only by P3DInstance to set a unique ID for +// this particular download object. +//////////////////////////////////////////////////////////////////// +inline void P3DDownload:: +set_download_id(int download_id) { + _download_id = download_id; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::get_download_id +// Access: Public +// Description: Returns the unique ID set by the P3DInstance. +//////////////////////////////////////////////////////////////////// +inline int P3DDownload:: +get_download_id() const { + return _download_id; +} diff --git a/direct/src/plugin/p3dDownload.cxx b/direct/src/plugin/p3dDownload.cxx new file mode 100755 index 0000000000..e256063ab8 --- /dev/null +++ b/direct/src/plugin/p3dDownload.cxx @@ -0,0 +1,123 @@ +// Filename: p3dDownload.cxx +// Created by: drose (11Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "p3dDownload.h" + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +P3DDownload:: +P3DDownload() { + _status = P3D_RC_in_progress; + _http_status_code = 0; + _total_data = 0; + _total_expected_data = 0; + + _download_id = 0; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::Destructor +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +P3DDownload:: +~P3DDownload() { +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::set_url +// Access: Public +// Description: Supplies the source URL for the download. +//////////////////////////////////////////////////////////////////// +void P3DDownload:: +set_url(const string &url) { + _url = url; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::feed_url_stream +// Access: Public +// Description: Called by P3DInstance as more data arrives from the +// host. +//////////////////////////////////////////////////////////////////// +bool P3DDownload:: +feed_url_stream(P3D_result_code result_code, + int http_status_code, + size_t total_expected_data, + const unsigned char *this_data, + size_t this_data_size) { + _status = result_code; + _http_status_code = http_status_code; + + if (this_data_size != 0) { + if (!receive_data(this_data, this_data_size)) { + // Failure writing to disk. + _status = P3D_RC_generic_error; + download_finished(false); + return false; + } + + _total_data += this_data_size; + } + + _total_expected_data = max(total_expected_data, _total_data); + + download_progress(); + + if (_status != P3D_RC_in_progress) { + // We're done. + download_finished(get_download_success()); + } + + return true; +} + + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::receive_data +// Access: Protected, Virtual +// Description: Called as new data is downloaded. Returns true on +// success, false on failure. +//////////////////////////////////////////////////////////////////// +bool P3DDownload:: +receive_data(const unsigned char *this_data, size_t this_data_size) { + return false; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::download_progress +// Access: Protected, Virtual +// Description: Intended to be overloaded to generate an occasional +// callback as new data comes in. +//////////////////////////////////////////////////////////////////// +void P3DDownload:: +download_progress() { + cerr << "Downloading " << get_url() << ": " + << int(get_download_progress() * 1000.0) / 10.0 << "\n"; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::download_finished +// Access: Protected, Virtual +// Description: Intended to be overloaded to generate a callback +// when the download finishes, either successfully or +// otherwise. The bool parameter is true if the +// download was successful. +//////////////////////////////////////////////////////////////////// +void P3DDownload:: +download_finished(bool success) { +} diff --git a/direct/src/plugin/p3dDownload.h b/direct/src/plugin/p3dDownload.h new file mode 100755 index 0000000000..662cdf2fd9 --- /dev/null +++ b/direct/src/plugin/p3dDownload.h @@ -0,0 +1,71 @@ +// Filename: p3dDownload.h +// Created by: drose (11Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef P3DDOWNLOAD_H +#define P3DDOWNLOAD_H + +#include "p3d_plugin_common.h" + +//////////////////////////////////////////////////////////////////// +// Class : P3DDownload +// Description : This represents a request to download a single file +// from a URL, with no particular destination. It is +// intended to be used as an abstract base class; to use +// it, subclass it and redefine the appropriate callback +// methods. +//////////////////////////////////////////////////////////////////// +class P3DDownload { +public: + P3DDownload(); + virtual ~P3DDownload(); + + void set_url(const string &url); + inline const string &get_url() const; + + inline double get_download_progress() const; + inline bool get_download_finished() const; + inline bool get_download_success() const; + +public: + // These are intended to be called only by P3DInstance. + inline void set_download_id(int download_id); + inline int get_download_id() const; + + bool feed_url_stream(P3D_result_code result_code, + int http_status_code, + size_t total_expected_data, + const unsigned char *this_data, + size_t this_data_size); + +protected: + virtual bool receive_data(const unsigned char *this_data, + size_t this_data_size); + virtual void download_progress(); + virtual void download_finished(bool success); + +protected: + P3D_result_code _status; + int _http_status_code; + + size_t _total_data; + size_t _total_expected_data; + +private: + int _download_id; + string _url; +}; + +#include "p3dDownload.I" + +#endif diff --git a/direct/src/plugin/p3dFileDownload.I b/direct/src/plugin/p3dFileDownload.I new file mode 100755 index 0000000000..aa6c0a7dbf --- /dev/null +++ b/direct/src/plugin/p3dFileDownload.I @@ -0,0 +1,24 @@ +// Filename: p3dFileDownload.I +// Created by: drose (11Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////// +// Function: P3DFileDownload::get_filename +// Access: Public +// Description: Returns the filename that we are downloading into. +//////////////////////////////////////////////////////////////////// +const string &P3DFileDownload:: +get_filename() const { + return _filename; +} diff --git a/direct/src/plugin/p3dFileDownload.cxx b/direct/src/plugin/p3dFileDownload.cxx new file mode 100755 index 0000000000..bcfcb5bd72 --- /dev/null +++ b/direct/src/plugin/p3dFileDownload.cxx @@ -0,0 +1,85 @@ +// Filename: p3dFileDownload.cxx +// Created by: drose (11Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "p3dFileDownload.h" + +//////////////////////////////////////////////////////////////////// +// Function: P3DFileDownload::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +P3DFileDownload:: +P3DFileDownload() { +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DFileDownload::set_filename +// Access: Public +// Description: Supplies the target local filename for the download. +// Returns true on success, false on failure. +//////////////////////////////////////////////////////////////////// +bool P3DFileDownload:: +set_filename(const string &filename) { + _filename = filename; + + return open_file(); +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DFileDownload::open_file +// Access: Protected, Virtual +// Description: Opens the local file for receiving the download. +// Returns true on success, false on failure. +//////////////////////////////////////////////////////////////////// +bool P3DFileDownload:: +open_file() { + unlink(_filename.c_str()); + _file.open(_filename.c_str(), ios::out | ios::trunc | ios::binary); + if (!_file) { + return false; + } + + return true; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DFileDownload::receive_data +// Access: Protected, Virtual +// Description: Called as new data is downloaded. Returns true on +// success, false on failure. +//////////////////////////////////////////////////////////////////// +bool P3DFileDownload:: +receive_data(const unsigned char *this_data, size_t this_data_size) { + _file.write((const char *)this_data, this_data_size); + + if (!_file) { + return false; + } + + return true; +} + +//////////////////////////////////////////////////////////////////// +// Function: P3DDownload::download_finished +// Access: Protected, Virtual +// Description: Intended to be overloaded to generate a callback +// when the download finishes, either successfully or +// otherwise. The bool parameter is true if the +// download was successful. +//////////////////////////////////////////////////////////////////// +void P3DFileDownload:: +download_finished(bool success) { + P3DDownload::download_finished(success); + _file.close(); +} diff --git a/direct/src/plugin/p3dFileDownload.h b/direct/src/plugin/p3dFileDownload.h new file mode 100755 index 0000000000..e75161487f --- /dev/null +++ b/direct/src/plugin/p3dFileDownload.h @@ -0,0 +1,50 @@ +// Filename: p3dFileDownload.h +// Created by: drose (11Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef P3DFILEDOWNLOAD_H +#define P3DFILEDOWNLOAD_H + +#include "p3d_plugin_common.h" +#include "p3DDownload.h" + +#include + +//////////////////////////////////////////////////////////////////// +// Class : P3DFileDownload +// Description : This is a specialization on P3DDownload that +// specifically writes a disk file. +//////////////////////////////////////////////////////////////////// +class P3DFileDownload : public P3DDownload { +public: + P3DFileDownload(); + + bool set_filename(const string &filename); + inline const string &get_filename() const; + +protected: + virtual bool open_file(); + virtual bool receive_data(const unsigned char *this_data, + size_t this_data_size); + virtual void download_finished(bool success); + +protected: + ofstream _file; + +private: + string _filename; +}; + +#include "p3dFileDownload.I" + +#endif