Index: jni/AndroidWebRequest.cpp |
diff --git a/jni/AndroidWebRequest.cpp b/jni/AndroidWebRequest.cpp |
deleted file mode 100644 |
index fb80bca0295d39d75b49efce64e20e5277274e6a..0000000000000000000000000000000000000000 |
--- a/jni/AndroidWebRequest.cpp |
+++ /dev/null |
@@ -1,323 +0,0 @@ |
-/* |
- * This file is part of Adblock Plus <http://adblockplus.org/>, |
- * Copyright (C) 2006-2014 Eyeo GmbH |
- * |
- * Adblock Plus is free software: you can redistribute it and/or modify |
- * it under the terms of the GNU General Public License version 3 as |
- * published by the Free Software Foundation. |
- * |
- * Adblock Plus is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
- */ |
- |
-#include <AdblockPlus.h> |
-#include "AndroidWebRequest.h" |
-#include "Utils.h" |
-#include "Debug.h" |
- |
-namespace |
-{ |
- std::string ExtractExceptionMessage(JNIEnv* env, jthrowable throwable) |
- { |
- jclass throwableClass = env->FindClass("java/lang/Throwable"); |
- jmethodID throwableToStringMethodId = env->GetMethodID(throwableClass, "toString", "()Ljava/lang/String;"); |
- jstring javaMessage = static_cast<jstring>(env->CallObjectMethod(throwable, throwableToStringMethodId)); |
- return "Java exception: " + GetString(env, javaMessage); |
- } |
- |
- class JavaException : public std::exception |
- { |
- public: |
- JavaException(JNIEnv* env) |
- : env(env), throwable(env->ExceptionOccurred()) |
- { |
- env->ExceptionClear(); |
- message = ExtractExceptionMessage(env, throwable); |
- } |
- |
- virtual ~JavaException() throw() |
- { |
- } |
- |
- const char* what() const throw() |
- { |
- return message.c_str(); |
- } |
- |
- bool IsInstanceOf(const std::string& className) const |
- { |
- jclass clazz = env->FindClass(className.c_str()); |
- if (!clazz) |
- return false; |
- bool isInstance = env->IsInstanceOf(throwable, clazz); |
- env->DeleteLocalRef(clazz); |
- return isInstance; |
- } |
- |
- private: |
- JNIEnv* env; |
- jthrowable throwable; |
- std::string message; |
- }; |
- |
- int64_t ExceptionToStatus(const JavaException& exception) |
- { |
- if (exception.IsInstanceOf("java/net/MalformedURLException")) |
- return AdblockPlus::WebRequest::NS_ERROR_MALFORMED_URI; |
- if (exception.IsInstanceOf("java/net/SocketTimeoutException")) |
- return AdblockPlus::WebRequest::NS_ERROR_NET_TIMEOUT; |
- return AdblockPlus::WebRequest::NS_ERROR_FAILURE; |
- } |
-} |
- |
-AndroidWebRequest::AndroidWebRequest(JavaVM*& gJvm) : globalJvm(gJvm) |
-{ |
- JNIEnv* jniEnv = NULL; |
- int stat = globalJvm->GetEnv((void **)&jniEnv, JNI_VERSION_1_6); |
- if (stat == JNI_EDETACHED) |
- { |
- if (globalJvm->AttachCurrentThread(&jniEnv, NULL) != 0) |
- throw std::runtime_error("Failed to get JNI environment"); |
- } |
- |
- jUrlClass = reinterpret_cast<jclass>(jniEnv->NewGlobalRef(jniEnv->FindClass("java/net/URL"))); |
- jUrlConstructorID = jniEnv->GetMethodID(jUrlClass, "<init>", "(Ljava/lang/String;)V"); |
- jUrlOpenConnectionID = jniEnv->GetMethodID(jUrlClass, "openConnection", "()Ljava/net/URLConnection;"); |
- jConnectionClass = reinterpret_cast<jclass>(jniEnv->NewGlobalRef(jniEnv->FindClass("java/net/HttpURLConnection"))); |
- jConnectionSetMethodID = jniEnv->GetMethodID(jConnectionClass, "setRequestMethod", "(Ljava/lang/String;)V"); |
- jConnectionSetRequestPropertyID = jniEnv->GetMethodID(jConnectionClass, "setRequestProperty", "(Ljava/lang/String;Ljava/lang/String;)V"); |
- jConnectionConnectID = jniEnv->GetMethodID(jConnectionClass, "connect", "()V"); |
- jConnectionGetContentLengthID = jniEnv->GetMethodID(jConnectionClass, "getContentLength", "()I"); |
- jConnectionGetResponseCodeID = jniEnv->GetMethodID(jConnectionClass, "getResponseCode", "()I"); |
- jConnectionGetContentEncodingID = jniEnv->GetMethodID(jConnectionClass, "getContentEncoding", "()Ljava/lang/String;"); |
- jConnectionGetInputStreamID = jniEnv->GetMethodID(jConnectionClass, "getInputStream", "()Ljava/io/InputStream;"); |
- jInputStreamReaderClass = reinterpret_cast<jclass>(jniEnv->NewGlobalRef(jniEnv->FindClass("java/io/InputStreamReader"))); |
- jInputStreamReaderConstructorID = jniEnv->GetMethodID(jInputStreamReaderClass, "<init>", "(Ljava/io/InputStream;Ljava/lang/String;)V"); |
- jBufferedReaderClass = reinterpret_cast<jclass>(jniEnv->NewGlobalRef(jniEnv->FindClass("java/io/BufferedReader"))); |
- jBufferedReaderConstructorID = jniEnv->GetMethodID(jBufferedReaderClass, "<init>", "(Ljava/io/Reader;)V"); |
- jStringBuilderClass = reinterpret_cast<jclass>(jniEnv->NewGlobalRef(jniEnv->FindClass("java/lang/StringBuilder"))); |
- jStringBuilderConstructorID = jniEnv->GetMethodID(jStringBuilderClass, "<init>", "()V"); |
- jBufferedReaderReadID = jniEnv->GetMethodID(jBufferedReaderClass, "read", "([CII)I"); |
- jStringBuilderAppendID = jniEnv->GetMethodID(jStringBuilderClass, "append", "([CII)Ljava/lang/StringBuilder;"); |
- jStringBuilderToStringID = jniEnv->GetMethodID(jStringBuilderClass, "toString", "()Ljava/lang/String;"); |
- jBufferedReaderCloseID = jniEnv->GetMethodID(jBufferedReaderClass, "close", "()V"); |
- jConnectionGetHeaderFieldKeyID = jniEnv->GetMethodID(jConnectionClass, "getHeaderField", "(I)Ljava/lang/String;"); |
- jConnectionGetHeaderFieldID = jniEnv->GetMethodID(jConnectionClass, "getHeaderFieldKey", "(I)Ljava/lang/String;"); |
- |
- if (stat == JNI_EDETACHED) |
- globalJvm->DetachCurrentThread(); |
-} |
- |
-AndroidWebRequest::~AndroidWebRequest() |
-{ |
- JNIEnv* jniEnv = NULL; |
- int stat = globalJvm->GetEnv((void **)&jniEnv, JNI_VERSION_1_6); |
- if (stat == JNI_EDETACHED) |
- { |
- if (globalJvm->AttachCurrentThread(&jniEnv, NULL) != 0) |
- throw std::runtime_error("Failed to get JNI environment"); |
- } |
- |
- jniEnv->DeleteGlobalRef(jUrlClass); |
- jniEnv->DeleteGlobalRef(jConnectionClass); |
- jniEnv->DeleteGlobalRef(jInputStreamReaderClass); |
- jniEnv->DeleteGlobalRef(jBufferedReaderClass); |
- jniEnv->DeleteGlobalRef(jStringBuilderClass); |
- |
- if (stat == JNI_EDETACHED) |
- globalJvm->DetachCurrentThread(); |
-} |
- |
-AdblockPlus::ServerResponse AndroidWebRequest::GET( |
- const std::string& url, const AdblockPlus::HeaderList& requestHeaders) const |
-{ |
- JNIEnv* jniEnv = NULL; |
- int stat = globalJvm->GetEnv((void **)&jniEnv, JNI_VERSION_1_6); |
- if (stat == JNI_EDETACHED) |
- { |
- if (globalJvm->AttachCurrentThread(&jniEnv, NULL) != 0) |
- throw std::runtime_error("Failed to get JNI environment"); |
- } |
- |
- AdblockPlus::ServerResponse result; |
- try |
- { |
- // URL jUrl = new URL(url) |
- jstring jUrlStr = jniEnv->NewStringUTF(url.c_str()); |
- |
- jobject jUrl = jniEnv->NewObject(jUrlClass, jUrlConstructorID, jUrlStr); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- jniEnv->DeleteLocalRef(jUrlStr); |
- |
- // HttpURLConnection connection = (HttpURLConnection) jUrl.openConnection(); |
- jobject jConnection = jniEnv->CallObjectMethod(jUrl, jUrlOpenConnectionID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- // connection.setRequestMethod("GET"); |
- jstring jMethod = jniEnv->NewStringUTF("GET"); |
- jniEnv->CallVoidMethod(jConnection, jConnectionSetMethodID, jMethod); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- jniEnv->DeleteLocalRef(jMethod); |
- |
- for (int i = 0; i < requestHeaders.size(); i++) |
- { |
- // connection.setRequestProperty(requestHeaders[i].first, requestHeaders[i].second); |
- jstring jHeader = jniEnv->NewStringUTF(requestHeaders[i].first.c_str()); |
- jstring jValue = jniEnv->NewStringUTF(requestHeaders[i].second.c_str()); |
- jniEnv->CallVoidMethod(jConnection, jConnectionSetRequestPropertyID, jHeader, jValue); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- jniEnv->DeleteLocalRef(jHeader); |
- jniEnv->DeleteLocalRef(jValue); |
- } |
- |
- // connection.connect(); |
- jniEnv->CallVoidMethod(jConnection, jConnectionConnectID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- // int lenghtOfFile = connection.getContentLength(); |
- jint lenghtOfFile = jniEnv->CallIntMethod(jConnection, jConnectionGetContentLengthID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- D(D_WARN, "Size: %d", lenghtOfFile); |
- |
- // result.responseStatus = connection.getResponseCode(); |
- result.responseStatus = jniEnv->CallIntMethod(jConnection, jConnectionGetResponseCodeID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- /* Read response data */ |
- |
- // String jEncoding = connection.getContentEncoding(); |
- jstring jEncoding = (jstring) jniEnv->CallObjectMethod(jConnection, jConnectionGetContentEncodingID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- if (jEncoding == NULL) |
- jEncoding = jniEnv->NewStringUTF("utf-8"); |
- |
- // InputStream jis = connection.getInputStream(); |
- jobject jis = jniEnv->CallObjectMethod(jConnection, jConnectionGetInputStreamID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- // InputStreamReader jisr = new InputStreamReader(jis, jEncoding); |
- jobject jisr = jniEnv->NewObject(jInputStreamReaderClass, jInputStreamReaderConstructorID, jis, jEncoding); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- jniEnv->DeleteLocalRef(jEncoding); |
- |
- // BufferedReader jin = new BufferedReader(jisr); |
- jobject jin = jniEnv->NewObject(jBufferedReaderClass, jBufferedReaderConstructorID, jisr); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- // char[] jBuffer = new char[0x10000]; |
- jcharArray jBuffer = jniEnv->NewCharArray(0x10000); |
- |
- // StringBuilder jout = new StringBuilder(); |
- jobject jout = jniEnv->NewObject(jStringBuilderClass, jStringBuilderConstructorID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- jlong total = 0; |
- jint read; |
- |
- jint jBufferLength = (jint) jniEnv->GetArrayLength(jBuffer); |
- |
- do |
- { |
- // read = jin.read(buffer, 0, buffer.length); |
- read = jniEnv->CallIntMethod(jin, jBufferedReaderReadID, jBuffer, 0, jBufferLength); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- if (read > 0) |
- { |
- // jout.append(buffer, 0, read); |
- jniEnv->CallObjectMethod(jout, jStringBuilderAppendID, jBuffer, 0, jBufferLength); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- total += read; |
- } |
- } |
- while (read >= 0); |
- |
- // String jData = out.toString(); |
- jstring jData = (jstring) jniEnv->CallObjectMethod(jout, jStringBuilderToStringID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- result.responseText = GetString(jniEnv, jData); |
- |
- // jin.close(); |
- jniEnv->CallVoidMethod(jin, jBufferedReaderCloseID); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- jint i = 0; |
- while (true) |
- { |
- // String jHeaderName = connection.getHeaderFieldKey(i) |
- jstring jHeaderName = (jstring) jniEnv->CallObjectMethod(jConnection, jConnectionGetHeaderFieldKeyID, i); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- // String jHeaderValue = connection.getHeaderField(i) |
- jstring jHeaderValue = (jstring) jniEnv->CallObjectMethod(jConnection, jConnectionGetHeaderFieldID, i); |
- if (jniEnv->ExceptionCheck()) |
- throw JavaException(jniEnv); |
- |
- if (!jHeaderValue) |
- break; |
- |
- std::string headerName = GetString(jniEnv, jHeaderName); |
- std::string headerValue = GetString(jniEnv, jHeaderValue); |
- |
- headerName = TrimString(headerName); |
- headerValue = TrimString(headerValue); |
- |
- std::transform(headerName.begin(), headerName.end(), headerName.begin(), ::tolower); |
- |
- result.responseHeaders.push_back(std::pair<std::string, std::string>(headerName, headerValue)); |
- |
- i++; |
- } |
- D(D_WARN, "Finished downloading"); |
- |
- result.status = NS_OK; |
- } |
- catch(JavaException& e) |
- { |
- result.responseStatus = 0; |
- result.status = ExceptionToStatus(e); |
- D(D_ERROR, "%s", e.what()); |
- } |
- catch (const std::exception& e) |
- { |
- D(D_ERROR, "Exception: %s", e.what()); |
- result.status = AdblockPlus::DefaultWebRequest::NS_ERROR_FAILURE; |
- } |
- catch (...) |
- { |
- D(D_ERROR, "Unknown exception"); |
- result.status = AdblockPlus::DefaultWebRequest::NS_ERROR_FAILURE; |
- } |
- |
- if (stat == JNI_EDETACHED) |
- globalJvm->DetachCurrentThread(); |
- |
- return result; |
-} |