Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/Omnijar.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
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 mozilla_Omnijar_h
8
#define mozilla_Omnijar_h
9
10
#include "nscore.h"
11
#include "nsCOMPtr.h"
12
#include "nsString.h"
13
#include "nsIFile.h"
14
#include "nsZipArchive.h"
15
16
#include "mozilla/StaticPtr.h"
17
18
namespace mozilla {
19
20
class Omnijar
21
{
22
private:
23
  /**
24
   * Store an nsIFile for an omni.jar. We can store two paths here, one
25
   * for GRE (corresponding to resource://gre/) and one for APP
26
   * (corresponding to resource:/// and resource://app/), but only
27
   * store one when both point to the same location (unified).
28
   */
29
  static StaticRefPtr<nsIFile> sPath[2];
30
31
  /**
32
   * Cached nsZipArchives for the corresponding sPath
33
   */
34
  static StaticRefPtr<nsZipArchive> sReader[2];
35
36
  /**
37
   * Cached nsZipArchives for the outer jar, when using nested jars.
38
   * Otherwise nullptr.
39
   */
40
  static StaticRefPtr<nsZipArchive> sOuterReader[2];
41
42
  /**
43
   * Has Omnijar::Init() been called?
44
   */
45
  static bool sInitialized;
46
47
  /**
48
   * Is using unified GRE/APP jar?
49
   */
50
  static bool sIsUnified;
51
52
public:
53
  enum Type
54
  {
55
    GRE = 0,
56
    APP = 1
57
  };
58
59
private:
60
  /**
61
   * Returns whether we are using nested jars.
62
   */
63
  static inline bool IsNested(Type aType)
64
23
  {
65
23
    MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
66
23
    return !!sOuterReader[aType];
67
23
  }
68
69
  /**
70
   * Returns a nsZipArchive pointer for the outer jar file when using nested
71
   * jars. Returns nullptr in the same cases GetPath() would, or if not using
72
   * nested jars.
73
   */
74
  static inline already_AddRefed<nsZipArchive> GetOuterReader(Type aType)
75
0
  {
76
0
    MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
77
0
    RefPtr<nsZipArchive> reader = sOuterReader[aType].get();
78
0
    return reader.forget();
79
0
  }
80
81
public:
82
  /**
83
   * Returns whether SetBase has been called at least once with
84
   * a valid nsIFile
85
   */
86
3
  static inline bool IsInitialized() { return sInitialized; }
87
88
  /**
89
   * Initializes the Omnijar API with the given directory or file for GRE and
90
   * APP. Each of the paths given can be:
91
   * - a file path, pointing to the omnijar file,
92
   * - a directory path, pointing to a directory containing an "omni.jar" file,
93
   * - nullptr for autodetection of an "omni.jar" file.
94
   */
95
  static void Init(nsIFile* aGrePath = nullptr, nsIFile* aAppPath = nullptr);
96
97
  /**
98
   * Cleans up the Omnijar API
99
   */
100
  static void CleanUp();
101
102
  /**
103
   * Returns an nsIFile pointing to the omni.jar file for GRE or APP.
104
   * Returns nullptr when there is no corresponding omni.jar.
105
   * Also returns nullptr for APP in the unified case.
106
   */
107
  static inline already_AddRefed<nsIFile> GetPath(Type aType)
108
3
  {
109
3
    MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
110
3
    nsCOMPtr<nsIFile> path = sPath[aType].get();
111
3
    return path.forget();
112
3
  }
113
114
  /**
115
   * Returns whether GRE or APP use an omni.jar. Returns PR_False for
116
   * APP when using an omni.jar in the unified case.
117
   */
118
  static inline bool HasOmnijar(Type aType)
119
6
  {
120
6
    MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
121
6
    return !!sPath[aType];
122
6
  }
123
124
  /**
125
   * Returns a nsZipArchive pointer for the omni.jar file for GRE or
126
   * APP. Returns nullptr in the same cases GetPath() would.
127
   */
128
  static inline already_AddRefed<nsZipArchive> GetReader(Type aType)
129
68
  {
130
68
    MOZ_ASSERT(IsInitialized(), "Omnijar not initialized");
131
68
    RefPtr<nsZipArchive> reader = sReader[aType].get();
132
68
    return reader.forget();
133
68
  }
134
135
  /**
136
   * Returns a nsZipArchive pointer for the given path IAOI the given
137
   * path is the omni.jar for either GRE or APP.
138
   */
139
  static already_AddRefed<nsZipArchive> GetReader(nsIFile* aPath);
140
141
  /**
142
   * Returns the URI string corresponding to the omni.jar or directory
143
   * for GRE or APP. i.e. jar:/path/to/omni.jar!/ for omni.jar and
144
   * /path/to/base/dir/ otherwise. Returns an empty string for APP in
145
   * the unified case.
146
   * The returned URI is guaranteed to end with a slash.
147
   */
148
  static nsresult GetURIString(Type aType, nsACString& aResult);
149
150
private:
151
  /**
152
   * Used internally, respectively by Init() and CleanUp()
153
   */
154
  static void InitOne(nsIFile* aPath, Type aType);
155
  static void CleanUpOne(Type aType);
156
}; /* class Omnijar */
157
158
} /* namespace mozilla */
159
160
#endif /* mozilla_Omnijar_h */