1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "mozilla/ClearOnShutdown.h"
8 #include "nsJARProtocolHandler.h"
11 #include "nsJARChannel.h"
14 #include "nsIMIMEService.h"
15 #include "nsMimeTypes.h"
16 #include "nsThreadUtils.h"
18 static NS_DEFINE_CID(kZipReaderCacheCID
, NS_ZIPREADERCACHE_CID
);
20 #define NS_JAR_CACHE_SIZE 32
22 //-----------------------------------------------------------------------------
24 StaticRefPtr
<nsJARProtocolHandler
> gJarHandler
;
26 nsJARProtocolHandler::nsJARProtocolHandler() { MOZ_ASSERT(NS_IsMainThread()); }
28 nsJARProtocolHandler::~nsJARProtocolHandler() {}
30 nsresult
nsJARProtocolHandler::Init() {
33 mJARCache
= do_CreateInstance(kZipReaderCacheCID
, &rv
);
34 if (NS_FAILED(rv
)) return rv
;
36 rv
= mJARCache
->Init(NS_JAR_CACHE_SIZE
);
40 nsIMIMEService
* nsJARProtocolHandler::MimeService() {
41 if (!mMimeService
) mMimeService
= do_GetService("@mozilla.org/mime;1");
43 return mMimeService
.get();
46 NS_IMPL_ISUPPORTS(nsJARProtocolHandler
, nsIProtocolHandler
,
47 nsISupportsWeakReference
)
49 already_AddRefed
<nsJARProtocolHandler
> nsJARProtocolHandler::GetSingleton() {
51 gJarHandler
= new nsJARProtocolHandler();
52 if (NS_SUCCEEDED(gJarHandler
->Init())) {
53 ClearOnShutdown(&gJarHandler
);
55 gJarHandler
= nullptr;
58 return do_AddRef(gJarHandler
);
61 ////////////////////////////////////////////////////////////////////////////////
62 // nsIProtocolHandler methods:
65 nsJARProtocolHandler::GetScheme(nsACString
& result
) {
66 result
.AssignLiteral("jar");
71 nsJARProtocolHandler::GetDefaultPort(int32_t* result
) {
72 *result
= -1; // no port for JAR: URLs
77 nsJARProtocolHandler::GetProtocolFlags(uint32_t* result
) {
78 // URI_LOADABLE_BY_ANYONE, since it's our inner URI that will matter
80 *result
= URI_NORELATIVE
| URI_NOAUTH
| URI_LOADABLE_BY_ANYONE
;
81 /* Although jar uris have their own concept of relative urls
82 it is very different from the standard behaviour, so we
83 have to say norelative here! */
88 nsJARProtocolHandler::NewChannel(nsIURI
* uri
, nsILoadInfo
* aLoadInfo
,
89 nsIChannel
** result
) {
90 nsJARChannel
* chan
= new nsJARChannel();
91 if (!chan
) return NS_ERROR_OUT_OF_MEMORY
;
94 nsresult rv
= chan
->Init(uri
);
100 // set the loadInfo on the new channel
101 rv
= chan
->SetLoadInfo(aLoadInfo
);
112 nsJARProtocolHandler::AllowPort(int32_t port
, const char* scheme
,
114 // don't override anything.
119 ////////////////////////////////////////////////////////////////////////////////