// WM_INITDIALOG BOOL wmInitDialog(HWND /* focus */, LPARAM /* lParam */) { setSmallIcon(m_hwnd, IDI_ICON_mayu); setBigIcon(m_hwnd, IDI_ICON_mayu); Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_path), g_destDir.c_str()); HWND hwndCombo = GetDlgItem(m_hwnd, IDC_COMBO_keyboard); #if 0 if (checkOs(SetupFile::W2k)) #endif { ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard109usb)); ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard104usb)); } #if 0 ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard109)); ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard104)); #endif ComboBox_SetCurSel(hwndCombo, (g_keyboardKind == KEYBOARD_KIND_109) ? 0 : 1); tstring note; for (int i = IDS_note01; i <= IDS_note13; ++ i) { note += g_resource->loadString(i); } Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_note), note.c_str()); return TRUE; }
// is the filename readable ? bool SettingLoader::isReadable(const tstringi &i_filename, int i_debugLevel) const { if (i_filename.empty()) return false; #ifdef UNICODE tifstream ist(to_string(i_filename).c_str()); #else tifstream ist(i_filename.c_str()); #endif if (ist.good()) { if (m_log && m_soLog) { Acquire a(m_soLog, 0); *m_log << _T(" loading: ") << i_filename << std::endl; } return true; } else { if (m_log && m_soLog) { Acquire a(m_soLog, i_debugLevel); *m_log << _T("not found: ") << i_filename << std::endl; } return false; } }
// WM_COMMAND BOOL wmCommand(int /* notify_code */, int i_id, HWND /* hwnd_control */) { switch (i_id) { case IDC_BUTTON_browse: { _TCHAR folder[GANA_MAX_PATH]; BROWSEINFO bi; ZeroMemory(&bi, sizeof(bi)); bi.hwndOwner = m_hwnd; bi.pidlRoot = NULL; bi.pszDisplayName = folder; bi.lpszTitle = g_resource->loadString(IDS_selectDir); ITEMIDLIST *browse = SHBrowseForFolder(&bi); if (browse != NULL) { if (SHGetPathFromIDList(browse, folder)) { if (createDirectories(folder)) Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_path), folder); } IMalloc *imalloc = NULL; if (SHGetMalloc(&imalloc) == NOERROR) imalloc->Free((void *)browse); } return TRUE; } case IDOK: { _TCHAR buf[GANA_MAX_PATH]; Edit_GetText(GetDlgItem(m_hwnd, IDC_EDIT_path), buf, NUMBER_OF(buf)); if (buf[0]) { g_destDir = normalizePath(buf); m_doRegisterToStartMenu = (IsDlgButtonChecked(m_hwnd, IDC_CHECK_registerStartMenu) == BST_CHECKED); m_doRegisterToStartUp = (IsDlgButtonChecked(m_hwnd, IDC_CHECK_registerStartUp) == BST_CHECKED); int curSel = ComboBox_GetCurSel(GetDlgItem(m_hwnd, IDC_COMBO_keyboard)); g_flags = SetupFile::Normal; #if 0 if (checkOs(SetupFile::W2k)) #endif { switch (curSel) { case 0: g_keyboardKind = KEYBOARD_KIND_109; g_flags = Flag_Usb; break; case 1: g_keyboardKind = KEYBOARD_KIND_104; g_flags = Flag_Usb; break; #if 0 case 2: g_keyboardKind = KEYBOARD_KIND_109; break; case 3: g_keyboardKind = KEYBOARD_KIND_104; break; #endif }; } #if 0 else { switch (curSel) { case 0: g_keyboardKind = KEYBOARD_KIND_109; break; case 1: g_keyboardKind = KEYBOARD_KIND_104; break; }; } #endif #if 0 if (g_flags == Flag_Usb) if (message(IDS_usbWarning, MB_OKCANCEL | MB_ICONWARNING, m_hwnd) == IDCANCEL) return TRUE; #endif if (createDirectories(g_destDir.c_str())) EndDialog(m_hwnd, install()); else message(IDS_invalidDirectory, MB_OK | MB_ICONSTOP, m_hwnd); } else message(IDS_mayuEmpty, MB_OK, m_hwnd); return TRUE; } case IDCANCEL: { CHECK_TRUE( EndDialog(m_hwnd, 0) ); return TRUE; } } return FALSE; }
// install int install() { Registry reg(DIR_REGISTRY_ROOT); CHECK_TRUE( reg.write(_T("dir"), g_destDir) ); tstringi srcDir = getModuleDirectory(); if (!installFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir, g_destDir)) { removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir); if (g_wasExecutedBySFX) removeSrcFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir); return 1; } if (g_wasExecutedBySFX) removeSrcFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir); #if defined(_WINNT) DWORD err = createDriverService(_T("mayud"), g_resource->loadString(IDS_mayud), getDriverDirectory() + _T("\\mayud.sys"), _T("+Keyboard Class\0"), g_flags & Flag_Usb ? true : false); if (err != ERROR_SUCCESS) { driverServiceError(err); removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir); return 1; } if (g_flags == Flag_Usb) CHECK_TRUE( reg.write(_T("isUsbDriver"), DWORD(1)) ); #endif // _WINNT // create shortcut if (m_doRegisterToStartMenu) { tstringi shortcut = getStartMenuName(loadString(IDS_shortcutName)); if (!shortcut.empty()) createLink((g_destDir + _T("\\mayu.exe")).c_str(), shortcut.c_str(), g_resource->loadString(IDS_shortcutName), g_destDir.c_str()); } if (m_doRegisterToStartUp) { tstringi shortcut = getStartUpName(loadString(IDS_shortcutName)); if (!shortcut.empty()) createLink((g_destDir + _T("\\mayu.exe")).c_str(), shortcut.c_str(), g_resource->loadString(IDS_shortcutName), g_destDir.c_str()); } // set registry reg.write(_T("layout"), (g_keyboardKind == KEYBOARD_KIND_109) ? _T("109") : _T("104")); // file extension createFileExtension(_T(".mayu"), _T("text/plain"), _T("mayu file"), g_resource->loadString(IDS_mayuFile), g_destDir + _T("\\mayu.exe,1"), g_resource->loadString(IDS_mayuShellOpen)); // uninstall createUninstallInformation(_T("mayu"), g_resource->loadString(IDS_mayu), g_destDir + _T("\\setup.exe -u")); if (g_flags == Flag_Usb) { if (message(IDS_copyFinishUsb, MB_YESNO | MB_ICONQUESTION, m_hwnd) == IDYES) { // reboot ... HANDLE hToken; // Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { message(IDS_failedToReboot, MB_OK | MB_ICONSTOP); return 0; } // Get the LUID for the shutdown privilege. TOKEN_PRIVILEGES tkp; LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges. if (GetLastError() != ERROR_SUCCESS) { message(IDS_failedToReboot, MB_OK | MB_ICONSTOP); return 0; } // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0)) { message(IDS_failedToReboot, MB_OK | MB_ICONSTOP); return 0; } } } else { if (message(IDS_copyFinish, MB_YESNO | MB_ICONQUESTION, m_hwnd) == IDYES) ExitWindows(0, 0); // logoff } return 0; }
/* _UNICODE: read file (UTF-16 LE/BE, UTF-8, locale specific multibyte encoding) _MBCS: read file */ bool readFile(tstring *o_data, const tstringi &i_filename) { // get size of file #if 0 // bcc's _wstat cannot obtain file size struct _stat sbuf; if (_tstat(i_filename.c_str(), &sbuf) < 0 || sbuf.st_size == 0) return false; #else // so, we use _wstati64 for bcc struct stati64_t sbuf; if (_tstati64(i_filename.c_str(), &sbuf) < 0 || sbuf.st_size == 0) return false; // following check is needed to cast sbuf.st_size to size_t safely // this cast occurs because of above workaround for bcc if (sbuf.st_size > UINT_MAX) return false; #endif // open FILE *fp = _tfopen(i_filename.c_str(), _T("rb")); if (!fp) return false; // read file Array<BYTE> buf(static_cast<size_t>(sbuf.st_size) + 1); if (fread(buf.get(), static_cast<size_t>(sbuf.st_size), 1, fp) != 1) { fclose(fp); return false; } buf.get()[sbuf.st_size] = 0; // mbstowcs() requires null // terminated string #ifdef _UNICODE // if (buf.get()[0] == 0xffU && buf.get()[1] == 0xfeU && sbuf.st_size % 2 == 0) // UTF-16 Little Endien { size_t size = static_cast<size_t>(sbuf.st_size) / 2; o_data->resize(size); BYTE *p = buf.get(); for (size_t i = 0; i < size; ++ i) { wchar_t c = static_cast<wchar_t>(*p ++); c |= static_cast<wchar_t>(*p ++) << 8; (*o_data)[i] = c; } fclose(fp); return true; } // if (buf.get()[0] == 0xfeU && buf.get()[1] == 0xffU && sbuf.st_size % 2 == 0) // UTF-16 Big Endien { size_t size = static_cast<size_t>(sbuf.st_size) / 2; o_data->resize(size); BYTE *p = buf.get(); for (size_t i = 0; i < size; ++ i) { wchar_t c = static_cast<wchar_t>(*p ++) << 8; c |= static_cast<wchar_t>(*p ++); (*o_data)[i] = c; } fclose(fp); return true; } // try multibyte charset size_t wsize = mbstowcs(NULL, reinterpret_cast<char *>(buf.get()), 0); if (wsize != size_t(-1)) { Array<wchar_t> wbuf(wsize); mbstowcs(wbuf.get(), reinterpret_cast<char *>(buf.get()), wsize); o_data->assign(wbuf.get(), wbuf.get() + wsize); fclose(fp); return true; } // try UTF-8 { Array<wchar_t> wbuf(static_cast<size_t>(sbuf.st_size)); BYTE *f = buf.get(); BYTE *end = buf.get() + sbuf.st_size; wchar_t *d = wbuf.get(); enum { STATE_1, STATE_2of2, STATE_2of3, STATE_3of3 } state = STATE_1; while (f != end) { switch (state) { case STATE_1: if (!(*f & 0x80)) // 0xxxxxxx: 00-7F *d++ = static_cast<wchar_t>(*f++); else if ((*f & 0xe0) == 0xc0) { // 110xxxxx 10xxxxxx: 0080-07FF *d = ((static_cast<wchar_t>(*f++) & 0x1f) << 6); state = STATE_2of2; } else if ((*f & 0xf0) == 0xe0) // 1110xxxx 10xxxxxx 10xxxxxx: // 0800 - FFFF { *d = ((static_cast<wchar_t>(*f++) & 0x0f) << 12); state = STATE_2of3; } else goto not_UTF_8; break; case STATE_2of2: case STATE_3of3: if ((*f & 0xc0) != 0x80) goto not_UTF_8; *d++ |= (static_cast<wchar_t>(*f++) & 0x3f); state = STATE_1; break; case STATE_2of3: if ((*f & 0xc0) != 0x80) goto not_UTF_8; *d |= ((static_cast<wchar_t>(*f++) & 0x3f) << 6); state = STATE_3of3; break; } } o_data->assign(wbuf.get(), d); fclose(fp); return true; not_UTF_8: ; } #endif // _UNICODE // assume ascii o_data->resize(static_cast<size_t>(sbuf.st_size)); for (off_t i = 0; i < sbuf.st_size; ++ i) (*o_data)[i] = buf.get()[i]; fclose(fp); return true; }