示例#1
0
Keymap::Keymap(Type i_type,
	       const tstringi &i_name,
	       const tstringi &i_windowClass,
	       const tstringi &i_windowTitle,
	       KeySeq *i_defaultKeySeq,
	       Keymap *i_parentKeymap)
  : m_type(i_type),
    m_name(i_name),
    m_defaultKeySeq(i_defaultKeySeq),
    m_parentKeymap(i_parentKeymap),
    m_windowClass(_T(".*")),
    m_windowTitle(_T(".*"))
{
  if (i_type == Type_windowAnd || i_type == Type_windowOr)
    try
    {
      tregex::flag_type f = (tregex::normal
			     | tregex::icase
// 			     | tregex::use_except
							 );
      if (!i_windowClass.empty())
	m_windowClass.assign(i_windowClass, f);
      if (!i_windowTitle.empty())
	m_windowTitle.assign(i_windowTitle, f);
    }
    catch (boost::bad_expression &i_e)
    {
      throw ErrorMessage() << i_e.what();
    }
}
示例#2
0
文件: setting.cpp 项目: byplayer/yamy
// get filename
bool SettingLoader::getFilename(const tstringi &i_name, tstringi *o_path,
								int i_debugLevel) const
{
	// the default filename is ".mayu"
	const tstringi &name = i_name.empty() ? tstringi(_T(".mayu")) : i_name;

	bool isFirstTime = true;

	while (true) {
		// find file from registry
		if (i_name.empty()) {			// called not from 'include'
			Setting::Symbols symbols;
			if (getFilenameFromRegistry(NULL, o_path, &symbols)) {
				if (o_path->empty())
					// find file from home directory
				{
					HomeDirectories pathes;
					getHomeDirectories(&pathes);
					for (HomeDirectories::iterator
							i = pathes.begin(); i != pathes.end(); ++ i) {
						*o_path = *i + _T("\\") + name;
						if (isReadable(*o_path, i_debugLevel))
							goto add_symbols;
					}
					return false;
				} else {
					if (!isReadable(*o_path, i_debugLevel))
						return false;
				}
add_symbols:
				for (Setting::Symbols::iterator
						i = symbols.begin(); i != symbols.end(); ++ i)
					m_setting->m_symbols.insert(*i);
				return true;
			}
		}

		if (!isFirstTime)
			return false;

		// find file from home directory
		HomeDirectories pathes;
		getHomeDirectories(&pathes);
		for (HomeDirectories::iterator i = pathes.begin(); i != pathes.end(); ++ i) {
			*o_path = *i + _T("\\") + name;
			if (isReadable(*o_path, i_debugLevel))
				return true;
		}

		if (!i_name.empty())
			return false;				// called by 'include'

		if (!DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_setting),
					   NULL, dlgSetting_dlgProc))
			return false;
	}
}
示例#3
0
文件: setting.cpp 项目: byplayer/yamy
/* load m_setting
   If called by "include", 'filename' describes filename.
   Otherwise the 'filename' is empty.
 */
bool SettingLoader::load(Setting *i_setting, const tstringi &i_filename)
{
	m_setting = i_setting;
	m_isThereAnyError = false;

	tstringi path;
	if (!getFilename(i_filename, &path)) {
		if (i_filename.empty()) {
			Acquire a(m_soLog);
			getFilename(i_filename, &path, 0);	// show filenames
			return false;
		} else
			throw ErrorMessage() << _T("`") << i_filename
			<< _T("': no such file or other error.");
	}

	// create global keymap's default keySeq
	ActionFunction af(createFunctionData(_T("OtherWindowClass")));
	KeySeq *globalDefault = m_setting->m_keySeqs.add(KeySeq(_T("")).add(af));

	// add default keymap
	m_currentKeymap = m_setting->m_keymaps.add(
						  Keymap(Keymap::Type_windowOr, _T("Global"), _T(""), _T(""),
								 globalDefault, NULL));

	/*
	// add keyboard layout name
	if (filename.empty())
	{
	  char keyboardLayoutName[KL_NAMELENGTH];
	  if (GetKeyboardLayoutName(keyboardLayoutName))
	  {
	    tstringi kl = tstringi(_T("KeyboardLayout/")) + keyboardLayoutName;
	    m_setting->symbols.insert(kl);
	    Acquire a(m_soLog);
	    *m_log << _T("KeyboardLayout: ") << kl << std::endl;
	  }
	}
	*/

	// load
	load(path);

	// finalize
	if (i_filename.empty())
		m_setting->m_keymaps.adjustModifier(m_setting->m_keyboard);

	return !m_isThereAnyError;
}
示例#4
0
文件: setup.cpp 项目: byplayer/yamy
	// 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;
	}
示例#5
0
文件: setting.cpp 项目: byplayer/yamy
// 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;
	}
}
示例#6
0
文件: setup.cpp 项目: byplayer/yamy
	// 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;
	}
示例#7
0
文件: setup.cpp 项目: byplayer/yamy
	// 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;
	}
示例#8
0
文件: setting.cpp 项目: byplayer/yamy
/*
  _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;
}
示例#9
0
文件: setting.cpp 项目: byplayer/yamy
// prefix sort predicate used in load(const string &)
static bool prefixSortPred(const tstringi &i_a, const tstringi &i_b)
{
	return i_b.size() < i_a.size();
}