?? mainwin.cpp
字號:
/*
User掕媊 Event CallBack
*/
BOOL TMainWin::EventUser(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SENDDLG_OPEN:
SendDlgOpen((HWND)wParam, (MsgBuf *)lParam);
return TRUE;
case WM_SENDDLG_EXIT:
SendDlgExit((TSendDlg *)lParam);
return TRUE;
case WM_SENDDLG_HIDE:
SendDlgHide((TSendDlg *)lParam);
return TRUE;
case WM_RECVDLG_OPEN:
PopupCheck();
return TRUE;
case WM_RECVDLG_EXIT:
RecvDlgExit((TRecvDlg *)lParam);
return TRUE;
case WM_IPMSG_NOTIFY: // TaskTray
PostMessage((UINT)lParam, 0, 0);
return TRUE;
case WM_HIDE_CHILDWIN:
ActiveChildWindow(activeToggle = !activeToggle);
return TRUE;
case WM_UDPEVENT:
UdpEvent(lParam);
return TRUE;
case WM_TCPEVENT:
TcpEvent(wParam, lParam);
return TRUE;
case WM_REFRESH_HOST:
RefreshHost((BOOL)wParam);
return TRUE;
case WM_MSGDLG_EXIT:
MsgDlgExit((TMsgDlg *)lParam);
return TRUE;
case WM_DELMISCDLG:
EvCommand(0, MENU_DELMISCDLG, 0);
return TRUE;
case WM_IPMSG_INITICON:
InitIcon();
SetIcon(cfg->AbsenceCheck == FALSE ? hMainIcon : hRevIcon);
return TRUE;
default:
if (uMsg == TaskBarCreateMsg)
{
TaskBar(NIM_ADD, hMainIcon, IPMSG_MSGSTR);
return TRUE;
}
}
return FALSE;
}
/*
嶲壛 Message Packet憲弌
*/
void TMainWin::EntryHost(void)
{
time_t now_time = Time();
if (entryStartTime + (time_t)cfg->ListGetMSec / 1000 > now_time)
return;
entryStartTime = now_time;
if (cfg->ListGet)
{
if (::SetTimer(hWnd, IPMSG_LISTGET_TIMER, cfg->ListGetMSec, NULL))
entryTimerStatus = IPMSG_LISTGET_TIMER;
BroadcastEntry(IPMSG_BR_ISGETLIST2);
}
else
BroadcastEntry(IPMSG_BR_ENTRY);
}
/*
扙弌 Message Packet憲弌
*/
void TMainWin::ExitHost(void)
{
BroadcastEntry(IPMSG_BR_EXIT);
Sleep(100);
BroadcastEntry(IPMSG_BR_EXIT);
}
/*
廳暋 Packet挷嵏乮娙堈...傕偟偔偼庤敳偒偲傕尵偆(^^;乯
*/
BOOL TMainWin::IsLastPacket(MsgBuf *msg)
{
for (int cnt=0; cnt < MAX_PACKETLOG; cnt++)
{
if (packetLog[cnt].addr == msg->hostSub.addr && packetLog[cnt].port == msg->hostSub.portNo && packetLog[cnt].no == msg->packetNo && msg->packetNo != IPMSG_DEFAULT_PORT)
return TRUE;
}
return FALSE;
}
/*
UDP Packet 庴怣張棟
*/
BOOL TMainWin::UdpEvent(LPARAM lParam)
{
MsgBuf msg;
if (WSAGETSELECTERROR(lParam) || msgMng->Recv(&msg) != TRUE)
return FALSE;
if (cfg->PriorityReject)
{
Host *host = cfg->priorityHosts.GetHostByName(&msg.hostSub);
if (host && (host->priority < 0 || cfg->PriorityReject >= 2 && host->priority == 0) && IsSameHost(&msg.hostSub, msgMng->GetLocalHost()) == FALSE)
{
ULONG cmd = GET_MODE(msg.command);
if (cmd != IPMSG_BR_EXIT && cmd != IPMSG_NOOPERATION)
BroadcastEntrySub(&msg.hostSub, IPMSG_BR_EXIT);
if (GET_MODE(msg.command) != IPMSG_ANSENTRY)
return FALSE;
}
}
switch (GET_MODE(msg.command))
{
case IPMSG_BR_ENTRY:
MsgBrEntry(&msg);
return TRUE;
case IPMSG_BR_EXIT:
MsgBrExit(&msg);
return TRUE;
case IPMSG_ANSENTRY:
MsgAnsEntry(&msg);
return TRUE;
case IPMSG_BR_ABSENCE:
MsgBrAbsence(&msg);
return TRUE;
case IPMSG_SENDMSG:
MsgSendMsg(&msg);
break;
case IPMSG_RECVMSG:
MsgRecvMsg(&msg);
break;
case IPMSG_READMSG:
case IPMSG_ANSREADMSG:
MsgReadMsg(&msg);
break;
case IPMSG_BR_ISGETLIST2:
MsgBrIsGetList(&msg);
return TRUE;
case IPMSG_OKGETLIST:
MsgOkGetList(&msg);
return TRUE;
case IPMSG_GETLIST:
MsgGetList(&msg);
return TRUE;
case IPMSG_ANSLIST:
MsgAnsList(&msg);
return TRUE;
case IPMSG_GETINFO:
MsgGetInfo(&msg);
break;
case IPMSG_SENDINFO:
MsgSendInfo(&msg);
break;
case IPMSG_GETPUBKEY:
MsgGetPubKey(&msg);
break;
case IPMSG_ANSPUBKEY:
MsgAnsPubKey(&msg);
break;
case IPMSG_GETABSENCEINFO:
MsgGetAbsenceInfo(&msg);
break;
case IPMSG_SENDABSENCEINFO:
MsgSendAbsenceInfo(&msg);
break;
case IPMSG_RELEASEFILES:
MsgReleaseFiles(&msg);
break;
}
packetLog[packetLogCnt].no = msg.packetNo;
packetLog[packetLogCnt].addr = msg.hostSub.addr;
packetLog[packetLogCnt].port = msg.hostSub.portNo;
packetLogCnt = (packetLogCnt + 1) % MAX_PACKETLOG;
return TRUE;
}
/*
TCP Packet 庴怣張棟
*/
inline SendFileObj *TMainWin::FindSendFileObj(SOCKET sd)
{
for (SendFileObj *obj = (SendFileObj *)sendFileList.TopObj(); obj; obj = (SendFileObj *)sendFileList.NextObj(obj))
if (obj->conInfo->sd == sd)
return obj;
return NULL;
}
BOOL TMainWin::TcpEvent(SOCKET sd, LPARAM lParam)
{
if (WSAGETSELECTERROR(lParam))
return FALSE;
switch (LOWORD(lParam)) {
case FD_ACCEPT:
{
ConnectInfo tmpInfo, *info;
if (msgMng->Accept(hWnd, &tmpInfo))
{
if (CheckConnectInfo(&tmpInfo))
{
info = new ConnectInfo(tmpInfo);
connectList.AddObj(info);
}
else ::closesocket(tmpInfo.sd);
}
}
break;
case FD_READ:
StartSendFile(sd);
break;
case FD_CLOSE:
{
SendFileObj *obj;
if ((obj = FindSendFileObj(sd)) != NULL)
EndSendFile(obj);
else
::closesocket(sd);
}
break;
}
return TRUE;
}
BOOL TMainWin::CheckConnectInfo(ConnectInfo *conInfo)
{
for (ShareInfo *info=shareMng->Top(); info; info=shareMng->Next(info))
{
for (int cnt=0; cnt < info->hostCnt; cnt++)
if (info->host[cnt]->hostSub.addr == conInfo->addr/* && info->host[cnt]->hostSub.portNo == conInfo->port*/)
return conInfo->port = info->host[cnt]->hostSub.portNo, TRUE;
}
return FALSE;
}
/*
僼傽僀儖憲庴怣奐巒張棟
*/
BOOL TMainWin::StartSendFile(SOCKET sd)
{
ConnectInfo *conInfo;
AcceptFileInfo fileInfo;
for (conInfo=(ConnectInfo *)connectList.TopObj(); conInfo && conInfo->sd != sd; conInfo=(ConnectInfo *)connectList.NextObj(conInfo))
;
if (conInfo == NULL)
return ::closesocket(sd), FALSE;
else {
msgMng->ConnectDone(hWnd, conInfo); // 旕摨婜儊僢僙乕僕偺梷惂
// 偡偱偵 read 梫媮偑偒偰偄傞偺偱丄屌傑傞帠偼柍偄...偼偢
// 堦搙偺 recv 偱撉傔側偄応崌丄僄儔乕偵偟偰偟傑偆乮庤敳偒乯
char buf[MAX_PATH];
int size;
if ((size = ::recv(conInfo->sd, buf, sizeof(buf) -1, 0)) > 0)
buf[size] = 0;
if (size <= 0 || shareMng->GetAcceptableFileInfo(conInfo, buf, &fileInfo) == FALSE)
{
connectList.DelObj(conInfo);
::closesocket(conInfo->sd);
delete conInfo;
return FALSE;
}
}
SendFileObj *obj = new SendFileObj;
memset(obj, 0, sizeof(SendFileObj));
obj->conInfo = conInfo;
obj->hFile = INVALID_HANDLE_VALUE;
obj->fileInfo = fileInfo.fileInfo;
obj->offset = fileInfo.offset;
obj->packetNo = fileInfo.packetNo;
obj->host = fileInfo.host;
obj->command = GET_MODE(fileInfo.command);
obj->conInfo->startTick = obj->conInfo->lastTick = ::GetTickCount();
obj->attachTime = fileInfo.attachTime;
connectList.DelObj(conInfo);
sendFileList.AddObj(obj);
if (GetFileInfomation(obj->fileInfo->Fname(), &obj->fdata) == FALSE)
return EndSendFile(obj), FALSE;
obj->isDir = (obj->fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? TRUE : FALSE;
obj->status = obj->isDir || obj->command == IPMSG_GETDIRFILES ? FS_DIRFILESTART : FS_TRANSFILE;
if (*obj->fdata.cFileName == 0)
ForcePathToFname(obj->fileInfo->Fname(), obj->fdata.cFileName);
BOOL ret;
if (obj->isDir)
{
ret = obj->command == IPMSG_GETDIRFILES ? TRUE : FALSE;
obj->hDir = (HANDLE *)malloc((MAX_PATH/2) * sizeof(HANDLE));
}
else {
if ((cfg->fileTransOpt & FT_STRICTDATE) && *(_int64 *)&obj->fdata.ftLastWriteTime > *(_int64 *)&obj->attachTime)
ret = FALSE, obj->status = FS_COMPLETE; // 嫟桳忣曬偐傜徚嫀
else if (obj->command == IPMSG_GETDIRFILES)
ret = TRUE;
else
ret = OpenSendFile(obj->fileInfo->Fname(), obj);
}
if (ret == FALSE)
return EndSendFile(obj), FALSE;
DWORD id; // 巊傢偢乮95宯偱 error 偵側傞偺傪杊偖偩偗乯
obj->hThread = (HANDLE)~0; // 旝柇側椞堟傪旔偗傞
// thread 撪偱偼 MT 懳墳偑昁梫側 crt 偼巊傢偢
if ((obj->hThread = ::CreateThread(NULL, 0, SendFileThread, obj, 0, &id)) == NULL)
return EndSendFile(obj), FALSE;
return TRUE;
}
BOOL TMainWin::OpenSendFile(const char *fname, SendFileObj *obj)
{
DWORD lowSize, highSize, viewSize;
if ((obj->hFile = ::CreateFile(fname, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE)
{
lowSize = ::GetFileSize(obj->hFile, &highSize);
if ((obj->fileSize = (_int64)highSize << 32 | lowSize) == 0)
return TRUE;
obj->hMap = ::CreateFileMapping(obj->hFile, 0, PAGE_READONLY, highSize, lowSize, 0);
viewSize = (int)(obj->fileSize > cfg->ViewMax ? cfg->ViewMax : obj->fileSize);
highSize = (int)(obj->offset >> 32);
lowSize = (int)((obj->offset / cfg->ViewMax) * cfg->ViewMax);
obj->mapAddr = (char *)::MapViewOfFile(obj->hMap, FILE_MAP_READ, highSize, lowSize, viewSize);
if (obj->mapAddr && IsBadReadPtr(obj->mapAddr, 1))
{
CloseSendFile(obj);
return FALSE;
}
}
return obj->mapAddr ? TRUE : FALSE;
}
BOOL TMainWin::CloseSendFile(SendFileObj *obj)
{
if (obj == NULL)
return FALSE;
::UnmapViewOfFile(obj->mapAddr);obj->mapAddr= NULL;
::CloseHandle(obj->hMap); obj->hMap = NULL;
::CloseHandle(obj->hFile); obj->hFile = INVALID_HANDLE_VALUE;
obj->offset = 0;
return TRUE;
}
DWORD WINAPI TMainWin::SendFileThread(void *_sendFileObj)
{
SendFileObj *obj = (SendFileObj *)_sendFileObj;
fd_set fds;
fd_set *rfds = NULL, *wfds = &fds;
timeval tv;
int sock_ret;
BOOL ret = FALSE, completeWait = FALSE;
BOOL (TMainWin::*SendFileFunc)(SendFileObj *obj) =
obj->command == IPMSG_GETDIRFILES ? TMainWin::SendDirFile : TMainWin::SendFile;
FD_ZERO(&fds);
FD_SET(obj->conInfo->sd, &fds);
for (int waitCnt=0; waitCnt < 180 && obj->hThread != NULL; waitCnt++)
{
tv.tv_sec = 1, tv.tv_usec = 0;
if ((sock_ret = ::select(obj->conInfo->sd + 1, rfds, wfds, NULL, &tv)) > 0)
{
waitCnt = 0;
if (completeWait)
{ // dummy read 偵傛傝丄憡庤懁偺 socket 僋儘乕僘偵傛傞 EOF 傪専弌
if (::recv(obj->conInfo->sd, (char *)&ret, sizeof(ret), 0) >= 0)
ret = TRUE;
break;
}
else if ((mainWin->*SendFileFunc)(obj) != TRUE)
break;
else if (obj->status == FS_COMPLETE)
{
completeWait = TRUE, rfds = &fds, wfds = NULL;
// 夁嫀兝7埲慜偺屳姺惈偺偨傔
if (obj->fileSize == 0) { ret = TRUE; break; }
}
}
else if (sock_ret == 0) {
FD_ZERO(&fds);
FD_SET(obj->conInfo->sd, &fds);
}
else if (sock_ret == SOCKET_ERROR) {
break;
}
}
if (obj->isDir)
{
mainWin->CloseSendFile(obj);
while (--obj->dirCnt >= 0)
::FindClose(obj->hDir[obj->dirCnt]);
}
obj->status = ret ? FS_COMPLETE : FS_ERROR;
mainWin->PostMessage(WM_TCPEVENT, obj->conInfo->sd, FD_CLOSE);
::ExitThread(0);
return 0;
}
int MakeDirHeader(SendFileObj *obj, BOOL find)
{
int len;
WIN32_FIND_DATA *dat = &obj->fdata;
DWORD attr = dat->dwFileAttributes, ipmsg_attr;
ipmsg_attr = (find == FALSE ? IPMSG_FILE_RETPARENT : (attr & FILE_ATTRIBUTE_DIRECTORY)
? IPMSG_FILE_DIR : IPMSG_FILE_REGULAR) |
(attr & FILE_ATTRIBUTE_READONLY ? IPMSG_FILE_RONLYOPT : 0) |
(attr & FILE_ATTRIBUTE_HIDDEN ? IPMSG_FILE_HIDDENOPT : 0) |
(attr & FILE_ATTRIBUTE_SYSTEM ? IPMSG_FILE_SYSTEMOPT : 0);
if (find)
len = wsprintf(obj->header, "0000:%s:%x%08x:%x:%x=%x:%x=%x:", dat->cFileName,
dat->nFileSizeHigh, dat->nFileSizeLow, ipmsg_attr,
IPMSG_FILE_MTIME, FileTime2UnixTime(&dat->ftLastWriteTime),
IPMSG_FILE_CREATETIME, FileTime2UnixTime(&dat->ftCreationTime));
else if (*(_int64 *)&dat->ftLastWriteTime)
len = wsprintf(obj->header, "0000:.:0:%x:%x=%x:%x=%x:", ipmsg_attr,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -