modules/libjar/nsJARChannel.h
author L10n Bumper Bot <release+l10nbumper@mozilla.com>
Tue, 17 Sep 2019 11:00:37 +0000
changeset 551836 4243b9ca3ed4a5512d3a47dcdad9c4f698c94907
parent 530873 e1993a1f09ac53cd1a04fdf6a87f8cad8e44f73e
permissions -rw-r--r--
no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD ast -> 83ada18a77c6 be -> fa03aa331905 el -> 1496d84f4882 fa -> 09b4fe3694b4 fi -> ffab067af84f ia -> 1d33f55d17f6 nn-NO -> f3e97ebc03fc pt-BR -> cb472b785a06 ro -> e566490f197e sl -> 257999c4ca23

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef nsJARChannel_h__
#define nsJARChannel_h__

#include "mozilla/net/MemoryDownloader.h"
#include "nsIJARChannel.h"
#include "nsIJARURI.h"
#include "nsIEventTarget.h"
#include "nsIInputStreamPump.h"
#include "nsIInterfaceRequestor.h"
#include "nsIProgressEventSink.h"
#include "nsIStreamListener.h"
#include "nsIZipReader.h"
#include "nsILoadGroup.h"
#include "nsILoadInfo.h"
#include "nsIThreadRetargetableRequest.h"
#include "nsIThreadRetargetableStreamListener.h"
#include "nsHashPropertyBag.h"
#include "nsIFile.h"
#include "nsIURI.h"
#include "nsCOMPtr.h"
#include "nsString.h"
#include "mozilla/Logging.h"

class nsJARInputThunk;
class nsJARProtocolHandler;
class nsInputStreamPump;

//-----------------------------------------------------------------------------

class nsJARChannel final : public nsIJARChannel,
                           public nsIStreamListener,
                           public nsIThreadRetargetableRequest,
                           public nsIThreadRetargetableStreamListener,
                           public nsHashPropertyBag {
 public:
  NS_DECL_ISUPPORTS_INHERITED
  NS_DECL_NSIREQUEST
  NS_DECL_NSICHANNEL
  NS_DECL_NSIJARCHANNEL
  NS_DECL_NSIREQUESTOBSERVER
  NS_DECL_NSISTREAMLISTENER
  NS_DECL_NSITHREADRETARGETABLEREQUEST
  NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER

  nsJARChannel();

  nsresult Init(nsIURI* uri);

  void SetFile(nsIFile* file);

 private:
  virtual ~nsJARChannel();

  nsresult CreateJarInput(nsIZipReaderCache*, nsJARInputThunk**);
  nsresult LookupFile();
  nsresult OpenLocalFile();
  nsresult ContinueOpenLocalFile(nsJARInputThunk* aInput, bool aIsSyncCall);
  nsresult OnOpenLocalFileComplete(nsresult aResult, bool aIsSyncCall);
  nsresult CheckPendingEvents();
  void NotifyError(nsresult aError);
  void FireOnProgress(uint64_t aProgress);

  nsCString mSpec;

  bool mOpened;

  RefPtr<nsJARProtocolHandler> mJarHandler;
  nsCOMPtr<nsIJARURI> mJarURI;
  nsCOMPtr<nsIURI> mOriginalURI;
  nsCOMPtr<nsISupports> mOwner;
  nsCOMPtr<nsILoadInfo> mLoadInfo;
  nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
  nsCOMPtr<nsISupports> mSecurityInfo;
  nsCOMPtr<nsIProgressEventSink> mProgressSink;
  nsCOMPtr<nsILoadGroup> mLoadGroup;
  nsCOMPtr<nsIStreamListener> mListener;
  nsCString mContentType;
  nsCString mContentCharset;
  int64_t mContentLength;
  uint32_t mLoadFlags;
  nsresult mStatus;
  bool mIsPending;  // the AsyncOpen is in progress.

  bool mEnableOMT;
  // |Cancel()|, |Suspend()|, and |Resume()| might be called during AsyncOpen.
  struct {
    bool isCanceled;
    uint32_t suspendCount;
  } mPendingEvent;

  nsCOMPtr<nsIInputStreamPump> mPump;
  // mRequest is only non-null during OnStartRequest, so we'll have a pointer
  // to the request if we get called back via RetargetDeliveryTo.
  nsCOMPtr<nsIRequest> mRequest;
  nsCOMPtr<nsIFile> mJarFile;
  nsCOMPtr<nsIFile> mJarFileOverride;
  nsCOMPtr<nsIZipReader> mPreCachedJarReader;
  nsCOMPtr<nsIURI> mJarBaseURI;
  nsCString mJarEntry;
  nsCString mInnerJarEntry;

  // use StreamTransportService as background thread
  nsCOMPtr<nsIEventTarget> mWorker;
};

#endif  // nsJARChannel_h__