Skip to content

Commit

Permalink
Guardian: Automatically restart crashed server
Browse files Browse the repository at this point in the history
  • Loading branch information
ccyybn committed May 16, 2024
1 parent 704f20d commit 88a02dd
Show file tree
Hide file tree
Showing 21 changed files with 1,933 additions and 32 deletions.
394 changes: 392 additions & 2 deletions RimeWithWeasel/RimeWithWeasel.cpp

Large diffs are not rendered by default.

25 changes: 25 additions & 0 deletions WeaselIPC/ContextUpdater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,26 @@ void StatusUpdater::Store(Deserializer::KeyType const& k,
return;
}

if (k[1] == L"schema_list") {
m_pTarget->p_status->schema_list = value;
return;
}

if (k[1] == L"schema_list_size") {
m_pTarget->p_status->schema_list_size = value;
return;
}

if (k[1] == L"option_list") {
m_pTarget->p_status->option_list = value;
return;
}

if (k[1] == L"option_list_size") {
m_pTarget->p_status->option_list_size = value;
return;
}

if (k[1] == L"ascii_mode") {
m_pTarget->p_status->ascii_mode = bool_value;
return;
Expand All @@ -124,4 +144,9 @@ void StatusUpdater::Store(Deserializer::KeyType const& k,
m_pTarget->p_status->full_shape = bool_value;
return;
}

if (k[1] == L"options") {
m_pTarget->p_status->options = value;
return;
}
}
35 changes: 33 additions & 2 deletions WeaselIPC/WeaselClientImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,18 @@ void ClientImpl::TrayCommand(UINT menuId) {
_SendMessage(WEASEL_IPC_TRAY_COMMAND, menuId, session_id);
}

void ClientImpl::SetOptions(DWORD options, DWORD values) {
_SendMessage(WEASEL_IPC_SET_OPTIONS, options, session_id, values);
}

void ClientImpl::SaveOptions(DWORD options, DWORD values) {
_SendMessage(WEASEL_IPC_SAVE_OPTIONS, options, session_id, values);
}

void ClientImpl::SelectSchema(DWORD schema_index) {
_SendMessage(WEASEL_IPC_SELECT_SCHEMA, schema_index, session_id);
}

void ClientImpl::StartSession() {
if (_Active() && Echo())
return;
Expand Down Expand Up @@ -192,15 +204,22 @@ bool ClientImpl::_WriteClientInfo() {

LRESULT ClientImpl::_SendMessage(WEASEL_IPC_COMMAND Msg,
DWORD wParam,
DWORD lParam) {
DWORD lParam,
DWORD vParam) {
try {
PipeMessage req{Msg, wParam, lParam};
PipeMessage req{Msg, wParam, lParam, vParam};
return channel.Transact(req);
} catch (DWORD /* ex */) {
return 0;
}
}

LRESULT ClientImpl::_SendMessage(WEASEL_IPC_COMMAND Msg,
DWORD wParam,
DWORD lParam) {
return _SendMessage(Msg, wParam, lParam, 0);
}

Client::Client() : m_pImpl(new ClientImpl()) {}

Client::~Client() {
Expand Down Expand Up @@ -283,3 +302,15 @@ bool Client::Echo() {
bool Client::GetResponseData(ResponseHandler handler) {
return m_pImpl->GetResponseData(handler);
}

void Client::SetOptions(DWORD options, DWORD values) {
return m_pImpl->SetOptions(options, values);
}

void Client::SaveOptions(DWORD options, DWORD values) {
return m_pImpl->SaveOptions(options, values);
}

void Client::SelectSchema(DWORD schema_index) {
return m_pImpl->SelectSchema(schema_index);
}
7 changes: 7 additions & 0 deletions WeaselIPC/WeaselClientImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,19 @@ class ClientImpl {
void FocusIn();
void FocusOut();
void TrayCommand(UINT menuId);
void SetOptions(DWORD options, DWORD values);
void SaveOptions(DWORD options, DWORD values);
void SelectSchema(DWORD schema_index);
bool GetResponseData(ResponseHandler const& handler);

protected:
void _InitializeClientInfo();
bool _WriteClientInfo();

LRESULT _SendMessage(WEASEL_IPC_COMMAND Msg,
DWORD wParam,
DWORD lParam,
DWORD vParam);
LRESULT _SendMessage(WEASEL_IPC_COMMAND Msg, DWORD wParam, DWORD lParam);

bool _Connected() const { return channel.Connected(); }
Expand Down
51 changes: 51 additions & 0 deletions WeaselIPCServer/WeaselServerImpl.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#include "stdafx.h"
#include "WeaselServerImpl.h"
#include <RimeWithWeasel.h>
#include <Windows.h>
#include <resource.h>
#include <WeaselUtility.h>
#include <bitset>

namespace weasel {
class PipeServer : public PipeChannel<DWORD, PipeMessage> {
Expand Down Expand Up @@ -355,6 +357,41 @@ DWORD ServerImpl::OnChangePage(WEASEL_IPC_COMMAND uMsg,
return 0;
}

DWORD ServerImpl::OnSetOptions(WEASEL_IPC_COMMAND uMsg,
DWORD wParam,
DWORD lParam,
DWORD vParam) {
OutputDebugStringA(
("[WeaselServerImpl][SET][Session Id: " + std::to_string(lParam) + "][" +
tobitstrA(wParam) + "]" + " -> [" + tobitstrA(vParam) + "]")
.c_str());
m_pRequestHandler->SetOptions(lParam, wParam, vParam);
return 0;
}

DWORD ServerImpl::OnSaveOptions(WEASEL_IPC_COMMAND uMsg,
DWORD wParam,
DWORD lParam,
DWORD vParam) {
OutputDebugStringA(
("[WeaselServerImpl][SAVE][Session Id: " + std::to_string(lParam) + "][" +
tobitstrA(wParam) + "]" + " -> [" + tobitstrA(vParam) + "]")
.c_str());
m_pRequestHandler->SaveOptions(lParam, wParam, vParam);
return 0;
}

DWORD ServerImpl::OnSelectSchema(WEASEL_IPC_COMMAND uMsg,
DWORD wParam,
DWORD lParam) {
OutputDebugStringA(
("[WeaselServerImpl][Schema][Session Id: " + std::to_string(lParam) +
"][" + std::to_string(wParam) + "]")
.c_str());
m_pRequestHandler->SelectSchema(lParam, wParam);
return 0;
}

#define MAP_PIPE_MSG_HANDLE(__msg, __wParam, __lParam) \
{ \
auto lParam = __lParam; \
Expand Down Expand Up @@ -396,6 +433,20 @@ void ServerImpl::HandlePipeMessage(PipeMessage pipe_msg, _Resp resp) {
PIPE_MSG_HANDLE(WEASEL_IPC_TRAY_COMMAND, OnCommand);
END_MAP_PIPE_MSG_HANDLE(result);

switch (pipe_msg.Msg) {
case WEASEL_IPC_SET_OPTIONS:
result = OnSetOptions(pipe_msg.Msg, pipe_msg.wParam, pipe_msg.lParam,
pipe_msg.vParam);
break;
case WEASEL_IPC_SAVE_OPTIONS:
result = OnSaveOptions(pipe_msg.Msg, pipe_msg.wParam, pipe_msg.lParam,
pipe_msg.vParam);
break;
case WEASEL_IPC_SELECT_SCHEMA:
result = OnSelectSchema(pipe_msg.Msg, pipe_msg.wParam, pipe_msg.lParam);
break;
}

resp(result);
}

Expand Down
9 changes: 9 additions & 0 deletions WeaselIPCServer/WeaselServerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,15 @@ class ServerImpl : public CWindowImpl<ServerImpl, CWindow, ServerWinTraits>
DWORD wParam,
DWORD lParam);
DWORD OnChangePage(WEASEL_IPC_COMMAND uMsg, DWORD wParam, DWORD lParam);
DWORD OnSetOptions(WEASEL_IPC_COMMAND uMsg,
DWORD wParam,
DWORD lParam,
DWORD vParam);
DWORD OnSaveOptions(WEASEL_IPC_COMMAND uMsg,
DWORD wParam,
DWORD lParam,
DWORD vParam);
DWORD OnSelectSchema(WEASEL_IPC_COMMAND uMsg, DWORD wParam, DWORD lParam);

public:
ServerImpl();
Expand Down
6 changes: 4 additions & 2 deletions WeaselServer/resource.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// WeaselServer.rc 使用
// Microsoft Visual C++ generated include file.
// Used by WeaselServer.rc
//
#define IDI_WEASEL 100
#define IDI_EN 101
Expand All @@ -23,6 +23,8 @@
#define ID_WEASELTRAY_SYNC 40012
#define ID_WEASELTRAY_ENABLE_ASCII 40013
#define ID_WEASELTRAY_DISABLE_ASCII 40014
#define ID_WEASELTRAY_RERUN_SERVICE 40015
#define ID_WEASELTRAY_GUARDIAN 40016

// Next default values for new objects
//
Expand Down
2 changes: 1 addition & 1 deletion WeaselTSF/Compartment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ HRESULT WeaselTSF::_HandleCompartment(REFGUID guidCompartment) {
weasel::ResponseParser parser(NULL, NULL, &_status, NULL,
&_cand->style());
bool ok = m_client.GetResponseData(std::ref(parser));
_UpdateLanguageBar(_status);
_UpdateLanguageBar(L"_HandleCompartment", _status);
}
}
return S_OK;
Expand Down
2 changes: 1 addition & 1 deletion WeaselTSF/EditSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ STDAPI WeaselTSF::DoEditSession(TfEditCookie ec) {

bool ok = m_client.GetResponseData(std::ref(parser));

_UpdateLanguageBar(_status);
_UpdateLanguageBar(L"DoEditSession", _status);

if (ok) {
if (!commit.empty()) {
Expand Down
6 changes: 6 additions & 0 deletions WeaselTSF/Globals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,9 @@ const GUID GUID_IME_MODE_PRESERVED_KEY = {
0xa8f7,
0x4b42,
{0xa9, 0x6d, 0xce, 0xc7, 0xc5, 0x0e, 0x0e, 0xae}};

static const GUID GUID_COMPARTMENT_IS_GUARD = {
0x581c6cf,
0xf159,
0x4843,
{0xb7, 0xed, 0xf9, 0x19, 0x6f, 0x5c, 0x93, 0x3e}};
1 change: 1 addition & 0 deletions WeaselTSF/Globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,4 @@ extern const GUID GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT;

extern const GUID GUID_LBI_INPUTMODE;
extern const GUID GUID_IME_MODE_PRESERVED_KEY;
extern const GUID GUID_COMPARTMENT_IS_GUARD;
49 changes: 33 additions & 16 deletions WeaselTSF/LanguageBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,6 @@ static void HMENU2ITfMenu(HMENU hMenu, ITfMenu* pTfMenu) {
}
}

static LONG RegGetStringValue(HKEY key,
LPCWSTR lpSubKey,
LPCWSTR lpValue,
std::wstring& value) {
TCHAR szValue[MAX_PATH];
DWORD dwBufLen = MAX_PATH;

LONG lRes = RegGetValue(key, lpSubKey, lpValue, RRF_RT_REG_SZ, NULL, szValue,
&dwBufLen);
if (lRes == ERROR_SUCCESS) {
value = std::wstring(szValue);
}
return lRes;
}

static LPCWSTR GetWeaselRegName() {
LPCWSTR WEASEL_REG_NAME_;
if (is_wow64())
Expand Down Expand Up @@ -187,6 +172,9 @@ STDAPI CLangBarItemButton::OnClick(TfLBIClick click,
? LoadMenuW(g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP))
: LoadMenuW(g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP_HANT)));
HMENU popupMenu = GetSubMenu(menu, 0);
CheckMenuItem(popupMenu, ID_WEASELTRAY_GUARDIAN,
MF_BYCOMMAND | (_pTextService->_IsGuard() ? MF_CHECKED
: MF_UNCHECKED));
UINT wID = TrackPopupMenuEx(
popupMenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_HORPOSANIMATION, pt.x,
pt.y, hwnd, NULL);
Expand Down Expand Up @@ -329,6 +317,14 @@ void WeaselTSF::_HandleLangBarMenuSelect(UINT wID) {
explore(dir);
}
break;
case ID_WEASELTRAY_GUARDIAN: {
BOOL isGuard = _IsGuard();
if (isGuard) {
_SwitchGuard(FALSE);
} else {
_SwitchGuard(TRUE);
}
} break;
case ID_WEASELTRAY_WIKI:
open(L"https://rime.im/docs/");
break;
Expand Down Expand Up @@ -402,7 +398,28 @@ void WeaselTSF::_UninitLanguageBar() {
_pLangBarButton = NULL;
}

void WeaselTSF::_UpdateLanguageBar(weasel::Status stat) {
void WeaselTSF::_UpdateLanguageBar(const std::wstring& callFrom,
weasel::Status stat) {
if (!stat.composing && !stat.options.empty()) {
std::wstring log = L"[WeaselTSF][" + callFrom + L"][BackUpStatus]";

if (_allOptions.empty() ||
_backupStatus.option_list.compare(stat.option_list)) {
_allOptions = split2set(ws2s(stat.option_list), ",");
}
_backupStatus = stat;
_isBackupStatusInitialized = true;

// logger(log, L"schema_list[" + _backupStatus.schema_list + L"][" +
// _backupStatus.schema_list_size + L"]"); logger(log, L"option_list[" +
// _backupStatus.option_list + L"][" + _backupStatus.option_list_size +
// L"][" + std::to_wstring(_allOptions.size()) + L"]"); logger(log,
// L"schema_id[" + _backupStatus.schema_id + L"],composing[" +
// std::to_wstring(_backupStatus.composing) + L"],ascii_mode[" +
// std::to_wstring(_backupStatus.ascii_mode) + L"],full_shape[" +
// std::to_wstring(_backupStatus.full_shape) + L"]"); logger(log,
// L"options[" + tobitstr(options) + L"]");
}
if (!_pLangBarButton)
return;
DWORD flags;
Expand Down
Loading

0 comments on commit 88a02dd

Please sign in to comment.