// proxy_util_w23.cpp : Main methods of the DLL. #include "stdafx.h" #include "proxy_util_w32.h" /***************************************************************************** * Class: com_btr_proxy_search_desktop_win_Win32ProxyUtils * Method: winHttpDetectAutoProxyConfigUrl * Signature: (I)Ljava/lang/String; ****************************************************************************/ JNIEXPORT jstring JNICALL Java_com_btr_proxy_search_desktop_win_Win32ProxyUtils_winHttpDetectAutoProxyConfigUrl (JNIEnv *env, jobject source, jint mode) { LPWSTR ppwszAutoConfigUrl = NULL; BOOL result = WinHttpDetectAutoProxyConfigUrl( mode, &ppwszAutoConfigUrl ); if (ppwszAutoConfigUrl == NULL) { return NULL; } jstring retValue = env->NewString((jchar*)ppwszAutoConfigUrl, wcslen(ppwszAutoConfigUrl)); GlobalFree( ppwszAutoConfigUrl ); return retValue; } /***************************************************************************** * Class: com_btr_proxy_search_desktop_win_Win32ProxyUtils * Method: winHttpGetDefaultProxyConfiguration * Signature: ()Ljava/lang/String; ****************************************************************************/ JNIEXPORT jstring JNICALL Java_com_btr_proxy_search_desktop_win_Win32ProxyUtils_winHttpGetDefaultProxyConfiguration (JNIEnv *env, jobject source) { WINHTTP_PROXY_INFO proxyInfo; // Retrieve the default proxy configuration. BOOL result = WinHttpGetDefaultProxyConfiguration( &proxyInfo ); if (result == FALSE) { // TODO what to do in case of error. DWORD errorCode = GetLastError(); } int proxyTypeLen = 0; int proxyLen = 0; int proxyBypassLen = 0; LPWSTR proxyType = NULL; if (proxyInfo.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY) { proxyType = L"PROXY "; proxyTypeLen = wcslen(proxyType); } else if (proxyInfo.dwAccessType == WINHTTP_ACCESS_TYPE_NO_PROXY) { proxyType = L"DIRECT "; proxyTypeLen = wcslen(proxyType); } if (proxyInfo.lpszProxy != NULL) { proxyLen += wcslen(proxyInfo.lpszProxy); } if (proxyInfo.lpszProxyBypass != NULL) { proxyBypassLen += wcslen(proxyInfo.lpszProxyBypass); } jstring retVal = proxyInfo.lpszProxy == NULL? NULL : env->NewString((jchar*)proxyInfo.lpszProxy, wcslen(proxyInfo.lpszProxy)); if (proxyInfo.lpszProxy != NULL) { GlobalFree( proxyInfo.lpszProxy ); } if (proxyInfo.lpszProxyBypass != NULL) { GlobalFree( proxyInfo.lpszProxyBypass ); } return retVal; //int retValueLen = proxyTypeLen+proxyLen+1+proxyBypassLen+1; //int insertPos = 0; //LPWSTR combined = new WCHAR[retValueLen]; //combined[retValueLen] = 0; //wcsncat_s(combined, retValueLen, proxyType, proxyTypeLen); //insertPos += proxyTypeLen; //retValueLen -= proxyTypeLen; //wcsncat_s(combined, retValueLen, proxyInfo.lpszProxy, proxyLen); //insertPos += proxyLen; //retValueLen -= proxyLen; //wcsncat_s(combined, retValueLen, TEXT("|"), 1); //insertPos += proxyLen; //retValueLen -= proxyLen; //wcsncat_s(combined, retValueLen, proxyInfo.lpszProxyBypass, proxyBypassLen); //insertPos += proxyBypassLen; //retValueLen -= proxyBypassLen; // if (proxyInfo.lpszProxy != NULL) { // GlobalFree( proxyInfo.lpszProxy ); // } // if (proxyInfo.lpszProxyBypass != NULL) { // GlobalFree( proxyInfo.lpszProxyBypass ); // } //jstring retVal = env->NewString((jchar*)combined, wcslen(combined)); //return retVal; } /***************************************************************************** * Class: com_btr_proxy_search_desktop_win_Win32ProxyUtils * Method: WinHttpGetIEProxyConfigForCurrentUser * Signature: ()Lcom/btr/proxy/search/desktop/win/Win32IESettings; ****************************************************************************/ JNIEXPORT jobject JNICALL Java_com_btr_proxy_search_desktop_win_Win32ProxyUtils_winHttpGetIEProxyConfigForCurrentUser (JNIEnv *env, jobject source) { WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ieProxyInfo; // Retrieve the IE proxy configuration. BOOL result = WinHttpGetIEProxyConfigForCurrentUser( &ieProxyInfo ); if (result == FALSE) { DWORD errorCode = GetLastError(); return NULL; } jboolean autoDetect = ieProxyInfo.fAutoDetect; jstring autoConfigUrl = NULL; jstring proxy = NULL; jstring proxyBypass = NULL; if (ieProxyInfo.lpszAutoConfigUrl != NULL) { autoConfigUrl = env->NewString((jchar*)ieProxyInfo.lpszAutoConfigUrl, wcslen(ieProxyInfo.lpszAutoConfigUrl)); GlobalFree( ieProxyInfo.lpszAutoConfigUrl ); } if (ieProxyInfo.lpszProxy != NULL) { proxy = env->NewString((jchar*)ieProxyInfo.lpszProxy, wcslen(ieProxyInfo.lpszProxy)); GlobalFree( ieProxyInfo.lpszProxy ); } if (ieProxyInfo.lpszProxyBypass != NULL) { proxyBypass = env->NewString((jchar*)ieProxyInfo.lpszProxyBypass, wcslen(ieProxyInfo.lpszProxyBypass)); GlobalFree( ieProxyInfo.lpszProxyBypass ); } // Build result container object. jclass retValueClass = env->FindClass("com/btr/proxy/search/desktop/win/Win32IESettings"); if ( retValueClass == NULL ) { return NULL; } jmethodID jmid = env->GetMethodID(retValueClass, "", "(ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (jmid == NULL) { return NULL; } // Win32IESettings(boolean autoDetect, String autoConfigUrl, String proxy, String proxyBypass) jobject retValue = env->NewObject(retValueClass, jmid, autoDetect, autoConfigUrl, proxy, proxyBypass); return retValue; } /***************************************************************************** * Class: com_btr_proxy_search_desktop_win_Win32ProxyUtils * Method: readUserHomedir * Signature: ()Ljava/lang/String; ****************************************************************************/ JNIEXPORT jstring JNICALL Java_com_btr_proxy_search_desktop_win_Win32ProxyUtils_readUserHomedir (JNIEnv *env, jobject source) { HKEY key; int result = RegOpenKeyEx(HKEY_CURRENT_USER, #ifdef _WIN64 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", #else L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", #endif 0, KEY_QUERY_VALUE, &key); if (0 != ERROR_SUCCESS) { LPWSTR errorMsg = L"ERROR: Key open failed"; return env->NewString((jchar*)errorMsg, wcslen(errorMsg)); } BYTE pvData[1000]; DWORD dataSize = 1000; #ifdef _WIN64 result = RegQueryValueEx(key, "AppData", NULL, NULL, pvData, &dataSize); #else result = RegQueryValueEx(key, L"AppData", NULL, NULL, pvData, &dataSize); #endif RegCloseKey(key); if (result != ERROR_SUCCESS) { LPWSTR errorMsg = L"ERROR: Read value failed"; return env->NewString((jchar*)errorMsg, wcslen(errorMsg)); } jstring retValue = env->NewString((jchar*)pvData, (dataSize-1)/2); return retValue; }