// RemoteTest.cpp
//

#include "stdafx.h"
#include "RemoteTest.h"
#include "RemoteTestDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define     VAIBOWLANKEY        "Software\\Sony\\VirtualAIBO\\WLAN"
#define     IPADDRKEY           "AIBO-IP"

/////////////////////////////////////////////////////////////////////////////
// CRemoteTestApp

BEGIN_MESSAGE_MAP(CRemoteTestApp, CWinApp)
    //{{AFX_MSG_MAP(CRemoteTestApp)
    //}}AFX_MSG
    ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRemoteTestApp construction

CRemoteTestApp::CRemoteTestApp()
{
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CRemoteTestApp object

CRemoteTestApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CRemoteTestApp initialization

BOOL CRemoteTestApp::InitInstance()
{
    AfxEnableControlContainer();

    CoInitialize( NULL );


#ifdef _AFXDLL
    Enable3dControls();
#else
    Enable3dControlsStatic();
#endif
    free((void*)m_pszAppName);
    m_pszAppName=_tcsdup(_T("VirtualAIBO\\RemoteTest"));
    SetRegistryKey(_T("Sony"));
    m_aiboIP = GetProfileString("","AIBO-IP","");
    WriteProfileString("","AIBO-IP",m_aiboIP);
    if ( m_aiboIP.GetLength() == 0 ) {
        GetVAIBOIPAddress();
    }

//  m_appPath = GetProfileString( "","AppPath", "" );
    m_appPath = _T("");
    if ( m_appPath.GetLength() == 0 ) {
        ////////////////////////////////////////
        // Get execution directory
        CString strExePath;
        strExePath.Empty();
        GetModuleFileName(AfxGetInstanceHandle(), strExePath.GetBuffer(_MAX_PATH+1), _MAX_PATH);
        strExePath.ReleaseBuffer();
        INT iIndex = strExePath.ReverseFind('\\');
        strExePath = strExePath.Left(iIndex);
        m_appPath = strExePath;
//      WriteProfileString( "", "AppPath", m_appPath );
    }

    CRemoteTestDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    }
    else if (nResponse == IDCANCEL)
    {
    }

    return FALSE;
}

int CRemoteTestApp::ExitInstance()
{
    CoUninitialize();
    free((void*)m_pszAppName);
    m_pszAppName=_tcsdup(_T("VirtualAIBO\\WLAN"));
    WriteProfileString( "", "AIBO-IP", m_aiboIP );

    return CWinApp::ExitInstance();
}

void CRemoteTestApp::GetVAIBOIPAddress( void )
{
    LONG        lReg;
    DWORD       dwDisposition;
    HKEY        prefKey;
    char        keyName[128];
    char        szIPAddr[256];
    DWORD       len;
    DWORD       dwType;

    lReg = RegOpenKeyEx(HKEY_CURRENT_USER,
                VAIBOWLANKEY,
                0,
                KEY_ALL_ACCESS,
                &prefKey);
    if (lReg != ERROR_SUCCESS) {
        lReg = RegCreateKeyEx(HKEY_CURRENT_USER,
                VAIBOWLANKEY,
                0,
                "",
                REG_OPTION_NON_VOLATILE,
                KEY_ALL_ACCESS,
                NULL,
                &prefKey,
                &dwDisposition);
    }

    // Get the IP address that was set using the AIBO WLAN Manager
    dwType = REG_SZ;
    len = 256;
    ::strcpy( keyName, IPADDRKEY );
    lReg = ::RegQueryValueEx( prefKey, (LPTSTR)keyName, 0, &dwType, (LPBYTE)&szIPAddr, &len );
    if (lReg != ERROR_SUCCESS) {
        ::strcpy( szIPAddr, "10.0.1.100" );
    }

    m_aiboIP = szIPAddr;
    RegCloseKey(prefKey);

}

int CRemoteTestApp::StringHexToNum( char *szHex )
{
    int     num = 0;

    if ( strlen( szHex ) == 2 ) {
        num = CharHexToNum( szHex[0] ) * 16;
        num += CharHexToNum( szHex[1] );
    } else {
        num = CharHexToNum( szHex[0] );
    }

    return num;
}

unsigned int CRemoteTestApp::StringHexToUnsignedInt( char *szHex )
{
    unsigned int    num = 0;

    for ( int i = 0; i < ( int )strlen( szHex ); i++ ) {
        num *= 16;
        num += ( unsigned int )CharHexToNum( szHex[ i ] );
    }

    return num;
}

int CRemoteTestApp::CharHexToNum( char hex )
{
    int     num = 0;

    if ( hex >= 0x30 && hex <= 0x39 ) {
        num = hex - 0x30;
    } else if ( hex >= 0x41 && hex <= 0x46 ) {
        num = hex - 0x41 + 10;
    } else if ( hex >= 0x61 && hex <= 0x66 ) {
        num = hex - 0x61 + 10;
    }
    return num;
}


