static char *mainwin_id =
"@(#)Copyright (C) H.Shirouzu 1996-2004 mainwin.cpp Ver2.06";
/* ========================================================================
Project Name : IP Messenger for Win32
Module Name : Main Window
Create : 1996-06-01(Sat)
Update : 2004-09-08(Wed)
Copyright : H.Shirouzu
Reference :
======================================================================== */
#include "tlib.h"
#include "resource.h"
#include "ipmsg.h"
#include "msgstr.h"
#include "blowfish.h"
HICON TMainWin::hMainIcon = NULL;
HICON TMainWin::hRevIcon = NULL;
TMainWin *TMainWin::mainWin = NULL;
static HWND hMainWnd = NULL;
/*
MainWindow の初期化
*/
TMainWin::TMainWin(ULONG nicAddr, int _portNo, TWin *_parent) : TWin(_parent)
{
hosts.Enable(THosts::NAME, TRUE);
hosts.Enable(THosts::ADDR, TRUE);
cfg = new Cfg(nicAddr, portNo = _portNo);
if ((msgMng = new MsgMng(nicAddr, portNo, cfg))->GetStatus() == FALSE)
{
::ExitProcess(0xffffffff);
return;
}
cfg->ReadRegistry();
setupDlg = new TSetupDlg(cfg, &hosts);
aboutDlg = new TAboutDlg();
absenceDlg = new TAbsenceDlg(cfg, this);
logmng = new LogMng(cfg);
ansList = new TRecycleList(MAX_ANSLIST, sizeof(AddrObj));
shareMng = new ShareMng(cfg);
shareStatDlg = new TShareStatDlg(shareMng, cfg);
refreshStartTime = 0;
entryStartTime = IPMSG_GETLIST_FINISH;
memset(packetLog, 0, sizeof(packetLog));
packetLogCnt = 0;
entryTimerStatus = 0;
reverseTimerStatus = 0;
ansTimerID = 0;
terminateFlg = FALSE;
activeToggle = TRUE;
InitIcon();
hAccel = ::LoadAccelerators(TApp::hI, (LPCSTR)IPMSG_ACCEL);
}
/*
MainWindow 終了
*/
TMainWin::~TMainWin()
{
#if 0 // 無駄
delete msgMng;
delete cfg;
delete ansList;
#endif
}
/*
子Window および socketの終了と所有Memoryの開放
*/
void TMainWin::Terminate(void)
{
if (terminateFlg)
return;
terminateFlg = TRUE;
if (msgMng->GetStatus() != TRUE)
return;
ExitHost();
DeleteListDlg(&sendList);
DeleteListDlg(&recvList);
DeleteListDlg(&msgList);
delete aboutDlg;
delete shareStatDlg;
delete absenceDlg;
delete setupDlg;
if (IsNewShell())
TaskBar(NIM_DELETE);
time_t now_time = Time();
for (int cnt=0; cnt < hosts.HostCnt(); cnt++)
hosts.GetHost(cnt)->updateTime = now_time;
cfg->WriteRegistry(CFG_HOSTINFO|CFG_DELCHLDHOST);
msgMng->CloseSocket();
if (cfg->hPrivKey)
pCryptDestroyKey(cfg->hPrivKey);
if (cfg->hSmallPrivKey)
pCryptDestroyKey(cfg->hSmallPrivKey);
#if 0 // 無駄
delete logmng;
Host *host;
while (hosts.HostCnt() > 0)
{
hosts.DelHost(host = hosts.GetHost(0));
// delete host;
}
AddrObj *brObj;
while ((brObj = (AddrObj *)cfg->DialUpList.TopObj()) != NULL)
{
cfg->DialUpList.DelObj(brObj);
delete brObj;
}
#endif
}
/*
MainWindow 生成時の CallBack
New Shell なら、TaskTray に icon登録、そうでないなら icon化
Packet 受信開始、Entry Packetの送出
*/
BOOL TMainWin::EvCreate(LPARAM lParam)
{
hMainWnd = hWnd;
mainWin = this;
if (msgMng->GetStatus() != TRUE)
return TRUE;
if (IsNewShell())
{
Show(SW_HIDE);
while (TaskBar(NIM_ADD, hMainIcon, IPMSG_MSGSTR) != TRUE)
Sleep(1000); // for logon script
}
else
Show(SW_MINIMIZE);
TaskBarCreateMsg= ::RegisterWindowMessage("TaskbarCreated");
SetIcon(cfg->AbsenceCheck == FALSE ? hMainIcon : hRevIcon);
SetCaption();
if (SetupCryptAPI() == FALSE)
MessageBox("CryptoAPI can't be used. Setup New version IE");
msgMng->AsyncSelectRegist(hWnd);
SetHotKey(cfg);
if (msgMng->GetStatus())
EntryHost();
return TRUE;
}
/*
Task Managerなどからの終了要求
*/
BOOL TMainWin::EvClose(void)
{
Terminate();
::PostQuitMessage(0);
return TRUE;
}
/*
Timer Callback
NonPopup受信時の icon反転
ListGet Modeにおける、HostList要求/受信処理
*/
BOOL TMainWin::EvTimer(WPARAM timerID, TIMERPROC proc)
{
if (terminateFlg)
{
::KillTimer(hWnd, timerID);
return TRUE;
}
switch (timerID)
{
case IPMSG_REVERSEICON:
ReverseIcon(FALSE);
return TRUE;
case IPMSG_LISTGET_TIMER:
::KillTimer(hWnd, IPMSG_LISTGET_TIMER);
entryTimerStatus = 0;
if (entryStartTime != IPMSG_GETLIST_FINISH)
{
entryStartTime = Time();
if (::SetTimer(hWnd, IPMSG_LISTGETRETRY_TIMER, cfg->ListGetMSec, NULL))
entryTimerStatus = IPMSG_LISTGETRETRY_TIMER;
BroadcastEntry(IPMSG_BR_ISGETLIST2 | IPMSG_RETRYOPT);
}
return TRUE;
case IPMSG_LISTGETRETRY_TIMER:
::KillTimer(hWnd, IPMSG_LISTGETRETRY_TIMER);
entryTimerStatus = 0;
if (entryStartTime != IPMSG_GETLIST_FINISH)
{
entryStartTime = IPMSG_GETLIST_FINISH;
if (cfg->ListGet)
BroadcastEntry(IPMSG_BR_ENTRY);
}
return TRUE;
case IPMSG_ANS_TIMER:
::KillTimer(hWnd, IPMSG_ANS_TIMER);
ansTimerID = 0;
ExecuteAnsQueue();
return TRUE;
case IPMSG_ENTRY_TIMER:
::KillTimer(hWnd, IPMSG_ENTRY_TIMER);
for (TBroadcastObj *brobj=cfg->broadcastList.Top(); brobj; brobj=cfg->broadcastList.Next(brobj))
BroadcastEntrySub(brobj->Addr(), htons(portNo), IPMSG_BR_ENTRY);
for (AddrObj *obj = (AddrObj *)cfg->DialUpList.TopObj(); obj != NULL; obj = (AddrObj *)cfg->DialUpList.NextObj(obj))
BroadcastEntrySub(obj->addr, obj->portNo, IPMSG_BR_ENTRY);
return TRUE;
}
return FALSE;
}
/*
WM_COMMAND CallBack
*/
BOOL TMainWin::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
switch (wID)
{
case MENU_SETUP:
MiscDlgOpen(setupDlg);
return TRUE;
case MENU_LOGOPEN:
LogOpen();
return TRUE;
case MENU_ABOUT:
MiscDlgOpen(aboutDlg);
return TRUE;
case MENU_SHARE:
MiscDlgOpen(shareStatDlg);
return TRUE;
case MENU_ACTIVEWIN:
ActiveChildWindow(activeToggle = TRUE);
return TRUE;
case MENU_ABSENCE:
cfg->AbsenceCheck = !cfg->AbsenceCheck;
BroadcastEntry(IPMSG_BR_ABSENCE);
SetIcon(cfg->AbsenceCheck == FALSE ? hMainIcon : hRevIcon);
return TRUE;
case MENU_ABSENCEEX:
MiscDlgOpen(absenceDlg);
return TRUE;
case HIDE_ACCEL:
PostMessage(WM_HIDE_CHILDWIN, 0, 0);
return TRUE;
case MISC_ACCEL:
case MENU_DELMISCDLG:
DeleteListDlg(&msgList);
return TRUE;
case MENU_EXIT:
case IDCANCEL:
Terminate();
::PostQuitMessage(0);
return TRUE;
default:
if (wID >= (UINT)MENU_ABSENCE_START && wID < (UINT)MENU_ABSENCE_START + cfg->AbsenceMax)
{
cfg->AbsenceChoice = wID - MENU_ABSENCE_START;
cfg->AbsenceCheck = FALSE;
EvCommand(0, MENU_ABSENCE, 0);
return TRUE;
}
}
return FALSE;
}
/*
System Menu Callback
*/
BOOL TMainWin::EvSysCommand(WPARAM uCmdType, POINTS pos)
{
switch (uCmdType)
{
case SC_RESTORE: case SC_MAXIMIZE:
if (!IsNewShell())
SendDlgOpen();
return TRUE;
case MENU_SETUP:
case MENU_LOGOPEN:
case MENU_ABOUT:
case MENU_SHARE:
case MENU_ACTIVEWIN:
case MENU_DELMISCDLG:
case MENU_ABSENCE:
case MENU_ABSENCEEX:
case MENU_EXIT:
return EvCommand(0, uCmdType, 0);
default:
if (uCmdType >= MENU_ABSENCE_START && (int)uCmdType < MENU_ABSENCE_START + cfg->AbsenceMax)
return EvCommand(0, uCmdType, 0);
break;
}
return FALSE;
}
/*
Logout時などの終了通知 CallBack
*/
BOOL TMainWin::EvEndSession(BOOL nSession, BOOL nLogOut)
{
if (nSession)
Terminate();
return TRUE;
}
/*
iconを通常Windowに戻してよいかどうかの問い合わせ CallBack
*/
BOOL TMainWin::EvQueryOpen(void)
{
if (!IsNewShell())
SendDlgOpen();
return TRUE;
}
BOOL TMainWin::EvHotKey(int hotKey)
{
switch (hotKey)
{
case WM_SENDDLG_OPEN:
case WM_DELMISCDLG:
case WM_RECVDLG_OPEN:
return PostMessage(hotKey, 0, 0), TRUE;
}
return FALSE;
}
/*
MouseButton Event CallBack
*/
BOOL TMainWin::EventButton(UINT uMsg, int nHitTest, POINTS pos)
{
switch (uMsg)
{
// case WM_RBUTTONDOWN:
// case WM_NCRBUTTONDOWN:
case WM_RBUTTONUP:
case WM_NCRBUTTONUP:
Popup(MAIN_MENU);
return TRUE