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 "CString.h" 31 #include "FileSystem.h" 32 #include "KURL.h" 33 #include "NetscapePlugInStreamLoader.h" 34 #include "PlatformString.h" 35 #include "PluginQuirkSet.h" 36 #include "ResourceRequest.h" 37 #include "ResourceResponse.h" 38 #include "StringHash.h" 39 #include "Timer.h" 40 #include "npruntime_internal.h" 41 #include <wtf/HashMap.h> 42 #include <wtf/OwnPtr.h> 43 #include <wtf/RefCounted.h> 44 #include <wtf/Vector.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 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 92 ResourceRequest m_resourceRequest; 93 ResourceResponse m_resourceResponse; 94 95 PluginStreamClient* m_client; 96 Frame* m_frame; 97 RefPtr<NetscapePlugInStreamLoader> m_loader; 98 void* m_notifyData; 99 bool m_sendNotification; 100 PluginStreamState m_streamState; 101 bool m_loadManually; 102 103 Timer<PluginStream> m_delayDeliveryTimer; 104 void delayDeliveryTimerFired(Timer<PluginStream>*); 105 106 OwnPtr< Vector<char> > m_deliveryData; 107 108 PlatformFileHandle m_tempFileHandle; 109 110 const NPPluginFuncs* m_pluginFuncs; 111 NPP m_instance; 112 uint16 m_transferMode; 113 int32 m_offset; 114 CString m_headers; 115 CString m_path; 116 NPReason m_reason; 117 NPStream m_stream; 118 PluginQuirkSet m_quirks; 119 }; 120 121 } // namespace WebCore 122 123 #endif 124