#include "stdafx.h"
#include "Rnsf7.h"
#include "commfunc.h"

// ツールチップの準備
// Comctl32.dllのバージョンが4.70以上ならば、ツールチップの幅を
// ダイアログサイズの５分の４に制限する
// (同時に改行"\r\n"も有効になるはず)
HWND makeToolTip( HWND hWndParent, const struct DEFTOOLTIP *dtt )
{
	HWND hToolTip;
	RECT rc;

	hToolTip = CreateToolTip( hInst, hWndParent, dtt );
	if ( hToolTip ) {
		{ //if ( ccpu32_GetComCtl32Ver() >= 470 ) {
			GetClientRect( hWndParent, &rc );
			SendMessage( hToolTip, TTM_SETMAXTIPWIDTH, 0, rc.right*5/4 );  
		}
	}

	return hToolTip;
}

// rnsf7のレジストリエントリから値データを読み込む
int rnsf7RegRead( const char *entry, int def )
{
	HKEY hKey;
	int  rv;

	if ( NULL != (hKey = tRegOpenKey(HKEY_CURRENT_USER, RNSF7REGKEY, TREG_OPEN_READONLY)) ) {
		rv = tRegReadInteger(hKey, entry, def);
        RegCloseKey( hKey );
	}
	else {
		rv = def;
	}

	return rv;
}

// rnsf7のレジストリエントリに値データを書き込む
int rnsf7RegWrite( const char *entry, int value )
{
	HKEY hKey;
	int  rv;

	if ( NULL != (hKey = tRegOpenKey(HKEY_CURRENT_USER, RNSF7REGKEY, TREG_OPEN_CREATE)) ) {
		rv = tRegWriteInteger(hKey, entry, value);
		if (rv == FALSE) {
			dispErrorMessage(NULL, MB_OK | MB_ICONSTOP, "レジストリへの書き込み中エラー", "レジストリキー'HKEY_CURRENT_USER\\", RNSF7REGKEY, "'のエントリ'", entry,
				             "'に書き込もうとしてエラーになりました。\nAPIが報告した原因：", getLastErrorString(tRegGetLastError()));
		}
        RegCloseKey( hKey );
	}
	else {
		dispErrorMessage(NULL, MB_OK | MB_ICONSTOP, "レジストリへの書き込み中エラー", "レジストリキー'HKEY_CURRENT_USER\\", RNSF7REGKEY,
			             "'を書き込みアクセスで開こうとしてエラーになりました。\nAPIが報告した原因：", getLastErrorString(tRegGetLastError()), NULL, NULL);
		rv = 0;
	}

	return rv;
}

// CreateProcess
BOOL runProgram(HWND hWnd, const char *lpCommandLine)
{
	if ( (HINSTANCE)32 > ShellExecute(hWnd, "open", lpCommandLine, NULL, ".", SW_SHOWNORMAL) ) {
		return FALSE;
	}

	return TRUE;
}

// CreateProcess(Sync)
UINT runProgram_sync(char *lpCommandLine)
{
	STARTUPINFO sinfo;
	PROCESS_INFORMATION pinfo;
	UINT		rv;
	HANDLE		hph;

	ZeroMemory( &sinfo, sizeof( STARTUPINFO ) );
	ZeroMemory( &pinfo, sizeof( PROCESS_INFORMATION ) );
	sinfo.cb = sizeof( STARTUPINFO );
	sinfo.dwFlags = STARTF_USESHOWWINDOW;
	sinfo.wShowWindow = SW_SHOWNORMAL;
	
	if ( CreateProcess( NULL, lpCommandLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &sinfo, &pinfo ) ) {
		WaitForInputIdle( pinfo.hProcess, INFINITE );
		WaitForSingleObject( pinfo.hProcess, INFINITE );
		if ( isNT ) hph = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pinfo.dwProcessId );
		GetExitCodeProcess(pinfo.hProcess, (LPDWORD)&rv);
		if ( isNT ) CloseHandle(hph);

		CloseHandle(pinfo.hProcess);
		return rv;
	}
	else {
        return ERRORVALUE;
	}
}

// 共通エラーメッセージ表示関数
int dispErrorMessage(HWND hWnd, UINT uType, const char *errTitle, const char *err1, const char *err2, const char *err3, const char *err4, const char *err5, const char *err6)
{
	int meslen = 0;
	int rv = 0;
	char *mesbuf;

	if (err1) meslen = lstrlen(err1);
	if (err2) meslen += lstrlen(err2);
	if (err3) meslen += lstrlen(err3);
	if (err4) meslen += lstrlen(err4);
	if (err5) meslen += lstrlen(err5);
	if (err6) meslen += lstrlen(err6);

	mesbuf = zalloc(meslen+1);
	if (mesbuf) {
		if (err1) lstrcpy(mesbuf, err1);
		if (err2) lstrcat(mesbuf, err2); 
		if (err3) lstrcat(mesbuf, err3);
		if (err4) lstrcat(mesbuf, err4);
		if (err5) lstrcat(mesbuf, err5);
		if (err6) lstrcat(mesbuf, err6);

		rv = MessageBox(hWnd, mesbuf, errTitle, uType);

		free(mesbuf);
	}

	return rv;
}
