/src/mozilla-central/image/decoders/icon/nsIconURI.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
2 | | * vim: set sw=2 sts=2 ts=2 et tw=80: |
3 | | * |
4 | | * This Source Code Form is subject to the terms of the Mozilla Public |
5 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
6 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
7 | | |
8 | | #include "nsIconURI.h" |
9 | | |
10 | | #include "mozilla/ArrayUtils.h" |
11 | | #include "mozilla/ipc/URIUtils.h" |
12 | | #include "mozilla/Sprintf.h" |
13 | | |
14 | | #include "nsIIOService.h" |
15 | | #include "nsIURL.h" |
16 | | #include "nsNetUtil.h" |
17 | | #include "plstr.h" |
18 | | #include <stdlib.h> |
19 | | |
20 | | using namespace mozilla; |
21 | | using namespace mozilla::ipc; |
22 | | |
23 | 0 | #define DEFAULT_IMAGE_SIZE 16 |
24 | | |
25 | | #if defined(MAX_PATH) |
26 | | #define SANE_FILE_NAME_LEN MAX_PATH |
27 | | #elif defined(PATH_MAX) |
28 | 0 | #define SANE_FILE_NAME_LEN PATH_MAX |
29 | | #else |
30 | | #define SANE_FILE_NAME_LEN 1024 |
31 | | #endif |
32 | | |
33 | | // helper function for parsing out attributes like size, and contentType |
34 | | // from the icon url. |
35 | | static void extractAttributeValue(const char* aSearchString, |
36 | | const char* aAttributeName, |
37 | | nsCString& aResult); |
38 | | |
39 | | static const char* kSizeStrings[] = |
40 | | { |
41 | | "button", |
42 | | "toolbar", |
43 | | "toolbarsmall", |
44 | | "menu", |
45 | | "dnd", |
46 | | "dialog" |
47 | | }; |
48 | | |
49 | | static const char* kStateStrings[] = |
50 | | { |
51 | | "normal", |
52 | | "disabled" |
53 | | }; |
54 | | |
55 | | //////////////////////////////////////////////////////////////////////////////// |
56 | | |
57 | | nsMozIconURI::nsMozIconURI() |
58 | | : mSize(DEFAULT_IMAGE_SIZE), |
59 | | mIconSize(-1), |
60 | | mIconState(-1) |
61 | 0 | { } |
62 | | |
63 | | nsMozIconURI::~nsMozIconURI() |
64 | 0 | { } |
65 | | |
66 | | NS_IMPL_ADDREF(nsMozIconURI) |
67 | | NS_IMPL_RELEASE(nsMozIconURI) |
68 | | |
69 | 0 | NS_INTERFACE_MAP_BEGIN(nsMozIconURI) |
70 | 0 | NS_INTERFACE_MAP_ENTRY(nsIMozIconURI) |
71 | 0 | NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURI) |
72 | 0 | NS_INTERFACE_MAP_ENTRY(nsIURI) |
73 | 0 | NS_INTERFACE_MAP_ENTRY(nsIIPCSerializableURI) |
74 | 0 | NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsINestedURI, mIconURL) |
75 | 0 | NS_INTERFACE_MAP_END |
76 | | |
77 | 0 | #define MOZICON_SCHEME "moz-icon:" |
78 | 0 | #define MOZICON_SCHEME_LEN (sizeof(MOZICON_SCHEME) - 1) |
79 | | |
80 | | //////////////////////////////////////////////////////////////////////////////// |
81 | | // nsIURI methods: |
82 | | |
83 | | NS_IMETHODIMP |
84 | | nsMozIconURI::GetSpec(nsACString& aSpec) |
85 | 0 | { |
86 | 0 | aSpec = MOZICON_SCHEME; |
87 | 0 |
|
88 | 0 | if (mIconURL) { |
89 | 0 | nsAutoCString fileIconSpec; |
90 | 0 | nsresult rv = mIconURL->GetSpec(fileIconSpec); |
91 | 0 | NS_ENSURE_SUCCESS(rv, rv); |
92 | 0 | aSpec += fileIconSpec; |
93 | 0 | } else if (!mStockIcon.IsEmpty()) { |
94 | 0 | aSpec += "//stock/"; |
95 | 0 | aSpec += mStockIcon; |
96 | 0 | } else { |
97 | 0 | aSpec += "//"; |
98 | 0 | aSpec += mFileName; |
99 | 0 | } |
100 | 0 |
|
101 | 0 | aSpec += "?size="; |
102 | 0 | if (mIconSize >= 0) { |
103 | 0 | aSpec += kSizeStrings[mIconSize]; |
104 | 0 | } else { |
105 | 0 | char buf[20]; |
106 | 0 | SprintfLiteral(buf, "%d", mSize); |
107 | 0 | aSpec.Append(buf); |
108 | 0 | } |
109 | 0 |
|
110 | 0 | if (mIconState >= 0) { |
111 | 0 | aSpec += "&state="; |
112 | 0 | aSpec += kStateStrings[mIconState]; |
113 | 0 | } |
114 | 0 |
|
115 | 0 | if (!mContentType.IsEmpty()) { |
116 | 0 | aSpec += "&contentType="; |
117 | 0 | aSpec += mContentType.get(); |
118 | 0 | } |
119 | 0 |
|
120 | 0 | return NS_OK; |
121 | 0 | } |
122 | | |
123 | | NS_IMETHODIMP |
124 | | nsMozIconURI::GetSpecIgnoringRef(nsACString& result) |
125 | 0 | { |
126 | 0 | return GetSpec(result); |
127 | 0 | } |
128 | | |
129 | | NS_IMETHODIMP |
130 | | nsMozIconURI::GetDisplaySpec(nsACString& aUnicodeSpec) |
131 | 0 | { |
132 | 0 | return GetSpec(aUnicodeSpec); |
133 | 0 | } |
134 | | |
135 | | NS_IMETHODIMP |
136 | | nsMozIconURI::GetDisplayHostPort(nsACString& aUnicodeHostPort) |
137 | 0 | { |
138 | 0 | return GetHostPort(aUnicodeHostPort); |
139 | 0 | } |
140 | | |
141 | | NS_IMETHODIMP |
142 | | nsMozIconURI::GetDisplayHost(nsACString& aUnicodeHost) |
143 | 0 | { |
144 | 0 | return GetHost(aUnicodeHost); |
145 | 0 | } |
146 | | |
147 | | NS_IMETHODIMP |
148 | | nsMozIconURI::GetDisplayPrePath(nsACString& aPrePath) |
149 | 0 | { |
150 | 0 | return GetPrePath(aPrePath); |
151 | 0 | } |
152 | | |
153 | | NS_IMETHODIMP |
154 | | nsMozIconURI::GetHasRef(bool* result) |
155 | 0 | { |
156 | 0 | *result = false; |
157 | 0 | return NS_OK; |
158 | 0 | } |
159 | | |
160 | | NS_IMPL_ISUPPORTS(nsMozIconURI::Mutator, nsIURISetters, nsIURIMutator) |
161 | | |
162 | | NS_IMETHODIMP |
163 | | nsMozIconURI::Mutate(nsIURIMutator** aMutator) |
164 | 0 | { |
165 | 0 | RefPtr<nsMozIconURI::Mutator> mutator = new nsMozIconURI::Mutator(); |
166 | 0 | nsresult rv = mutator->InitFromURI(this); |
167 | 0 | if (NS_FAILED(rv)) { |
168 | 0 | return rv; |
169 | 0 | } |
170 | 0 | mutator.forget(aMutator); |
171 | 0 | return NS_OK; |
172 | 0 | } |
173 | | |
174 | | // takes a string like ?size=32&contentType=text/html and returns a new string |
175 | | // containing just the attribute value. i.e you could pass in this string with |
176 | | // an attribute name of 'size=', this will return 32 |
177 | | // Assumption: attribute pairs in the string are separated by '&'. |
178 | | void |
179 | | extractAttributeValue(const char* aSearchString, |
180 | | const char* aAttributeName, |
181 | | nsCString& aResult) |
182 | 0 | { |
183 | 0 | //NS_ENSURE_ARG_POINTER(extractAttributeValue); |
184 | 0 |
|
185 | 0 | aResult.Truncate(); |
186 | 0 |
|
187 | 0 | if (aSearchString && aAttributeName) { |
188 | 0 | // search the string for attributeName |
189 | 0 | uint32_t attributeNameSize = strlen(aAttributeName); |
190 | 0 | const char* startOfAttribute = PL_strcasestr(aSearchString, aAttributeName); |
191 | 0 | if (startOfAttribute && |
192 | 0 | ( *(startOfAttribute-1) == '?' || *(startOfAttribute-1) == '&') ) { |
193 | 0 | startOfAttribute += attributeNameSize; // skip over the attributeName |
194 | 0 | // is there something after the attribute name |
195 | 0 | if (*startOfAttribute) { |
196 | 0 | const char* endofAttribute = strchr(startOfAttribute, '&'); |
197 | 0 | if (endofAttribute) { |
198 | 0 | aResult.Assign(Substring(startOfAttribute, endofAttribute)); |
199 | 0 | } else { |
200 | 0 | aResult.Assign(startOfAttribute); |
201 | 0 | } |
202 | 0 | } // if we have a attribute value |
203 | 0 | } // if we have a attribute name |
204 | 0 | } // if we got non-null search string and attribute name values |
205 | 0 | } |
206 | | |
207 | | nsresult |
208 | | nsMozIconURI::SetSpecInternal(const nsACString& aSpec) |
209 | 0 | { |
210 | 0 | // Reset everything to default values. |
211 | 0 | mIconURL = nullptr; |
212 | 0 | mSize = DEFAULT_IMAGE_SIZE; |
213 | 0 | mContentType.Truncate(); |
214 | 0 | mFileName.Truncate(); |
215 | 0 | mStockIcon.Truncate(); |
216 | 0 | mIconSize = -1; |
217 | 0 | mIconState = -1; |
218 | 0 |
|
219 | 0 | nsAutoCString iconSpec(aSpec); |
220 | 0 | if (!Substring(iconSpec, 0, |
221 | 0 | MOZICON_SCHEME_LEN).EqualsLiteral(MOZICON_SCHEME) || |
222 | 0 | (!Substring(iconSpec, MOZICON_SCHEME_LEN, 7).EqualsLiteral("file://") && |
223 | 0 | // Checking for the leading '//' will match both the '//stock/' and '//.foo' cases: |
224 | 0 | !Substring(iconSpec, MOZICON_SCHEME_LEN, 2).EqualsLiteral("//"))) { |
225 | 0 | return NS_ERROR_MALFORMED_URI; |
226 | 0 | } |
227 | 0 | |
228 | 0 | int32_t questionMarkPos = iconSpec.Find("?"); |
229 | 0 | if (questionMarkPos != -1 && |
230 | 0 | static_cast<int32_t>(iconSpec.Length()) > (questionMarkPos + 1)) { |
231 | 0 | extractAttributeValue(iconSpec.get(), "contentType=", mContentType); |
232 | 0 |
|
233 | 0 | nsAutoCString sizeString; |
234 | 0 | extractAttributeValue(iconSpec.get(), "size=", sizeString); |
235 | 0 | if (!sizeString.IsEmpty()) { |
236 | 0 | const char* sizeStr = sizeString.get(); |
237 | 0 | for (uint32_t i = 0; i < ArrayLength(kSizeStrings); i++) { |
238 | 0 | if (PL_strcasecmp(sizeStr, kSizeStrings[i]) == 0) { |
239 | 0 | mIconSize = i; |
240 | 0 | break; |
241 | 0 | } |
242 | 0 | } |
243 | 0 |
|
244 | 0 | int32_t sizeValue = atoi(sizeString.get()); |
245 | 0 | if (sizeValue > 0) { |
246 | 0 | mSize = sizeValue; |
247 | 0 | } |
248 | 0 | } |
249 | 0 |
|
250 | 0 | nsAutoCString stateString; |
251 | 0 | extractAttributeValue(iconSpec.get(), "state=", stateString); |
252 | 0 | if (!stateString.IsEmpty()) { |
253 | 0 | const char* stateStr = stateString.get(); |
254 | 0 | for (uint32_t i = 0; i < ArrayLength(kStateStrings); i++) { |
255 | 0 | if (PL_strcasecmp(stateStr, kStateStrings[i]) == 0) { |
256 | 0 | mIconState = i; |
257 | 0 | break; |
258 | 0 | } |
259 | 0 | } |
260 | 0 | } |
261 | 0 | } |
262 | 0 |
|
263 | 0 | int32_t pathLength = iconSpec.Length() - MOZICON_SCHEME_LEN; |
264 | 0 | if (questionMarkPos != -1) { |
265 | 0 | pathLength = questionMarkPos - MOZICON_SCHEME_LEN; |
266 | 0 | } |
267 | 0 | if (pathLength < 3) { |
268 | 0 | return NS_ERROR_MALFORMED_URI; |
269 | 0 | } |
270 | 0 | |
271 | 0 | nsAutoCString iconPath(Substring(iconSpec, MOZICON_SCHEME_LEN, pathLength)); |
272 | 0 |
|
273 | 0 | // Icon URI path can have three forms: |
274 | 0 | // (1) //stock/<icon-identifier> |
275 | 0 | // (2) //<some dummy file with an extension> |
276 | 0 | // (3) a valid URL |
277 | 0 |
|
278 | 0 | if (!strncmp("//stock/", iconPath.get(), 8)) { |
279 | 0 | mStockIcon.Assign(Substring(iconPath, 8)); |
280 | 0 | // An icon identifier must always be specified. |
281 | 0 | if (mStockIcon.IsEmpty()) { |
282 | 0 | return NS_ERROR_MALFORMED_URI; |
283 | 0 | } |
284 | 0 | return NS_OK; |
285 | 0 | } |
286 | 0 | |
287 | 0 | if (StringBeginsWith(iconPath, NS_LITERAL_CSTRING("//"))) { |
288 | 0 | // Sanity check this supposed dummy file name. |
289 | 0 | if (iconPath.Length() > SANE_FILE_NAME_LEN) { |
290 | 0 | return NS_ERROR_MALFORMED_URI; |
291 | 0 | } |
292 | 0 | iconPath.Cut(0, 2); |
293 | 0 | mFileName.Assign(iconPath); |
294 | 0 | } |
295 | 0 |
|
296 | 0 | nsresult rv; |
297 | 0 | nsCOMPtr<nsIIOService> ioService(do_GetService(NS_IOSERVICE_CONTRACTID, &rv)); |
298 | 0 | NS_ENSURE_SUCCESS(rv, rv); |
299 | 0 |
|
300 | 0 | nsCOMPtr<nsIURI> uri; |
301 | 0 | ioService->NewURI(iconPath, nullptr, nullptr, getter_AddRefs(uri)); |
302 | 0 | mIconURL = do_QueryInterface(uri); |
303 | 0 | if (mIconURL) { |
304 | 0 | // The inner URI should be a 'file:' one. If not, bail. |
305 | 0 | bool isFile = false; |
306 | 0 | if (!NS_SUCCEEDED(mIconURL->SchemeIs("file", &isFile)) || !isFile) { |
307 | 0 | return NS_ERROR_MALFORMED_URI; |
308 | 0 | } |
309 | 0 | mFileName.Truncate(); |
310 | 0 | } else if (mFileName.IsEmpty()) { |
311 | 0 | return NS_ERROR_MALFORMED_URI; |
312 | 0 | } |
313 | 0 | |
314 | 0 | return NS_OK; |
315 | 0 | } |
316 | | |
317 | | NS_IMETHODIMP |
318 | | nsMozIconURI::GetPrePath(nsACString& prePath) |
319 | 0 | { |
320 | 0 | prePath = MOZICON_SCHEME; |
321 | 0 | return NS_OK; |
322 | 0 | } |
323 | | |
324 | | NS_IMETHODIMP |
325 | | nsMozIconURI::GetScheme(nsACString& aScheme) |
326 | 0 | { |
327 | 0 | aScheme = "moz-icon"; |
328 | 0 | return NS_OK; |
329 | 0 | } |
330 | | |
331 | | nsresult |
332 | | nsMozIconURI::SetScheme(const nsACString& aScheme) |
333 | 0 | { |
334 | 0 | // doesn't make sense to set the scheme of a moz-icon URL |
335 | 0 | return NS_ERROR_FAILURE; |
336 | 0 | } |
337 | | |
338 | | NS_IMETHODIMP |
339 | | nsMozIconURI::GetUsername(nsACString& aUsername) |
340 | 0 | { |
341 | 0 | return NS_ERROR_FAILURE; |
342 | 0 | } |
343 | | |
344 | | nsresult |
345 | | nsMozIconURI::SetUsername(const nsACString& aUsername) |
346 | 0 | { |
347 | 0 | return NS_ERROR_FAILURE; |
348 | 0 | } |
349 | | |
350 | | NS_IMETHODIMP |
351 | | nsMozIconURI::GetPassword(nsACString& aPassword) |
352 | 0 | { |
353 | 0 | return NS_ERROR_FAILURE; |
354 | 0 | } |
355 | | |
356 | | nsresult |
357 | | nsMozIconURI::SetPassword(const nsACString& aPassword) |
358 | 0 | { |
359 | 0 | return NS_ERROR_FAILURE; |
360 | 0 | } |
361 | | |
362 | | NS_IMETHODIMP |
363 | | nsMozIconURI::GetUserPass(nsACString& aUserPass) |
364 | 0 | { |
365 | 0 | return NS_ERROR_FAILURE; |
366 | 0 | } |
367 | | |
368 | | nsresult |
369 | | nsMozIconURI::SetUserPass(const nsACString& aUserPass) |
370 | 0 | { |
371 | 0 | return NS_ERROR_FAILURE; |
372 | 0 | } |
373 | | |
374 | | NS_IMETHODIMP |
375 | | nsMozIconURI::GetHostPort(nsACString& aHostPort) |
376 | 0 | { |
377 | 0 | return NS_ERROR_FAILURE; |
378 | 0 | } |
379 | | |
380 | | nsresult |
381 | | nsMozIconURI::SetHostPort(const nsACString& aHostPort) |
382 | 0 | { |
383 | 0 | return NS_ERROR_FAILURE; |
384 | 0 | } |
385 | | |
386 | | NS_IMETHODIMP |
387 | | nsMozIconURI::GetHost(nsACString& aHost) |
388 | 0 | { |
389 | 0 | return NS_ERROR_FAILURE; |
390 | 0 | } |
391 | | |
392 | | nsresult |
393 | | nsMozIconURI::SetHost(const nsACString& aHost) |
394 | 0 | { |
395 | 0 | return NS_ERROR_FAILURE; |
396 | 0 | } |
397 | | |
398 | | NS_IMETHODIMP |
399 | | nsMozIconURI::GetPort(int32_t* aPort) |
400 | 0 | { |
401 | 0 | return NS_ERROR_FAILURE; |
402 | 0 | } |
403 | | |
404 | | nsresult |
405 | | nsMozIconURI::SetPort(int32_t aPort) |
406 | 0 | { |
407 | 0 | return NS_ERROR_FAILURE; |
408 | 0 | } |
409 | | |
410 | | NS_IMETHODIMP |
411 | | nsMozIconURI::GetPathQueryRef(nsACString& aPath) |
412 | 0 | { |
413 | 0 | aPath.Truncate(); |
414 | 0 | return NS_OK; |
415 | 0 | } |
416 | | |
417 | | nsresult |
418 | | nsMozIconURI::SetPathQueryRef(const nsACString& aPath) |
419 | 0 | { |
420 | 0 | return NS_ERROR_FAILURE; |
421 | 0 | } |
422 | | |
423 | | NS_IMETHODIMP |
424 | | nsMozIconURI::GetFilePath(nsACString& aFilePath) |
425 | 0 | { |
426 | 0 | aFilePath.Truncate(); |
427 | 0 | return NS_OK; |
428 | 0 | } |
429 | | |
430 | | nsresult |
431 | | nsMozIconURI::SetFilePath(const nsACString& aFilePath) |
432 | 0 | { |
433 | 0 | return NS_ERROR_FAILURE; |
434 | 0 | } |
435 | | |
436 | | NS_IMETHODIMP |
437 | | nsMozIconURI::GetQuery(nsACString& aQuery) |
438 | 0 | { |
439 | 0 | aQuery.Truncate(); |
440 | 0 | return NS_OK; |
441 | 0 | } |
442 | | |
443 | | nsresult |
444 | | nsMozIconURI::SetQuery(const nsACString& aQuery) |
445 | 0 | { |
446 | 0 | return NS_ERROR_FAILURE; |
447 | 0 | } |
448 | | |
449 | | nsresult |
450 | | nsMozIconURI::SetQueryWithEncoding(const nsACString& aQuery, |
451 | | const Encoding* aEncoding) |
452 | 0 | { |
453 | 0 | return NS_ERROR_FAILURE; |
454 | 0 | } |
455 | | |
456 | | NS_IMETHODIMP |
457 | | nsMozIconURI::GetRef(nsACString& aRef) |
458 | 0 | { |
459 | 0 | aRef.Truncate(); |
460 | 0 | return NS_OK; |
461 | 0 | } |
462 | | |
463 | | nsresult |
464 | | nsMozIconURI::SetRef(const nsACString& aRef) |
465 | 0 | { |
466 | 0 | return NS_ERROR_FAILURE; |
467 | 0 | } |
468 | | |
469 | | NS_IMETHODIMP |
470 | | nsMozIconURI::Equals(nsIURI* other, bool* result) |
471 | 0 | { |
472 | 0 | *result = false; |
473 | 0 | NS_ENSURE_ARG_POINTER(other); |
474 | 0 | MOZ_ASSERT(result, "null pointer"); |
475 | 0 |
|
476 | 0 | nsAutoCString spec1; |
477 | 0 | nsAutoCString spec2; |
478 | 0 |
|
479 | 0 | nsresult rv = GetSpec(spec1); |
480 | 0 | NS_ENSURE_SUCCESS(rv, rv); |
481 | 0 | rv = other->GetSpec(spec2); |
482 | 0 | NS_ENSURE_SUCCESS(rv, rv); |
483 | 0 |
|
484 | 0 | if (!PL_strcasecmp(spec1.get(), spec2.get())) { |
485 | 0 | *result = true; |
486 | 0 | } else { |
487 | 0 | *result = false; |
488 | 0 | } |
489 | 0 | return NS_OK; |
490 | 0 | } |
491 | | |
492 | | NS_IMETHODIMP |
493 | | nsMozIconURI::EqualsExceptRef(nsIURI* other, bool* result) |
494 | 0 | { |
495 | 0 | // GetRef/SetRef not supported by nsMozIconURI, so |
496 | 0 | // EqualsExceptRef() is the same as Equals(). |
497 | 0 | return Equals(other, result); |
498 | 0 | } |
499 | | |
500 | | NS_IMETHODIMP |
501 | | nsMozIconURI::SchemeIs(const char* aScheme, bool* aEquals) |
502 | 0 | { |
503 | 0 | NS_ENSURE_ARG_POINTER(aEquals); |
504 | 0 | if (!aScheme) { |
505 | 0 | return NS_ERROR_INVALID_ARG; |
506 | 0 | } |
507 | 0 | |
508 | 0 | *aEquals = PL_strcasecmp("moz-icon", aScheme) ? false : true; |
509 | 0 | return NS_OK; |
510 | 0 | } |
511 | | |
512 | | nsresult |
513 | | nsMozIconURI::Clone(nsIURI** result) |
514 | 0 | { |
515 | 0 | nsresult rv; |
516 | 0 | nsCOMPtr<nsIURL> newIconURL; |
517 | 0 | if (mIconURL) { |
518 | 0 | newIconURL = do_QueryInterface(mIconURL, &rv); |
519 | 0 | if (NS_FAILED(rv)) { |
520 | 0 | return rv; |
521 | 0 | } |
522 | 0 | } |
523 | 0 | |
524 | 0 | RefPtr<nsMozIconURI> uri = new nsMozIconURI(); |
525 | 0 | newIconURL.swap(uri->mIconURL); |
526 | 0 | uri->mSize = mSize; |
527 | 0 | uri->mContentType = mContentType; |
528 | 0 | uri->mFileName = mFileName; |
529 | 0 | uri->mStockIcon = mStockIcon; |
530 | 0 | uri->mIconSize = mIconSize; |
531 | 0 | uri->mIconState = mIconState; |
532 | 0 | uri.forget(result); |
533 | 0 |
|
534 | 0 | return NS_OK; |
535 | 0 | } |
536 | | |
537 | | NS_IMETHODIMP |
538 | | nsMozIconURI::Resolve(const nsACString& relativePath, nsACString& result) |
539 | 0 | { |
540 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
541 | 0 | } |
542 | | |
543 | | NS_IMETHODIMP |
544 | | nsMozIconURI::GetAsciiSpec(nsACString& aSpecA) |
545 | 0 | { |
546 | 0 | return GetSpec(aSpecA); |
547 | 0 | } |
548 | | |
549 | | NS_IMETHODIMP |
550 | | nsMozIconURI::GetAsciiHostPort(nsACString& aHostPortA) |
551 | 0 | { |
552 | 0 | return GetHostPort(aHostPortA); |
553 | 0 | } |
554 | | |
555 | | NS_IMETHODIMP |
556 | | nsMozIconURI::GetAsciiHost(nsACString& aHostA) |
557 | 0 | { |
558 | 0 | return GetHost(aHostA); |
559 | 0 | } |
560 | | |
561 | | //////////////////////////////////////////////////////////////////////////////// |
562 | | // nsIIconUri methods: |
563 | | |
564 | | NS_IMETHODIMP |
565 | | nsMozIconURI::GetIconURL(nsIURL** aFileUrl) |
566 | 0 | { |
567 | 0 | *aFileUrl = mIconURL; |
568 | 0 | NS_IF_ADDREF(*aFileUrl); |
569 | 0 | return NS_OK; |
570 | 0 | } |
571 | | |
572 | | NS_IMETHODIMP |
573 | | nsMozIconURI::GetImageSize(uint32_t* aImageSize) |
574 | | // measured by # of pixels in a row. defaults to 16. |
575 | 0 | { |
576 | 0 | *aImageSize = mSize; |
577 | 0 | return NS_OK; |
578 | 0 | } |
579 | | |
580 | | NS_IMETHODIMP |
581 | | nsMozIconURI::GetContentType(nsACString& aContentType) |
582 | 0 | { |
583 | 0 | aContentType = mContentType; |
584 | 0 | return NS_OK; |
585 | 0 | } |
586 | | |
587 | | NS_IMETHODIMP |
588 | | nsMozIconURI::GetFileExtension(nsACString& aFileExtension) |
589 | 0 | { |
590 | 0 | // First, try to get the extension from mIconURL if we have one |
591 | 0 | if (mIconURL) { |
592 | 0 | nsAutoCString fileExt; |
593 | 0 | if (NS_SUCCEEDED(mIconURL->GetFileExtension(fileExt))) { |
594 | 0 | if (!fileExt.IsEmpty()) { |
595 | 0 | // unfortunately, this code doesn't give us the required '.' in |
596 | 0 | // front of the extension so we have to do it ourselves. |
597 | 0 | aFileExtension.Assign('.'); |
598 | 0 | aFileExtension.Append(fileExt); |
599 | 0 | } |
600 | 0 | } |
601 | 0 | return NS_OK; |
602 | 0 | } |
603 | 0 |
|
604 | 0 | if (!mFileName.IsEmpty()) { |
605 | 0 | // truncate the extension out of the file path... |
606 | 0 | const char* chFileName = mFileName.get(); // get the underlying buffer |
607 | 0 | const char* fileExt = strrchr(chFileName, '.'); |
608 | 0 | if (!fileExt) { |
609 | 0 | return NS_OK; |
610 | 0 | } |
611 | 0 | aFileExtension = fileExt; |
612 | 0 | } |
613 | 0 |
|
614 | 0 | return NS_OK; |
615 | 0 | } |
616 | | |
617 | | NS_IMETHODIMP |
618 | | nsMozIconURI::GetStockIcon(nsACString& aStockIcon) |
619 | 0 | { |
620 | 0 | aStockIcon = mStockIcon; |
621 | 0 | return NS_OK; |
622 | 0 | } |
623 | | |
624 | | NS_IMETHODIMP |
625 | | nsMozIconURI::GetIconSize(nsACString& aSize) |
626 | 0 | { |
627 | 0 | if (mIconSize >= 0) { |
628 | 0 | aSize = kSizeStrings[mIconSize]; |
629 | 0 | } else { |
630 | 0 | aSize.Truncate(); |
631 | 0 | } |
632 | 0 | return NS_OK; |
633 | 0 | } |
634 | | |
635 | | NS_IMETHODIMP |
636 | | nsMozIconURI::GetIconState(nsACString& aState) |
637 | 0 | { |
638 | 0 | if (mIconState >= 0) { |
639 | 0 | aState = kStateStrings[mIconState]; |
640 | 0 | } else { |
641 | 0 | aState.Truncate(); |
642 | 0 | } |
643 | 0 | return NS_OK; |
644 | 0 | } |
645 | | //////////////////////////////////////////////////////////////////////////////// |
646 | | // nsIIPCSerializableURI methods: |
647 | | |
648 | | void |
649 | | nsMozIconURI::Serialize(URIParams& aParams) |
650 | 0 | { |
651 | 0 | IconURIParams params; |
652 | 0 |
|
653 | 0 | if (mIconURL) { |
654 | 0 | URIParams iconURLParams; |
655 | 0 | SerializeURI(mIconURL, iconURLParams); |
656 | 0 | if (iconURLParams.type() == URIParams::T__None) { |
657 | 0 | // Serialization failed, bail. |
658 | 0 | return; |
659 | 0 | } |
660 | 0 | |
661 | 0 | params.uri() = iconURLParams; |
662 | 0 | } else { |
663 | 0 | params.uri() = void_t(); |
664 | 0 | } |
665 | 0 |
|
666 | 0 | params.size() = mSize; |
667 | 0 | params.fileName() = mFileName; |
668 | 0 | params.stockIcon() = mStockIcon; |
669 | 0 | params.iconSize() = mIconSize; |
670 | 0 | params.iconState() = mIconState; |
671 | 0 |
|
672 | 0 | aParams = params; |
673 | 0 | } |
674 | | |
675 | | bool |
676 | | nsMozIconURI::Deserialize(const URIParams& aParams) |
677 | 0 | { |
678 | 0 | if (aParams.type() != URIParams::TIconURIParams) { |
679 | 0 | MOZ_ASSERT_UNREACHABLE("Received unknown URI from other process!"); |
680 | 0 | return false; |
681 | 0 | } |
682 | 0 |
|
683 | 0 | const IconURIParams& params = aParams.get_IconURIParams(); |
684 | 0 | if (params.uri().type() != OptionalURIParams::Tvoid_t) { |
685 | 0 | nsCOMPtr<nsIURI> uri = DeserializeURI(params.uri().get_URIParams()); |
686 | 0 | mIconURL = do_QueryInterface(uri); |
687 | 0 | if (!mIconURL) { |
688 | 0 | MOZ_ASSERT_UNREACHABLE("bad nsIURI passed"); |
689 | 0 | return false; |
690 | 0 | } |
691 | 0 | } |
692 | 0 |
|
693 | 0 | mSize = params.size(); |
694 | 0 | mContentType = params.contentType(); |
695 | 0 | mFileName = params.fileName(); |
696 | 0 | mStockIcon = params.stockIcon(); |
697 | 0 |
|
698 | 0 | if (params.iconSize() < -1 || |
699 | 0 | params.iconSize() >= (int32_t) ArrayLength(kSizeStrings)) { |
700 | 0 | return false; |
701 | 0 | } |
702 | 0 | mIconSize = params.iconSize(); |
703 | 0 |
|
704 | 0 | if (params.iconState() < -1 || |
705 | 0 | params.iconState() >= (int32_t) ArrayLength(kStateStrings)) { |
706 | 0 | return false; |
707 | 0 | } |
708 | 0 | mIconState = params.iconState(); |
709 | 0 |
|
710 | 0 | return true; |
711 | 0 | } |
712 | | |
713 | | NS_IMETHODIMP |
714 | | nsMozIconURI::GetInnerURI(nsIURI** aURI) |
715 | 0 | { |
716 | 0 | nsCOMPtr<nsIURI> iconURL = do_QueryInterface(mIconURL); |
717 | 0 | if (!iconURL) { |
718 | 0 | *aURI = nullptr; |
719 | 0 | return NS_ERROR_FAILURE; |
720 | 0 | } |
721 | 0 | |
722 | 0 | iconURL.forget(aURI); |
723 | 0 | return NS_OK; |
724 | 0 | } |
725 | | |
726 | | NS_IMETHODIMP |
727 | | nsMozIconURI::GetInnermostURI(nsIURI** aURI) |
728 | 0 | { |
729 | 0 | return NS_ImplGetInnermostURI(this, aURI); |
730 | 0 | } |