| 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; |
| -} |