Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/modules/libjar/nsJARInputStream.h
Line
Count
Source
1
/* nsJARInputStream.h
2
 *
3
 * This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef nsJARINPUTSTREAM_h__
8
#define nsJARINPUTSTREAM_h__
9
10
#include "nsIInputStream.h"
11
#include "nsJAR.h"
12
#include "nsTArray.h"
13
#include "mozilla/Attributes.h"
14
15
#ifdef MOZ_JAR_BROTLI
16
struct BrotliDecoderStateStruct;
17
#endif
18
19
/*-------------------------------------------------------------------------
20
 * Class nsJARInputStream declaration. This class defines the type of the
21
 * object returned by calls to nsJAR::GetInputStream(filename) for the
22
 * purpose of reading a file item out of a JAR file.
23
 *------------------------------------------------------------------------*/
24
class nsJARInputStream final : public nsIInputStream
25
{
26
  public:
27
    nsJARInputStream()
28
    : mOutSize(0)
29
    , mInCrc(0)
30
    , mOutCrc(0)
31
#ifdef MOZ_JAR_BROTLI
32
    , mBrotliState(nullptr)
33
#endif
34
    , mNameLen(0)
35
    , mCurPos(0)
36
    , mArrPos(0)
37
    , mMode(MODE_NOTINITED)
38
5
    {
39
5
      memset(&mZs, 0, sizeof(z_stream));
40
5
    }
41
42
    NS_DECL_THREADSAFE_ISUPPORTS
43
    NS_DECL_NSIINPUTSTREAM
44
45
    // takes ownership of |fd|, even on failure
46
    nsresult InitFile(nsJAR *aJar, nsZipItem *item);
47
48
    nsresult InitDirectory(nsJAR *aJar,
49
                           const nsACString& aJarDirSpec,
50
                           const char* aDir);
51
52
  private:
53
5
    ~nsJARInputStream() { Close(); }
54
55
    RefPtr<nsZipHandle>  mFd;         // handle for reading
56
    uint32_t               mOutSize;    // inflated size
57
    uint32_t               mInCrc;      // CRC as provided by the zipentry
58
    uint32_t               mOutCrc;     // CRC as calculated by me
59
    z_stream               mZs;         // zip data structure
60
#ifdef MOZ_JAR_BROTLI
61
    BrotliDecoderStateStruct* mBrotliState; // Brotli decoder state
62
#endif
63
64
    /* For directory reading */
65
    RefPtr<nsJAR>          mJar;        // string reference to zipreader
66
    uint32_t               mNameLen;    // length of dirname
67
    nsCString              mBuffer;     // storage for generated text of stream
68
    uint32_t               mCurPos;     // Current position in buffer
69
    uint32_t               mArrPos;     // current position within mArray
70
    nsTArray<nsCString>    mArray;      // array of names in (zip) directory
71
72
  typedef enum {
73
        MODE_NOTINITED,
74
        MODE_CLOSED,
75
        MODE_DIRECTORY,
76
        MODE_INFLATE,
77
#ifdef MOZ_JAR_BROTLI
78
        MODE_BROTLI,
79
#endif
80
        MODE_COPY
81
    } JISMode;
82
83
    JISMode                mMode;   // Modus of the stream
84
85
    nsresult ContinueInflate(char* aBuf, uint32_t aCount, uint32_t* aBytesRead);
86
    nsresult ReadDirectory(char* aBuf, uint32_t aCount, uint32_t* aBytesRead);
87
    uint32_t CopyDataToBuffer(char* &aBuffer, uint32_t &aCount);
88
};
89
90
#endif /* nsJARINPUTSTREAM_h__ */
91