1 /* 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2008 Collabora, Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef PluginStream_h 28 #define PluginStream_h 29 30 #include "FileSystem.h" 31 #include "KURL.h" 32 #include "NetscapePlugInStreamLoader.h" 33 #include "PlatformString.h" 34 #include "PluginQuirkSet.h" 35 #include "ResourceRequest.h" 36 #include "ResourceResponse.h" 37 #include "Timer.h" 38 #include "npruntime_internal.h" 39 #include <wtf/HashMap.h> 40 #include <wtf/OwnPtr.h> 41 #include <wtf/RefCounted.h> 42 #include <wtf/Vector.h> 43 #include <wtf/text/CString.h> 44 #include <wtf/text/StringHash.h> 45 46 namespace WebCore { 47 class Frame; 48 class PluginStream; 49 50 enum PluginStreamState { StreamBeforeStarted, StreamStarted, StreamStopped }; 51 52 class PluginStreamClient { 53 public: ~PluginStreamClient()54 virtual ~PluginStreamClient() {} streamDidFinishLoading(PluginStream *)55 virtual void streamDidFinishLoading(PluginStream*) {} 56 }; 57 58 class PluginStream : public RefCounted<PluginStream>, private NetscapePlugInStreamLoaderClient { 59 public: create(PluginStreamClient * client,Frame * frame,const ResourceRequest & request,bool sendNotification,void * notifyData,const NPPluginFuncs * functions,NPP instance,const PluginQuirkSet & quirks)60 static PassRefPtr<PluginStream> create(PluginStreamClient* client, Frame* frame, const ResourceRequest& request, bool sendNotification, void* notifyData, const NPPluginFuncs* functions, NPP instance, const PluginQuirkSet& quirks) 61 { 62 return adoptRef(new PluginStream(client, frame, request, sendNotification, notifyData, functions, instance, quirks)); 63 } 64 virtual ~PluginStream(); 65 66 void start(); 67 void stop(); 68 69 void startStream(); 70 setLoadManually(bool loadManually)71 void setLoadManually(bool loadManually) { m_loadManually = loadManually; } 72 73 void sendJavaScriptStream(const KURL& requestURL, const WTF::CString& resultString); 74 void cancelAndDestroyStream(NPReason); 75 76 static NPP ownerForStream(NPStream*); 77 78 // NetscapePlugInStreamLoaderClient 79 virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&); 80 virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int); 81 virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&); 82 virtual void didFinishLoading(NetscapePlugInStreamLoader*); 83 virtual bool wantsAllStreams() const; 84 85 private: 86 PluginStream(PluginStreamClient*, Frame*, const ResourceRequest&, bool sendNotification, void* notifyData, const NPPluginFuncs*, NPP instance, const PluginQuirkSet&); 87 88 void deliverData(); 89 void destroyStream(NPReason); 90 void destroyStream(); 91 #if PLATFORM(ANDROID) 92 int deliveryDelay() const; 93 #endif 94 ResourceRequest m_resourceRequest; 95 ResourceResponse m_resourceResponse; 96 97 PluginStreamClient* m_client; 98 Frame* m_frame; 99 RefPtr<NetscapePlugInStreamLoader> m_loader; 100 void* m_notifyData; 101 bool m_sendNotification; 102 PluginStreamState m_streamState; 103 bool m_loadManually; 104 105 Timer<PluginStream> m_delayDeliveryTimer; 106 void delayDeliveryTimerFired(Timer<PluginStream>*); 107 108 OwnPtr< Vector<char> > m_deliveryData; 109 110 PlatformFileHandle m_tempFileHandle; 111 112 const NPPluginFuncs* m_pluginFuncs; 113 NPP m_instance; 114 uint16_t m_transferMode; 115 int32_t m_offset; 116 CString m_headers; 117 String m_path; 118 NPReason m_reason; 119 NPStream m_stream; 120 PluginQuirkSet m_quirks; 121 }; 122 123 } // namespace WebCore 124 125 #endif 126