summaryrefslogblamecommitdiffstats
path: root/src_native/win/proxy_util_w23/proxy_util_w32.cpp
blob: a62ed085fdb61d773237ba9ca42f1d018fc51989 (plain) (tree)












































































































































































































                                                                                                                                  
// 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, "<init>", "(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;
}