Skip to content

Commit

Permalink
・フィルター編集ウィンドウでマッチングパターンと置換するテキストの間にカーソルがあるとカーソル形状を変化させるようにした
Browse files Browse the repository at this point in the history
・フィルター編集ウィンドウでヘッダ名のテキスト入力エリア以上に文字を書き込めなかったのを修正 #32
・$UESCでデコードする文字に小文字が含まれているとデコードできなかったのを修正
  • Loading branch information
amate committed Apr 9, 2016
1 parent 7ca803c commit 5c409a9
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 27 deletions.
2 changes: 1 addition & 1 deletion Proxydomo/AppConst.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
#endif

/// アプリケーションのバージョン
#define APP_VERSION _T("1.82")
#define APP_VERSION _T("1.83")



Expand Down
24 changes: 24 additions & 0 deletions Proxydomo/FilterEditWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,30 @@ void CFilterEditWindow::OnDestroy()
}


BOOL CFilterEditWindow::OnSetCursor(CWindow wnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTCLIENT) {
CRect rcMatching = _GetControlRect(IDC_EDIT_MATCHPATTERN);
CRect rcReplace = _GetControlRect(IDC_EDIT_REPLACEPATTERN);

CRect rcDragBound;
rcDragBound.top = rcMatching.bottom;
rcDragBound.left = rcMatching.left;
rcDragBound.right = rcMatching.right;
rcDragBound.bottom = rcReplace.top;

CPoint point;
::GetCursorPos(&point);
ScreenToClient(&point);
if (rcDragBound.PtInRect(point)) {
SetCursor(LoadCursor(0, IDC_SIZENS));
return TRUE;
}
}
SetMsgHandled(FALSE);
return FALSE;
}

void CFilterEditWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rcMatching = _GetControlRect(IDC_EDIT_MATCHPATTERN);
Expand Down
3 changes: 3 additions & 0 deletions Proxydomo/FilterEditWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ class CFilterEditWindow :
DLGRESIZE_CONTROL( IDC_STATIC_VERSION, DLSZ_MOVE_X )
DLGRESIZE_CONTROL( IDC_EDIT_VERSION, DLSZ_MOVE_X )
DLGRESIZE_CONTROL( IDC_EDIT_FILTERDISCRIPTION, DLSZ_SIZE_X )
DLGRESIZE_CONTROL( IDC_COMBO_HEADERNAME, DLSZ_SIZE_X)
DLGRESIZE_CONTROL( IDC_CHECKBOX_MULTIPLEMUTCH, DLSZ_MOVE_X )
DLGRESIZE_CONTROL( IDC_EDIT_URLPATTERN, DLSZ_SIZE_X )
DLGRESIZE_CONTROL( IDC_EDIT_BOUNDSPATTERN, DLSZ_SIZE_X )
Expand All @@ -110,6 +111,7 @@ class CFilterEditWindow :
BEGIN_MSG_MAP_EX( CFilterEditWindow )
MSG_WM_INITDIALOG( OnInitDialog )
MSG_WM_DESTROY( OnDestroy )
MSG_WM_SETCURSOR( OnSetCursor )
MSG_WM_LBUTTONDOWN( OnLButtonDown )
MSG_WM_MOUSEMOVE( OnMouseMove )
MSG_WM_LBUTTONUP( OnLButtonUp )
Expand All @@ -127,6 +129,7 @@ class CFilterEditWindow :
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);
void OnDestroy();

BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message);
void OnLButtonDown(UINT nFlags, CPoint point);
void OnMouseMove(UINT nFlags, CPoint point);
void OnLButtonUp(UINT nFlags, CPoint point);
Expand Down
9 changes: 7 additions & 2 deletions Proxydomo/Proxydomo.rc
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@ BEGIN
COMBOBOX IDC_COMBO_FILTERTYPE,44,61,74,55,CBS_DROPDOWNLIST | CBS_HASSTRINGS
RTEXT "����o�C�g��",IDC_STATIC_LIMIT,184,115,42,9
EDITTEXT IDC_EDIT_WINDOWWIDTH,228,114,35,12,ES_AUTOHSCROLL | ES_NUMBER
RTEXT "�w�b�_��",IDC_STATIC_HEADERNAME,140,62,44,9
COMBOBOX IDC_COMBO_HEADERNAME,190,61,74,89,CBS_DROPDOWN | CBS_HASSTRINGS
RTEXT "�w�b�_��",IDC_STATIC_HEADERNAME,126,62,43,9
COMBOBOX IDC_COMBO_HEADERNAME,174,61,90,89,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_HASSTRINGS
CONTROL "�ċA�}�b�`�����‚���",IDC_CHECKBOX_MULTIPLEMUTCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,82,92,13
GROUPBOX "�͈�",IDC_STATIC_BOUNDS,3,74,264,56,0,WS_EX_TRANSPARENT
LTEXT "URL�p�^�[��",IDC_STATIC_URLPATTERN,8,85,50,11
Expand Down Expand Up @@ -384,6 +384,11 @@ BEGIN
0
END

IDD_FILTEREDIT AFX_DIALOG_LAYOUT
BEGIN
0
END


/////////////////////////////////////////////////////////////////////////////
//
Expand Down
21 changes: 21 additions & 0 deletions Proxydomo/Test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -604,4 +604,25 @@ TEST(FilterOwner, CleanHeader)
EXPECT_TRUE(headers.empty());
}

#include "proximodo\util.h"

TEST(CUtil, UESC)
{
EXPECT_TRUE(CUtil::UESC(L"%2A%5C") == L"*\\");
EXPECT_TRUE(CUtil::UESC(L"%2a%5c") == L"*\\"); // 小文字

EXPECT_TRUE(CUtil::UESC(L"TEST") == L"TEST"); // そのまま

EXPECT_TRUE(CUtil::UESC(L"%u65E5%u672C%u8A9E") == L"日本語");
EXPECT_TRUE(CUtil::UESC(L"%u65e5%u672c%u8a9e") == L"日本語"); // 小文字

EXPECT_TRUE(CUtil::UESC(L"%2A%5") == L"*%5"); // 末尾欠け
EXPECT_TRUE(CUtil::UESC(L"%2A%UU") == L"*%UU"); // デコード不可

EXPECT_TRUE(CUtil::UESC(L"%u65E5%u672C%u8A9") == L"日本%u8A9"); // 末尾欠け
EXPECT_TRUE(CUtil::UESC(L"%u65E5%u672C%u8A9G") == L"日本%u8A9G"); // デコード不可


}

#endif // UNIT_TEST
88 changes: 64 additions & 24 deletions Proxydomo/proximodo/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <sstream>
#include <fstream>
#include <iomanip>
#include <boost\optional.hpp>
#include <Windows.h>
#include "..\Misc.h"

Expand Down Expand Up @@ -381,39 +382,78 @@ string CUtil::UESC(const string& str) {

wstring CUtil::UESC(const wstring& str) {
wstringstream out;
static const wstring hex = L"0123456789ABCDEF";
for (auto c = str.begin(); c != str.end(); c++) {
for (auto c = str.begin(); c != str.end(); ++c) {
if (*c == L'%') {
if (*(c + 1) == L'u' &&
hex.find(*(c + 2)) != string::npos &&
hex.find(*(c + 3)) != string::npos &&
hex.find(*(c + 4)) != string::npos &&
hex.find(*(c + 5)) != string::npos )
{
auto funcHexToNumber = [](const wchar_t c) -> BYTE {
if (L'0' <= c && c <= L'9') {
return c - L'0';
} else if (L'A' <= c && c <= L'F') {
return c - L'A' + 0x0A;
} else if (L'a' <= c && c <= L'f') {
return c - L'a' + 0x0A;
}
ATLASSERT(FALSE);
return 0;
};
wchar_t wc = funcHexToNumber(*(c + 2)) << 12 | funcHexToNumber(*(c + 3)) << 8 | funcHexToNumber(*(c + 4)) << 4 | funcHexToNumber(*(c + 5));

auto funcCharOpt = [&](std::wstring::const_iterator it, size_t advance) -> boost::optional<wchar_t> {
auto advancedIt = std::next(it, advance);
if (advancedIt == str.end()) {
return boost::none;
} else {
return *advancedIt;
}
};

auto funcIsHex = [](wchar_t c) -> bool {
if (L'0' <= c && c <= L'9') {
return true;
} else if (L'A' <= c && c <= L'F') {
return true;
} else if (L'a' <= c && c <= L'f') {
return true;
}
return false;
};

// 16進数を数値に変換する
auto funcHexToNumber = [](const wchar_t c) -> BYTE {
if (L'0' <= c && c <= L'9') {
return c - L'0';
} else if (L'A' <= c && c <= L'F') {
return c - L'A' + 10;
} else if (L'a' <= c && c <= L'f') {
return c - L'a' + 10;
}
ATLASSERT(FALSE);
return 0;
};

auto c1 = funcCharOpt(c, 1);

// %uXXXX 形式
if (c1 && *c1 == L'u') {
auto c2 = funcCharOpt(c, 2);
if (!c2 || !funcIsHex(*c2))
goto OUTPUT;
auto c3 = funcCharOpt(c, 3);
if (!c3 || !funcIsHex(*c3))
goto OUTPUT;
auto c4 = funcCharOpt(c, 4);
if (!c4 || !funcIsHex(*c4))
goto OUTPUT;
auto c5 = funcCharOpt(c, 5);
if (!c5 || !funcIsHex(*c5))
goto OUTPUT;

wchar_t wc = funcHexToNumber(*c2) << 12 | funcHexToNumber(*c3) << 8 | funcHexToNumber(*c4) << 4 | funcHexToNumber(*c5);
out << wc;
c += 5;
continue;

} else { // %XX 形式
if (!c1 || !funcIsHex(*c1))
goto OUTPUT;

auto c2 = funcCharOpt(c, 2);
if (!c2 || !funcIsHex(*c2))
goto OUTPUT;

} else if (hex.find(*(c + 1)) != string::npos &&
hex.find(*(c + 2)) != string::npos)
{
out << (char)(hex.find(*(c + 1)) * 16 + hex.find(*(c + 2)));
out << (char)((funcHexToNumber(*c1) * 16) + funcHexToNumber(*c2));
c += 2;
continue;
}
}
OUTPUT:;
out << *c;
}
return out.str();
Expand Down

0 comments on commit 5c409a9

Please sign in to comment.