1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
4  */
5 
6 #ifndef _nsZipWriter_h_
7 #define _nsZipWriter_h_
8 
9 #include "nsIZipWriter.h"
10 #include "nsIFileStreams.h"
11 #include "nsIBufferedStreams.h"
12 #include "nsIRequestObserver.h"
13 #include "nsZipHeader.h"
14 #include "nsCOMPtr.h"
15 #include "nsCOMArray.h"
16 #include "nsTArray.h"
17 #include "nsDataHashtable.h"
18 #include "mozilla/Attributes.h"
19 
20 #define ZIPWRITER_CONTRACTID "@mozilla.org/zipwriter;1"
21 #define ZIPWRITER_CID { 0x430d416c, 0xa722, 0x4ad1, \
22            { 0xbe, 0x98, 0xd9, 0xa4, 0x45, 0xf8, 0x5e, 0x3f } }
23 
24 #define OPERATION_ADD 0
25 #define OPERATION_REMOVE 1
26 struct nsZipQueueItem
27 {
28 public:
29     uint32_t mOperation;
30     nsCString mZipEntry;
31     nsCOMPtr<nsIFile> mFile;
32     nsCOMPtr<nsIChannel> mChannel;
33     nsCOMPtr<nsIInputStream> mStream;
34     PRTime mModTime;
35     int32_t mCompression;
36     uint32_t mPermissions;
37 };
38 
39 class nsZipWriter final : public nsIZipWriter,
40                           public nsIRequestObserver
41 {
42 public:
43     NS_DECL_ISUPPORTS
44     NS_DECL_NSIZIPWRITER
45     NS_DECL_NSIREQUESTOBSERVER
46 
47     nsZipWriter();
48     nsresult EntryCompleteCallback(nsZipHeader *aHeader, nsresult aStatus);
49 
50 private:
51     ~nsZipWriter();
52 
53     uint32_t mCDSOffset;
54     bool mCDSDirty;
55     bool mInQueue;
56 
57     nsCOMPtr<nsIFile> mFile;
58     nsCOMPtr<nsIRequestObserver> mProcessObserver;
59     nsCOMPtr<nsISupports> mProcessContext;
60     nsCOMPtr<nsIOutputStream> mStream;
61     nsCOMArray<nsZipHeader> mHeaders;
62     nsTArray<nsZipQueueItem> mQueue;
63     nsDataHashtable<nsCStringHashKey, int32_t> mEntryHash;
64     nsCString mComment;
65 
66     nsresult SeekCDS();
67     void Cleanup();
68     nsresult ReadFile(nsIFile *aFile);
69     nsresult InternalAddEntryDirectory(const nsACString & aZipEntry,
70                                        PRTime aModTime, uint32_t aPermissions);
71     nsresult BeginProcessingAddition(nsZipQueueItem* aItem, bool* complete);
72     nsresult BeginProcessingRemoval(int32_t aPos);
73     nsresult AddEntryStream(const nsACString & aZipEntry, PRTime aModTime,
74                             int32_t aCompression, nsIInputStream *aStream,
75                             bool aQueue, uint32_t aPermissions);
76     void BeginProcessingNextItem();
77     void FinishQueue(nsresult aStatus);
78 };
79 
80 #endif
81