author Mike Hommey <>
Thu, 26 Mar 2015 12:07:17 +0900
changeset 258314 fc1e894eec2fbd34b745cd94f505080427d24705
parent 257987 a20c7910a82fa2df2f3398c1108d102bac9128b0
permissions -rw-r--r--
Bug 1147207 - Add a ComposedFinder class that acts like a FileFinder proxy over multiple FileFinders. r=gps, a=sledru

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* 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 */

#ifndef mozilla_dom_archivereader_domarchivereader_h__
#define mozilla_dom_archivereader_domarchivereader_h__

#include "nsWrapperCache.h"

#include "ArchiveReaderCommon.h"

#include "nsCOMArray.h"
#include "nsIChannel.h"
#include "nsIDOMFile.h"
#include "mozilla/Attributes.h"

namespace mozilla {
namespace dom {
struct ArchiveReaderOptions;
class File;
class FileImpl;
class GlobalObject;
} // namespace dom
} // namespace mozilla


class ArchiveRequest;

 * This is the ArchiveReader object
class ArchiveReader final : public nsISupports,
                                public nsWrapperCache

  static already_AddRefed<ArchiveReader>
  Constructor(const GlobalObject& aGlobal, File& aBlob,
              const ArchiveReaderOptions& aOptions, ErrorResult& aError);

  ArchiveReader(File& aBlob, nsPIDOMWindow* aWindow,
                const nsACString& aEncoding);

  nsIDOMWindow* GetParentObject() const
    return mWindow;

  virtual JSObject* WrapObject(JSContext* aCx) override;

  already_AddRefed<ArchiveRequest> GetFilenames();
  already_AddRefed<ArchiveRequest> GetFile(const nsAString& filename);
  already_AddRefed<ArchiveRequest> GetFiles();

  nsresult GetInputStream(nsIInputStream** aInputStream);
  nsresult GetSize(uint64_t* aSize);

public: // for the ArchiveRequest:
  nsresult RegisterRequest(ArchiveRequest* aRequest);

public: // For events:
  FileImpl* GetFileImpl() const
    return mFileImpl;

  void Ready(nsTArray<nsCOMPtr<nsIDOMFile> >& aFileList,
             nsresult aStatus);


  already_AddRefed<ArchiveRequest> GenerateArchiveRequest();

  nsresult OpenArchive();

  void RequestReady(ArchiveRequest* aRequest);

  // The archive blob/file
  nsRefPtr<FileImpl> mFileImpl;

  // The window is needed by the requests
  nsCOMPtr<nsPIDOMWindow> mWindow;

  // Are we ready to return data?
  enum {
    NOT_STARTED = 0,
  } mStatus;

  // State of the read:
  enum {
    Header, // We are collecting the header: 30bytes
    Name,   // The name length is contained in the header
    Data,   // The length of the data segment COULD be written in the header
    Search  // ... if the data length is unknown (== 0) we wait until we read a new header 
  } mReadStatus;

  // List of requests to be processed
  nsTArray<nsRefPtr<ArchiveRequest> > mRequests;

  // Everything related to the blobs and the status:
  struct {
    nsTArray<nsCOMPtr<nsIDOMFile> > fileList;
    nsresult status;
  } mData;

  nsCString mEncoding;


#endif // mozilla_dom_archivereader_domarchivereader_h__