8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-25 00:43:03 +01:00
firebird-mirror/src/remote/property.cpp
2002-06-29 09:36:00 +00:00

348 lines
10 KiB
C++

/*
* The contents of this file are subject to the Interbase Public
* License Version 1.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.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
/*
* PROGRAM: IB Server
* MODULE: property.c
* DESCRIPTION: Property sheet implementation for WIN32 server
*
*/
/* Since it's a Win32-only file, we might as well assert it*/
#if !defined(_WIN32) && !defined(WIN32) && !defined(__WIN32__)
#error This is a Win32 only file.
#endif
#include "firebird.h"
#include <windows.h>
#include <shellapi.h>
#include <prsht.h>
#include <dbt.h>
#define BOOLEAN_DEFINED
#define MSG_DEFINED
#include "../jrd/common.h"
#include "../jrd/license.h"
#include "../jrd/isc.h"
#include "../jrd/file_params.h"
#include "../remote/remote_def.h"
#include "../remote/window.rh"
#include "../remote/property.rh"
#include "../ipserver/ips.h"
#include "../jrd/svc_proto.h"
#include "../remote/window_proto.h"
#include "../remote/propty_proto.h"
#include "../ipserver/ipsrv_proto.h"
#include "../remote/ibconfig.h"
#include "../jrd/ibase.h"
#include "../remote/ibsvrhlp.h"
#include "../remote/chop_proto.h"
#include "../jrd/thd.h" /* get jrd_proto.h to declare the function */
#include "../jrd/jrd_proto.h" /* JRD_num_attachments() */
#include <stdio.h> /* sprintf() */
#define WIN_TEXTLEN 128
#define MSG_STRINGLEN 64
#define APP_LABEL "Firebird Server"
static HINSTANCE hInstance = NULL; // Handle to the current app. instance
static HWND hPSDlg = NULL; // Handle to the parent prop. sheet window
HBRUSH hGrayBrush = NULL; // Handle to a Gray Brush
static USHORT usServerFlags; // Server Flag Mask
// Define an array of dword pairs,
// where the first of each pair is the control ID,
// and the second is the context ID for a help topic,
// which is used in the help file.
static const DWORD aMenuHelpIDs[] = {
IDC_IBSVR_ICON, ibs_server_icon,
IDC_PROTOCOLS, ibs_capabilities,
IDC_CAPABILITIES_TEXT, ibs_capabilities,
IDC_PRODNAME, ibs_prodname,
IDC_PATH, ibs_image_path,
IDC_LOCATION_TEXT, ibs_image_path,
IDC_STAT1, ibs_version,
IDC_VERSION_TEXT, ibs_version,
IDC_STAT2, ibs_num_dbs_attached,
IDC_NUM_ATTACH_TEXT, ibs_num_dbs_attached,
IDC_STAT3, ibs_num_dbs,
IDC_NUM_DB_TEXT, ibs_num_dbs,
IDC_REFRESH, ibs_refresh,
0, 0
};
// Window procedures
LRESULT APIENTRY GeneralPage(HWND, UINT, WPARAM, LPARAM);
// Static functions to be called from this file only.
static char *MakeVersionString(char *, int, USHORT);
static void RefreshUserCount(HWND);
HWND DisplayProperties(HWND hParentWnd,
HINSTANCE hInst, USHORT usServerFlagMask)
{
/******************************************************************************
*
* D i s p l a y P r o p e r t i e s
*
******************************************************************************
*
* Input: hParentWnd - Handle to the main window of this application
*
* Return: Handle to the Property sheet dialog if successful
* NULL if error in displaying property sheet
*
* Description: This function initializes the page(s) of the property sheet,
* and then calls the PropertySheet() function to display it.
*****************************************************************************/
PROPSHEETHEADER PSHdr;
PROPSHEETPAGE PSPages[1];
hInstance = hInst;
usServerFlags = usServerFlagMask;
PSPages[0].dwSize = sizeof(PROPSHEETPAGE);
PSPages[0].dwFlags = PSP_USETITLE | PSP_HASHELP;
PSPages[0].hInstance = hInstance;
PSPages[0].pszTemplate = MAKEINTRESOURCE(GENERAL_DLG);
PSPages[0].pszTitle = "General";
PSPages[0].pfnDlgProc = (DLGPROC) GeneralPage;
PSPages[0].pfnCallback = NULL;
PSHdr.dwSize = sizeof(PROPSHEETHEADER);
PSHdr.dwFlags = PSH_PROPTITLE | PSH_PROPSHEETPAGE |
PSH_USEICONID | PSH_MODELESS;
PSHdr.hwndParent = hParentWnd;
PSHdr.hInstance = hInstance;
PSHdr.pszIcon = MAKEINTRESOURCE(IDI_IBSVR);
PSHdr.pszCaption = (LPSTR) APP_LABEL;
PSHdr.nPages = sizeof(PSPages) / sizeof(PROPSHEETPAGE);
PSHdr.nStartPage = 0;
PSHdr.ppsp = (LPCPROPSHEETPAGE) & PSPages;
PSHdr.pfnCallback = NULL;
// Initialize the gray brush to paint the background
// for all prop. sheet pages and their controls
hGrayBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
hPSDlg = (HWND) PropertySheet(&PSHdr);
if (hPSDlg <= 0)
hPSDlg = NULL;
else
// Add the Configuration pages
AddConfigPages(hPSDlg, hInstance);
return hPSDlg;
}
LRESULT CALLBACK GeneralPage(HWND hDlg, UINT unMsg, WPARAM wParam,
LPARAM lParam)
{
/******************************************************************************
*
* G e n e r a l P a g e
*
******************************************************************************
*
* Input: hDlg - Handle to the page dialog
* unMsg - Message ID
* wParam - WPARAM message parameter
* lParam - LPARAM message parameter
*
* Return: FALSE if message is not processed
* TRUE if message is processed here
*
* Description: This is the window procedure for the "General" page dialog
* of the property sheet dialog box. All the Property Sheet
* related events are passed as WM_NOTIFY messages and they
* are identified within the LPARAM which will be pointer to
* the NMDR structure
*****************************************************************************/
switch (unMsg) {
case WM_INITDIALOG:
{
char *pszPtr;
char szText[MSG_STRINGLEN];
char szWindowText[WIN_TEXTLEN];
lstrcpy(szText, GDS_VERSION);
SetDlgItemText(hDlg, IDC_STAT1, szText);
LoadString(hInstance, IDS_UNLIMITED_USERS, szText, MSG_STRINGLEN);
SetDlgItemText(hDlg, IDC_LICENSE, szText);
if (usServerFlags & (SRVR_inet | SRVR_pipe | SRVR_spx))
LoadString(hInstance,
IDS_SERVERPROD_NAME, szText, MSG_STRINGLEN);
else
LoadString(hInstance,
IDS_LOCALPROD_NAME, szText, MSG_STRINGLEN);
SetDlgItemText(hDlg, IDC_PRODNAME, szText);
MakeVersionString(szWindowText, WIN_TEXTLEN, usServerFlags);
SetDlgItemText(hDlg, IDC_PROTOCOLS, szWindowText);
GetModuleFileName(hInstance, szWindowText, WIN_TEXTLEN);
pszPtr = strrchr(szWindowText, '\\');
*(pszPtr + 1) = 0x00;
ChopFileName(szWindowText, szWindowText, 38);
SetDlgItemText(hDlg, IDC_PATH, szWindowText);
RefreshUserCount(hDlg);
}
break;
case WM_CTLCOLORDLG:
case WM_CTLCOLORSTATIC:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORMSGBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORBTN:
{
OSVERSIONINFO OsVersionInfo;
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx((LPOSVERSIONINFO) & OsVersionInfo) &&
OsVersionInfo.dwMajorVersion < 4) {
SetBkMode((HDC) wParam, TRANSPARENT);
return (LRESULT) hGrayBrush;
}
}
break;
case WM_HELP:
{
LPHELPINFO lphi;
lphi = (LPHELPINFO) lParam;
if (lphi->iContextType == HELPINFO_WINDOW) // must be for a control
{
WinHelp(static_cast < HWND > (lphi->hItemHandle),
"IBSERVER.HLP",
HELP_WM_HELP, (DWORD) (LPVOID) aMenuHelpIDs);
}
}
return TRUE;
case WM_CONTEXTMENU:
{
WinHelp((HWND) wParam,
"IBSERVER.HLP",
HELP_CONTEXTMENU, (DWORD) (LPVOID) aMenuHelpIDs);
}
return TRUE;
case WM_COMMAND:
switch (wParam) {
case IDC_REFRESH:
RefreshUserCount(hDlg);
break;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR) lParam)->code) {
case PSN_KILLACTIVE:
SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
break;
case PSN_HELP:
HelpCmd(hDlg, hInstance, ibsp_Server_Information_Properties);
break;
}
break;
}
return FALSE;
}
static char *MakeVersionString(char *pchBuf, int nLen,
USHORT usServerFlagMask)
{
/******************************************************************************
*
* M a k e V e r s i o n S t r i n g
*
******************************************************************************
*
* Input: pchBuf - Buffer to be filled into
* nLen - Length of the buffer
* usServerFlagMask - Bit flag mask encoding the server flags
*
* Return: Buffer containing the version string
*
* Description: This method is called to get the Version String. This string
* is based on the flag set in usServerFlagMask.
*****************************************************************************/
char *p = pchBuf;
char *end = p + nLen;
if (usServerFlagMask & SRVR_inet) {
p += LoadString(hInstance, IDS_TCP, p, end - p);
if (p < end)
*p++ = '\r';
if (p < end)
*p++ = '\n';
}
if (usServerFlagMask & SRVR_pipe) {
p += LoadString(hInstance, IDS_NP, p, end - p);
if (p < end)
*p++ = '\r';
if (p < end)
*p++ = '\n';
}
if (usServerFlagMask & SRVR_ipc) {
p += LoadString(hInstance, IDS_IPC, p, end - p);
}
return pchBuf;
}
static void RefreshUserCount(HWND hDlg)
{
/******************************************************************************
*
* R e f r e s h U s e r C o u n t
*
******************************************************************************
*
* Input: hDlg - Handle to the General page dialog
*
* Return: void
*
* Description: This method calls the JRD_num_attachments() function to get
* the number of active attachments to the server.
*****************************************************************************/
char szText[MSG_STRINGLEN];
USHORT num_att = 0;
USHORT num_dbs = 0;
HCURSOR hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
JRD_num_attachments(NULL, 0, 0, &num_att, &num_dbs);
sprintf(szText, "%d", num_att);
SetDlgItemText(hDlg, IDC_STAT2, szText);
sprintf(szText, "%d", num_dbs);
SetDlgItemText(hDlg, IDC_STAT3, szText);
SetCursor(hOldCursor);
}