/***************************************************************************/ /* SETUP.C */ /* Copyright (C) 1995-96 SYWARE Inc., All rights reserved */ /***************************************************************************/ // Commenting #define out - causing compiler error - not sure if needed, compiles // okay without it. //#define WINVER 0x0400 #include "precomp.h" #include "wbemidl.h" #include //smart pointer _COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices); _COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, IID_IEnumWbemClassObject); //_COM_SMARTPTR_TYPEDEF(IWbemContext, IID_IWbemContext ); _COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator); #include "drdbdr.h" #include "odbcinst.h" /***************************************************************************/ typedef struct tagSETUP { WORD fRequest; char szOriginalDSN[SQL_MAX_DSN_LENGTH+1]; char szDSN[SQL_MAX_DSN_LENGTH+1]; char szDatabase[MAX_DATABASE_NAME_LENGTH+1]; char szUsername[MAX_USER_NAME_LENGTH+1]; char szPassword[MAX_PASSWORD_LENGTH+1]; char szHost[MAX_HOST_NAME_LENGTH+1]; char szPort[MAX_PORT_NUMBER_LENGTH+1]; } SETUP, FAR *LPSETUP; /***************************************************************************/ extern "C" BOOL EXPFUNC dlgSetup ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { LPSETUP lpSetup; switch (message) { case WM_INITDIALOG: lpSetup = (LPSETUP) lParam; SendDlgItemMessage(hDlg, DSN_NAME, EM_LIMITTEXT, SQL_MAX_DSN_LENGTH, 0L); SendDlgItemMessage(hDlg, DATABASE_NAME, EM_LIMITTEXT, MAX_DATABASE_NAME_LENGTH, 0L); SendDlgItemMessage(hDlg, HOST_NAME, EM_LIMITTEXT, MAX_HOST_NAME_LENGTH, 0L); SendDlgItemMessage(hDlg, PORT_NUMBER, EM_LIMITTEXT, MAX_PORT_NUMBER_LENGTH, 0L); SetWindowLong(hDlg, DWL_USER, (LPARAM) lpSetup); SetDlgItemText(hDlg, DSN_NAME, (LPSTR) (lpSetup->szDSN)); SetDlgItemText(hDlg, DATABASE_NAME, (LPSTR) (lpSetup->szDatabase)); SetDlgItemText(hDlg, HOST_NAME, (LPSTR) (lpSetup->szHost)); SetDlgItemText(hDlg, PORT_NUMBER, (LPSTR) (lpSetup->szPort)); if ((lpSetup->fRequest == ODBC_ADD_DSN) && (lstrlen((char*)lpSetup->szDSN) != 0)) EnableWindow(GetDlgItem(hDlg, DSN_NAME), FALSE); return (TRUE); case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: /* Get data source name */ lpSetup = (LPSETUP) GetWindowLong(hDlg, DWL_USER); GetDlgItemText(hDlg, DSN_NAME, (char*)lpSetup->szDSN, SQL_MAX_DSN_LENGTH); /* Get database name */ GetDlgItemText(hDlg, DATABASE_NAME, (char*)lpSetup->szDatabase, MAX_DATABASE_NAME_LENGTH); AnsiToOem((char*)lpSetup->szDatabase, (char*)lpSetup->szDatabase); /* Clear off leading blanks */ while (*lpSetup->szDatabase == ' ') lstrcpy((char*)lpSetup->szDatabase, (char*) (lpSetup->szDatabase+1)); /* Clear off trailing blanks */ while (*lpSetup->szDatabase != '\0') { if (lpSetup->szDatabase[lstrlen((char*)lpSetup->szDatabase)-1] != ' ') break; lpSetup->szDatabase[lstrlen((char*)lpSetup->szDatabase)-1] = '\0'; } /* Get rid of terminating backslash (if any) */ if (lstrlen((char*)lpSetup->szDatabase) > 0) { if (lpSetup->szDatabase[lstrlen((char*)lpSetup->szDatabase)-1] == '\\') lpSetup->szDatabase[lstrlen((char*)lpSetup->szDatabase)-1] = '\0'; } else { /* If no directory specified, use the current directory */ lstrcpy((char*)lpSetup->szDatabase, "."); } /* Get host name */ GetDlgItemText(hDlg, HOST_NAME, lpSetup->szHost, MAX_HOST_NAME_LENGTH); /* Clear off leading blanks */ while (*lpSetup->szHost == ' ') lstrcpy(lpSetup->szHost, lpSetup->szHost+1); /* Clear off trailing blanks */ while (*lpSetup->szHost != '\0') { if (lpSetup->szHost[lstrlen(lpSetup->szHost)-1] != ' ') break; lpSetup->szHost[lstrlen(lpSetup->szHost)-1] = '\0'; } /* Get port number */ GetDlgItemText(hDlg, PORT_NUMBER, lpSetup->szPort, MAX_PORT_NUMBER_LENGTH); /* Clear off leading blanks */ while (*lpSetup->szPort == ' ') lstrcpy(lpSetup->szPort, lpSetup->szPort+1); /* Clear off trailing blanks */ while (*lpSetup->szPort != '\0') { if (lpSetup->szPort[lstrlen(lpSetup->szPort)-1] != ' ') break; lpSetup->szPort[lstrlen(lpSetup->szPort)-1] = '\0'; } /* Return */ EndDialog(hDlg, TRUE); return (TRUE); case IDCANCEL: EndDialog(hDlg, FALSE); return (TRUE); } break; } return (FALSE); } /***************************************************************************/ extern "C" BOOL INSTAPI ConfigDSN(HWND hwnd, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes) { SETUP sSetup; LPSTR ptr; LPSTR lpszKeyword; LPSTR lpszValue; DLGPROC lpProc; char szDriver[MAX_DRIVER_LENGTH+1]; char szTitle[100]; char szMessage[128]; /* Parse the attribute string */ sSetup.fRequest = fRequest; lstrcpy((char*)sSetup.szOriginalDSN, ""); lstrcpy((char*)sSetup.szDSN, ""); lstrcpy((char*)sSetup.szDatabase, ""); lstrcpy((char*)sSetup.szUsername, ""); lstrcpy((char*)sSetup.szPassword, ""); lstrcpy(sSetup.szHost, ""); lstrcpy(sSetup.szPort, ""); ptr = (LPSTR) lpszAttributes; while ( (lpszAttributes != NULL) && *ptr) { /* Point at start of next keyword */ lpszKeyword = ptr; /* Find the end of the keyword */ while ((*ptr != '\0') && (*ptr != '=')) ptr++; /* Accomodate bug in Microsoft ODBC Administrator */ if (*ptr == '\0') { ptr++; continue; } /* Error if no value */ if ((*ptr == '\0') || (ptr == lpszKeyword)) return FALSE; /* Put a zero terminator on the keyword */ *ptr = '\0'; ptr++; /* Point at start of the keyword's value */ lpszValue = ptr; /* Find the end of the value */ while (*ptr != '\0') ptr++; /* Save the keyword */ if (!lstrcmpi(lpszKeyword, KEY_DSN)) { lstrcpy((char*)sSetup.szOriginalDSN, lpszValue); lstrcpy((char*)sSetup.szDSN, lpszValue); } else if (!lstrcmpi(lpszKeyword, KEY_DATABASE)) lstrcpy((char*)sSetup.szDatabase, lpszValue); else if (!lstrcmpi(lpszKeyword, KEY_USERNAME)) lstrcpy((char*)sSetup.szUsername, lpszValue); else if (!lstrcmpi(lpszKeyword, KEY_PASSWORD)) lstrcpy((char*)sSetup.szPassword, lpszValue); else if (!lstrcmpi(lpszKeyword, KEY_HOST)) lstrcpy(sSetup.szHost, lpszValue); else if (!lstrcmpi(lpszKeyword, KEY_PORT)) lstrcpy(sSetup.szPort, lpszValue); /* Restore the input string */ lpszKeyword[lstrlen(lpszKeyword)] = '='; ptr++; } /* Which configuration operation? */ switch (fRequest) { case ODBC_REMOVE_DSN: /* Remove. Error if none specified */ if (lstrlen((char*)sSetup.szOriginalDSN) == 0) return FALSE; /* Remove the datasource */ if (!SQLRemoveDSNFromIni((char*)sSetup.szOriginalDSN)) return FALSE; break; case ODBC_CONFIG_DSN: /* Config. Get the database name from ODBC.INI file if not specified */ if (lstrlen((char*)sSetup.szDatabase) == 0) { if (lstrlen((char*)sSetup.szOriginalDSN) > 0) { SQLGetPrivateProfileString((char*)sSetup.szOriginalDSN, KEY_DATABASE, ".", (char*)sSetup.szDatabase, MAX_DATABASE_NAME_LENGTH+1, ODBC_INI); } } /* Get the user name from ODBC.INI file if not specified */ if (lstrlen((char*)sSetup.szUsername) == 0) { if (lstrlen((char*)sSetup.szOriginalDSN) > 0) { SQLGetPrivateProfileString((char*)sSetup.szOriginalDSN, KEY_USERNAME, "", (char*)sSetup.szUsername, MAX_USER_NAME_LENGTH+1, ODBC_INI); } } /* Get the password from ODBC.INI file if not specified */ if (lstrlen((char*)sSetup.szPassword) == 0) { if (lstrlen((char*)sSetup.szOriginalDSN) > 0) { SQLGetPrivateProfileString((char*)sSetup.szOriginalDSN, KEY_PASSWORD, "", (char*)sSetup.szPassword, MAX_PASSWORD_LENGTH+1, ODBC_INI); } } /* Get the host from ODBC.INI file if not specified */ if (lstrlen(sSetup.szHost) == 0) { if (lstrlen(sSetup.szOriginalDSN) > 0) { SQLGetPrivateProfileString(sSetup.szOriginalDSN, KEY_HOST, "", sSetup.szHost, MAX_HOST_NAME_LENGTH+1, ODBC_INI); } } /* Get the port number from ODBC.INI file if not specified */ if (lstrlen(sSetup.szPort) == 0) { if (lstrlen(sSetup.szOriginalDSN) > 0) { SQLGetPrivateProfileString(sSetup.szOriginalDSN, KEY_PORT, "", sSetup.szPort, MAX_PORT_NUMBER_LENGTH+1, ODBC_INI); } } /* Get changes from the user */ if (hwnd != NULL) { lpProc = MakeProcInstance( dlgSetup, s_hModule); if (!DialogBoxParam(s_hModule, "dlgSetup", hwnd, lpProc, (LPARAM) ((LPSETUP) &sSetup))) { FreeProcInstance(lpProc); return FALSE; } FreeProcInstance(lpProc); } /* Did datasource name change? */ if (lstrcmpi((char*)sSetup.szOriginalDSN, (char*)sSetup.szDSN)) { /* Yes. Does the new datasource name already exist? */ SQLGetPrivateProfileString((char*)sSetup.szDSN, KEY_DRIVER, "", (char*)szDriver, MAX_DRIVER_LENGTH+1, ODBC_INI); if (lstrlen((char*)szDriver) != 0) { /* Yes. Ask user if it is OK to overwrite. */ LoadString(s_hModule, STR_SETUP, (char*)szTitle, sizeof(szTitle)); LoadString(s_hModule, STR_OVERWRITE, (char*)szMessage, sizeof(szMessage)); if (IDOK != MessageBox(hwnd, (char*)szMessage, (char*)szTitle, MB_OKCANCEL | MB_ICONQUESTION)) return FALSE; } /* Remove the old datasource */ if (!SQLRemoveDSNFromIni((char*)sSetup.szOriginalDSN)) return FALSE; /* Create a new one */ if (!SQLWriteDSNToIni((char*)sSetup.szDSN, lpszDriver)) return FALSE; } /* Write the rest of the INI file entries */ SQLWritePrivateProfileString((char*)sSetup.szDSN, KEY_DATABASE, (char*)sSetup.szDatabase, ODBC_INI); SQLWritePrivateProfileString((char*)sSetup.szDSN, KEY_USERNAME, (char*)sSetup.szUsername, ODBC_INI); SQLWritePrivateProfileString((char*)sSetup.szDSN, KEY_PASSWORD, (char*)sSetup.szPassword, ODBC_INI); SQLWritePrivateProfileString(sSetup.szDSN, KEY_HOST, sSetup.szHost, ODBC_INI); SQLWritePrivateProfileString(sSetup.szDSN, KEY_PORT, sSetup.szPort, ODBC_INI); break; case ODBC_ADD_DSN: /* Add. Get changes from the user */ if (hwnd != NULL) { lpProc = MakeProcInstance( dlgSetup, s_hModule); if (!DialogBoxParam(s_hModule, "dlgSetup", hwnd, lpProc, (LPARAM) ((LPSETUP) &sSetup))) { FreeProcInstance(lpProc); return FALSE; } FreeProcInstance(lpProc); } /* Does the new datasource name already exist? */ SQLGetPrivateProfileString((char*)sSetup.szDSN, KEY_DRIVER, "", (char*)szDriver, MAX_DRIVER_LENGTH+1, ODBC_INI); if (lstrlen((char*)szDriver) != 0) { /* Yes. Ask user if it is OK to overwrite. */ if (hwnd != NULL) { LoadString(s_hModule, STR_SETUP, (char*)szTitle, sizeof(szTitle)); LoadString(s_hModule, STR_OVERWRITE, (char*)szMessage, sizeof(szMessage)); if (IDOK != MessageBox(hwnd, (char*)szMessage, (char*)szTitle, MB_OKCANCEL | MB_ICONQUESTION)) return FALSE; } /* Remove the old datasource */ if (!SQLRemoveDSNFromIni((char*)sSetup.szDSN)) return FALSE; } /* Create a new one */ if (!SQLWriteDSNToIni((char*)sSetup.szDSN, lpszDriver)) return FALSE; SQLWritePrivateProfileString((char*)sSetup.szDSN, KEY_DATABASE, (char*)sSetup.szDatabase, ODBC_INI); SQLWritePrivateProfileString((char*)sSetup.szDSN, KEY_USERNAME, (char*)sSetup.szUsername, ODBC_INI); SQLWritePrivateProfileString((char*)sSetup.szDSN, KEY_PASSWORD, (char*)sSetup.szPassword, ODBC_INI); SQLWritePrivateProfileString(sSetup.szDSN, KEY_HOST, sSetup.szHost, ODBC_INI); SQLWritePrivateProfileString(sSetup.szDSN, KEY_PORT, sSetup.szPort, ODBC_INI); break; } return TRUE; } /***************************************************************************/