/* * 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 #include #include #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 NewStreamCallback; typedef o3d::Callback4 FinishedCallback; // The signature for these callbacks corresponds to the NPP_WriteReady() // and NPP_Write() calls typedef o3d::ResultCallback1 WriteReadyCallback; typedef o3d::ResultCallback4 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 new_stream_callback_; scoped_ptr write_ready_callback_; scoped_ptr write_callback_; scoped_ptr finished_callback_; int bytes_received_; State state_; }; bool CheckEntry(NPDownloadStream *entry); NPP plugin_instance_; std::vector entries_; }; } // namespace glue #endif // EXPERIMENTAL_O3D_O3DPLUGIN_AUTOGEN_O3D_GLUE_STREAM_MANAGER_H_