| 5071 |
|
|
| 5072 |
static void XsProcClipboard(PCHAR buff) |
static void XsProcClipboard(PCHAR buff) |
| 5073 |
{ |
{ |
| 5074 |
int len, blen; |
char *p; |
|
char *p, *cbbuff, hdr[20]; |
|
| 5075 |
wchar_t *notify_buff, *notify_title; |
wchar_t *notify_buff, *notify_title; |
|
HGLOBAL cbmem; |
|
|
int wide_len; |
|
|
HGLOBAL wide_cbmem; |
|
|
LPWSTR wide_buf; |
|
| 5076 |
|
|
| 5077 |
p = buff; |
p = buff; |
| 5078 |
while (strchr("cps01234567", *p)) { |
while (strchr("cps01234567", *p)) { |
| 5082 |
if (*p++ == ';') { |
if (*p++ == ';') { |
| 5083 |
if (*p == '?' && *(p+1) == 0) { // Read access |
if (*p == '?' && *(p+1) == 0) { // Read access |
| 5084 |
if (ts.CtrlFlag & CSF_CBREAD) { |
if (ts.CtrlFlag & CSF_CBREAD) { |
| 5085 |
|
char hdr[20]; |
| 5086 |
if (ts.NotifyClipboardAccess) { |
if (ts.NotifyClipboardAccess) { |
| 5087 |
GetI18nStrWW("Tera Term", "MSG_CBACCESS_TITLE", |
GetI18nStrWW("Tera Term", "MSG_CBACCESS_TITLE", |
| 5088 |
L"Clipboard Access", ts.UILanguageFileW, ¬ify_title); |
L"Clipboard Access", ts.UILanguageFileW, ¬ify_title); |
| 5108 |
} |
} |
| 5109 |
} |
} |
| 5110 |
else if (ts.CtrlFlag & CSF_CBWRITE) { // Write access |
else if (ts.CtrlFlag & CSF_CBWRITE) { // Write access |
| 5111 |
len = strlen(buff); |
size_t len = strlen(buff); |
| 5112 |
blen = len * 3 / 4 + 1; |
size_t blen = len * 3 / 4 + 1; |
| 5113 |
|
char *cbbuff = malloc(blen); |
|
if ((cbmem = GlobalAlloc(GMEM_MOVEABLE, blen)) == NULL) { |
|
|
return; |
|
|
}; |
|
|
if ((cbbuff = GlobalLock(cbmem)) == NULL) { |
|
|
GlobalFree(cbmem); |
|
|
return; |
|
|
} |
|
|
|
|
| 5114 |
len = b64decode(cbbuff, blen, p); |
len = b64decode(cbbuff, blen, p); |
|
|
|
| 5115 |
if (len < 0 || len >= blen) { |
if (len < 0 || len >= blen) { |
| 5116 |
GlobalUnlock(cbmem); |
free(cbbuff); |
|
GlobalFree(cbmem); |
|
| 5117 |
return; |
return; |
| 5118 |
} |
} |
|
|
|
| 5119 |
cbbuff[len] = 0; |
cbbuff[len] = 0; |
|
GlobalUnlock(cbmem); |
|
| 5120 |
|
|
| 5121 |
if (ts.NotifyClipboardAccess) { |
if (ts.NotifyClipboardAccess) { |
| 5122 |
wchar_t *buf; |
wchar_t *buf; |
| 5131 |
free(notify_buff); |
free(notify_buff); |
| 5132 |
} |
} |
| 5133 |
|
|
| 5134 |
wide_len = MultiByteToWideChar(CP_ACP, 0, cbbuff, -1, NULL, 0); |
// cbbuff に入っている文字列をクリップボードにセットする |
| 5135 |
wide_cbmem = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len); |
{ |
| 5136 |
if (wide_cbmem) { |
// wchar_t へ変換して設定 |
| 5137 |
wide_buf = (LPWSTR)GlobalLock(wide_cbmem); |
// とりあえずUTF-8 が入っている前提 |
| 5138 |
MultiByteToWideChar(CP_ACP, 0, cbbuff, -1, wide_buf, wide_len); |
// TODO 受信文字コードに合わせて変更すればok? |
| 5139 |
GlobalUnlock(wide_cbmem); |
wchar_t *cbbuffW = ToWcharU8(cbbuff); |
| 5140 |
} |
CBSetTextW(NULL, cbbuffW, 0); |
| 5141 |
|
free(cbbuffW); |
|
if (OpenClipboard(NULL)) { |
|
|
EmptyClipboard(); |
|
|
SetClipboardData(CF_TEXT, cbmem); |
|
|
if (wide_buf) { |
|
|
SetClipboardData(CF_UNICODETEXT, wide_cbmem); |
|
|
} |
|
|
CloseClipboard(); |
|
| 5142 |
} |
} |
| 5143 |
|
free(cbbuff); |
| 5144 |
} |
} |
| 5145 |
else if (ts.NotifyClipboardAccess) { |
else if (ts.NotifyClipboardAccess) { |
| 5146 |
GetI18nStrWW("Tera Term", "MSG_CBACCESS_REJECT_TITLE", |
GetI18nStrWW("Tera Term", "MSG_CBACCESS_REJECT_TITLE", |