1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=4 sw=2 sts=2 et cin: */
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/. */
7 #include "nsAndroidProtocolHandler.h"
9 #include "nsIChannel.h"
10 #include "nsIIOService.h"
11 #include "nsIStandardURL.h"
13 #include "nsIURIMutator.h"
14 #include "android/log.h"
15 #include "nsBaseChannel.h"
16 #include "AndroidBridge.h"
17 #include "GeneratedJNIWrappers.h"
19 using namespace mozilla
;
21 class AndroidInputStream
: public nsIInputStream
{
23 explicit AndroidInputStream(jni::Object::Param connection
) {
24 mBridgeInputStream
= java::GeckoAppShell::CreateInputStream(connection
);
25 mBridgeChannel
= AndroidBridge::ChannelCreate(mBridgeInputStream
);
29 virtual ~AndroidInputStream() {}
32 NS_DECL_THREADSAFE_ISUPPORTS
33 NS_DECL_NSIINPUTSTREAM
36 jni::Object::GlobalRef mBridgeInputStream
;
37 jni::Object::GlobalRef mBridgeChannel
;
40 NS_IMPL_ISUPPORTS(AndroidInputStream
, nsIInputStream
)
42 NS_IMETHODIMP
AndroidInputStream::Close(void) {
43 AndroidBridge::InputStreamClose(mBridgeInputStream
);
47 NS_IMETHODIMP
AndroidInputStream::Available(uint64_t *_retval
) {
48 *_retval
= AndroidBridge::InputStreamAvailable(mBridgeInputStream
);
52 NS_IMETHODIMP
AndroidInputStream::Read(char *aBuf
, uint32_t aCount
,
54 return AndroidBridge::InputStreamRead(mBridgeChannel
, aBuf
, aCount
, _retval
);
57 NS_IMETHODIMP
AndroidInputStream::ReadSegments(nsWriteSegmentFun aWriter
,
58 void *aClosure
, uint32_t aCount
,
60 return NS_ERROR_NOT_IMPLEMENTED
;
63 NS_IMETHODIMP
AndroidInputStream::IsNonBlocking(bool *_retval
) {
68 class AndroidChannel
: public nsBaseChannel
{
70 AndroidChannel(nsIURI
*aURI
, jni::Object::Param aConnection
) {
71 mConnection
= aConnection
;
74 auto type
= java::GeckoAppShell::ConnectionGetMimeType(mConnection
);
76 SetContentType(type
->ToCString());
81 static AndroidChannel
*CreateChannel(nsIURI
*aURI
) {
85 auto connection
= java::GeckoAppShell::GetConnection(spec
);
86 return connection
? new AndroidChannel(aURI
, connection
) : nullptr;
89 virtual ~AndroidChannel() {}
91 virtual nsresult
OpenContentStream(bool async
, nsIInputStream
**result
,
92 nsIChannel
**channel
) {
93 nsCOMPtr
<nsIInputStream
> stream
= new AndroidInputStream(mConnection
);
94 NS_ADDREF(*result
= stream
);
99 jni::Object::GlobalRef mConnection
;
102 NS_IMPL_ISUPPORTS(nsAndroidProtocolHandler
, nsIProtocolHandler
,
103 nsISupportsWeakReference
)
106 nsAndroidProtocolHandler::GetScheme(nsACString
&result
) {
107 result
.AssignLiteral("android");
112 nsAndroidProtocolHandler::GetDefaultPort(int32_t *result
) {
113 *result
= -1; // no port for android: URLs
118 nsAndroidProtocolHandler::AllowPort(int32_t port
, const char *scheme
,
120 // don't override anything.
126 nsAndroidProtocolHandler::GetProtocolFlags(uint32_t *result
) {
127 *result
= URI_STD
| URI_IS_UI_RESOURCE
| URI_IS_LOCAL_RESOURCE
|
128 URI_NORELATIVE
| URI_DANGEROUS_TO_LOAD
;
133 nsAndroidProtocolHandler::NewURI(const nsACString
&aSpec
, const char *aCharset
,
134 nsIURI
*aBaseURI
, nsIURI
**result
) {
135 nsCOMPtr
<nsIURI
> base(aBaseURI
);
136 return NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID
)
137 .Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init
,
138 nsIStandardURL::URLTYPE_STANDARD
, -1,
139 nsCString(aSpec
), aCharset
, base
, nullptr))
144 nsAndroidProtocolHandler::NewChannel(nsIURI
*aURI
, nsILoadInfo
*aLoadInfo
,
145 nsIChannel
**aResult
) {
146 nsCOMPtr
<nsIChannel
> channel
= AndroidChannel::CreateChannel(aURI
);
147 if (!channel
) return NS_ERROR_FAILURE
;
149 // set the loadInfo on the new channel
150 nsresult rv
= channel
->SetLoadInfo(aLoadInfo
);
151 NS_ENSURE_SUCCESS(rv
, rv
);
153 NS_ADDREF(*aResult
= channel
);