200 lines
4.6 KiB
C++
200 lines
4.6 KiB
C++
|
#include "pch.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
BOOL fTrayIconShowing;
|
||
|
TCHAR downloadFormatString[64];
|
||
|
TCHAR pauseString[64];
|
||
|
|
||
|
|
||
|
BOOL MyShell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid)
|
||
|
{
|
||
|
|
||
|
// DEBUGMSG("MyShell_NotifyIcon() called with msg %d", dwMessage);
|
||
|
BOOL fRet;
|
||
|
|
||
|
if (NIM_SETVERSION == dwMessage)
|
||
|
{
|
||
|
return Shell_NotifyIcon(dwMessage, pnid);
|
||
|
}
|
||
|
UINT uRetry = 0;
|
||
|
//retry 3 times due to the way Shell_NotifyIcon is implemented
|
||
|
while ( !(fRet = Shell_NotifyIcon(dwMessage, pnid)) && uRetry++ < 3)
|
||
|
{
|
||
|
if (WAIT_TIMEOUT != MsgWaitForMultipleObjectsEx(0,NULL, 2000, QS_POSTMESSAGE, MWMO_INPUTAVAILABLE))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
void InitTrayIcon()
|
||
|
{
|
||
|
fTrayIconShowing = FALSE;
|
||
|
|
||
|
TCHAR PauseMenuString[30];
|
||
|
TCHAR ResumeMenuString[30];
|
||
|
|
||
|
LoadString(ghInstance, IDS_PAUSEMENUITEM, PauseMenuString, ARRAYSIZE(PauseMenuString));
|
||
|
LoadString(ghInstance, IDS_RESUMEMENUITEM, ResumeMenuString, ARRAYSIZE(ResumeMenuString));
|
||
|
|
||
|
ghPauseMenu = CreatePopupMenu();
|
||
|
AppendMenu(ghPauseMenu, MF_STRING, IDC_PAUSE, PauseMenuString);
|
||
|
ghResumeMenu = CreatePopupMenu();
|
||
|
AppendMenu(ghResumeMenu, MF_STRING, IDC_RESUME, ResumeMenuString);
|
||
|
|
||
|
LoadString(ghInstance, IDS_DOWNLOADINGFORMAT, downloadFormatString, ARRAYSIZE(downloadFormatString));
|
||
|
LoadString(ghInstance, IDS_SUSPENDEDFORMAT, pauseString, ARRAYSIZE(pauseString));
|
||
|
}
|
||
|
|
||
|
void UninitPopupMenus()
|
||
|
{
|
||
|
if (NULL != ghPauseMenu)
|
||
|
{
|
||
|
DestroyMenu(ghPauseMenu);
|
||
|
}
|
||
|
if (NULL != ghResumeMenu)
|
||
|
{
|
||
|
DestroyMenu(ghResumeMenu);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL ShowTrayIcon()
|
||
|
{
|
||
|
DEBUGMSG("ShowTrayIcon() called");
|
||
|
|
||
|
if ( fTrayIconShowing)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
NOTIFYICONDATA nid;
|
||
|
memset(&nid, 0, sizeof(nid));
|
||
|
nid.cbSize = sizeof(nid);
|
||
|
nid.hWnd = ghMainWindow;
|
||
|
nid.uID = (UINT) IDI_AUICON;
|
||
|
nid.uFlags = NIF_ICON | NIF_MESSAGE;
|
||
|
nid.uCallbackMessage = AUMSG_TRAYCALLBACK;
|
||
|
nid.hIcon = ghTrayIcon;
|
||
|
BOOL fRet = MyShell_NotifyIcon(NIM_ADD, &nid);
|
||
|
|
||
|
if(!fRet)
|
||
|
{
|
||
|
// If for any reason, we are not able to use the tray icon, something is wrong
|
||
|
// ask WUAUSERV wait for sometime before relaunch WUAUCLT.
|
||
|
DEBUGMSG("WUAUCLT quit because fail to add tray icon");
|
||
|
SetClientExitCode(CDWWUAUCLT_RELAUNCHLATER);
|
||
|
QUITAUClient();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fTrayIconShowing = TRUE;
|
||
|
}
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
void ShowTrayBalloon(WORD title, WORD caption, WORD tip )
|
||
|
{
|
||
|
DEBUGMSG("ShowTrayBalloon() called");
|
||
|
|
||
|
static NOTIFYICONDATA nid;
|
||
|
|
||
|
memset(&nid, 0, sizeof(nid));
|
||
|
nid.uTimeout = 15000;
|
||
|
|
||
|
LoadString(ghInstance, title, nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle));
|
||
|
LoadString(ghInstance, caption, nid.szInfo, ARRAYSIZE(nid.szInfo));
|
||
|
LoadString(ghInstance, tip, nid.szTip, ARRAYSIZE(nid.szTip));
|
||
|
nid.uFlags = NIF_INFO | NIF_TIP;
|
||
|
nid.cbSize = sizeof(nid);
|
||
|
nid.hWnd = ghMainWindow;
|
||
|
nid.uID = (UINT) IDI_AUICON;
|
||
|
nid.dwInfoFlags = NIIF_INFO;
|
||
|
|
||
|
BOOL fRet = MyShell_NotifyIcon(NIM_MODIFY, &nid);
|
||
|
if (!fRet)
|
||
|
{
|
||
|
DEBUGMSG("WUAUCLT Creation of tray balloon failed");
|
||
|
}
|
||
|
|
||
|
#ifdef DBG
|
||
|
DebugCheckForAutoPilot(ghMainWindow);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
void AddTrayToolTip(WORD tip)
|
||
|
{
|
||
|
static NOTIFYICONDATA nid;
|
||
|
|
||
|
memset(&nid, 0, sizeof(nid));
|
||
|
LoadString(ghInstance, tip, nid.szTip, ARRAYSIZE(nid.szTip));
|
||
|
nid.uFlags = NIF_TIP;
|
||
|
nid.cbSize = sizeof(nid);
|
||
|
nid.hWnd = ghMainWindow;
|
||
|
nid.uID = (UINT) IDI_AUICON;
|
||
|
MyShell_NotifyIcon(NIM_MODIFY, &nid);
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
void RemoveTrayIcon()
|
||
|
{
|
||
|
DEBUGMSG("RemoveTrayIcon() called");
|
||
|
if (fTrayIconShowing)
|
||
|
{
|
||
|
NOTIFYICONDATA nid;
|
||
|
memset(&nid, 0, sizeof(nid));
|
||
|
nid.cbSize = sizeof(nid);
|
||
|
nid.hWnd = ghMainWindow;
|
||
|
nid.uID = (UINT) IDI_AUICON;
|
||
|
MyShell_NotifyIcon(NIM_DELETE, &nid);
|
||
|
|
||
|
// Don't leave any popup menu around when removing tray icon.
|
||
|
if (SendMessage(ghMainWindow, WM_CANCELMODE, 0, 0))
|
||
|
{
|
||
|
DEBUGMSG("WUAUCLT WM_CANCELMODE was not handled");
|
||
|
}
|
||
|
|
||
|
fTrayIconShowing = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//fixcode: when download complete, should call ShowProgress() to update trayicon info
|
||
|
void ShowProgress()
|
||
|
{
|
||
|
NOTIFYICONDATA nid;
|
||
|
UINT percentComplete;
|
||
|
DWORD status;
|
||
|
|
||
|
//DEBUGMSG("ShowProgress() called");
|
||
|
memset(&nid, 0, sizeof(nid));
|
||
|
|
||
|
if (FAILED(gInternals->m_getDownloadStatus(&percentComplete, &status)))
|
||
|
{
|
||
|
QUITAUClient();
|
||
|
return;
|
||
|
}
|
||
|
nid.cbSize = sizeof(nid);
|
||
|
nid.hWnd = ghMainWindow;
|
||
|
nid.uID = (UINT) IDI_AUICON;
|
||
|
nid.uFlags = NIF_TIP;
|
||
|
|
||
|
if(status == DWNLDSTATUS_DOWNLOADING)
|
||
|
{
|
||
|
(void)StringCchPrintfEx(nid.szTip, ARRAYSIZE(nid.szTip), NULL, NULL, MISTSAFE_STRING_FLAGS, downloadFormatString, percentComplete);
|
||
|
}
|
||
|
else if(status == DWNLDSTATUS_PAUSED)
|
||
|
{
|
||
|
(void)StringCchCopyEx(nid.szTip, ARRAYSIZE(nid.szTip), pauseString, NULL, NULL, MISTSAFE_STRING_FLAGS);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
(void)StringCchCopyEx(nid.szTip, ARRAYSIZE(nid.szTip), _T(""), NULL, NULL, MISTSAFE_STRING_FLAGS);
|
||
|
}
|
||
|
MyShell_NotifyIcon(NIM_MODIFY, &nid);
|
||
|
}
|
||
|
|