?? mainwin.cpp
字號:
/*
晄嵼捠抦 Information 梫媮 Packet庴怣張棟
*/
void TMainWin::MsgGetAbsenceInfo(MsgBuf *msg)
{
msgMng->Send(&msg->hostSub, IPMSG_SENDABSENCEINFO, cfg->AbsenceCheck ? cfg->AbsenceStr[cfg->AbsenceChoice] : NOTABSENCE_MSGSTR);
}
/*
晄嵼捠抦 Information 捠抦 Packet庴怣張棟
*/
void TMainWin::MsgSendAbsenceInfo(MsgBuf *msg)
{
MsgInfoSub(msg);
}
/*
揧晅僼傽僀儖攋婞捠抦 Packet庴怣張棟
*/
void TMainWin::MsgReleaseFiles(MsgBuf *msg)
{
int packet_no = atoi(msg->msgBuf);
shareMng->EndHostShare(packet_no, &msg->hostSub);
}
/*
憲怣Dialog惗惉丅偨偩偟丄摨堦偺寎寕憲怣Dialog偑奐偄偰偄傞応崌偼丄
偦偺Dialog傪 Active偵偡傞偺傒丅
*/
BOOL TMainWin::SendDlgOpen(HWND hRecvWnd, MsgBuf *msg)
{
TSendDlg *sendDlg;
if (hRecvWnd)
{
for (sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
if (sendDlg->GetRecvWnd() == hRecvWnd && sendDlg->IsSending() != TRUE)
return ActiveDlg(sendDlg), TRUE;
}
if ((sendDlg = new TSendDlg(msgMng, shareMng, &hosts, cfg, logmng, hRecvWnd, msg)) == NULL)
return FALSE;
sendList.AddObj(sendDlg);
sendDlg->Create(), sendDlg->Show();
ControlIME(sendDlg, TRUE);
// test
if (hosts.HostCnt() == 0 && cfg->ListGet == FALSE)
BroadcastEntrySub(inet_addr("127.0.0.1"), htons(portNo), IPMSG_BR_ENTRY);
return TRUE;
}
/*
憲怣Dialog Hide捠抦(WM_SENDDLG_HIDE)張棟丅
揱偊偰偒偨憲怣Dialog偵懳墳偡傞丄庴怣Dialog傪攋婞
*/
void TMainWin::SendDlgHide(TSendDlg *sendDlg)
{
ControlIME(sendDlg, FALSE);
if (sendDlg->GetRecvWnd() && cfg->NoErase == FALSE)
{
TRecvDlg *recvDlg;
for (recvDlg = (TRecvDlg *)recvList.TopObj(); recvDlg != NULL; recvDlg = (TRecvDlg *)recvList.NextObj(recvDlg))
{
if (recvDlg->hWnd == sendDlg->GetRecvWnd() && recvDlg->IsClosable())
{
recvDlg->EvCommand(0, IDCANCEL, 0);
break;
}
}
}
}
/*
憲怣Dialog Exit捠抦(WM_SENDDLG_EXIT)張棟丅
揱偊偰偒偨憲怣Dialog 偍傛傃懳墳偡傞庴怣Dialog偺攋婞
*/
void TMainWin::SendDlgExit(TSendDlg *sendDlg)
{
if (sendDlg->IsSending() == FALSE) // 憲怣拞偺応崌偼 HIDE 偱幚峴嵪傒
ControlIME(sendDlg, FALSE);
sendList.DelObj(sendDlg);
delete sendDlg;
}
/*
庴怣Dialog傪惗惉
*/
BOOL TMainWin::RecvDlgOpen(MsgBuf *msg)
{
TRecvDlg *recvDlg;
if ((recvDlg = new TRecvDlg(msgMng, msg, &hosts, cfg, logmng)) == NULL)
return FALSE;
if (recvDlg->Status() == FALSE) // 埫崋暥偺暅崋偵幐攕偟偨
{
delete recvDlg;
return FALSE;
}
recvList.AddObj(recvDlg);
if (cfg->NoBeep == FALSE)
{
char *soundFile = cfg->SoundFile;
#if 0
Host *host = hosts.GetHostByAddr(&msg->hostSub);
if (host)
{
int priorityLevel = (host->priority - DEFAULT_PRIORITY) / PRIORITY_OFFSET;
if (priorityLevel >= 0 && priorityLevel < cfg->PriorityMax)
{
if (cfg->PrioritySound[priorityLevel])
soundFile = cfg->PrioritySound[priorityLevel];
}
}
#endif
if (*soundFile == '\0' || PlaySound(soundFile, 0, SND_FILENAME|SND_ASYNC) != TRUE)
if (MessageBeep(MB_OK) != TRUE)
MessageBeep((UINT)~0);
}
if (cfg->NoPopupCheck || (cfg->AbsenceNonPopup && cfg->AbsenceCheck))
{
if (reverseTimerStatus == 0)
{
ReverseIcon(TRUE);
if (::SetTimer(hWnd, IPMSG_REVERSEICON, IPMSG_TIMERINTERVAL, NULL))
reverseTimerStatus = IPMSG_REVERSEICON;
}
}
else {
recvDlg->Create();
recvDlg->Show();
recvDlg->SetForceForegroundWindow();
}
return TRUE;
}
/*
庴怣Dialog傪攋婞
*/
void TMainWin::RecvDlgExit(TRecvDlg *recvDlg)
{
recvList.DelObj(recvDlg);
delete recvDlg;
}
/*
妋擣Dialog傪攋婞
*/
void TMainWin::MsgDlgExit(TMsgDlg *msgDlg)
{
msgList.DelObj(msgDlg);
delete msgDlg;
}
/*
Setup/About/Absence Dialog傪惗惉
*/
void TMainWin::MiscDlgOpen(TDlg *dlg)
{
if (dlg->hWnd == NULL)
dlg->Create(), dlg->Show();
else
ActiveDlg(dlg);
}
/*
TaskTray偵巜掕icon傪搊榐
*/
BOOL TMainWin::TaskBar(int nimMode, HICON hSetIcon, LPCSTR tip)
{
NOTIFYICONDATA tn;
memset(&tn, 0, sizeof(tn));
tn.cbSize = sizeof(tn);
tn.hWnd = hWnd;
tn.uID = IPMSG_DEFAULT_PORT; // test
tn.uFlags = NIF_MESSAGE|(hSetIcon ? NIF_ICON : 0)|(tip ? NIF_TIP : 0);
tn.uCallbackMessage = WM_IPMSG_NOTIFY;
tn.hIcon = hSetIcon;
if (tip)
strcpy(tn.szTip, tip);
return ::Shell_NotifyIcon(nimMode, &tn);
}
/*
MainWindow or TaskTray Icon 傪 click偟偨帪偺 Popup Menu惗惉
*/
void TMainWin::Popup(UINT resId)
{
HMENU hMenu = ::LoadMenu(TApp::hI, (LPCSTR)resId);
HMENU hSubMenu = ::GetSubMenu(hMenu, 0); //偐側傜偢丄嵟弶偺崁栚偵掕媊
DWORD val = ::GetMessagePos();
POINTS pos = MAKEPOINTS(val);
if (hMenu == NULL || hSubMenu == NULL)
return;
ShareCntInfo info;
shareMng->GetShareCntInfo(&info);
char buf[MAX_LISTBUF] = DOWNLOAD_MSGSTR;
if (info.packetCnt)
wsprintf(buf + strlen(buf), "(%d/%d)", info.fileCnt, info.transferCnt);
::InsertMenu(hSubMenu, 0, MF_BYPOSITION|MF_SEPARATOR, NULL, NULL);
::InsertMenu(hSubMenu, 0, MF_BYPOSITION|MF_STRING, MENU_SHARE, buf);
AddAbsenceMenu(hSubMenu, 2);
SetForegroundWindow(); //偲偭偰傕戝帠両
::TrackPopupMenu(hSubMenu, TPM_RIGHTBUTTON, pos.x, pos.y, 0, hWnd, NULL);
::DestroyMenu(hMenu);
}
/*
NonPopup忬懺偵側偭偰偄偨庴怣Dialog偑偁傟偽丄弌尰偝偣傞
*/
BOOL TMainWin::PopupCheck(void)
{
BOOL result = FALSE;
TRecvDlg *recvDlg;
for (recvDlg = (TRecvDlg *)recvList.TopObj(); recvDlg != NULL; recvDlg = (TRecvDlg *)recvList.NextObj(recvDlg))
{
if (recvDlg->hWnd == 0)
{
recvDlg->Create(), recvDlg->Show();
result = TRUE;
}
}
if (result)
{
::KillTimer(hWnd, IPMSG_REVERSEICON);
reverseTimerStatus = 0;
SetIcon(cfg->AbsenceCheck == FALSE ? hMainIcon : hRevIcon);
}
return result;
}
/*
慡Window傪慜柺偵傕偭偰偔傞丅hide == TRUE偺応崌丄慡Window傪 hide偵
*/
void TMainWin::ActiveChildWindow(BOOL active)
{
ActiveDlg(aboutDlg, active);
ActiveDlg(setupDlg, active);
ActiveDlg(absenceDlg, active);
ActiveDlg(shareStatDlg, active);
ActiveListDlg(&recvList, active);
ActiveListDlg(&sendList, active);
ActiveListDlg(&msgList, active);
if (active == FALSE)
SetForegroundWindow();
}
/*
HostData偺copy
*/
inline void TMainWin::SetHostData(Host *destHost, HostSub *hostSub, ULONG command, time_t update_time, char *nickName, char *groupName, int priority)
{
destHost->hostStatus = GET_OPT(command);
destHost->hostSub = *hostSub;
destHost->updateTime = update_time;
destHost->priority = priority;
strncpyz(destHost->nickName, nickName, sizeof(destHost->nickName));
strncpyz(destHost->groupName, groupName, sizeof(destHost->groupName));
}
/*
Host捛壛張棟
*/
void TMainWin::AddHost(HostSub *hostSub, ULONG command, char *nickName, char *groupName)
{
Host *host, *tmp_host, *priorityHost;
time_t now_time = Time();
int priority = DEFAULT_PRIORITY;
if (GET_MODE(command) == IPMSG_BR_ENTRY && (command & IPMSG_DIALUPOPT) && !IsSameHost(hostSub, msgMng->GetLocalHost()))
{
for (AddrObj *obj = (AddrObj *)cfg->DialUpList.TopObj(); obj != NULL; obj = (AddrObj *)cfg->DialUpList.NextObj(obj))
if (obj->addr == hostSub->addr && obj->portNo == hostSub->portNo)
break;
if (obj == NULL)
{
obj = new AddrObj;
obj->addr = hostSub->addr;
obj->portNo = hostSub->portNo;
cfg->DialUpList.AddObj(obj);
}
}
if ((priorityHost = cfg->priorityHosts.GetHostByName(hostSub)) != NULL)
{
priority = priorityHost->priority;
// command |= priorityHost->hostStatus & IPMSG_ENCRYPTOPT;
}
if ((host = hosts.GetHostByName(hostSub)) != NULL)
{
if (host->hostSub.addr != hostSub->addr || host->hostSub.portNo != hostSub->portNo)
{
if ((tmp_host = hosts.GetHostByAddr(hostSub)) != NULL)
{
for (TSendDlg *sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
sendDlg->DelHost(tmp_host);
hosts.DelHost(tmp_host);
if (tmp_host->RefCnt() == 0)
delete tmp_host;
}
hosts.DelHost(host);
host->hostSub.addr = hostSub->addr;
host->hostSub.portNo = hostSub->portNo;
hosts.AddHost(host);
}
if (((command ^ host->hostStatus) & (IPMSG_ABSENCEOPT|IPMSG_FILEATTACHOPT|IPMSG_ENCRYPTOPT)) || strcmp(host->nickName, nickName) || strcmp(host->groupName, groupName))
{
SetHostData(host, hostSub, command, now_time, nickName, groupName, priority);
for (TSendDlg *sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
sendDlg->ModifyHost(host);
}
else {
host->hostStatus = GET_OPT(command);
host->updateTime = now_time;
}
return;
}
if ((host = hosts.GetHostByAddr(hostSub)) != NULL)
{
for (TSendDlg *sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
sendDlg->DelHost(host);
hosts.DelHost(host);
if (host->RefCnt() == 0)
delete host;
}
if ((host = priorityHost) == NULL)
host = new Host;
SetHostData(host, hostSub, command, now_time, nickName, groupName, priority);
hosts.AddHost(host);
// if (priorityHost == NULL)
// cfg->priorityHosts.AddHost(host);
SetCaption();
for (TSendDlg *sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
sendDlg->AddHost(host);
}
/*
慡Host偺嶍彍張棟
*/
void TMainWin::DelAllHost(void)
{
for (TSendDlg *sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
sendDlg->DelAllHost();
while (hosts.HostCnt() > 0)
DelHostSub(hosts.GetHost(0));
}
/*
摿掕Host偺嶍彍張棟
*/
void TMainWin::DelHost(HostSub *hostSub)
{
Host *host;
if ((host = hosts.GetHostByAddr(hostSub)) != NULL)
DelHostSub(host);
}
/*
摿掕Host偺嶍彍張棟Sub
*/
void TMainWin::DelHostSub(Host *host)
{
for (TSendDlg *sendDlg = (TSendDlg *)sendList.TopObj(); sendDlg != NULL; sendDlg = (TSendDlg *)sendList.NextObj(sendDlg))
sendDlg->DelHost(host);
for (AddrObj *obj = (AddrObj *)cfg->DialUpList.TopObj(); obj != NULL; obj = (AddrObj *)cfg->DialUpList.NextObj(obj))
{
if (obj->addr == host->hostSub.addr && obj->portNo == host->hostSub.portNo)
{
cfg->DialUpList.DelObj(obj);
delete obj;
break;
}
}
hosts.DelHost(host);
if (host->RefCnt() == 0)
delete host;
else if (host->pubKey.Key())
host->pubKey.UnSet();
SetCaption();
}
/*
峏怴Button梡張棟丅強桳HostList偺嶍彍丄偍傛傃嵞Entry Packet憲弌丅
側偍丄unRemoveFlg == TRUE偺応崌偼丄嶍彍張棟傪峴傢側偄
*/
void TMainWin::RefreshHost(BOOL unRemoveFlg)
{
time_t now_time = Time();
if (cfg->ListGet && entryTimerStatus != 0 || refreshStartTime + IPMSG_ENTRYMINSEC >= now_time)
return;
if (unRemoveFlg != TRUE)
{
if (cfg->UpdateTime == 0 || refreshStartTime + cfg->UpdateTime < now_time) {
DelAllHost();
}
else {
for (int cnt=0; cnt < hosts.HostCnt(); )
{
if (hosts.GetHost(cnt)->updateTime + cfg->UpdateTime < now_time)
DelHostSub(hosts.GetHost(cnt));
else
cnt++;
}
}
}
refreshStartTime = now_time;
EntryHost();
}
/*
Main Window or TaskTray梡 Caption偺愝掕
*/
void TMainWin::SetCaption(void)
{
char buf[MAX_LISTBUF];
wsprintf(buf, "IPMsg(%d)", hosts.HostCnt());
if (IsNewShell())
TaskBar(NIM_MODIFY, NULL, buf);
else
::SetWindowText(hWnd, buf);
}
/*
IPMSG_ENTRY/IPMSG_EXIT/IPMSG_ABSENCE僷働僢僩憲弌
*/
void TMainWin::BroadcastEntry(ULONG mode)
{
for (TBroadcastObj *brobj=cfg->broadcastList.Top(); brobj; brobj=cfg->broadcastList.Next(brobj))
BroadcastEntrySub(brobj->Addr(cfg->ResolveOpt & RS_REALTIME), htons(portNo), IPMSG_NOOPERATION);
BroadcastEntrySub((ULONG)~0, htons(portNo), IPMSG_NOOPERATION);
this->Sleep(cfg->DelayTime);
UINT host_status = mode | HostStatus();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -