windows-nt/Source/XPSP1/NT/enduser/windows.com/wuau/wuauclt/trayicon.cpp

200 lines
4.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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);
}