blob: 4de4f3c1d73a7a4ff1078b2c37bacf9b7c02c844 [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// 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.
//
// @@@ END COPYRIGHT @@@
********************************************************************/
// PropSheet.cpp : implementation file
//
#include "stdafx.h"
#include "drvr35adm.h"
#include "PropSheet.h"
#include "HtmlHelp.h"
#include <atlconv.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPropSheet
IMPLEMENT_DYNAMIC(CPropSheet, CPropertySheet)
const int CPropSheet::m_NewDSNIndexOffset = 7;
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
bUpdateDSN=false;
}
CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
bUpdateDSN=false;
}
CPropSheet::~CPropSheet()
{
}
BEGIN_MESSAGE_MAP(CPropSheet, CPropertySheet)
//{{AFX_MSG_MAP(CPropSheet)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPropSheet message handlers
#define ODBCMXDS "odbcmxds.chm"
#define General_Create_DS 100
#define Network_Create_DS 110
#define Data_Access_Create_DS 120
#define Localize_Create_DS 125
#define Trace_Create_DS 130
#define Test_Create_DS 140
#define Test_dlg_box_Create_DS 150
#define General_Reconfigure_DS 200
#define Network_Reconfigure_DS 210
#define Data_Access_Reconfigure_DS 220
#define Trace_Reconfigure_DS 230
#define Test_Reconfigure_DS 240
#define Localize_Reconfigure_DS 225
enum {
pageGeneral = 1,
pageNetwork,
pageOptions,
pageLocalTr,
pageTracing,
pageTesting,
tabGeneral,
tabNetwork,
tabOptions,
tabLocalTr,
tabTracing,
tabTesting
};
int map[] = {
General_Create_DS,
Network_Create_DS,
Data_Access_Create_DS,
Localize_Create_DS,
Trace_Create_DS,
Test_Create_DS,
Test_dlg_box_Create_DS,
General_Reconfigure_DS,
Network_Reconfigure_DS,
Data_Access_Reconfigure_DS,
Localize_Reconfigure_DS,
Trace_Reconfigure_DS,
Test_Reconfigure_DS,
};
BOOL CPropSheet::OnHelpInfo(HELPINFO* pHelpInfo)
{
DisplayHtmlHelp();
return CPropertySheet::OnHelpInfo(pHelpInfo);
}
BOOL CPropSheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
if(wParam==IDHELP)
{
DisplayHtmlHelp();
}
return CPropertySheet::OnCommand(wParam, lParam);
}
BOOL CPropSheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
// CMenu* pCMenu = GetSystemMenu(FALSE);
// while (pCMenu != NULL && pCMenu->GetMenuItemCount() > 0)
// pCMenu->DeleteMenu( 0, MF_BYPOSITION);
if (bNewDSN == TRUE)
SetWindowText(CREATE_NEW_DSN);
else
{
CString cTitle;
cTitle = cTitle + CONFIGURE_DSN1 + aAttr[ KEY_DSN].szAttr + CONFIGURE_DSN2;
SetWindowText(cTitle);
}
return bResult;
}
bool CPropSheet::UpdateDSN( void )
{
char* lpszDSN;
char szBuf[ _MAX_PATH];
lpszDSN = aAttr[ KEY_DSN].szAttr;
// if the data source name has changed, remove the old name
if( !bNewDSN && strcmp( szDSN, lpszDSN) != 0)
{
SQLRemoveDSNFromIni( szDSN);
// remove File Data Source Name
DeleteFileDSN( szDSN );
}
if(strcmp( szDSN, lpszDSN )!=0)
{
WritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI);
// update File DSN
lstrcpy(szBuf, lpszDSN );
lstrcat(szBuf, " (not sharable)");
SQLWriteFileDSN( szBuf, "ODBC", "DSN", lpszDSN );
SQLWritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI);
}
// write data source name
if( !SQLWriteDSNToIni( lpszDSN, lpszDrvr))
{
char szMsg[ MAXPATHLEN];
CString szBuf;
szBuf.LoadString(IDS_BADDSN);
wsprintf( szMsg, szBuf, lpszDSN);
AfxMessageBox( szMsg);
return FALSE;
}
// update ODBC.INI
// save the value if the data source is new, edited, or explicitly supplied
WritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI);
// update File DSN
lstrcpy(szBuf, lpszDSN );
lstrcat(szBuf, " (not sharable)");
SQLWriteFileDSN( szBuf, "ODBC", "DSN", lpszDSN );
SQLWritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI);
// the following are the localization (internationalization) attributes
WritePrivateProfileString( lpszDSN, INI_ERRORLANG, aAttr[ KEY_ERRORLANG].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_ERRORLANG, aAttr[ KEY_ERRORLANG].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_DATALANG, aAttr[ KEY_DATALANG].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_DATALANG, aAttr[ KEY_DATALANG].szAttr, ODBC_INI);
// Association Service (IP Address and Port Number)
wsprintf(szBuf, "%s%s/%s", TCP_STR, aAttr[ KEY_IPADDRESS].szAttr, aAttr[ KEY_PORTNUM].szAttr);
WritePrivateProfileString( lpszDSN, INI_NETWORK, szBuf, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_NETWORK, szBuf, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_LOGIN, aAttr[ KEY_LOGIN].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_LOGIN, aAttr[ KEY_LOGIN].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_CONNECTION, aAttr[ KEY_CONNECTION].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_CONNECTION, aAttr[ KEY_CONNECTION].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_QUERY, aAttr[ KEY_QUERY].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_QUERY, aAttr[ KEY_QUERY].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_CATALOG, aAttr[ KEY_CATALOG].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_CATALOG, aAttr[ KEY_CATALOG].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_SCHEMA, aAttr[ KEY_SCHEMA].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_SCHEMA, aAttr[ KEY_SCHEMA].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_TRANSLATION_DLL, aAttr[ KEY_TRANSLATION_DLL].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_TRANSLATION_DLL, aAttr[ KEY_TRANSLATION_DLL].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_TRANSLATION_OPTION, aAttr[ KEY_TRANSLATION_OPTION].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_TRANSLATION_OPTION, aAttr[ KEY_TRANSLATION_OPTION].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_FETCH_BUFFER_SIZE, aAttr[ KEY_FETCH_BUFFER_SIZE].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_FETCH_BUFFER_SIZE, aAttr[ KEY_FETCH_BUFFER_SIZE].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_REPLACEMENT_CHAR, aAttr[ KEY_REPLACEMENT_CHAR].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_REPLACEMENT_CHAR, aAttr[ KEY_REPLACEMENT_CHAR].szAttr, ODBC_INI);
WritePrivateProfileString( lpszDSN, INI_COMPRESSION, aAttr[ KEY_COMPRESSION].szAttr, ODBC_INI);
SQLWritePrivateProfileString( lpszDSN, INI_COMPRESSION, aAttr[ KEY_COMPRESSION].szAttr, ODBC_INI);
WriteTraceRegistry( INI_TRACE_FILE,aAttr[ KEY_TRACE_FILE].szAttr);
WriteTraceRegistry( INI_TRACE_FLAGS,aAttr[ KEY_TRACE_FLAGS].szAttr);
return TRUE;
}
CString CPropSheet::GetHelpFilePath()
{
CString helpPath, regKey, regValue;
HKEY ODBCKey;
DWORD MaxValue = MAX_PATH + 1;
bool bError = true;
regKey.LoadString(IDS_REGKEY_HELP);
regValue.LoadString(IDS_REGVALUE_HELP);
// Get the path name out of the registry.
// If this fails, return the system directory.
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
regKey,
0,
KEY_READ,
&ODBCKey) == ERROR_SUCCESS)
{
if (RegQueryValueEx(ODBCKey, regValue, NULL, NULL,
(LPBYTE) helpPath.GetBuffer(MaxValue),
&MaxValue) == ERROR_SUCCESS)
{
bError = false;
}
helpPath.ReleaseBuffer();
RegCloseKey(ODBCKey);
}
if (bError)
{
GetSystemDirectory(helpPath.GetBuffer(MaxValue), MaxValue);
helpPath.ReleaseBuffer();
}
// Append a "\" if directory path doesn't already have one.
if (helpPath.Right(1) != _T("\\"))
helpPath += _T("\\");
return helpPath;
}
/******************************************************************************
DisplayHtmlHelp()
Description:
This function performs some error handling of the HtmlHelp() API.
Returns:
TRUE - An HtmlHelp window was successfully created.
FALSE - An HtmlHelp window could not be created.
*****************************************************************************/
BOOL CPropSheet::DisplayHtmlHelp()
{
USES_CONVERSION; // For Unicode to ANSI string conversion
HWND hwndHelp = NULL;
CString strError, strCaption, strFile;
HH_LAST_ERROR hherror;
int index = GetActiveIndex();
int context = -1;
// Setting up the file name
strFile.LoadString(IDS_HELPFILENAME);
strFile = GetHelpFilePath() + strFile;
// Setting up the index
if (bNewDSN != TRUE) index += m_NewDSNIndexOffset;
context = map[index];
#ifndef _WIN64
// Win64 link gives unresolved reference
hwndHelp = ::HtmlHelp(m_hWnd, strFile, HH_HELP_CONTEXT, context);
#endif
if (hwndHelp == NULL)
{
// Try to get error message.
#ifndef _WIN64
// Win64 link gives unresolved reference
hwndHelp = ::HtmlHelp(m_hWnd,
NULL, HH_GET_LAST_ERROR,
reinterpret_cast<DWORD>(&hherror));
#endif
// Generate an error message if we have one.
if (hwndHelp != 0)
{
if (hherror.hr < 0)
{
// Is there a text message to display?
if (hherror.description)
{
// Convert the String to ANSI
TCHAR* pDesc = OLE2T(hherror.description) ;
::SysFreeString(hherror.description) ;
// Generate our message
strError = pDesc;
}
}
}
// Couldn't determine error from HtmlHelp. Generate a generic error message.
else
{
strError.Format(IDS_HELP_GENERIC_ERROR, strFile);
}
strCaption.LoadString(IDS_HELP_ERROR_CAPTION);
MessageBox(strError, strCaption, MB_OK | MB_ICONERROR);
return FALSE;
}
else
return TRUE;
}