STEP4.CPP
//----------------------------------------------------------------------------- 
// Microsoft OLE DB TABLECOPY Sample 
// Copyright (C) 1996 By Microsoft Corporation. 
// 
// @doc 
// 
// @module STEP4.CPP 
// 
//----------------------------------------------------------------------------- 
 
///////////////////////////////////////////////////////////////////// 
// Includes 
// 
///////////////////////////////////////////////////////////////////// 
#include "wizard.h" 
#include "common.h" 
#include "tablecopy.h" 
#include "table.h" 
 
 
///////////////////////////////////////////////////////////////////// 
// CS4Dialog::CS4Dialog 
// 
///////////////////////////////////////////////////////////////////// 
CS4Dialog::CS4Dialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy) 
: CDialog(hWnd, hInst) 
{ 
ASSERT(pCTableCopy); 
m_pCTableCopy = pCTableCopy; 
} 
 
 
///////////////////////////////////////////////////////////////////// 
// CS4Dialog::~CS4Dialog 
// 
///////////////////////////////////////////////////////////////////// 
CS4Dialog::~CS4Dialog() 
{ 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// ULONG CS4Dialog::Display 
// 
///////////////////////////////////////////////////////////////////////////// 
ULONG CS4Dialog::Display() 
{   
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_OPTIONS), NULL, DlgProc, (LPARAM)this); 
} 
 
 
///////////////////////////////////////////////////////////////////// 
// CS4Dialog::DlgProc 
// 
///////////////////////////////////////////////////////////////////// 
BOOL WINAPI CS4Dialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch(msg)  
{ 
case WM_INITDIALOG: 
{ 
//Store the "this" pointer, since this is a static method 
CS4Dialog* pThis = (CS4Dialog*)lParam; 
SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis); 
 
//On INIT we know we have a valid hWnd to store 
pThis->m_hWnd = hWnd; 
 
pThis->InitControls(); 
CenterDialog(hWnd); 
return HANDLED_MSG; 
} 
 
case WM_COMMAND: 
{ 
//Obtain the "this" pointer 
CS4Dialog* pThis = (CS4Dialog*)GetWindowLong(hWnd, GWL_USERDATA); 
 
// All buttons are handled the same way 
switch(GET_WM_COMMAND_ID(wParam, lParam))  
{ 
case IDX_COPY_TABLE: 
case IDX_COPY_INDEXES: 
case IDX_SHOW_SQL: 
 
case IDR_ALL_ROWS: 
case IDR_MAX_ROWS: 
case IDR_PARAM_SETS: 
case IDR_INSERT_ROW: 
case IDR_BLOB_SIZE: 
case IDR_ISEQ_STREAM: 
pThis->RefreshControls(); 
return HANDLED_MSG; 
 
 
case IDOK: 
case IDB_PREV: 
if(!pThis->RefreshControls()) 
return HANDLED_MSG; 
                 
case IDCANCEL: 
                EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam)); 
                return HANDLED_MSG; 
} 
} 
} 
 
return UNHANDLED_MSG; 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// BOOL CS4Dialog::InitControls 
// 
///////////////////////////////////////////////////////////////////////////// 
BOOL CS4Dialog::InitControls() 
{ 
//IDX_COPY_TABLE (default-checked) 
CheckDlgButton(m_hWnd, IDX_COPY_TABLE, m_pCTableCopy->m_fCopyTables); 
 
//IDX_COPY_INDEXES (default-checked) 
CheckDlgButton(m_hWnd, IDX_COPY_INDEXES, m_pCTableCopy->m_fCopyIndexes); 
 
//IDX_SHOW_SQL (checked) 
CheckDlgButton(m_hWnd, IDX_SHOW_SQL, m_pCTableCopy->m_fShowQuery); 
 
//IDR_ALL_ROWS (default) 
//IDR_MAX_ROWS 
CheckRadioButton(m_hWnd, IDR_ALL_ROWS, IDR_MAX_ROWS, m_pCTableCopy->m_dwRowOpt); 
wSetDlgItemText(m_hWnd, IDE_MAX_ROWS, L"%lu", m_pCTableCopy->m_ulMaxRows); 
 
//IDR_PARAM_SETS (default) 
//IDR_INSERT_ROW 
//If multiple param sets are not supported by this driver, select only 1 set 
if(!m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets) 
m_pCTableCopy->m_ulParamSets = 1; 
CheckRadioButton(m_hWnd, IDR_PARAM_SETS, IDR_INSERT_ROW, m_pCTableCopy->m_dwParamOpt); 
wSetDlgItemText(m_hWnd, IDE_PARAM_SETS, L"%lu", m_pCTableCopy->m_ulParamSets); 
 
//IDR_BLOB_SIZE(default) 
//IDR_ISEQ_STREAM  
CheckRadioButton(m_hWnd, IDR_BLOB_SIZE, IDR_ISEQ_STREAM, m_pCTableCopy->m_dwBlobOpt); 
wSetDlgItemText(m_hWnd, IDE_BLOB_SIZE, L"%lu", m_pCTableCopy->m_ulBlobSize); 
 
//ISEQ_STREAM is currently disabled, until limitations are fixed 
EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), FALSE); 
 
//Limit the TextLength of the Edit Controls to 10 chars 
SendDlgItemMessage(m_hWnd, IDE_MAX_ROWS, EM_LIMITTEXT, (WPARAM)10, 0L); 
SendDlgItemMessage(m_hWnd, IDE_PARAM_SETS, EM_LIMITTEXT, (WPARAM)10, 0L); 
SendDlgItemMessage(m_hWnd, IDE_BLOB_SIZE, EM_LIMITTEXT, (WPARAM)10, 0L); 
 
// Refresh the controls 
RefreshControls(); 
return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// BOOL CS4Dialog::RefreshControls 
// 
///////////////////////////////////////////////////////////////////////////// 
BOOL CS4Dialog::RefreshControls() 
{ 
// IDE_MAX_ROWS Get the Copy options first so we can check the row count if given. 
if(IsDlgButtonChecked(m_hWnd, IDR_MAX_ROWS))  
{ 
m_pCTableCopy->m_dwRowOpt = IDR_MAX_ROWS; 
EnableWindow(GetDlgItem(m_hWnd, IDE_MAX_ROWS), TRUE); 
} 
else 
{ 
m_pCTableCopy->m_dwRowOpt = IDR_ALL_ROWS; 
EnableWindow(GetDlgItem(m_hWnd, IDE_MAX_ROWS), FALSE); 
} 
 
//Verify IDE_MAX_ROWS has legal value 
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_MAX_ROWS), 1, LONG_MAX, &m_pCTableCopy->m_ulMaxRows)) 
return FALSE; 
 
//ISEQ_STREAM is currently disabled, until limitations are fixed 
EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), FALSE); 
 
//IDE_BLOB_SIZE Get the Insert ParamSets options 
if(IsDlgButtonChecked(m_hWnd, IDR_BLOB_SIZE)) 
{ 
m_pCTableCopy->m_dwBlobOpt = IDR_BLOB_SIZE; 
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), TRUE); 
} 
else 
{ 
m_pCTableCopy->m_dwBlobOpt = IDR_ISEQ_STREAM; 
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), FALSE); 
} 
 
//Verify IDE_BLOB_SIZE has legal value 
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), 1, MAX_COL_SIZE, &m_pCTableCopy->m_ulBlobSize)) 
return FALSE; 
 
//IDE_PARAM_SETS Get the Insert ParamSets options 
if(IsDlgButtonChecked(m_hWnd, IDR_PARAM_SETS)) 
{ 
m_pCTableCopy->m_dwParamOpt = IDR_PARAM_SETS; 
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets); 
} 
else 
{ 
m_pCTableCopy->m_dwParamOpt = IDR_INSERT_ROW; 
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE); 
} 
 
//Verify IDE_PARAM_SETS has legal value 
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_PARAM_SETS), 1, LONG_MAX, &m_pCTableCopy->m_ulParamSets)) 
return FALSE; 
 
// Get Create options 
m_pCTableCopy->m_fCopyTables = IsDlgButtonChecked(m_hWnd, IDX_COPY_TABLE); 
m_pCTableCopy->m_fCopyIndexes = IsDlgButtonChecked(m_hWnd, IDX_COPY_INDEXES); 
 
// Set other Options 
m_pCTableCopy->m_fShowQuery = IsDlgButtonChecked(m_hWnd, IDX_SHOW_SQL); 
return TRUE; 
} 
 
 
///////////////////////////////////////////////////////////////////// 
// CTypesDialog::CTypesDialog 
// 
///////////////////////////////////////////////////////////////////// 
CTypesDialog::CTypesDialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy) 
: CDialog(hWnd, hInst) 
{ 
ASSERT(pCTableCopy); 
m_pCTableCopy = pCTableCopy; 
} 
 
 
///////////////////////////////////////////////////////////////////// 
// CTypesDialog::~CTypesDialog 
// 
///////////////////////////////////////////////////////////////////// 
CTypesDialog::~CTypesDialog() 
{ 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// ULONG CTypesDialog::Display 
// 
///////////////////////////////////////////////////////////////////////////// 
ULONG CTypesDialog::Display() 
{ 
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_DATA_TYPES), NULL, DlgProc, (LPARAM)this); 
} 
 
 
///////////////////////////////////////////////////////////////////// 
// CTypesDialog::DlgProc 
// 
///////////////////////////////////////////////////////////////////// 
BOOL WINAPI CTypesDialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
 switch(msg)  
{ 
case WM_INITDIALOG: 
{ 
//Store the "this" pointer, since this is a static method 
CTypesDialog* pThis = (CTypesDialog*)lParam; 
SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis); 
 
//On INIT we know we have a valid hWnd to store 
pThis->m_hWnd = hWnd; 
 
//Tell TableCopy to Map the Types from the Source->Target 
//If MapTypes fails, end the app, (ie: same as hitting CANCEL) 
if(FAILED(pThis->m_pCTableCopy->MapTypes())) 
EndDialog(hWnd, IDCANCEL); 
 
//Set Horizontal ScrollBar dimensions 
SendDlgItemMessage(hWnd, IDL_FROM_DATA_TYPES, LB_SETHORIZONTALEXTENT, (WPARAM)120*4, (LPARAM)0); 
SendDlgItemMessage(hWnd, IDL_TO_DATA_TYPES, LB_SETHORIZONTALEXTENT, (WPARAM)120*4, (LPARAM)0); 
 
// Now Display the lists of Mappings 
pThis->RefreshLists(); 
CenterDialog(hWnd); 
return HANDLED_MSG; 
} 
 
case WM_COMMAND: 
{ 
// All buttons are handled the same way 
 
//Obtain the "this" pointer 
CTypesDialog* pThis = (CTypesDialog*)GetWindowLong(hWnd, GWL_USERDATA); 
 
switch(GET_WM_COMMAND_ID(wParam, lParam))  
{ 
                case IDOK: 
//Now copy the Tables, End the Dialog first, so the user 
//can't still acess it while the copiing is going on... 
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam)); 
pThis->m_pCTableCopy->CopyTables(); 
                return HANDLED_MSG; 
                 
case IDCANCEL: 
case IDB_PREV: 
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam)); 
                return HANDLED_MSG; 
                 
                case IDL_FROM_DATA_TYPES: 
                switch(GET_WM_COMMAND_CMD(wParam, lParam)) 
{ 
case LBN_SELCHANGE: 
SyncSibling(GetDlgItem(hWnd,IDL_TO_DATA_TYPES), GetDlgItem(hWnd,IDL_FROM_DATA_TYPES)); 
                return HANDLED_MSG; 
} 
 
                case IDL_TO_DATA_TYPES: 
                switch(GET_WM_COMMAND_CMD(wParam, lParam)) 
{ 
case LBN_SELCHANGE: 
SyncSibling(GetDlgItem(hWnd,IDL_FROM_DATA_TYPES), GetDlgItem(hWnd,IDL_TO_DATA_TYPES)); 
                return HANDLED_MSG; 
} 
} 
} 
} 
 
return UNHANDLED_MSG; 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// BOOL CTypesDialog::RefreshLists 
// 
///////////////////////////////////////////////////////////////////////////// 
BOOL CTypesDialog::RefreshLists() 
{ 
HWNDhWndFrom;// From data types 
HWNDhWndTo;// To data types 
 
WCHARwszType[MAX_NAME_LEN];// Buffer for type value 
WCHARwszBuffer[MAX_NAME_LEN];// Buffer for type value 
 
CTable* pCFromTable = m_pCTableCopy->m_pCFromTable; 
CTable* pCToTable = m_pCTableCopy->m_pCToTable; 
 
//Set the TABLENAME / DSN for Source 
wSetDlgItemText(m_hWnd, IDT_FROM_DSN, wsz_FROM_TABLE_DSN_, pCFromTable->m_wszQualTableName, pCFromTable->m_pCDataSource->m_pwszDataSource); 
 
//Set the TABLENAME / DSN for Target 
wSetDlgItemText(m_hWnd, IDT_TO_DSN, wsz_TO_TABLE_DSN_, pCToTable->m_wszQualTableName, pCToTable->m_pCDataSource->m_pwszDataSource); 
 
// Get window handles to speed up the population 
hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_DATA_TYPES); 
hWndTo = GetDlgItem(m_hWnd, IDL_TO_DATA_TYPES); 
 
// Now populate each list 
for(ULONG i=0;  i<pCFromTable->m_cColumns; i++)  
{ 
// Format both values and add them to the list 
wcscpy(wszType, pCFromTable->m_rgColDesc[i].wszTypeName); 
ULONG ulParamFlag = pCFromTable->m_rgColDesc[i].ulCreateParams; 
 
// Add the Precision/Scale info 
if(ulParamFlag & CP_LENGTH) 
{ 
swprintf(wszBuffer, L"(%lu)", COLINFO_SIZE(pCFromTable->m_rgColDesc[i])); 
wcscat(wszType, wszBuffer); 
} 
else if(ulParamFlag & CP_PRECISION && ulParamFlag & CP_SCALE) 
{ 
swprintf(wszBuffer, L"(%lu,%lu)", COLINFO_SIZE(pCFromTable->m_rgColDesc[i]), pCFromTable->m_rgColDesc[i].bScale); 
wcscat(wszType, wszBuffer); 
} 
 
// Send the Entire String to the Window 
swprintf(wszBuffer, wsz_TYPE_FORMAT_,  
pCFromTable->m_rgColDesc[i].wszColName,wszType, 
GetDBTypeName(pCFromTable->m_rgColDesc[i].wType)); 
wSendMessage(hWndFrom, LB_ADDSTRING, (WPARAM)0, wszBuffer); 
 
 
// Format the To type info 
wcscpy(wszType, pCToTable->m_rgColDesc[i].wszTypeName); 
ulParamFlag = pCToTable->m_rgColDesc[i].ulCreateParams; 
 
// Add the Precision/Scale info 
if(ulParamFlag & CP_LENGTH) 
{ 
swprintf(wszBuffer, L"(%lu)", COLINFO_SIZE(pCToTable->m_rgColDesc[i])); 
wcscat(wszType, wszBuffer); 
} 
else if(ulParamFlag & CP_PRECISION && ulParamFlag & CP_SCALE) 
{ 
swprintf(wszBuffer, L"(%lu,%lu)", COLINFO_SIZE(pCToTable->m_rgColDesc[i]), pCToTable->m_rgColDesc[i].bScale); 
wcscat(wszType, wszBuffer); 
} 
 
// Send the Entire String to the Window 
swprintf(wszBuffer, wsz_TYPE_FORMAT_,  
pCToTable->m_rgColDesc[i].wszColName, wszType, 
GetDBTypeName(pCToTable->m_rgColDesc[i].wType)); 
wSendMessage(hWndTo, LB_ADDSTRING, (WPARAM)0, wszBuffer); 
} 
return TRUE; 
}