// BDE - (C) Copyright 1994 by Borland International #include #include #include #include #include #include "dbping.h" // Declaration of global data HINSTANCE hInst; HWND hMainWnd; HCURSOR hArrow, hWait; // Function prototypes static BOOL InitApp(int nCmdShow); void reset_connect_dialog(HWND hWnd, BOOL bFirstReset, BOOL bResetAll); void try_to_connect(HWND hWnd); long FAR PASCAL _export MainWndProc(HWND, UINT, UINT, LONG); BOOL FAR PASCAL _export About(HWND, WORD, WORD, LONG); //=============================================================== // Name: WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow) // // Input: hInstance - The handle that represents the applications // unique instance ID. // hPrevInstance - Indicates if this is the first instance of // the app. // lpCmdLine - Command line parameters (up to the app to // parse). // nCmdShow - TRUE = Show as non-icon application // // Desc: Application entry point. Init the app, main // window, and global variables. //================================================================ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; DBIResult rslt; // IDAPI return values // Avoid warning re: Parameter is never used lpCmdLine = lpCmdLine; // Register CTL3D Ctl3dRegister(hInstance); Ctl3dAutoSubclass(hInstance); Ctl3dColorChange(); // Make this a single instance program if (hPrevInstance) { MessageBox(GetFocus(), "This application is already running!", "PING Utility", MB_OK); return FALSE; } // Init ODAPI (quit if failure occurs) SetCursor(hWait); if ((rslt = DbiInit(NULL)) != DBIERR_NONE) { if (rslt == DBIERR_CANTFINDODAPI) { MessageBox(GetFocus(), "Init( ) failed - DLL's not found." "\r\nCheck your path.", "PING Utility", MB_OK); } else { MessageBox(GetFocus(), "Init( ) failed!", "PING Utility", MB_OK); } return FALSE; } // Enable trace info if the debugging layer is enabled. DbiDebugLayerOptions(DEBUGON | OUTPUTTOFILE, "DBPING.INF"); SetCursor(hArrow); // Start the application hInst = hInstance; hWait = LoadCursor(NULL, IDC_WAIT); hArrow = LoadCursor(NULL, IDC_ARROW); if (InitApp(nCmdShow) == FALSE) { return FALSE; } // Process all event driven messages... while (GetMessage(&msg, NULL, NULL, NULL)) { if (!IsDialogMessage(hMainWnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } // Clean up and return SetCursor(hWait); DbiDebugLayerOptions(0, NULL); DbiExit(); DestroyWindow(hMainWnd); SetCursor(hArrow); // Unregister CTL3D Ctl3dUnregister(hInstance); return msg.wParam; } //================================================================= // Name: InitApp(nCmdShow); // // Input: nCmdShow - Whether to show the window after it is created // // Return: TRUE - Init worked // FALSE - Init failed // // Desc: Create the application window (in this case a // dialog). //================================================================ static BOOL InitApp (int nCmdShow) { WNDCLASS wc; BOOL ret = TRUE; // Init the application & create the needed windows wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = DLGWINDOWEXTRA; wc.hInstance = hInst; wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(1100)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); wc.lpszMenuName = NULL; wc.lpszClassName = "ConnectClass"; if(!RegisterClass(&wc)) { MessageBox(NULL, "RegisterClass failed!", "System Error", MB_OK | MB_ICONHAND); return FALSE; } hMainWnd = CreateDialog(hInst, "MainDialog", NULL, NULL); if (hMainWnd == NULL) { MessageBox(NULL, "CreateDialog failed!", "System Error", MB_OK | MB_ICONHAND); return FALSE; } ShowWindow(hMainWnd, nCmdShow); reset_connect_dialog(hMainWnd, TRUE, TRUE); SetFocus(GetDlgItem(hMainWnd, IDL_DRIVERS)); return ret; } //=============================================================== // Name: reset_connect_dialog(hWnd, bFirstReset, bResetAll); // // Input: hWnd - The dialog handle // bFirstReset - TRUE means to fill the driver listbox // bResetAll - TRUE means to repaint the entire dialog // FALSE means to repaint alias information // // Return: None. // // Desc: Reset the "connect to the database" dialog based // on the current driver selected. //================================================================ void reset_connect_dialog (HWND hWnd, BOOL bFirstReset, BOOL bResetAll) { hDBICur hList; DBDesc DbData; pFLDDesc pCfgInfo; WORD ListIndex; pCHAR pCfgRecBuf; pCHAR Driver; pCHAR Alias; // Allocate resources Alias = (pCHAR)malloc(DBIMAXSCFLDLEN); Driver = (pCHAR)malloc(DBIMAXSCFLDLEN); pCfgRecBuf = (pCHAR)malloc(DBIMAXSCRECSIZE); pCfgInfo = (pFLDDesc) malloc(sizeof(FLDDesc) * DBIMAXSCFIELDS); if (bFirstReset) { // Fill the listbox with the drivers available SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_RESETCONTENT, 0, 0); if (DbiOpenDriverList(&hList) == DBIERR_NONE) { while (DbiGetNextRecord(hList, dbiNOLOCK, (pBYTE)Driver, NULL) == DBIERR_NONE) { SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_INSERTSTRING, 0, (LPARAM) Driver); } DbiCloseCursor(&hList); } // Select the first item of the list boxes SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_SETCURSEL, 0, 0); } // Get the driver currently selected ListIndex = (WORD) SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_GETCURSEL, 0, 0); SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_GETTEXT, (WPARAM) ListIndex, (LPARAM) Driver); // Reset the driver to "STANDARD" if Paradox or dBASE if ((strcmp(Driver, szDBASE) == GOOD_STR_COMPARE) || (strcmp(Driver, szPARADOX) == GOOD_STR_COMPARE)) { strcpy(Driver, "STANDARD"); } // Leave the alias list alone if not resetting the listbox if (bResetAll) { // Reset info displayed (based on the driver type) if (strcmp(Driver, "STANDARD") == GOOD_STR_COMPARE) { // Remove the user name & password if alias is STANDARD ShowWindow(GetDlgItem(hWnd, IDE_PASSWORD), SW_HIDE); ShowWindow(GetDlgItem(hWnd, IDT_PASSWORD_HDR), SW_HIDE); } else { // Make sure all is displayed ShowWindow(GetDlgItem(hWnd, IDE_PASSWORD), SW_SHOW); ShowWindow(GetDlgItem(hWnd, IDT_PASSWORD_HDR), SW_SHOW); } // Clear & fill the alias listbox SendDlgItemMessage(hWnd, IDL_ALIASES, LB_RESETCONTENT, 0, 0); if (DbiOpenDatabaseList(&hList) == DBIERR_NONE) { // Scan the list of aliases for matching drivers while (DbiGetNextRecord(hList, dbiNOLOCK, (pBYTE) &DbData, NULL) == DBIERR_NONE) { if (strcmp(DbData.szDbType, Driver) == GOOD_STR_COMPARE) { SendDlgItemMessage(hWnd, IDL_ALIASES, LB_INSERTSTRING, 0, (LPARAM) DbData.szName); } } DbiCloseCursor(&hList); SendDlgItemMessage(hWnd, IDL_ALIASES, LB_SETCURSEL, 0, 0); } } // Reset the connection results list box SendDlgItemMessage(hWnd, IDL_RESULTS, LB_RESETCONTENT, 0, 0); // Don't forget to free up resources free(Alias); free(Driver); free(pCfgRecBuf); free((pCHAR) pCfgInfo); } //=============================================================== // Name: try_to_connect(hWnd); // // Input: hWnd - The dialog handle // // Return: None. // // Desc: Try to connect to a database based on the data // selected in the main window. //================================================================ void try_to_connect (HWND hWnd) { hDBIDb hDb; DBIResult rslt; DBIErrInfo ErrInfo; WORD ListIndex; CHAR Msg[DBIMAXMSGLEN+1]; pCHAR Driver; pCHAR Alias; pCHAR Password; // Init the strings SetCursor(hWait); Alias = (pCHAR)malloc(DBIMAXSCFLDLEN); Driver = (pCHAR)malloc(DBIMAXSCFLDLEN); Password = (pCHAR)malloc(DBIMAXSCFLDLEN); Alias[0] = '\0'; Driver[0] = '\0'; Password[0] = '\0'; // Get the selected driver ListIndex = (WORD) SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_GETCURSEL, 0, 0); SendDlgItemMessage(hWnd, IDL_DRIVERS, LB_GETTEXT, (WPARAM) ListIndex, (LPARAM) Driver); // Reset the driver type to NULL if standard database if ((strcmp(Driver, szDBASE) == GOOD_STR_COMPARE) || (strcmp(Driver, szPARADOX) == GOOD_STR_COMPARE)) { Driver[0] = '\0'; } else // SQL database... { // SQL database needs the alias & password ListIndex = (WORD) SendDlgItemMessage(hWnd, IDL_ALIASES, LB_GETCURSEL, 0, 0); SendDlgItemMessage(hWnd, IDL_ALIASES, LB_GETTEXT, (WPARAM) ListIndex, (LPARAM) Alias); SendDlgItemMessage(hWnd, IDE_PASSWORD, WM_GETTEXT, 80, (LPARAM) Password); } // Try to open the database hDb = NULL; SendDlgItemMessage(hWnd, IDL_RESULTS, LB_RESETCONTENT, 0, 0); rslt = DbiOpenDatabase(Alias, Driver, dbiREADWRITE, dbiOPENSHARED, Password, 0, NULL, NULL, &hDb); if (rslt == DBIERR_NONE) { DbiCloseDatabase(&hDb); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM) "Connection is available!"); } else { // Failed to connect DbiGetErrorInfo(TRUE, &ErrInfo); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM) "ERROR - Failed to connect"); wsprintf(Msg, " Error Category = %d Error Code = %d", ErrCat(rslt), ErrCode(rslt)); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM)Msg); if (ErrInfo.szErrCode[0] != '\0') { wsprintf(Msg, " -> ErrCode: %s", ErrInfo.szErrCode); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM)Msg); } if (ErrInfo.szContext1[0] != '\0') { wsprintf(Msg, " -> Context1: %s", ErrInfo.szContext1); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM)Msg); } if (ErrInfo.szContext2[0] != '\0') { wsprintf(Msg, " -> Context2: %s", ErrInfo.szContext2); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM)Msg); } if (ErrInfo.szContext3[0] != '\0') { wsprintf(Msg, " -> Context3: %s", ErrInfo.szContext3); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM)Msg); } if (ErrInfo.szContext4[0] != '\0') { wsprintf(Msg, " -> Context4: %s", ErrInfo.szContext4); SendDlgItemMessage(hWnd, IDL_RESULTS, LB_ADDSTRING, 0, (LPARAM)Msg); } } // Free up resources free(Alias); free(Driver); free(Password); SetCursor(hArrow); } //============================================================== // Name: MainWndProc(hWnd, msg, wParam, lParam); // // Desc: This routine will process all messaged for // the primary application window. Included in this are all // menu commands. //============================================================== long FAR PASCAL _export MainWndProc (HWND hWnd, UINT msg, UINT wParam, LONG lParam) { HWND hFocus; FARPROC lpTempProc; INT32 ret = FALSE; HWND hwnd; switch (msg) { case WM_CREATE: PostMessage(hWnd, WM_COMMAND, ID_SUBCLASS, NULL); ShowWindow(hWnd, FALSE); break; case WM_CTLCOLOR: return (long)(WORD)Ctl3dCtlColorEx(msg, wParam, lParam); case WM_SYSCOLORCHANGE: Ctl3dColorChange(); break; case WM_SETFOCUS: SetFocus(GetDlgItem(hWnd, IDL_DRIVERS)); case WM_COMMAND: hFocus = GetFocus(); switch(wParam) { case IDL_DRIVERS: if (HIWORD(lParam) == LBN_SELCHANGE) { reset_connect_dialog(hWnd, FALSE, TRUE); } break; case IDL_ALIASES: if (HIWORD(lParam) == LBN_SELCHANGE) { reset_connect_dialog(hWnd, FALSE, FALSE); } break; case IDM_ABOUT: lpTempProc = MakeProcInstance((FARPROC) About, hInst); DialogBox(hInst, "About", hMainWnd, (DLGPROC)lpTempProc); FreeProcInstance((FARPROC) lpTempProc); break; case IDOK: try_to_connect(hWnd); break; case ID_SUBCLASS: // Can't do this within WM_CREATE hwnd = GetWindow(hWnd, GW_CHILD); while (hwnd != NULL) { Ctl3dSubclassCtl(hwnd); hwnd = GetWindow(hwnd, GW_HWNDNEXT); } // Set a width for the horrizontal scroll bar SendMessage(GetDlgItem(hWnd, IDL_RESULTS), LB_SETHORIZONTALEXTENT, 2000, NULL); ShowWindow(hWnd, TRUE); break; case IDCANCEL: PostQuitMessage(0); break; default: ret = DefWindowProc(hWnd, msg, wParam, lParam); break; } SetFocus(hFocus); break; case WM_DESTROY: PostQuitMessage(0); break; default: ret = DefWindowProc(hWnd, msg, wParam, lParam); break; } return ret; } //============================================================== // Name: About(hDlg, msg, wParam, lParam); // // Desc: This routine will process all I/O for the // ABOUT dialog. //============================================================== BOOL FAR PASCAL _export About (HWND hDlg, WORD msg, WORD wParam, LONG lParam) { int ret = FALSE; switch (msg) { case WM_COMMAND: switch (wParam) { case IDOK: case IDCANCEL: // Avoid warning re: parameter not used lParam = lParam; EndDialog(hDlg, TRUE); ret = TRUE; break; } break; } return ret; }