/**************************************************/ /* */ /* */ /* Chinese IME Batch Mode */ /* (Dialogbox) */ /* */ /* */ /* Copyright (c) 1997-1999 Microsoft Corporation. */ /**************************************************/ #include "stdafx.h" #include "eudcedit.h" #if 1 // use function in imeblink.c! #include "imeblink.h" #endif #include "blinkdlg.h" #include "util.h" #define STRSAFE_LIB #include #define SIGN_CWIN 0x4E495743 /* Sign of CWin */ #define SIGN__TBL 0x4C42545F /* Sign of IME Table */ #if 0 // move to imeblink.c! #define UNICODE_CP 1200 #define BIG5_CP 950 #define ALT_BIG5_CP 938 #define GB2312_CP 936 typedef struct _tagCOUNTRYSETTING { UINT uCodePage; LPCTSTR szCodePage; } COUNTRYSETTING; static const COUNTRYSETTING sCountry[] = { { BIG5_CP, TEXT("BIG5") } , { ALT_BIG5_CP, TEXT("BIG5") } #if defined(UNICODE) , { UNICODE_CP, TEXT("UNICODE") } #endif , { GB2312_CP, TEXT("GB2312") } }; #endif // move to imeblink.c! #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif /****************************************/ /* */ /* Constructor */ /* */ /****************************************/ CBLinkDlg::CBLinkDlg( CWnd *pParent) : CDialog( CBLinkDlg::IDD, pParent) { //{{AFX_DATA_INIT(CBLinkDlg) //}}AFX_DATA_INIT } /****************************************/ /* */ /* MESSAGE "WM_INITDIALOG" */ /* */ /****************************************/ BOOL CBLinkDlg::OnInitDialog() { CString DlgTtl; CDialog::OnInitDialog(); // Increment contexthelp mark "?" in dialog caption. // LONG WindowStyle = GetWindowLong( this->GetSafeHwnd(), GWL_EXSTYLE); // WindowStyle |= WS_EX_CONTEXTHELP; // SetWindowLong( this->GetSafeHwnd(), GWL_EXSTYLE, WindowStyle); // Set dialog title name. DlgTtl.LoadString( IDS_BATCHLNK_DLGTITLE); this->SetWindowText( DlgTtl); return TRUE; } /****************************************/ /* */ /* COMMAND "BROWSE" */ /* */ /****************************************/ void CBLinkDlg::OnBrowsetable() { OPENFILENAME ofn; CString DlgTtl, DlgMsg; CString sFilter; TCHAR chReplace; TCHAR szFilter[64]; TCHAR szFileName[MAX_PATH]; TCHAR szDirName[MAX_PATH]; TCHAR szTitleName[MAX_PATH]; HRESULT hresult; // Check size of IME batch table structure if( sizeof( USRDICIMHDR) != 256){ OutputMessageBox( this->GetSafeHwnd(), IDS_INTERNAL_TITLE, IDS_INTERNAL_MSG, TRUE); return; } // Set filter of file( from string table) GetStringRes(szFilter, IDS_BATCHIME_FILTER, ARRAYLEN(szFilter)); int StringLength = lstrlen( szFilter); chReplace = szFilter[StringLength-1]; for( int i = 0; szFilter[i]; i++){ if( szFilter[i] == chReplace) szFilter[i] = '\0'; } GetSystemWindowsDirectory( szDirName, sizeof(szDirName)/sizeof(TCHAR)); //*STRSAFE* lstrcpy( szFileName, TEXT("*.TBL")); hresult = StringCchCopy(szFileName , ARRAYLEN(szFileName), TEXT("*.TBL")); if (!SUCCEEDED(hresult)) { return ; } DlgTtl.LoadString( IDS_BROWSETABLE_DLGTITLE); // Set data in structure of OPENFILENAME ofn.lStructSize = sizeof( OPENFILENAME); ofn.hwndOwner = this->GetSafeHwnd(); ofn.lpstrFilter = szFilter; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 0; ofn.lpstrFileTitle = szTitleName; ofn.nMaxFileTitle = sizeof( szTitleName) / sizeof(TCHAR); ofn.lpstrFile = szFileName; ofn.nMaxFile = sizeof( szFileName) / sizeof(TCHAR); ofn.lpstrInitialDir = szDirName; ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_CREATEPROMPT | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = NULL; ofn.lpstrTitle = DlgTtl; if( !GetOpenFileName( &ofn)) return; this->SetDlgItemText( IDC_IMETABLE, ofn.lpstrFile); CWnd *cWnd = GetDlgItem( IDOK); GotoDlgCtrl( cWnd); } /****************************************/ /* */ /* COMMAND "IDOK" */ /* */ /****************************************/ void CBLinkDlg::OnOK() { if( !RegistStringTable()) return; CDialog::OnOK(); } /****************************************/ /* */ /* Register reading string */ /* */ /****************************************/ BOOL CBLinkDlg::RegistStringTable() { LPUSRDICIMHDR lpIsvUsrDic; HANDLE hIsvUsrDicFile, hIsvUsrDic; DWORD dwSize, dwFileSize; BOOL stFunc; TCHAR szTableFile[MAX_PATH]; TCHAR szFileName[MAX_PATH]; CString DlgMsg, DlgTtl; HRESULT hresult; this->GetDlgItemText( IDC_IMETABLE, szTableFile, sizeof( szTableFile)/sizeof(TCHAR)); //*STRSAFE* lstrcpy( szFileName, TEXT("*.TBL")); hresult = StringCchCopy(szFileName , ARRAYLEN(szFileName), TEXT("*.TBL")); if (!SUCCEEDED(hresult)) { return FALSE; } // Create file( to read) hIsvUsrDicFile = CreateFile( szTableFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( hIsvUsrDicFile == INVALID_HANDLE_VALUE){ DlgTtl.LoadString( IDS_NOTOPEN_TITLE); DlgMsg.LoadString( IDS_NOTOPEN_MSG); this->MessageBox( DlgMsg, DlgTtl, MB_OK | MB_ICONHAND | MB_TASKMODAL | MB_TOPMOST); return FALSE; } #if 0 for( i = 0; i < sizeof( szFileName); i++){ if( szFileName[i] == '\\'){ szFileName[i] = ' '; } } #endif // Create file mapping( read only) hIsvUsrDic = CreateFileMapping((HANDLE)hIsvUsrDicFile, NULL, PAGE_READONLY, 0, 0, NULL); if( !hIsvUsrDic){ stFunc = FALSE; DlgTtl.LoadString( IDS_NOTOPEN_TITLE); DlgMsg.LoadString( IDS_NOTOPEN_MSG); this->MessageBox( DlgMsg, DlgTtl, MB_OK | MB_ICONHAND | MB_TASKMODAL | MB_TOPMOST); goto BatchCloseUsrDicFile; } // Set view file lpIsvUsrDic = (LPUSRDICIMHDR)MapViewOfFile( hIsvUsrDic, FILE_MAP_READ, 0, 0, 0); if( !lpIsvUsrDic){ stFunc = FALSE; DlgTtl.LoadString( IDS_NOTOPEN_TITLE); DlgMsg.LoadString( IDS_NOTOPEN_MSG); this->MessageBox( DlgMsg, DlgTtl, MB_OK | MB_ICONHAND | MB_TASKMODAL | MB_TOPMOST); goto BatchCloseUsrDic; } dwSize = lpIsvUsrDic->ulTableCount * ( sizeof(WORD) + sizeof(WORD) + lpIsvUsrDic->cMethodKeySize) + 256; dwFileSize = GetFileSize( hIsvUsrDicFile, (LPDWORD)NULL); #if 0 dwSize = dwFileSize; #endif // Check table file data if( dwSize != dwFileSize){ stFunc = FALSE; OutputMessageBox( this->GetSafeHwnd(), IDS_FILESIZE_MSGTITLE, IDS_FILESIZE_MSG, TRUE); }else if( lpIsvUsrDic->uHeaderSize != 256){ stFunc = FALSE; OutputMessageBox( this->GetSafeHwnd(), IDS_FILEHEADER_MSGTITLE, IDS_FILEHEADER_MSG, TRUE); }else if( lpIsvUsrDic->uInfoSize != 13){ stFunc = FALSE; OutputMessageBox( this->GetSafeHwnd(), IDS_INMETHOD_MSGTITLE, IDS_INMETHOD_MSG, TRUE); }else if( CodePageInfo( lpIsvUsrDic->idCP) == -1){ stFunc = FALSE; OutputMessageBox( this->GetSafeHwnd(), IDS_CODEPAGE_MSGTITLE, IDS_CODEPAGE_MSG, TRUE); }else if( *(DWORD UNALIGNED *)lpIsvUsrDic->idUserCharInfoSign != SIGN_CWIN){ stFunc = FALSE; OutputMessageBox( this->GetSafeHwnd(), IDS_SIGN_MSGTITLE, IDS_SIGN_MSG, TRUE); }else if( *(DWORD UNALIGNED *)((LPBYTE)lpIsvUsrDic->idUserCharInfoSign + sizeof(DWORD)) != SIGN__TBL){ stFunc = FALSE; OutputMessageBox( this->GetSafeHwnd(), IDS_SIGN_MSGTITLE, IDS_SIGN_MSG, TRUE); }else{ stFunc = TRUE; if( !RegisterTable( this->GetSafeHwnd(), lpIsvUsrDic, dwFileSize, lpIsvUsrDic->idCP)){ OutputMessageBox( this->GetSafeHwnd(), IDS_UNMATCHED_TITLE, IDS_UNMATCHED_MSG, TRUE); stFunc = FALSE; } } UnmapViewOfFile( lpIsvUsrDic); BatchCloseUsrDic: CloseHandle( hIsvUsrDic); BatchCloseUsrDicFile: CloseHandle( hIsvUsrDicFile); return stFunc; } static DWORD aIds[] = { IDC_STATICIMETBL, IDH_EUDC_BLINK_EDITTBL, IDC_IMETABLE, IDH_EUDC_BLINK_EDITTBL, IDC_BROWSETABLE, IDH_EUDC_BROWSE, 0, 0 }; /****************************************/ /* */ /* Window Procedure */ /* */ /****************************************/ LRESULT CBLinkDlg::WindowProc( UINT message, WPARAM wParam, LPARAM lParam) {/* if( message == WM_HELP){ ::WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, HelpPath, HELP_WM_HELP, (DWORD_PTR)(LPDWORD)aIds); return(0); } if( message == WM_CONTEXTMENU){ ::WinHelp((HWND)wParam, HelpPath, HELP_CONTEXTMENU, (DWORD_PTR)(LPDWORD)aIds); return(0); } */ return CDialog::WindowProc(message, wParam, lParam); } BEGIN_MESSAGE_MAP(CBLinkDlg, CDialog) //{{AFX_MSG_MAP(CBLinkDlg) ON_BN_CLICKED(IDC_BROWSETABLE, OnBrowsetable) //}}AFX_MSG_MAP END_MESSAGE_MAP()