|
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 #include "nsHostObjectURI.h" |
|
6 |
|
7 #include "nsAutoPtr.h" |
|
8 #include "nsIObjectInputStream.h" |
|
9 #include "nsIObjectOutputStream.h" |
|
10 #include "nsIProgrammingLanguage.h" |
|
11 |
|
12 static NS_DEFINE_CID(kHOSTOBJECTURICID, NS_HOSTOBJECTURI_CID); |
|
13 |
|
14 static NS_DEFINE_CID(kThisSimpleURIImplementationCID, |
|
15 NS_THIS_SIMPLEURI_IMPLEMENTATION_CID); |
|
16 |
|
17 NS_IMPL_ADDREF_INHERITED(nsHostObjectURI, nsSimpleURI) |
|
18 NS_IMPL_RELEASE_INHERITED(nsHostObjectURI, nsSimpleURI) |
|
19 |
|
20 NS_INTERFACE_MAP_BEGIN(nsHostObjectURI) |
|
21 NS_INTERFACE_MAP_ENTRY(nsIURIWithPrincipal) |
|
22 if (aIID.Equals(kHOSTOBJECTURICID)) |
|
23 foundInterface = static_cast<nsIURI*>(this); |
|
24 else if (aIID.Equals(kThisSimpleURIImplementationCID)) { |
|
25 // Need to return explicitly here, because if we just set foundInterface |
|
26 // to null the NS_INTERFACE_MAP_END_INHERITING will end up calling into |
|
27 // nsSimplURI::QueryInterface and finding something for this CID. |
|
28 *aInstancePtr = nullptr; |
|
29 return NS_NOINTERFACE; |
|
30 } |
|
31 else |
|
32 NS_INTERFACE_MAP_END_INHERITING(nsSimpleURI) |
|
33 |
|
34 // nsIURIWithPrincipal methods: |
|
35 |
|
36 NS_IMETHODIMP |
|
37 nsHostObjectURI::GetPrincipal(nsIPrincipal** aPrincipal) |
|
38 { |
|
39 NS_IF_ADDREF(*aPrincipal = mPrincipal); |
|
40 |
|
41 return NS_OK; |
|
42 } |
|
43 |
|
44 NS_IMETHODIMP |
|
45 nsHostObjectURI::GetPrincipalUri(nsIURI** aUri) |
|
46 { |
|
47 if (mPrincipal) { |
|
48 mPrincipal->GetURI(aUri); |
|
49 } |
|
50 else { |
|
51 *aUri = nullptr; |
|
52 } |
|
53 |
|
54 return NS_OK; |
|
55 } |
|
56 |
|
57 // nsISerializable methods: |
|
58 |
|
59 NS_IMETHODIMP |
|
60 nsHostObjectURI::Read(nsIObjectInputStream* aStream) |
|
61 { |
|
62 nsresult rv = nsSimpleURI::Read(aStream); |
|
63 NS_ENSURE_SUCCESS(rv, rv); |
|
64 |
|
65 nsCOMPtr<nsISupports> supports; |
|
66 rv = NS_ReadOptionalObject(aStream, true, getter_AddRefs(supports)); |
|
67 NS_ENSURE_SUCCESS(rv, rv); |
|
68 |
|
69 mPrincipal = do_QueryInterface(supports, &rv); |
|
70 return rv; |
|
71 } |
|
72 |
|
73 NS_IMETHODIMP |
|
74 nsHostObjectURI::Write(nsIObjectOutputStream* aStream) |
|
75 { |
|
76 nsresult rv = nsSimpleURI::Write(aStream); |
|
77 NS_ENSURE_SUCCESS(rv, rv); |
|
78 |
|
79 return NS_WriteOptionalCompoundObject(aStream, mPrincipal, |
|
80 NS_GET_IID(nsIPrincipal), |
|
81 true); |
|
82 } |
|
83 |
|
84 // nsIURI methods: |
|
85 nsresult |
|
86 nsHostObjectURI::CloneInternal(nsSimpleURI::RefHandlingEnum aRefHandlingMode, |
|
87 nsIURI** aClone) |
|
88 { |
|
89 nsCOMPtr<nsIURI> simpleClone; |
|
90 nsresult rv = |
|
91 nsSimpleURI::CloneInternal(aRefHandlingMode, getter_AddRefs(simpleClone)); |
|
92 NS_ENSURE_SUCCESS(rv, rv); |
|
93 |
|
94 #ifdef DEBUG |
|
95 nsRefPtr<nsHostObjectURI> uriCheck; |
|
96 rv = simpleClone->QueryInterface(kHOSTOBJECTURICID, getter_AddRefs(uriCheck)); |
|
97 NS_ABORT_IF_FALSE(NS_SUCCEEDED(rv) && uriCheck, |
|
98 "Unexpected!"); |
|
99 #endif |
|
100 |
|
101 nsHostObjectURI* u = static_cast<nsHostObjectURI*>(simpleClone.get()); |
|
102 |
|
103 u->mPrincipal = mPrincipal; |
|
104 |
|
105 simpleClone.forget(aClone); |
|
106 return NS_OK; |
|
107 } |
|
108 |
|
109 /* virtual */ nsresult |
|
110 nsHostObjectURI::EqualsInternal(nsIURI* aOther, |
|
111 nsSimpleURI::RefHandlingEnum aRefHandlingMode, |
|
112 bool* aResult) |
|
113 { |
|
114 if (!aOther) { |
|
115 *aResult = false; |
|
116 return NS_OK; |
|
117 } |
|
118 |
|
119 nsRefPtr<nsHostObjectURI> otherUri; |
|
120 aOther->QueryInterface(kHOSTOBJECTURICID, getter_AddRefs(otherUri)); |
|
121 if (!otherUri) { |
|
122 *aResult = false; |
|
123 return NS_OK; |
|
124 } |
|
125 |
|
126 // Compare the member data that our base class knows about. |
|
127 if (!nsSimpleURI::EqualsInternal(otherUri, aRefHandlingMode)) { |
|
128 *aResult = false; |
|
129 return NS_OK; |
|
130 } |
|
131 |
|
132 // Compare the piece of additional member data that we add to base class. |
|
133 if (mPrincipal && otherUri->mPrincipal) { |
|
134 // Both of us have mPrincipals. Compare them. |
|
135 return mPrincipal->Equals(otherUri->mPrincipal, aResult); |
|
136 } |
|
137 // else, at least one of us lacks a principal; only equal if *both* lack it. |
|
138 *aResult = (!mPrincipal && !otherUri->mPrincipal); |
|
139 return NS_OK; |
|
140 } |
|
141 |
|
142 // nsIClassInfo methods: |
|
143 NS_IMETHODIMP |
|
144 nsHostObjectURI::GetInterfaces(uint32_t *count, nsIID * **array) |
|
145 { |
|
146 *count = 0; |
|
147 *array = nullptr; |
|
148 return NS_OK; |
|
149 } |
|
150 |
|
151 NS_IMETHODIMP |
|
152 nsHostObjectURI::GetHelperForLanguage(uint32_t language, nsISupports **_retval) |
|
153 { |
|
154 *_retval = nullptr; |
|
155 return NS_OK; |
|
156 } |
|
157 |
|
158 NS_IMETHODIMP |
|
159 nsHostObjectURI::GetContractID(char * *aContractID) |
|
160 { |
|
161 // Make sure to modify any subclasses as needed if this ever |
|
162 // changes. |
|
163 *aContractID = nullptr; |
|
164 return NS_OK; |
|
165 } |
|
166 |
|
167 NS_IMETHODIMP |
|
168 nsHostObjectURI::GetClassDescription(char * *aClassDescription) |
|
169 { |
|
170 *aClassDescription = nullptr; |
|
171 return NS_OK; |
|
172 } |
|
173 |
|
174 NS_IMETHODIMP |
|
175 nsHostObjectURI::GetClassID(nsCID * *aClassID) |
|
176 { |
|
177 // Make sure to modify any subclasses as needed if this ever |
|
178 // changes to not call the virtual GetClassIDNoAlloc. |
|
179 *aClassID = (nsCID*) nsMemory::Alloc(sizeof(nsCID)); |
|
180 NS_ENSURE_TRUE(*aClassID, NS_ERROR_OUT_OF_MEMORY); |
|
181 |
|
182 return GetClassIDNoAlloc(*aClassID); |
|
183 } |
|
184 |
|
185 NS_IMETHODIMP |
|
186 nsHostObjectURI::GetImplementationLanguage(uint32_t *aImplementationLanguage) |
|
187 { |
|
188 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; |
|
189 return NS_OK; |
|
190 } |
|
191 |
|
192 NS_IMETHODIMP |
|
193 nsHostObjectURI::GetFlags(uint32_t *aFlags) |
|
194 { |
|
195 *aFlags = nsIClassInfo::MAIN_THREAD_ONLY; |
|
196 return NS_OK; |
|
197 } |
|
198 |
|
199 NS_IMETHODIMP |
|
200 nsHostObjectURI::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) |
|
201 { |
|
202 *aClassIDNoAlloc = kHOSTOBJECTURICID; |
|
203 return NS_OK; |
|
204 } |