summaryrefslogtreecommitdiffstats
path: root/o3d/plugin/cross/stream_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/plugin/cross/stream_manager.h')
-rw-r--r--o3d/plugin/cross/stream_manager.h169
1 files changed, 169 insertions, 0 deletions
diff --git a/o3d/plugin/cross/stream_manager.h b/o3d/plugin/cross/stream_manager.h
new file mode 100644
index 0000000..f7c6723
--- /dev/null
+++ b/o3d/plugin/cross/stream_manager.h
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#ifndef EXPERIMENTAL_O3D_O3DPLUGIN_AUTOGEN_O3D_GLUE_STREAM_MANAGER_H_
+#define EXPERIMENTAL_O3D_O3DPLUGIN_AUTOGEN_O3D_GLUE_STREAM_MANAGER_H_
+
+#include <npapi.h>
+#include <string>
+#include <vector>
+#include "base/scoped_ptr.h"
+#include "core/cross/callback.h"
+#include "plugin/cross/download_stream.h"
+
+namespace glue {
+
+// Stream manager class, to help managing asynchronous loading of URLs into
+// files.
+class StreamManager {
+ public:
+ // TODO : get rid of these horrible callback objects
+ // and use an interface instead
+ typedef o3d::Callback1<DownloadStream*> NewStreamCallback;
+
+ typedef o3d::Callback4<DownloadStream*,
+ bool,
+ const std::string &,
+ const std::string &> FinishedCallback;
+
+ // The signature for these callbacks corresponds to the NPP_WriteReady()
+ // and NPP_Write() calls
+ typedef o3d::ResultCallback1<int32, DownloadStream*> WriteReadyCallback;
+
+ typedef o3d::ResultCallback4<int32,
+ DownloadStream*,
+ int32,
+ int32,
+ void*> WriteCallback;
+
+ explicit StreamManager(NPP plugin_instance);
+ ~StreamManager();
+
+ // Loads URL into a file, calls finished_callback->Run(success, filename)
+ // when done.
+ // returns a DownloadStream object (or NULL) if error
+ // filename is the name of the file where the contents of the URL are
+ // stored.
+ // LoadURL() takes ownership of new_stream_callback, write_ready_callback,
+ // write_callback, and callback: They will be deleted once the stream has
+ // completed.
+ DownloadStream *LoadURL(const std::string &url,
+ NewStreamCallback *new_stream_callback,
+ WriteReadyCallback *write_ready_callback,
+ WriteCallback *write_callback,
+ FinishedCallback *callback,
+ uint16 stream_type);
+
+ // Manages the NPP_NewStream callback.
+ bool NewStream(NPStream *stream, uint16 *stype);
+ // Manages the NPP_DestroyStream callback.
+ bool DestroyStream(NPStream *stream, NPReason reason);
+ // Manages the NPP_StreamAsFile callback.
+ bool SetStreamFile(NPStream *stream, const char *filename);
+ // Manages the NPP_URLNotify callback.
+ bool URLNotify(const char *url, NPReason reason, void *notifyData);
+
+ // Continuous streaming support
+ int32 WriteReady(NPStream *stream);
+ int32 Write(NPStream *stream, int32 offset, int32 len, void *buffer);
+
+ private:
+ class NPDownloadStream : public DownloadStream {
+ public:
+ NPDownloadStream(const std::string &url,
+ const std::string &file,
+ uint16 stream_type,
+ NPP plugin_instance,
+ NewStreamCallback *new_stream_callback,
+ WriteReadyCallback *write_ready_callback,
+ WriteCallback *write_callback,
+ FinishedCallback *callback)
+ : url_(url),
+ file_(file),
+ stream_type_(stream_type),
+ plugin_instance_(plugin_instance),
+ stream_(NULL),
+ new_stream_callback_(new_stream_callback),
+ write_ready_callback_(write_ready_callback),
+ write_callback_(write_callback),
+ finished_callback_(callback),
+ bytes_received_(0),
+ state_(STREAM_REQUESTED) {}
+
+ virtual ~NPDownloadStream();
+
+ // DownloadStream interface
+ virtual std::string GetURL();
+ virtual std::string GetCachedFile();
+ virtual State GetState();
+ virtual int GetReceivedByteCount();
+ virtual size_t GetStreamLength();
+ virtual void Cancel();
+
+ // NPAPI stream stuff
+ NPStream *GetStream() const { return stream_; }
+ bool NewStream(NPStream *new_stream, uint16 *stype);
+ bool DestroyStream(NPReason reason);
+ bool SetStreamFile(const char *filename);
+ bool URLNotify(NPReason reason);
+ int32 WriteReady();
+ int32 Write(int32 offset, int32 len, void *buffer);
+
+
+ private:
+ std::string url_;
+ std::string file_;
+
+ // stream type (as file or continuous stream)
+ uint16 stream_type_;
+
+ NPP plugin_instance_;
+ NPStream *stream_;
+
+ // callbacks
+ scoped_ptr<NewStreamCallback> new_stream_callback_;
+ scoped_ptr<WriteReadyCallback> write_ready_callback_;
+ scoped_ptr<WriteCallback> write_callback_;
+ scoped_ptr<FinishedCallback> finished_callback_;
+
+ int bytes_received_;
+ State state_;
+ };
+ bool CheckEntry(NPDownloadStream *entry);
+
+ NPP plugin_instance_;
+ std::vector<NPDownloadStream *> entries_;
+};
+
+} // namespace glue
+
+#endif // EXPERIMENTAL_O3D_O3DPLUGIN_AUTOGEN_O3D_GLUE_STREAM_MANAGER_H_