1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/plugins/base/nsPluginStreamListenerPeer.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,175 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef nsPluginStreamListenerPeer_h_ 1.10 +#define nsPluginStreamListenerPeer_h_ 1.11 + 1.12 +#include "nscore.h" 1.13 +#include "nsIFile.h" 1.14 +#include "nsIStreamListener.h" 1.15 +#include "nsIProgressEventSink.h" 1.16 +#include "nsIHttpHeaderVisitor.h" 1.17 +#include "nsWeakReference.h" 1.18 +#include "nsNPAPIPluginStreamListener.h" 1.19 +#include "nsDataHashtable.h" 1.20 +#include "nsHashKeys.h" 1.21 +#include "nsNPAPIPluginInstance.h" 1.22 +#include "nsIInterfaceRequestor.h" 1.23 +#include "nsIChannelEventSink.h" 1.24 + 1.25 +class nsIChannel; 1.26 + 1.27 +/** 1.28 + * When a plugin requests opens multiple requests to the same URL and 1.29 + * the request must be satified by saving a file to disk, each stream 1.30 + * listener holds a reference to the backing file: the file is only removed 1.31 + * when all the listeners are done. 1.32 + */ 1.33 +class CachedFileHolder 1.34 +{ 1.35 +public: 1.36 + CachedFileHolder(nsIFile* cacheFile); 1.37 + ~CachedFileHolder(); 1.38 + 1.39 + void AddRef(); 1.40 + void Release(); 1.41 + 1.42 + nsIFile* file() const { return mFile; } 1.43 + 1.44 +private: 1.45 + nsAutoRefCnt mRefCnt; 1.46 + nsCOMPtr<nsIFile> mFile; 1.47 +}; 1.48 + 1.49 +class nsPluginStreamListenerPeer : public nsIStreamListener, 1.50 +public nsIProgressEventSink, 1.51 +public nsIHttpHeaderVisitor, 1.52 +public nsSupportsWeakReference, 1.53 +public nsIInterfaceRequestor, 1.54 +public nsIChannelEventSink 1.55 +{ 1.56 +public: 1.57 + nsPluginStreamListenerPeer(); 1.58 + virtual ~nsPluginStreamListenerPeer(); 1.59 + 1.60 + NS_DECL_ISUPPORTS 1.61 + NS_DECL_NSIPROGRESSEVENTSINK 1.62 + NS_DECL_NSIREQUESTOBSERVER 1.63 + NS_DECL_NSISTREAMLISTENER 1.64 + NS_DECL_NSIHTTPHEADERVISITOR 1.65 + NS_DECL_NSIINTERFACEREQUESTOR 1.66 + NS_DECL_NSICHANNELEVENTSINK 1.67 + 1.68 + // Called by RequestRead 1.69 + void 1.70 + MakeByteRangeString(NPByteRange* aRangeList, nsACString &string, int32_t *numRequests); 1.71 + 1.72 + bool UseExistingPluginCacheFile(nsPluginStreamListenerPeer* psi); 1.73 + 1.74 + // Called by GetURL and PostURL (via NewStream) or by the host in the case of 1.75 + // the initial plugin stream. 1.76 + nsresult Initialize(nsIURI *aURL, 1.77 + nsNPAPIPluginInstance *aInstance, 1.78 + nsNPAPIPluginStreamListener *aListener); 1.79 + 1.80 + nsresult OnFileAvailable(nsIFile* aFile); 1.81 + 1.82 + nsresult ServeStreamAsFile(nsIRequest *request, nsISupports *ctxt); 1.83 + 1.84 + nsNPAPIPluginInstance *GetPluginInstance() { return mPluginInstance; } 1.85 + 1.86 + nsresult RequestRead(NPByteRange* rangeList); 1.87 + nsresult GetLength(uint32_t* result); 1.88 + nsresult GetURL(const char** result); 1.89 + nsresult GetLastModified(uint32_t* result); 1.90 + nsresult IsSeekable(bool* result); 1.91 + nsresult GetContentType(char** result); 1.92 + nsresult GetStreamOffset(int32_t* result); 1.93 + nsresult SetStreamOffset(int32_t value); 1.94 + 1.95 + void TrackRequest(nsIRequest* request) 1.96 + { 1.97 + mRequests.AppendObject(request); 1.98 + } 1.99 + 1.100 + void ReplaceRequest(nsIRequest* oldRequest, nsIRequest* newRequest) 1.101 + { 1.102 + int32_t i = mRequests.IndexOfObject(oldRequest); 1.103 + if (i == -1) { 1.104 + NS_ASSERTION(mRequests.Count() == 0, 1.105 + "Only our initial stream should be unknown!"); 1.106 + mRequests.AppendObject(oldRequest); 1.107 + } 1.108 + else { 1.109 + mRequests.ReplaceObjectAt(newRequest, i); 1.110 + } 1.111 + } 1.112 + 1.113 + void CancelRequests(nsresult status) 1.114 + { 1.115 + // Copy the array to avoid modification during the loop. 1.116 + nsCOMArray<nsIRequest> requestsCopy(mRequests); 1.117 + for (int32_t i = 0; i < requestsCopy.Count(); ++i) 1.118 + requestsCopy[i]->Cancel(status); 1.119 + } 1.120 + 1.121 + void SuspendRequests() { 1.122 + nsCOMArray<nsIRequest> requestsCopy(mRequests); 1.123 + for (int32_t i = 0; i < requestsCopy.Count(); ++i) 1.124 + requestsCopy[i]->Suspend(); 1.125 + } 1.126 + 1.127 + void ResumeRequests() { 1.128 + nsCOMArray<nsIRequest> requestsCopy(mRequests); 1.129 + for (int32_t i = 0; i < requestsCopy.Count(); ++i) 1.130 + requestsCopy[i]->Resume(); 1.131 + } 1.132 + 1.133 +private: 1.134 + nsresult SetUpStreamListener(nsIRequest* request, nsIURI* aURL); 1.135 + nsresult SetupPluginCacheFile(nsIChannel* channel); 1.136 + nsresult GetInterfaceGlobal(const nsIID& aIID, void** result); 1.137 + 1.138 + nsCOMPtr<nsIURI> mURL; 1.139 + nsCString mURLSpec; // Have to keep this member because GetURL hands out char* 1.140 + nsRefPtr<nsNPAPIPluginStreamListener> mPStreamListener; 1.141 + 1.142 + // Set to true if we request failed (like with a HTTP response of 404) 1.143 + bool mRequestFailed; 1.144 + 1.145 + /* 1.146 + * Set to true after nsNPAPIPluginStreamListener::OnStartBinding() has 1.147 + * been called. Checked in ::OnStopRequest so we can call the 1.148 + * plugin's OnStartBinding if, for some reason, it has not already 1.149 + * been called. 1.150 + */ 1.151 + bool mStartBinding; 1.152 + bool mHaveFiredOnStartRequest; 1.153 + // these get passed to the plugin stream listener 1.154 + uint32_t mLength; 1.155 + int32_t mStreamType; 1.156 + 1.157 + // local cached file, we save the content into local cache if browser cache is not available, 1.158 + // or plugin asks stream as file and it expects file extension until bug 90558 got fixed 1.159 + nsRefPtr<CachedFileHolder> mLocalCachedFileHolder; 1.160 + nsCOMPtr<nsIOutputStream> mFileCacheOutputStream; 1.161 + nsDataHashtable<nsUint32HashKey, uint32_t>* mDataForwardToRequest; 1.162 + 1.163 + nsCString mContentType; 1.164 + bool mSeekable; 1.165 + uint32_t mModified; 1.166 + nsRefPtr<nsNPAPIPluginInstance> mPluginInstance; 1.167 + int32_t mStreamOffset; 1.168 + bool mStreamComplete; 1.169 + 1.170 +public: 1.171 + bool mAbort; 1.172 + int32_t mPendingRequests; 1.173 + nsWeakPtr mWeakPtrChannelCallbacks; 1.174 + nsWeakPtr mWeakPtrChannelLoadGroup; 1.175 + nsCOMArray<nsIRequest> mRequests; 1.176 +}; 1.177 + 1.178 +#endif // nsPluginStreamListenerPeer_h_