summaryrefslogtreecommitdiff
path: root/components/jar/src/nsJARInputStream.h
blob: 60c3d763eea4c2a1b644d209c5c7e735a4d0a017 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* nsJARInputStream.h
 * 
 * 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 nsJARINPUTSTREAM_h__
#define nsJARINPUTSTREAM_h__

#include "nsIInputStream.h"
#include "nsJAR.h"
#include "nsTArray.h"
#include "mozilla/Attributes.h"

struct BrotliDecoderStateStruct;

/*-------------------------------------------------------------------------
 * Class nsJARInputStream declaration. This class defines the type of the
 * object returned by calls to nsJAR::GetInputStream(filename) for the
 * purpose of reading a file item out of a JAR file. 
 *------------------------------------------------------------------------*/
class nsJARInputStream final : public nsIInputStream
{
  public:
    nsJARInputStream()
    : mOutSize(0)
    , mInCrc(0)
    , mOutCrc(0)
    , mBrotliState(nullptr)
    , mNameLen(0)
    , mCurPos(0)
    , mArrPos(0)
    , mMode(MODE_NOTINITED)
    { 
      memset(&mZs, 0, sizeof(z_stream));
    }

    NS_DECL_THREADSAFE_ISUPPORTS
    NS_DECL_NSIINPUTSTREAM
   
    // takes ownership of |fd|, even on failure
    nsresult InitFile(nsJAR *aJar, nsZipItem *item);

    nsresult InitDirectory(nsJAR *aJar,
                           const nsACString& aJarDirSpec,
                           const char* aDir);
  
  private:
    ~nsJARInputStream() { Close(); }

    RefPtr<nsZipHandle>  mFd;         // handle for reading
    uint32_t               mOutSize;    // inflated size 
    uint32_t               mInCrc;      // CRC as provided by the zipentry
    uint32_t               mOutCrc;     // CRC as calculated by me
    z_stream               mZs;         // zip data structure
    BrotliDecoderStateStruct* mBrotliState; // Brotli decoder state

    /* For directory reading */
    RefPtr<nsJAR>          mJar;        // string reference to zipreader
    uint32_t               mNameLen;    // length of dirname
    nsCString              mBuffer;     // storage for generated text of stream
    uint32_t               mCurPos;     // Current position in buffer
    uint32_t               mArrPos;     // current position within mArray
    nsTArray<nsCString>    mArray;      // array of names in (zip) directory

	typedef enum {
        MODE_NOTINITED,
        MODE_CLOSED,
        MODE_DIRECTORY,
        MODE_INFLATE,
        MODE_BROTLI,
        MODE_COPY
    } JISMode;

    JISMode                mMode;		// Modus of the stream

    nsresult ContinueInflate(char* aBuf, uint32_t aCount, uint32_t* aBytesRead);
    nsresult ReadDirectory(char* aBuf, uint32_t aCount, uint32_t* aBytesRead);
    uint32_t CopyDataToBuffer(char* &aBuffer, uint32_t &aCount);
};

#endif /* nsJARINPUTSTREAM_h__ */