blob: 0f95714d62f75a0640610ac63dfd4ee39a70ccf6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "stdafx.h"
#include "StringUtils.h"
#include <stdio.h>
#include <resource.h>
#include <REST.h>
#define SERVERKEY "SERVER"
#define PORTKEY "PORT"
#define UIDKEY "UID"
#define PWDKEY "PWD"
#define PROJECTKEY "PROJECT"
#define BUFFERSIZE 256
#define INITFILE "ODBC.INI"
#define INSTINIFILE "ODBCINST.INI"
#define DRIVER_NAME "KylinODBCDriver"
#define DRIVER_DEFAULT_LOCATION "C:\\Program Files (x86)\\kylinolap\\KylinODBCDriver\\driver.dll"
#define PROTOCOL_HTTPS "https"
#define PROTOCOL_HTTP "http"
#define PROTOCOL_SEP "://"
#define PORT_HTTPS_DEFAULT "443"
#define PORT_HTTP_DEFAULT "80"
static char currentDSN[BUFFERSIZE];
static const char* supportedProtocols[] = { PROTOCOL_HTTPS, PROTOCOL_HTTP };
static const char* defaultPorts[] = { PORT_HTTPS_DEFAULT, PORT_HTTP_DEFAULT };
static int GetValueFromODBCINI ( char* section, char* key, char* defaultValue, char* buffer, int bufferSize,
char* initFileName )
{
return SQLGetPrivateProfileString ( section, key, defaultValue, buffer, bufferSize, initFileName );
}
static BOOL SetValueInODBCINI ( char* section, char* key, char* newValue, char* initFileName )
{
return SQLWritePrivateProfileString ( section, key, newValue, initFileName );
}
static BOOL AddDSN ( char* dsnName )
{
return SQLWritePrivateProfileString ( "ODBC Data Sources", dsnName, "KylinODBCDriver", INITFILE );
}
static BOOL RemoveDSN ( char* dsnName )
{
BOOL temp = true;
temp = SQLWritePrivateProfileString ( dsnName, NULL, NULL, INITFILE );
return SQLWritePrivateProfileString ( "ODBC Data Sources", dsnName, NULL, INITFILE ) && temp;
}
void SetCurrentDSN ( char* connStr, char* logFunc )
{
currentDSN[0] = '\0';
Word pairCount = 0;
Word index = 0;
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s : lparam: %s", logFunc, connStr ) );
ODBCKV* pKV = NULL;
if ( connStr == NULL || CvtStrToKeyValues ( connStr, -1, &pairCount, &pKV ) != GOOD )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s: failed to parse the attribute string %s", logFunc, connStr ) );
}
else
{
if ( FindInKeyValues ( "DSN", NULL, pKV, pairCount, &index ) != true )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s: failed to find the DSN attribute in %s", logFunc, connStr ) );
}
else
{
strcpy ( currentDSN, pKV[index] . value );
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "%s: success to set the currentDSN: %s", logFunc, currentDSN ) );
}
FreeGenODBCKeyValues ( pKV, pairCount );
delete[] pKV;
}
}
static eGoodBad LoadODBCINIDataToDlgDSNCfg2 ( HWND hDlg )
{
BOOL x;
char buffer[BUFFERSIZE];
// precaution
if ( !hDlg )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "LoadODBCINIDataToDlgDSNCfg2 - Bad params: hDlg is NULL" ) );
return BAD;
}
// DSN name
x = SetDlgItemText ( hDlg, IDC_DSNNAME, currentDSN );
if ( !x )
{
return BAD;
}
// server name/IP and protocol
GetValueFromODBCINI ( currentDSN, SERVERKEY, "", buffer, BUFFERSIZE, INITFILE );
int protocol = 0;
int hostOffset = 0;
if ( buffer[0] == 'h' && buffer[1] == 't' && buffer[2] == 't' && buffer[3] == 'p' )
{
if ( buffer[4] == ':' && buffer[5] == '/' && buffer[6] == '/' )
{
protocol = 1;
hostOffset = 7;
}
else if ( buffer[4] == 's' && buffer[5] == ':' && buffer[6] == '/' && buffer[7] == '/' )
{
hostOffset = 8;
}
}
HWND hwndCombo = GetDlgItem ( hDlg, IDC_PROTOCOL );
SendMessage ( hwndCombo, CB_SETCURSEL, protocol, 0 );
strcpy ( buffer, buffer + hostOffset );
x = SetDlgItemText ( hDlg, IDC_SERVER, buffer );
if ( !x )
{
return BAD;
}
// server port
char* defaultPort = PORT_HTTPS_DEFAULT;
if ( protocol == 1 )
{
defaultPort = PORT_HTTP_DEFAULT;
}
GetValueFromODBCINI ( currentDSN, PORTKEY, defaultPort, buffer, BUFFERSIZE, INITFILE );
int portTemp = atoi ( buffer );
if ( portTemp == 0 )
{
portTemp = atoi ( defaultPort );
}
x = SetDlgItemInt ( hDlg, IDC_PORT, portTemp, FALSE );
if ( !x )
{
return BAD;
}
// user name
GetValueFromODBCINI ( currentDSN, UIDKEY, "", buffer, BUFFERSIZE, INITFILE );
x = SetDlgItemText ( hDlg, IDC_UID, buffer );
if ( !x )
{
return BAD;
}
// password
GetValueFromODBCINI ( currentDSN, PWDKEY, "", buffer, BUFFERSIZE, INITFILE );
x = SetDlgItemText ( hDlg, IDC_PWD, buffer );
if ( !x )
{
return BAD;
}
return GOOD;
}
static eGoodBad RetriveDlgData ( HWND hDlg, char* newDSN, char* serverStr, char* uidStr, char* pwdStr, long* port )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Start retrieving the configs..." ) );
Long x;
if ( !hDlg )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "RetriveDlgData - Bad params: hDlg is NULL" ) );
return BAD;
}
x = SendDlgItemMessage ( hDlg, IDC_DSNNAME, EM_LINELENGTH, 0, 0 ); // get text from dialog
if ( x > 0 )
{
GetDlgItemText ( hDlg, IDC_DSNNAME, newDSN, BUFFERSIZE ); // get text from dialog
}
else
{
newDSN[0] = '\0';
}
////// server name/IP
// get length of input text
x = SendDlgItemMessage ( hDlg, IDC_SERVER, EM_LINELENGTH, 0, 0 );
if ( x > 0 )
{
char serverStrBuf[BUFFERSIZE - 8];
GetDlgItemText ( hDlg, IDC_SERVER, serverStrBuf, BUFFERSIZE ); // get text from dialog
HWND hwndCombo = GetDlgItem ( hDlg, IDC_PROTOCOL );
int ItemIndex = SendMessage ( hwndCombo, ( UINT ) CB_GETCURSEL, ( WPARAM ) 0, ( LPARAM ) 0 );
strcpy ( serverStr, supportedProtocols[ItemIndex] );
strcat ( serverStr, PROTOCOL_SEP );
strcat ( serverStr, serverStrBuf );
}
else
{
serverStr[0] = '\0';
}
///// Port
// get value
*port = GetDlgItemInt ( hDlg, IDC_PORT, NULL, FALSE );
////// User name
// get length
x = SendDlgItemMessage ( hDlg, IDC_UID, EM_LINELENGTH, 0, 0 );
if ( x > 0 )
{
// allocate space
GetDlgItemText ( hDlg, IDC_UID, uidStr, BUFFERSIZE );
}
else
{
uidStr[0] = '\0';
}
////// Password
// get length
x = SendDlgItemMessage ( hDlg, IDC_PWD, EM_LINELENGTH, 0, 0 );
if ( x > 0 )
{
GetDlgItemText ( hDlg, IDC_PWD, pwdStr, BUFFERSIZE );
}
else
{
pwdStr[0] = '\0';
}
trimwhitespace ( newDSN );
trimwhitespace ( serverStr );
trimwhitespace ( uidStr );
trimwhitespace ( pwdStr );
if ( strlen ( newDSN ) == 0 )
{
__ODBCPopMsg ( "DSN name cannot be empty" );
return BAD;
}
if ( strlen ( serverStr ) == 0 )
{
__ODBCPopMsg ( "Server cannot be empty" );
return BAD;
}
if ( strlen ( uidStr ) == 0 )
{
__ODBCPopMsg ( "Username cannot be empty" );
return BAD;
}
if ( strlen ( pwdStr ) == 0 )
{
__ODBCPopMsg ( "Password cannot be empty" );
return BAD;
}
if ( port == 0 )
{
__ODBCPopMsg ( "Port cannot be 0" );
return BAD;
}
return GOOD;
}
static pODBCConn createConn ()
{
pODBCConn conn;
// allocate a conn
conn = new ODBCConn;
// clear the conn attributes
memset ( conn, 0, sizeof ( ODBCConn) );
// set the handle signature
( ( pODBCConn ) conn ) -> Sign = SQL_HANDLE_DBC;
// default values
( ( pODBCConn ) conn ) -> AccessMode = SQL_MODE_READ_ONLY;
( ( pODBCConn ) conn ) -> AutoIPD = SQL_FALSE;
( ( pODBCConn ) conn ) -> AsyncEnable = SQL_ASYNC_ENABLE_OFF;
( ( pODBCConn ) conn ) -> AutoCommit = SQL_AUTOCOMMIT_ON;
( ( pODBCConn ) conn ) -> TimeOut = 0;
( ( pODBCConn ) conn ) -> LoginTimeOut = 0;
( ( pODBCConn ) conn ) -> MetaDataID = SQL_FALSE;
( ( pODBCConn ) conn ) -> ODBCCursors = SQL_CUR_USE_DRIVER;
( ( pODBCConn ) conn ) -> Window = NULL;
( ( pODBCConn ) conn ) -> TxnIsolation = 0;
( ( pODBCConn ) conn ) -> MaxRows = 0;
( ( pODBCConn ) conn ) -> QueryTimeout = 0;
( ( pODBCConn ) conn ) -> Server = new char[BUFFERSIZE];
( ( pODBCConn ) conn ) -> UserName = new char[BUFFERSIZE];
( ( pODBCConn ) conn ) -> Password = new char[BUFFERSIZE];
( ( pODBCConn ) conn ) -> Project = new char[BUFFERSIZE];
return conn;
}
static eGoodBad testGetMetadata ( char* serverStr, char* uidStr, char* pwdStr, long port, char* project )
{
pODBCConn conn = createConn ();
strcpy ( ( ( pODBCConn ) conn ) -> Server, serverStr );
strcpy ( ( ( pODBCConn ) conn ) -> UserName, uidStr );
strcpy ( ( ( pODBCConn ) conn ) -> Password, pwdStr );
strcpy ( ( ( pODBCConn ) conn ) -> Project, project );
( ( pODBCConn ) conn ) -> ServerPort = port;
RETCODE ret = TryFetchMetadata ( conn );
_SQLFreeDiag ( _DIAGCONN ( conn ) );
// disconnect
_SQLDisconnect ( conn );
// now free the structure itself
delete conn;
if ( ret == SQL_ERROR )
{
//validation of data & other prompts goes here
__ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
return BAD;
}
return GOOD;
}
static eGoodBad testConnection ( char* serverStr, char* uidStr, char* pwdStr, long port )
{
pODBCConn conn = createConn ();
strcpy ( ( ( pODBCConn ) conn ) -> Server, serverStr );
strcpy ( ( ( pODBCConn ) conn ) -> UserName, uidStr );
strcpy ( ( ( pODBCConn ) conn ) -> Password, pwdStr );
( ( pODBCConn ) conn ) -> ServerPort = port;
RETCODE ret = TryAuthenticate ( conn );
_SQLFreeDiag ( _DIAGCONN ( conn ) );
// disconnect
_SQLDisconnect ( conn );
// now free the structure itself
delete conn;
if ( ret == SQL_ERROR )
{
//validation of data & other prompts goes here
__ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
return BAD;
}
return GOOD;
}
static eGoodBad SaveConfigToODBCINI ( char* newDSN, char* serverStr, char* uidStr, char* pwdStr, long port,
char* projectStr )
{
char portStrBuffer[BUFFERSIZE];
SetValueInODBCINI ( newDSN, SERVERKEY, serverStr, INITFILE );
SetValueInODBCINI ( newDSN, PORTKEY, _itoa ( port, portStrBuffer, 10 ), INITFILE );
SetValueInODBCINI ( newDSN, UIDKEY, uidStr, INITFILE );
SetValueInODBCINI ( newDSN, PWDKEY, pwdStr, INITFILE );
SetValueInODBCINI ( newDSN, PROJECTKEY, projectStr, INITFILE );
//If a new dsn name comes, add a new entry in regedit
if ( _stricmp ( newDSN, currentDSN ) != 0 )
{
AddDSN ( newDSN );
//it is a dsn renaming
if ( strlen ( currentDSN ) != 0 )
{
RemoveDSN ( currentDSN );
}
}
strcpy ( currentDSN, newDSN );
char temp[BUFFERSIZE];
GetValueFromODBCINI ( DRIVER_NAME, "Driver", DRIVER_DEFAULT_LOCATION, temp, BUFFERSIZE, INSTINIFILE );
SetValueInODBCINI ( currentDSN, "Driver", temp, INITFILE );
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Finish saving the configurations to ODBC INI" ) );
return GOOD;
}
static eGoodBad RetriveDlgDataToODBCINI ( HWND hDlg, bool onlyTest )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Start retrieving the configurations to ODBC INI" ) );
Long x, port;
char newDSN[BUFFERSIZE];
char serverStr[BUFFERSIZE];
char uidStr[BUFFERSIZE];
char pwdStr[BUFFERSIZE];
char portStrBuffer[BUFFERSIZE];
if ( !hDlg )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "RetriveDlgDataToODBCINI - Bad params: hDlg is NULL" ) );
return BAD;
}
x = SendDlgItemMessage ( hDlg, IDC_DSNNAME, EM_LINELENGTH, 0, 0 ); // get text from dialog
if ( x > 0 )
{
GetDlgItemText ( hDlg, IDC_DSNNAME, newDSN, BUFFERSIZE ); // get text from dialog
}
else
{
newDSN[0] = '\0';
}
////// server name/IP
// get length of input text
x = SendDlgItemMessage ( hDlg, IDC_SERVER, EM_LINELENGTH, 0, 0 );
if ( x > 0 )
{
GetDlgItemText ( hDlg, IDC_SERVER, serverStr, BUFFERSIZE ); // get text from dialog
}
else
{
serverStr[0] = '\0';
}
///// Port
// get value
port = GetDlgItemInt ( hDlg, IDC_PORT, NULL, FALSE );
////// User name
// get length
x = SendDlgItemMessage ( hDlg, IDC_UID, EM_LINELENGTH, 0, 0 );
if ( x > 0 )
{
// allocate space
GetDlgItemText ( hDlg, IDC_UID, uidStr, BUFFERSIZE );
}
else
{
uidStr[0] = '\0';
}
////// Password
// get length
x = SendDlgItemMessage ( hDlg, IDC_PWD, EM_LINELENGTH, 0, 0 );
if ( x > 0 )
{
GetDlgItemText ( hDlg, IDC_PWD, pwdStr, BUFFERSIZE );
}
else
{
pwdStr[0] = '\0';
}
trimwhitespace ( newDSN );
trimwhitespace ( serverStr );
trimwhitespace ( uidStr );
trimwhitespace ( pwdStr );
if ( strlen ( newDSN ) == 0 )
{
__ODBCPopMsg ( "DSN name cannot be empty" );
return BAD;
}
if ( strlen ( serverStr ) == 0 )
{
__ODBCPopMsg ( "Server cannot be empty" );
return BAD;
}
if ( strlen ( uidStr ) == 0 )
{
__ODBCPopMsg ( "Username cannot be empty" );
return BAD;
}
if ( strlen ( pwdStr ) == 0 )
{
__ODBCPopMsg ( "Password cannot be empty" );
return BAD;
}
if ( port == 0 )
{
__ODBCPopMsg ( "Port cannot be 0" );
return BAD;
}
if ( onlyTest )
{
pODBCConn conn;
// allocate a conn
conn = new ODBCConn;
// clear the conn attributes
memset ( conn, 0, sizeof ( ODBCConn) );
// set the handle signature
( ( pODBCConn ) conn ) -> Sign = SQL_HANDLE_DBC;
// default values
( ( pODBCConn ) conn ) -> AccessMode = SQL_MODE_READ_ONLY;
( ( pODBCConn ) conn ) -> AutoIPD = SQL_FALSE;
( ( pODBCConn ) conn ) -> AsyncEnable = SQL_ASYNC_ENABLE_OFF;
( ( pODBCConn ) conn ) -> AutoCommit = SQL_AUTOCOMMIT_ON;
( ( pODBCConn ) conn ) -> TimeOut = 0;
( ( pODBCConn ) conn ) -> LoginTimeOut = 0;
( ( pODBCConn ) conn ) -> MetaDataID = SQL_FALSE;
( ( pODBCConn ) conn ) -> ODBCCursors = SQL_CUR_USE_DRIVER;
( ( pODBCConn ) conn ) -> Window = NULL;
( ( pODBCConn ) conn ) -> TxnIsolation = 0;
( ( pODBCConn ) conn ) -> MaxRows = 0;
( ( pODBCConn ) conn ) -> QueryTimeout = 0;
( ( pODBCConn ) conn ) -> Server = new char[BUFFERSIZE];
( ( pODBCConn ) conn ) -> UserName = new char[BUFFERSIZE];
( ( pODBCConn ) conn ) -> Password = new char[BUFFERSIZE];
strcpy ( ( ( pODBCConn ) conn ) -> Server, serverStr );
strcpy ( ( ( pODBCConn ) conn ) -> UserName, uidStr );
strcpy ( ( ( pODBCConn ) conn ) -> Password, pwdStr );
( ( pODBCConn ) conn ) -> ServerPort = port;
RETCODE ret = TryAuthenticate ( conn );
_SQLFreeDiag ( _DIAGCONN ( conn ) );
// disconnect
_SQLDisconnect ( conn );
// now free the structure itself
delete conn;
if ( ret == SQL_ERROR )
{
//validation of data & other prompts goes here
__ODBCPopMsg ( "Username/Password not authorized, or server out of service." );
return BAD;
}
return GOOD;
}
SetValueInODBCINI ( newDSN, SERVERKEY, serverStr, INITFILE );
SetValueInODBCINI ( newDSN, PORTKEY, _itoa ( port, portStrBuffer, 10 ), INITFILE );
SetValueInODBCINI ( newDSN, UIDKEY, uidStr, INITFILE );
SetValueInODBCINI ( newDSN, PWDKEY, pwdStr, INITFILE );
//If a new dsn name comes, add a new entry in regedit
if ( _stricmp ( newDSN, currentDSN ) != 0 )
{
AddDSN ( newDSN );
//it is a dsn renaming
if ( strlen ( currentDSN ) != 0 )
{
RemoveDSN ( currentDSN );
}
}
strcpy ( currentDSN, newDSN );
char temp[BUFFERSIZE];
GetValueFromODBCINI ( DRIVER_NAME, "Driver", DRIVER_DEFAULT_LOCATION, temp, BUFFERSIZE, INSTINIFILE );
SetValueInODBCINI ( currentDSN, "Driver", temp, INITFILE );
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Finish saving the configurations to ODBC INI" ) );
return GOOD;
}
eGoodBad LoadODBCINIDataToConn ( pODBCConn pConn )
{
Long x;
char buffer[BUFFERSIZE];
int c;
// note
// no error handling is currently being done for
// GetDlgItemText/GetDlgItemInt/SetConnProp
// generally should not be a problem
// precaution
if ( !pConn )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "GetDataFromDlgDSNCfg1 - Bad params: pConn is NULL" ) );
return BAD;
}
////// server name/IP
c = GetValueFromODBCINI ( currentDSN, SERVERKEY, "", buffer, BUFFERSIZE, INITFILE );
if ( c <= 0 )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
return BAD;
}
// set value in struct
SetConnProp ( pConn, CONN_PROP_SERVER, buffer );
///// Port
c = GetValueFromODBCINI ( currentDSN, PORTKEY, "", buffer, BUFFERSIZE, INITFILE );
if ( c <= 0 )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
return BAD;
}
x = atoi ( buffer );
// set value in struct
SetConnProp ( pConn, CONN_PROP_PORT, &x );
////// User name
c = GetValueFromODBCINI ( currentDSN, UIDKEY, "", buffer, BUFFERSIZE, INITFILE );
if ( c <= 0 )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
return BAD;
}
// set value in struct
SetConnProp ( pConn, CONN_PROP_UID, buffer );
////// Password
c = GetValueFromODBCINI ( currentDSN, PWDKEY, "", buffer, BUFFERSIZE, INITFILE );
if ( c <= 0 )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
return BAD;
}
// set value in struct
SetConnProp ( pConn, CONN_PROP_PWD, buffer );
////// Project
c = GetValueFromODBCINI ( currentDSN, PROJECTKEY, "", buffer, BUFFERSIZE, INITFILE );
if ( c <= 0 )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "Please config the Kylin DSN in odbcad.exe before using it." ) );
return BAD;
}
// set value in struct
SetConnProp ( pConn, CONN_PROP_PROJECT, buffer );
return GOOD;
}
INT_PTR CALLBACK DlgDSNCfg2Proc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
char* attributes = ( char* ) lParam;
Long port;
char newDSN[BUFFERSIZE];
char serverStr[BUFFERSIZE];
char uidStr[BUFFERSIZE];
char pwdStr[BUFFERSIZE];
switch ( uMsg )
{
case WM_INITDIALOG :
{
// init protocol list
HWND hwndCombo = GetDlgItem ( hDlg, IDC_PROTOCOL );
SendMessage ( hwndCombo, CB_ADDSTRING, 0, reinterpret_cast <LPARAM> ( ( LPCTSTR )supportedProtocols[0] ) );
SendMessage ( hwndCombo, CB_ADDSTRING, 0, reinterpret_cast <LPARAM> ( ( LPCTSTR )supportedProtocols[1] ) );
SendMessage ( hwndCombo, CB_SETCURSEL, 0, 0 );
SetCurrentDSN ( attributes, "DlgDSNCfg2Proc" );
// store the structure for future use
SetWindowLongPtr ( hDlg, DWLP_USER, lParam );
// initialize the dialog with data from REGEDIT
if ( LoadODBCINIDataToDlgDSNCfg2 ( hDlg ) != GOOD )
{
return false;
}
// set focus automatically
return TRUE;
}
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_PROTOCOL :
{
switch ( HIWORD ( wParam ) )
{
case CBN_SELCHANGE :
{
HWND hwndCombo = GetDlgItem ( hDlg, IDC_PROTOCOL );
int portIndex = SendMessage ( hwndCombo, ( UINT ) CB_GETCURSEL, ( WPARAM ) 0, ( LPARAM ) 0 );
if ( SetDlgItemText ( hDlg, IDC_PORT, defaultPorts[portIndex] ) )
{
return TRUE;
}
return FALSE;
}
default :
break;
}
break;
}
case IDC_BTEST :
{
if ( RetriveDlgData ( hDlg, newDSN, serverStr, uidStr, pwdStr, &port ) == GOOD )
{
if ( testConnection ( serverStr, uidStr, pwdStr, port ) == GOOD )
{
HWND hwndCombo = GetDlgItem ( hDlg, IDC_COMBO1 );
HWND hwndOK = GetDlgItem ( hDlg, IDOK );
//passed verification
EnableWindow ( hwndCombo, TRUE );
try
{
std::vector <string> projects;
restListProjects ( serverStr, port, uidStr, pwdStr, projects );
// reload project list
SendMessage ( hwndCombo, CB_RESETCONTENT, 0, 0 );
for ( unsigned int i = 0; i < projects . size (); ++i )
{
SendMessage ( hwndCombo, ( UINT ) CB_ADDSTRING, ( WPARAM ) 0, ( LPARAM ) projects . at ( i ) . c_str () );
}
SendMessage ( hwndCombo, CB_SETCURSEL, ( WPARAM ) 0, ( LPARAM ) 0 );
}
catch ( exception& e )
{
stringstream ss;
ss << "Getting project list failed with error: " << e . what ();
__ODBCPopMsg ( ss . str () . c_str () );
return FALSE;
}
EnableWindow ( hwndOK, TRUE );
return TRUE;
}
else
{
__ODBCPopMsg ( "Connection failed." );
}
}
else
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "RetriveDlgData failed." ));
}
return FALSE;
}
case IDOK :
{
HWND hwndCombo = GetDlgItem ( hDlg, IDC_COMBO1 );
int ItemIndex = SendMessage ( ( HWND ) hwndCombo, ( UINT ) CB_GETCURSEL,
( WPARAM ) 0, ( LPARAM ) 0 );
TCHAR projectName[256];
( TCHAR ) SendMessage ( ( HWND ) hwndCombo, ( UINT ) CB_GETLBTEXT,
( WPARAM ) ItemIndex, ( LPARAM ) projectName );
if ( RetriveDlgData ( hDlg, newDSN, serverStr, uidStr, pwdStr, &port ) == GOOD )
{
if ( testGetMetadata ( serverStr, uidStr, pwdStr, port, projectName ) == GOOD )
{
SaveConfigToODBCINI ( newDSN, serverStr, uidStr, pwdStr, port, projectName );
EndDialog ( hDlg, wParam );
return TRUE;
}
}
return FALSE;
}
case IDCANCEL :
// indicate end with control id as return value
EndDialog ( hDlg, wParam );
return TRUE;
}
}
return FALSE;
}
BOOL INSTAPI ConfigDSN ( HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ConfigDSN %s is called %s, the fRequest is: %d", lpszDriver, lpszAttributes,
fRequest ) );
if ( fRequest == ODBC_REMOVE_DSN )
{
SetCurrentDSN ( ( char* ) lpszAttributes, "ConfigDSN" );
if ( strlen ( currentDSN ) <= 0 )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "The DSN name is not defined in the connection string!" ) );
return false;
}
BOOL ret = TRUE;
ret = RemoveDSN ( currentDSN );
if ( !ret )
{
__ODBCPOPMSG ( _ODBCPopMsg ( "The DSN is not found, removal failed!" ) );
return false;
}
return true;
}
//else is ODBC_CONFIG_DSN or ODBC_ADD_DSN
int i;
i = DialogBoxParam ( ghInstDLL, MAKEINTRESOURCE ( IDD_DSN_CFG2 ), NULL, DlgDSNCfg2Proc, ( LPARAM ) lpszAttributes );
// check status
switch ( i )
{
case IDOK :
__ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "User click OK button on DSN config" ) );
return true; // complete
default :
__ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "User click Cancel button on DSN config" ) );
return false; // user-cancelled
}
return true;
}