OSDN Git Service

use boost_1_56_0 and build by VS2013
[yamy/yamy.git] / mayu.cpp
index 0380688..91653b8 100644 (file)
--- a/mayu.cpp
+++ b/mayu.cpp
@@ -70,12 +70,10 @@ class Mayu
        PROCESS_INFORMATION m_pi;\r
 #endif // _WIN64\r
        HANDLE m_mutex;\r
-#ifdef USE_MAILSLOT\r
        HANDLE m_hNotifyMailslot;                       /// mailslot to receive notify\r
        HANDLE m_hNotifyEvent;                  /// event on receive notify\r
        OVERLAPPED m_olNotify;                  ///\r
        BYTE m_notifyBuf[NOTIFY_MESSAGE_SIZE];\r
-#endif // USE_MAILSLOT\r
        static const DWORD SESSION_LOCKED = 1<<0;\r
        static const DWORD SESSION_DISCONNECTED = 1<<1;\r
        static const DWORD SESSION_END_QUERIED = 1<<2;\r
@@ -103,7 +101,6 @@ class Mayu
        };\r
 \r
 private:\r
-#ifdef USE_MAILSLOT\r
        static VOID CALLBACK mailslotProc(DWORD i_code, DWORD i_len, LPOVERLAPPED i_ol) {\r
                Mayu *pThis;\r
 \r
@@ -131,7 +128,6 @@ private:
                                                        &m_olNotify, Mayu::mailslotProc);\r
                return result;\r
        }\r
-#endif // USE_MAILSLOT\r
 \r
        /// register class for tasktray\r
        ATOM Register_tasktray() {\r
@@ -228,14 +224,27 @@ private:
                        break;\r
                }\r
 \r
+               case Notify::Type_threadAttach: {\r
+                       NotifyThreadAttach *n = (NotifyThreadAttach *)cd->lpData;\r
+                       m_engine.threadAttachNotify(n->m_threadId);\r
+                       break;\r
+               }\r
+\r
                case Notify::Type_threadDetach: {\r
                        NotifyThreadDetach *n = (NotifyThreadDetach *)cd->lpData;\r
                        m_engine.threadDetachNotify(n->m_threadId);\r
                        break;\r
                }\r
 \r
-               case Notify::Type_command: {\r
-                       NotifyCommand *n = (NotifyCommand *)cd->lpData;\r
+               case Notify::Type_command64: {\r
+                       NotifyCommand64 *n = (NotifyCommand64 *)cd->lpData;\r
+                       m_engine.commandNotify(n->m_hwnd, n->m_message,\r
+                                                                  n->m_wParam, n->m_lParam);\r
+                       break;\r
+               }\r
+\r
+               case Notify::Type_command32: {\r
+                       NotifyCommand32 *n = (NotifyCommand32 *)cd->lpData;\r
                        m_engine.commandNotify(n->m_hwnd, n->m_message,\r
                                                                   n->m_wParam, n->m_lParam);\r
                        break;\r
@@ -481,12 +490,23 @@ private:
 \r
                        case WM_APP_escapeNLSKeysFailed:\r
                                if (i_lParam) {\r
+                                       int ret;\r
+\r
                                        This->m_log << _T("escape NLS keys done code=") << i_wParam << std::endl;\r
-                                       if (i_wParam != YAMY_SUCCESS && i_wParam != YAMY_ERROR_RETRY_INJECTION_SUCCESS) {\r
-                                               int ret = This->errorDialogWithCode(IDS_escapeNlsKeysFailed, i_wParam, MB_RETRYCANCEL | MB_ICONSTOP);\r
+                                       switch (i_wParam) {\r
+                                       case YAMY_SUCCESS:\r
+                                       case YAMY_ERROR_RETRY_INJECTION_SUCCESS:\r
+                                               // escape NLS keys success\r
+                                               break;\r
+                                       case YAMY_ERROR_TIMEOUT_INJECTION:\r
+                                               ret = This->errorDialogWithCode(IDS_escapeNlsKeysRetry, i_wParam, MB_RETRYCANCEL | MB_ICONSTOP);\r
                                                if (ret == IDRETRY) {\r
                                                        This->m_fixScancodeMap.escape(true);\r
                                                }\r
+                                               break;\r
+                                       default:\r
+                                               This->errorDialogWithCode(IDS_escapeNlsKeysFailed, i_wParam, MB_OK);\r
+                                               break;\r
                                        }\r
                                } else {\r
                                        This->m_log << _T("restore NLS keys done with code=") << i_wParam << std::endl;\r
@@ -1009,7 +1029,6 @@ public:
                        m_engine(m_log) {\r
                Registry reg(MAYU_REGISTRY_ROOT);\r
                reg.read(_T("escapeNLSKeys"), &m_escapeNlsKeys, 0);\r
-#ifdef USE_MAILSLOT\r
                m_hNotifyMailslot = CreateMailslot(NOTIFY_MAILSLOT_NAME, 0, MAILSLOT_WAIT_FOREVER, (SECURITY_ATTRIBUTES *)NULL);\r
                ASSERT(m_hNotifyMailslot != INVALID_HANDLE_VALUE);\r
                int err;\r
@@ -1025,7 +1044,6 @@ public:
                m_olNotify.Offset = 0;\r
                m_olNotify.OffsetHigh = 0;\r
                m_olNotify.hEvent = m_hNotifyEvent;\r
-#endif // USE_MAILSLOT\r
                time(&m_startTime);\r
 \r
                CHECK_TRUE( Register_focus() );\r
@@ -1051,10 +1069,7 @@ public:
                CHECK_TRUE( m_hwndTaskTray );\r
 \r
                // set window handle of tasktray to hooks\r
-#ifndef USE_MAILSLOT\r
-               g_hookData->m_hwndTaskTray = reinterpret_cast<DWORD>(m_hwndTaskTray);\r
-#endif // !USE_MAILSLOT\r
-               CHECK_FALSE( installMessageHook() );\r
+               CHECK_FALSE( installMessageHook(reinterpret_cast<DWORD>(m_hwndTaskTray)) );\r
                m_usingSN = wtsRegisterSessionNotification(m_hwndTaskTray,\r
                                        NOTIFY_FOR_THIS_SESSION);\r
 \r
@@ -1077,7 +1092,7 @@ public:
                m_hwndVersion =\r
                        CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_version),\r
                                                          NULL, dlgVersion_dlgProc,\r
-                                                         (LPARAM)m_engine.getMayudVersion().c_str());\r
+                                                         (LPARAM)_T(""));\r
                CHECK_TRUE( m_hwndVersion );\r
 \r
                // attach log\r
@@ -1134,7 +1149,18 @@ public:
                // create mutex to block yamyd\r
                m_hMutexYamyd = CreateMutex((SECURITY_ATTRIBUTES *)NULL, TRUE, MUTEX_YAMYD_BLOCKER);\r
 \r
-               BOOL result = CreateProcess(_T("yamyd32"), _T("yamyd32"), NULL, NULL, FALSE,\r
+               tstring yamydPath;\r
+               _TCHAR exePath[GANA_MAX_PATH];\r
+               _TCHAR exeDrive[GANA_MAX_PATH];\r
+               _TCHAR exeDir[GANA_MAX_PATH];\r
+\r
+               GetModuleFileName(NULL, exePath, GANA_MAX_PATH);\r
+               _tsplitpath_s(exePath, exeDrive, GANA_MAX_PATH, exeDir, GANA_MAX_PATH, NULL, 0, NULL, 0);\r
+               yamydPath = exeDrive;\r
+               yamydPath += exeDir;\r
+               yamydPath += _T("yamyd32");\r
+\r
+               BOOL result = CreateProcess(yamydPath.c_str(), NULL, NULL, NULL, FALSE,\r
                                                           NORMAL_PRIORITY_CLASS, 0, NULL, &m_si, &m_pi);\r
                if (result == FALSE) {\r
                        TCHAR buf[1024];\r
@@ -1157,20 +1183,6 @@ public:
 \r
        ///\r
        ~Mayu() {\r
-#ifdef USE_MAILSLOT\r
-               CancelIo(m_hNotifyMailslot);\r
-               SleepEx(0, TRUE);\r
-               CloseHandle(m_hNotifyMailslot);\r
-               CloseHandle(m_hNotifyEvent);\r
-#endif // USE_MAILSLOT\r
-               ReleaseMutex(m_mutex);\r
-               WaitForSingleObject(m_mutex, INFINITE);\r
-               // first, detach log from edit control to avoid deadlock\r
-               m_log.detach();\r
-#ifdef LOG_TO_FILE\r
-               m_logFile.close();\r
-#endif // LOG_TO_FILE\r
-\r
                // stop notify from mayu.dll\r
                g_hookData->m_hwndTaskTray = NULL;\r
                CHECK_FALSE( uninstallMessageHook() );\r
@@ -1183,10 +1195,18 @@ public:
                }\r
                CloseHandle(m_hMutexYamyd);\r
 #endif // _WIN64\r
-               if (!(m_sessionState & SESSION_END_QUERIED)) {\r
-                       DWORD_PTR result;\r
-                       SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 3000, &result);\r
-               }\r
+\r
+               CancelIo(m_hNotifyMailslot);\r
+               SleepEx(0, TRUE);\r
+               CloseHandle(m_hNotifyMailslot);\r
+               CloseHandle(m_hNotifyEvent);\r
+               ReleaseMutex(m_mutex);\r
+               WaitForSingleObject(m_mutex, INFINITE);\r
+               // first, detach log from edit control to avoid deadlock\r
+               m_log.detach();\r
+#ifdef LOG_TO_FILE\r
+               m_logFile.close();\r
+#endif // LOG_TO_FILE\r
 \r
                // destroy windows\r
                CHECK_TRUE( DestroyWindow(m_hwndVersion) );\r
@@ -1205,6 +1225,11 @@ public:
                // stop keyboard handler thread\r
                m_engine.stop();\r
 \r
+               if (!(m_sessionState & SESSION_END_QUERIED)) {\r
+                       DWORD_PTR result;\r
+                       SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, 0, 3000, &result);\r
+               }\r
+\r
                // remove setting;\r
                delete m_setting;\r
        }\r
@@ -1214,7 +1239,6 @@ public:
                showBanner(false);\r
                load();\r
 \r
-#ifdef USE_MAILSLOT\r
                mailslotHandler(0, 0);\r
                while (1) {\r
                        HANDLE handles[] = { m_hNotifyEvent };\r
@@ -1251,20 +1275,6 @@ public:
                                break;\r
                        }\r
                }\r
-#else // !USE_MAILSLOT\r
-               MSG msg;\r
-               while (0 < GetMessage(&msg, NULL, 0, 0)) {\r
-                       if (IsDialogMessage(m_hwndLog, &msg))\r
-                               continue;\r
-                       if (IsDialogMessage(m_hwndInvestigate, &msg))\r
-                               continue;\r
-                       if (IsDialogMessage(m_hwndVersion, &msg))\r
-                               continue;\r
-                       TranslateMessage(&msg);\r
-                       DispatchMessage(&msg);\r
-               }\r
-               return msg.wParam;\r
-#endif // !USE_MAILSLOT\r
        }\r
 };\r
 \r