?? recvdlg.cpp
字號(hào):
static char *recvdlg_id =
"@(#)Copyright (C) H.Shirouzu 1996-2002 recvdlg.cpp Ver2.00";
/* ========================================================================
Project Name : IP Messenger for Win32
Module Name : Receive Dialog
Create : 1996-06-01(Sat)
Update : 2002-11-03(Sun)
Copyright : H.Shirouzu
Reference :
======================================================================== */
#include <time.h>
#include "tlib.h"
#include "resource.h"
#include "ipmsg.h"
#include "msgstr.h"
#include "blowfish.h"
int TRecvDlg::createCnt = 0;
TRecvDlg::TRecvDlg(MsgMng *_msgMng, MsgBuf *_msg, THosts *_hosts, Cfg *_cfg, LogMng *_logmng) : TListDlg(RECEIVE_DIALOG), editSub(_cfg, this)
{
msgMng = _msgMng;
cfg = _cfg;
openFlg = FALSE;
logmng = _logmng;
hosts = _hosts;
hEditFont = NULL;
hHeadFont = NULL;
fileObj = NULL;
shareInfo = NULL;
timerID = 0;
retryCnt = 0;
cryptCapa = 0;
createCnt++;
::GetLocalTime(&recvTime);
memset(&orgFont, 0, sizeof(orgFont));
msg.Init(_msg);
MakeListString(cfg, &msg.hostSub, hosts, head);
if (msg.command & IPMSG_FILEATTACHOPT)
{
if ((shareInfo = DecodeShareMsg(msg.msgBuf + msg.exOffset)) != NULL)
{
fileObj = new RecvFileObj;
memset(fileObj, 0, sizeof(RecvFileObj));
}
}
status = TRUE;
if (msg.command & IPMSG_ENCRYPTOPT)
if ((status = DecryptMsg()) == FALSE)
msgMng->Send(&msg.hostSub, IPMSG_SENDMSG|IPMSG_NOLOGOPT, DECRYPTERR_MSGSTR);
if (status)
{
if ((msg.command & IPMSG_PASSWORDOPT) == 0 || cfg->PasswdLogCheck == FALSE)
logmng->WriteRecvMsg(&msg, hosts, shareInfo);
hAccel = ::LoadAccelerators(TApp::hI, (LPCSTR)IPMSG_ACCEL);
}
}
TRecvDlg::~TRecvDlg()
{
if (shareInfo)
{
if (shareInfo->fileCnt > 0)
msgMng->Send(&msg.hostSub, IPMSG_RELEASEFILES, msg.packetNo);
// 偁偲偱庴怣廔椆捠抦偺僐乕僪傪擖傟傞
FreeDecodeShareMsg(shareInfo);
}
if (fileObj)
{
if (fileObj->conInfo)
delete fileObj->conInfo;
delete fileObj;
}
if (hHeadFont)
::DeleteObject(hHeadFont);
if (hEditFont)
::DeleteObject(hEditFont);
createCnt--;
}
/*
儊僢僙乕僕偺暅崋壔
*/
BOOL TRecvDlg::DecryptMsg()
{
HCRYPTKEY hKey=0, hExKey=0;
char *capa_hex, *skey_hex, *msg_hex, *p;
BYTE skey[MAX_BUF];
int len, msgLen;
HCRYPTPROV target_csp;
if ((capa_hex = separate_token(msg.msgBuf, ':', &p)) == NULL)
return FALSE;
cryptCapa = strtoul(capa_hex, 0, 16);
target_csp = (cryptCapa & IPMSG_RSA_1024) && cfg->pubKey.Key() ? cfg->hCsp : cfg->hSmallCsp;
if ((skey_hex = separate_token(NULL, ':', &p)) == NULL)
return FALSE;
if ((msg_hex = separate_token(NULL, 0, &p)) == NULL)
return FALSE;
if (cryptCapa & (IPMSG_BLOWFISH_128ALL)) { // blow fish
hexstr2bin_bigendian(skey_hex, skey, sizeof(skey), &len);
// 岞奐尞庢摼
if (!pCryptGetUserKey(target_csp, AT_KEYEXCHANGE, &hExKey))
return wsprintf(msg.msgBuf, "CryptGetUserKey Err(%X)", GetLastError()), FALSE;
if (!pCryptDecrypt(hExKey, 0, TRUE, 0, (BYTE *)skey, (DWORD *)&len))
return wsprintf(msg.msgBuf, "CryptDecrypt Err(%X)", GetLastError()), FALSE;
pCryptDestroyKey(hExKey);
CBlowFish bl;
bl.Initialize(skey, len, CBlowFish::CBC);
hexstr2bin(msg_hex, (BYTE *)msg.msgBuf, sizeof(msg.msgBuf), &msgLen);
bl.Decode((BYTE *)msg.msgBuf, (BYTE *)msg.msgBuf, msgLen);
}
else { // RC2
// Skey Blob 傪嶌傞
skey[0] = SIMPLEBLOB;
skey[1] = CUR_BLOB_VERSION;
*(WORD *)(skey + 2) = 0;
*(ALG_ID *)(skey + 4) = CALG_RC2;
*(ALG_ID *)(skey + 8) = CALG_RSA_KEYX;
((msg.command & IPMSG_ENCRYPTOPT) ? hexstr2bin_bigendian : hexstr2bin)(skey_hex, skey + SKEY_HEADER_SIZE, sizeof(skey) - SKEY_HEADER_SIZE, &len);
// 僙僢僔儑儞僉乕偺 import
if (!pCryptImportKey(target_csp, skey, len + SKEY_HEADER_SIZE, 0, 0, &hKey))
return wsprintf(msg.msgBuf, "CryptImportKey Err(%X)", GetLastError()), FALSE;
// 僉乕桳岠挿傪128bit偵
if (cryptCapa & IPMSG_RC2_128) {
DWORD val = 128;
if (!pCryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (BYTE *)&val, 0))
return wsprintf(msg.msgBuf, "CryptSetKeyParam Err(%X)", GetLastError()), FALSE;
}
// 儊僢僙乕僕偺 Decrypt
hexstr2bin(msg_hex, (BYTE *)msg.msgBuf, sizeof(msg.msgBuf), &msgLen);
if (!pCryptDecrypt(hKey, 0, TRUE, 0, (BYTE *)msg.msgBuf, (DWORD *)&msgLen))
return wsprintf(msg.msgBuf, "CryptDecrypt Err(%X)", GetLastError()), FALSE;
pCryptDestroyKey(hKey);
}
// UNIX 宍幃偺夵峴傪曄姺
if (cryptCapa & (IPMSG_BLOWFISH_128|IPMSG_RC2_128|IPMSG_RC2_40))
MsgMng::UnixNewLineToLocal(msg.msgBuf, msg.msgBuf, sizeof(msg.msgBuf));
return TRUE;
}
BOOL TRecvDlg::EvCreate(LPARAM lParam)
{
SetDlgIcon(hWnd);
SetDlgItemText(RECV_HEAD, head);
if (msg.command & IPMSG_BROADCASTOPT)
SetDlgItemText(RECV_TITLE, BROADCAST_MSGSTR);
else if (msg.command & IPMSG_MULTICASTOPT)
SetDlgItemText(RECV_TITLE, MULTICAST_MSGSTR);
else
SetDlgItemText(RECV_TITLE, UNICAST_MSGSTR);
if (msg.command & IPMSG_AUTORETOPT)
SetDlgItemText(RECV_TITLE, UNIABSENCE_MSGSTR);
char buf[MAX_LISTBUF];
if (msg.command & IPMSG_ENCRYPTOPT)
{
::GetWindowText(hWnd, buf, sizeof(buf));
strcat(buf, (cryptCapa & (IPMSG_BLOWFISH_128ALL|IPMSG_RC2_128ALL)) ? " +" : " -");
SetWindowText(buf);
}
wsprintf(head, "at %s", Ctime(&recvTime));
SetDlgItemText(RECV_HEAD2, head);
SetDlgItemText(RECV_EDIT, msg.msgBuf);
if (msg.command & IPMSG_SECRETOPT)
::ShowWindow(GetDlgItem(RECV_EDIT), SW_HIDE), ::ShowWindow(GetDlgItem(QUOTE_CHECK), SW_HIDE);
else {
::ShowWindow(GetDlgItem(OPEN_BUTTON), SW_HIDE), openFlg = TRUE;
if (shareInfo)
SetFileButton(this, FILE_BUTTON, shareInfo);
}
if (msg.command & IPMSG_FILEATTACHOPT)
{
GetDlgItemText(OPEN_BUTTON, buf, sizeof(buf));
strcat(buf, " " FILEATTACH_MSGSTR);
SetDlgItemText(OPEN_BUTTON, buf);
}
if (msg.command & IPMSG_PASSWORDOPT)
{
GetDlgItemText(OPEN_BUTTON, buf, sizeof(buf));
strcat(buf, KEYOPEN_MSGSTR);
SetDlgItemText(OPEN_BUTTON, buf);
}
if (cfg->QuoteCheck == TRUE)
SendDlgItemMessage(QUOTE_CHECK, BM_SETCHECK, cfg->QuoteCheck, 0);
if (cfg->AbnormalButton)
SetDlgItemText(IDOK, INTERCEPT_MSGSTR);
SetFont();
SetSize();
HMENU hMenu = ::GetSystemMenu(hWnd, FALSE);
::AppendMenu(hMenu, MF_SEPARATOR, NULL, NULL);
SetMainMenu(hMenu);
if (IsNewShell() != TRUE)
{
ULONG style = GetWindowLong(GWL_STYLE);
style &= 0xffffff0f;
style |= 0x00000080;
SetWindowLong(GWL_STYLE, style);
}
SetForegroundWindow();
editSub.CreateByWnd(GetDlgItem(RECV_EDIT));
if (msg.command & IPMSG_NOADDLISTOPT)
::EnableWindow(GetDlgItem(IDOK), FALSE);
EvSize(SIZE_RESTORED, 0, 0);
return TRUE;
}
BOOL TRecvDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
switch (wID)
{
case IDOK:
{
if (openFlg && ::IsDlgButtonChecked(hWnd, QUOTE_CHECK))
{
DWORD startStr, endStr, ret;
ret = SendDlgItemMessage(RECV_EDIT, EM_GETSEL, (WPARAM)&startStr, (LPARAM)&endStr);
GetDlgItemText(RECV_EDIT, msg.msgBuf, sizeof(msg.msgBuf));
if (startStr != endStr)
{
memmove(msg.msgBuf, msg.msgBuf + startStr, (int)(endStr - startStr));
msg.msgBuf[endStr - startStr] = 0;
}
}
else
*msg.msgBuf = 0;
::PostMessage(GetMainWnd(), WM_SENDDLG_OPEN, (WPARAM)hWnd, (LPARAM)&msg);
}
return TRUE;
case IDCANCEL:
if ((GetAsyncKeyState(VK_ESCAPE) & 0x8000) == 0)
{
if (fileObj && fileObj->conInfo)
return EvCommand(0, FILE_BUTTON, 0), TRUE;
if (timerID == 0)
::PostMessage(GetMainWnd(), WM_RECVDLG_EXIT, 0, (LPARAM)this);
else
TWin::Show(SW_HIDE);
}
return TRUE;
case MISC_ACCEL:
case HIDE_ACCEL:
::PostMessage(GetMainWnd(), WM_COMMAND, wID, 0);
return TRUE;
case ALLSELECT_ACCEL:
SendDlgItemMessage(RECV_EDIT, EM_SETSEL, 0, (LPARAM)-1);
return TRUE;
case OPEN_BUTTON:
if (openFlg)
return TRUE;
if (msg.command & IPMSG_PASSWORDOPT)
{
TPasswordDlg dlg(cfg, this);
if (dlg.Exec() != TRUE)
return TRUE;
if (cfg->PasswdLogCheck == TRUE)
logmng->WriteRecvMsg(&msg, hosts, shareInfo);
}
openFlg = TRUE;
::ShowWindow(GetDlgItem(RECV_EDIT), SW_SHOW);
::ShowWindow(GetDlgItem(QUOTE_CHECK), SW_SHOW);
::ShowWindow(GetDlgItem(OPEN_BUTTON), SW_HIDE);
::EnableWindow(GetDlgItem(OPEN_BUTTON), FALSE);
if (shareInfo)
SetFileButton(this, FILE_BUTTON, shareInfo), EvSize(SIZE_RESTORED, 0, 0);
if (msg.command & IPMSG_SECRETOPT)
{
char buf[MAX_LISTBUF];
wsprintf(buf, "%ld", msg.packetNo);
packetNo = msgMng->MakeMsg(readMsgBuf, IPMSG_READMSG|(msg.command & IPMSG_READCHECKOPT), buf);
msgMng->UdpSend(msg.hostSub.addr, msg.hostSub.portNo, readMsgBuf);
if (msg.command & IPMSG_READCHECKOPT)
timerID = ::SetTimer(hWnd, IPMSG_RECV_TIMER, cfg->RetryMSec, NULL);
}
return TRUE;
case FILE_BUTTON:
if (fileObj && fileObj->conInfo)
{
if (fileObj->hThread)
::SuspendThread(fileObj->hThread);
int ret = MessageBox(TRANSSTOP_MSGSTR, MSG_STR, MB_OKCANCEL);
if (fileObj->hThread)
::ResumeThread(fileObj->hThread);
if (ret == IDOK)
if (fileObj->conInfo) EndRecvFile(TRUE);
}
else if (fileObj) {
TSaveCommonDlg dlg(shareInfo, cfg, this);
if (dlg.Exec() == TRUE)
{
memset(fileObj, 0, sizeof(RecvFileObj));
strncpyz(fileObj->saveDir, cfg->lastSaveDir, MAX_PATH);
SaveFile();
}
}
break;
case MENU_SAVEPOS:
if ((cfg->RecvSavePos = !cfg->RecvSavePos) != 0)
{
GetWindowRect(&rect);
cfg->RecvXpos = rect.left;
cfg->RecvYpos = rect.top;
}
cfg->WriteRegistry(CFG_WINSIZE);
return TRUE;
case MENU_SAVESIZE:
GetWindowRect(&rect);
cfg->RecvXdiff = (rect.right - rect.left) - (orgRect.right - orgRect.left);
cfg->RecvYdiff = (rect.bottom - rect.top) - (orgRect.bottom - orgRect.top);
cfg->WriteRegistry(CFG_WINSIZE);
return TRUE;
case MENU_NORMALSIZE:
GetWindowRect(&rect);
MoveWindow(rect.left, rect.top, orgRect.right - orgRect.left, orgRect.bottom - orgRect.top, TRUE);
return TRUE;
case MENU_EDITFONT: case MENU_HEADFONT:
CHOOSEFONT cf;
LOGFONT tmpFont, *targetFont;
targetFont = wID == MENU_EDITFONT ? &cfg->RecvEditFont : &cfg->RecvHeadFont;
memset(&cf, 0, sizeof(cf));
cf.lStructSize = sizeof(cf);
cf.hwndOwner = hWnd;
cf.lpLogFont = &(tmpFont = *targetFont);
cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_SHOWHELP;
cf.nFontType = SCREEN_FONTTYPE;
if (::ChooseFont(&cf))
{
*targetFont = tmpFont;
SetFont();
::InvalidateRgn(hWnd, NULL, TRUE);
}
cfg->WriteRegistry(CFG_FONT);
return TRUE;
case MENU_DEFAULTFONT:
cfg->RecvHeadFont = orgFont;
cfg->RecvEditFont = orgFont;
SetFont();
::InvalidateRgn(hWnd, NULL, TRUE);
cfg->WriteRegistry(CFG_FONT);
return TRUE;
}
return FALSE;
}
BOOL TRecvDlg::SaveFile(void)
{
int target;
for (target=0; target < shareInfo->fileCnt; target++)
if (shareInfo->fileInfo[target]->IsSelected())
break;
if (target == shareInfo->fileCnt)
return FALSE;
memset(fileObj, 0, (char *)&fileObj->totalTrans - (char *)fileObj);
fileObj->conInfo = new ConnectInfo;
fileObj->fileInfo = shareInfo->fileInfo[target];
fileObj->isDir = GET_MODE(fileObj->fileInfo->Attr()) == IPMSG_FILE_DIR ? TRUE : FALSE;
fileObj->status = fileObj->isDir ? FS_DIRFILESTART : FS_TRANSFILE;
fileObj->hFile = INVALID_HANDLE_VALUE;
if (fileObj->isDir)
strncpyz(fileObj->path, fileObj->saveDir, MAX_PATH);
if (ConnectRecvFile() == TRUE)
SetDlgItemText(FILE_BUTTON, PREPARETRANS_MSGSTR);
else {
delete fileObj->conInfo;
fileObj->conInfo = NULL;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -