Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
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 : #include "nsIconProtocolHandler.h"
8 :
9 : #include "nsIconChannel.h"
10 : #include "nsIconURI.h"
11 : #include "nsIURL.h"
12 : #include "nsCRT.h"
13 : #include "nsCOMPtr.h"
14 : #include "nsIComponentManager.h"
15 : #include "nsIServiceManager.h"
16 : #include "nsNetCID.h"
17 :
18 : ///////////////////////////////////////////////////////////////////////////////
19 :
20 3 : nsIconProtocolHandler::nsIconProtocolHandler()
21 3 : { }
22 :
23 0 : nsIconProtocolHandler::~nsIconProtocolHandler()
24 0 : { }
25 :
26 43 : NS_IMPL_ISUPPORTS(nsIconProtocolHandler, nsIProtocolHandler,
27 : nsISupportsWeakReference)
28 :
29 :
30 : ///////////////////////////////////////////////////////////////////////////////
31 : // nsIProtocolHandler methods:
32 :
33 : NS_IMETHODIMP
34 0 : nsIconProtocolHandler::GetScheme(nsACString& result)
35 : {
36 0 : result = "moz-icon";
37 0 : return NS_OK;
38 : }
39 :
40 : NS_IMETHODIMP
41 0 : nsIconProtocolHandler::GetDefaultPort(int32_t* result)
42 : {
43 0 : *result = 0;
44 0 : return NS_OK;
45 : }
46 :
47 : NS_IMETHODIMP
48 0 : nsIconProtocolHandler::AllowPort(int32_t port,
49 : const char* scheme,
50 : bool* _retval)
51 : {
52 : // don't override anything.
53 0 : *_retval = false;
54 0 : return NS_OK;
55 : }
56 :
57 : NS_IMETHODIMP
58 1 : nsIconProtocolHandler::GetProtocolFlags(uint32_t* result)
59 : {
60 1 : *result = URI_NORELATIVE | URI_NOAUTH | URI_IS_UI_RESOURCE |
61 : URI_IS_LOCAL_RESOURCE;
62 1 : return NS_OK;
63 : }
64 :
65 : NS_IMETHODIMP
66 3 : nsIconProtocolHandler::NewURI(const nsACString& aSpec,
67 : const char* aOriginCharset, // ignored
68 : nsIURI* aBaseURI,
69 : nsIURI** result)
70 : {
71 6 : nsCOMPtr<nsIMozIconURI> uri = new nsMozIconURI();
72 3 : if (!uri) return NS_ERROR_OUT_OF_MEMORY;
73 :
74 3 : nsresult rv = uri->SetSpec(aSpec);
75 3 : if (NS_FAILED(rv)) return rv;
76 :
77 6 : nsCOMPtr<nsIURL> iconURL;
78 3 : uri->GetIconURL(getter_AddRefs(iconURL));
79 3 : if (iconURL) {
80 0 : uri = new nsNestedMozIconURI();
81 0 : rv = uri->SetSpec(aSpec);
82 0 : if (NS_FAILED(rv)) {
83 0 : return rv;
84 : }
85 : }
86 :
87 3 : NS_ADDREF(*result = uri);
88 3 : return NS_OK;
89 : }
90 :
91 : NS_IMETHODIMP
92 0 : nsIconProtocolHandler::NewChannel2(nsIURI* url,
93 : nsILoadInfo* aLoadInfo,
94 : nsIChannel** result)
95 : {
96 0 : NS_ENSURE_ARG_POINTER(url);
97 0 : nsIconChannel* channel = new nsIconChannel;
98 0 : if (!channel) {
99 0 : return NS_ERROR_OUT_OF_MEMORY;
100 : }
101 0 : NS_ADDREF(channel);
102 :
103 0 : nsresult rv = channel->Init(url);
104 0 : if (NS_FAILED(rv)) {
105 0 : NS_RELEASE(channel);
106 0 : return rv;
107 : }
108 :
109 : // set the loadInfo on the new channel
110 0 : rv = channel->SetLoadInfo(aLoadInfo);
111 0 : if (NS_FAILED(rv)) {
112 0 : NS_RELEASE(channel);
113 0 : return rv;
114 : }
115 :
116 0 : *result = channel;
117 0 : return NS_OK;
118 : }
119 :
120 : NS_IMETHODIMP
121 0 : nsIconProtocolHandler::NewChannel(nsIURI* url, nsIChannel** result)
122 : {
123 0 : return NewChannel2(url, nullptr, result);
124 : }
125 :
126 : ////////////////////////////////////////////////////////////////////////////////
|