dom/plugins/base/nsPluginStreamListenerPeer.h

changeset 0
6474c204b198
     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_

mercurial