Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
item.cpp
Package: shell.rar [view]
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 25k
Category:
Windows Kernel
Development Platform:
Visual C++
- #include <urlmon.h>
- #include "item.h"
- #include <webcheck.h>
- #include "utils.h"
- #include "parseinf.h"
- #include <mluisupp.h>
- extern "C" HRESULT GetControlFolderPath(LPTSTR lpszDir, ULONG ulSizeBuf);
- typedef HRESULT (STDAPICALLTYPE *PFNASYNCINSTALLDU)(LPCWSTR,LPCWSTR, LPCWSTR, DWORD,
- DWORD,LPCWSTR, IBindCtx *, LPVOID, DWORD );
- // registered clipboard formats
- //UINT g_cfFileDescriptor = 0;
- //UINT g_cfFileContents = 0;
- //UINT g_cfURL = 0;
- UINT g_cfPrefDropEffect = 0;
- ///////////////////////////////////////////////////////////////////////////////
- // CControlItem methods.
- CControlItem::CControlItem()
- {
- DebugMsg(DM_TRACE, TEXT("ci - CControlItem() called."));
- DllAddRef();
- m_cRef = 1;
- m_piciUpdate = NULL;
- m_pcpidlUpdate = NULL;
- m_pcdlbsc = NULL;
- }
- CControlItem::~CControlItem()
- {
- Assert(m_cRef == 0); // we should have zero ref count here
- DebugMsg(DM_TRACE, TEXT("ci - ~CControlItem() called."));
- LocalFree((HLOCAL)m_ppcei);
- if (m_pCFolder != NULL)
- m_pCFolder->Release(); // release the pointer to the sf
- DllRelease();
- }
- HRESULT CControlItem::Initialize(CControlFolder *pCFolder, UINT cidl, LPCITEMIDLIST *ppidl)
- {
- m_ppcei = (LPCONTROLPIDL*)LocalAlloc(LPTR, cidl * sizeof(LPCONTROLPIDL));
- if (m_ppcei == NULL)
- return E_OUTOFMEMORY;
- m_cItems = cidl;
- m_pCFolder = pCFolder;
- for (UINT i = 0; i < cidl; i++)
- m_ppcei[i] = (LPCONTROLPIDL)(ppidl[i]);
- m_pCFolder->AddRef(); // we're going to hold onto this pointer, so
- // we need to AddRef it.
- return NOERROR;
- }
- HRESULT CControlItem_CreateInstance(
- CControlFolder *pCFolder,
- UINT cidl,
- LPCITEMIDLIST *ppidl,
- REFIID riid,
- void **ppvOut)
- {
- *ppvOut = NULL; // null the out param
- // if (!_ValidateIDListArray(cidl, ppidl))
- // return E_FAIL;
- CControlItem *pCItem = new CControlItem;
- if (pCItem == NULL)
- return E_OUTOFMEMORY;
- HRESULT hr = pCItem->Initialize(pCFolder, cidl, ppidl);
- if (SUCCEEDED(hr))
- {
- hr = pCItem->QueryInterface(riid, ppvOut);
- }
- pCItem->Release();
- if (g_cfPrefDropEffect == 0)
- {
- // g_cfFileDescriptor = RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR); // "FileContents"
- // g_cfFileContents = RegisterClipboardFormat(CFSTR_FILECONTENTS); // "FileDescriptor"
- // g_cfURL = RegisterClipboardFormat(TEXT("UniformResourceLocator")); // "UniformResourceLocator"
- g_cfPrefDropEffect = RegisterClipboardFormat(TEXT("Preferred DropEffect"));// "Preferred DropEffect"
- }
- return hr;
- }
- HRESULT CControlItem::QueryInterface(REFIID iid, void **ppv)
- {
- DebugMsg(DM_TRACE, TEXT("ci - QueryInterface() called."));
- if ((iid == IID_IUnknown) || (iid == IID_IContextMenu))
- {
- *ppv = (LPVOID)(IContextMenu*)this;
- }
- else if (iid == IID_IDataObject)
- {
- *ppv = (LPVOID)(IDataObject*)this;
- }
- else if (iid == IID_IExtractIcon)
- {
- *ppv = (LPVOID)(IExtractIcon*)this;
- }
- else if (iid == CLSID_ControlFolder) // really should be CLSID_ControlFolderItem
- {
- *ppv = (void *)this; // for our friends
- }
- else
- {
- *ppv = NULL; // null the out param
- return E_NOINTERFACE;
- }
- AddRef();
- return S_OK;
- }
- ULONG CControlItem::AddRef()
- {
- return ++m_cRef;
- }
- ULONG CControlItem::Release()
- {
- if (--m_cRef)
- return m_cRef;
- delete this;
- return 0;
- }
- HRESULT CControlItem::GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM)
- {
- HRESULT hres;
- #ifdef _DEBUG_
- TCHAR szName[64];
- if (!GetClipboardFormatName(pFEIn->cfFormat, szName, sizeof(szName)))
- wsprintf(szName, "#%d", pFEIn->cfFormat);
- DebugMsg(DM_TRACE, TEXT("ci - do - GetData(%s)"), szName);
- #endif
- pSTM->hGlobal = NULL;
- pSTM->pUnkForRelease = NULL;
- if ((pFEIn->cfFormat == g_cfPrefDropEffect) && (pFEIn->tymed & TYMED_HGLOBAL))
- hres = CreatePrefDropEffect(pSTM);
- else
- hres = E_FAIL; // FAIL WHEN YOU DON'T SUPPORT IT!!!
- return hres;
- }
- HRESULT CControlItem::GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM)
- {
- DebugMsg(DM_TRACE, TEXT("ci - do - GetDataHere() called."));
- return E_NOTIMPL;
- }
- HRESULT CControlItem::QueryGetData(LPFORMATETC pFEIn)
- {
- #ifdef _DEBUG_
- TCHAR szName[64];
- if (!GetClipboardFormatName(pFEIn->cfFormat, szName, sizeof(szName)))
- wsprintf(szName, "#%d", pFEIn->cfFormat);
- DebugMsg(DM_TRACE, TEXT("ci - do - QueryGetData(%s)"), szName);
- #endif
- if (pFEIn->cfFormat == g_cfPrefDropEffect)
- {
- DebugMsg(DM_TRACE, TEXT(" format supported."));
- return NOERROR;
- }
- return S_FALSE;
- }
- HRESULT CControlItem::GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut)
- {
- DebugMsg(DM_TRACE, TEXT("ci - do - GetCanonicalFormatEtc() called."));
- return DATA_S_SAMEFORMATETC;
- }
- HRESULT CControlItem::SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease)
- {
- DebugMsg(DM_TRACE,TEXT("ci - do - SetData() called."));
- return E_NOTIMPL;
- }
- HRESULT CControlItem::EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum)
- {
- FORMATETC ControlFmte[1] = {
- {(CLIPFORMAT)g_cfPrefDropEffect, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}
- };
- DebugMsg(DM_TRACE, TEXT("ci - do - EnumFormatEtc() called."));
- return SHCreateStdEnumFmtEtc(ARRAYSIZE(ControlFmte), ControlFmte, ppEnum);
- }
- HRESULT CControlItem::DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink,
- LPDWORD pdwConnection)
- {
- DebugMsg(DM_TRACE, TEXT("ci - do - DAdvise() called."));
- return OLE_E_ADVISENOTSUPPORTED;
- }
- HRESULT CControlItem::DUnadvise(DWORD dwConnection)
- {
- DebugMsg(DM_TRACE, TEXT("ci - do - DUnAdvise() called."));
- return OLE_E_ADVISENOTSUPPORTED;
- }
- HRESULT CControlItem::EnumDAdvise(LPENUMSTATDATA *ppEnum)
- {
- DebugMsg(DM_TRACE, TEXT("ci - do - EnumAdvise() called."));
- return OLE_E_ADVISENOTSUPPORTED;
- }
- HRESULT CControlItem::CreatePrefDropEffect(LPSTGMEDIUM pSTM)
- {
- pSTM->tymed = TYMED_HGLOBAL;
- pSTM->pUnkForRelease = NULL;
- pSTM->hGlobal = GlobalAlloc(GPTR, sizeof(DWORD));
- if (pSTM->hGlobal)
- {
- *((LPDWORD)pSTM->hGlobal) = DROPEFFECT_COPY;
- return S_OK;
- }
- return E_OUTOFMEMORY;
- }
- HRESULT CControlItem::Remove(HWND hwnd)
- {
- TCHAR szMsg[MESSAGE_MAXSIZE];
- TCHAR szBuf[MESSAGE_MAXSIZE];
- if ( !g_fAllAccess )
- {
- // The current user does not have the access privileges to modify the
- // keys we need to tweak to remove a control, so let 'em know and bail
- // out quickly.
- MLLoadString(IDS_WARNING_USERNOACCESS, szMsg, ARRAYSIZE(szMsg));
- MLLoadString(IDS_MBTITLE_REMOVECONTROL, szBuf, ARRAYSIZE(szBuf));
- MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONWARNING);
- return S_FALSE;
- }
- szMsg[0] = '';
- if (m_cItems == 1)
- {
- // if(!PathFileExists(GetStringInfo(m_ppcei[0], SI_LOCATION)) ||
- // IsModuleRemovable(GetStringInfo(m_ppcei[0], SI_LOCATION)))
- {
- MLLoadString(IDS_WARNING_SINGLEREMOVAL, szBuf, ARRAYSIZE(szBuf));
- wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[0], SI_CONTROL));
- }
- }
- else
- {
- MLLoadString(IDS_WARNING_MULTIPLEREMOVAL, szMsg, ARRAYSIZE(szMsg));
- }
- if (szMsg[0] != '')
- {
- MLLoadString(IDS_MBTITLE_REMOVECONTROL, szBuf, ARRAYSIZE(szBuf));
- if (MessageBox(hwnd, szMsg, szBuf, MB_YESNO | MB_ICONWARNING) != IDYES)
- {
- return S_FALSE;
- }
- }
- // set wait cursor
- HRESULT hr = S_OK;
- HCURSOR hCurOld = StartWaitCur();
- LPCTSTR pszTypeLibId = NULL;
- for (UINT i = 0; i < m_cItems; i++)
- {
- Assert(m_ppcei[i] != NULL);
- if (m_ppcei[i] == NULL)
- {
- hr = E_FAIL;
- break;
- }
- pszTypeLibId = GetStringInfo(m_ppcei[i], SI_TYPELIBID);
- if (SUCCEEDED(hr = RemoveControlByName2(
- GetStringInfo(m_ppcei[i], SI_LOCATION),
- GetStringInfo(m_ppcei[i], SI_CLSID),
- (pszTypeLibId[0] == '' ? NULL : pszTypeLibId),
- TRUE, (m_ppcei[i])->ci.dwIsDistUnit, FALSE)))
- {
- if ( hr == S_FALSE )
- {
- MLLoadString(
- IDS_ERROR_NOUNINSTALLACTION,
- szBuf,
- ARRAYSIZE(szBuf));
- wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[i], SI_CONTROL));
- MLLoadString(
- IDS_MBTITLE_NOUNINSTALLACTION,
- szBuf,
- ARRAYSIZE(szBuf));
- MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONWARNING);
- }
- GenerateEvent(
- SHCNE_DELETE,
- m_pCFolder->m_pidl,
- (LPITEMIDLIST)(m_ppcei[i]),
- NULL);
- }
- else if (hr == STG_E_SHAREVIOLATION)
- {
- MLLoadString(
- IDS_CONTROL_INUSE,
- szBuf,
- ARRAYSIZE(szBuf));
- wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[i], SI_CONTROL));
- MLLoadString(
- IDS_MBTITLE_SHAREVIOLATION,
- szBuf,
- ARRAYSIZE(szBuf));
- MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONSTOP);
- }
- else
- {
- MLLoadString(
- IDS_ERROR_REMOVEFAIL,
- szBuf,
- ARRAYSIZE(szBuf));
- wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[i], SI_CONTROL));
- MLLoadString(
- IDS_MBTITLE_REMOVEFAIL,
- szBuf,
- ARRAYSIZE(szBuf));
- MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONSTOP);
- break;
- }
- }
- EndWaitCur(hCurOld);
- return hr;
- }
- ///////////////////////////////////////////////////////////////////////////////
- // IExtractIcon Methods
- STDMETHODIMP CControlItem::GetIconLocation(
- UINT uFlags,
- LPSTR szIconFile,
- UINT cchMax,
- int *piIndex,
- UINT *pwFlags)
- {
- Assert(szIconFile != NULL);
- Assert(m_cItems == 1);
- if (szIconFile == NULL)
- return S_FALSE;
- *piIndex = 0;
- *pwFlags = 0;
- if (uFlags != GIL_FORSHELL)
- return S_FALSE;
- *pwFlags = GIL_NOTFILENAME|GIL_PERINSTANCE;
- if (cchMax > (UINT)lstrlen(GetStringInfo(m_ppcei[0], SI_LOCATION)))
- {
- lstrcpy(szIconFile, GetStringInfo(m_ppcei[0], SI_LOCATION));
- return NOERROR;
- }
- szIconFile[0] = '';
- return S_FALSE;
- }
- STDMETHODIMP CControlItem::Extract(
- LPCSTR pszFile,
- UINT nIconIndex,
- HICON *phiconLarge,
- HICON *phiconSmall,
- UINT nIconSize)
- {
- *phiconLarge = ExtractIcon(g_hInst, pszFile, nIconIndex);
- if (*phiconLarge == NULL)
- {
- *phiconLarge = GetDefaultOCIcon( m_ppcei[0] );
- Assert(*phiconLarge != NULL);
- }
- *phiconSmall = *phiconLarge;
- return NOERROR;
- }
- ///////////////////////////////////////////////////////////////////////////////
- // IContextMenu Methods
- const struct {
- LPCTSTR pszVerb;
- UINT idCmd;
- } rgcmds[] = {
- {TEXT("Remove"), IDM_CTRL_REMOVECONTROL},
- {TEXT("Properties"), IDM_CTRL_PROPERTIES},
- {TEXT("Update"), IDM_CTRL_UPDATE},
- {TEXT("Delete"), IDM_CTRL_REMOVECONTROL},
- {NULL, 0} // terminator
- };
- int GetCmdID(LPCTSTR pszCmd)
- {
- if ((DWORD_PTR)pszCmd <= 0xFFFF)
- return (int)LOWORD(pszCmd);
- for (int i = 0; rgcmds[i].pszVerb != NULL; i++)
- if (lstrcmpi(pszCmd, rgcmds[i].pszVerb) == 0)
- return rgcmds[i].idCmd;
- return -1;
- }
- HMENU LoadPopupMenu(UINT id, UINT uSubOffset)
- {
- HMENU hmParent, hmPopup;
- hmParent = LoadMenu(MLGetHinst(), MAKEINTRESOURCE(id));
- if (!hmParent)
- return NULL;
- hmPopup = GetSubMenu(hmParent, uSubOffset);
- RemoveMenu(hmParent, uSubOffset, MF_BYPOSITION);
- DestroyMenu(hmParent);
- return hmPopup;
- }
- UINT MergePopupMenu(
- HMENU *phMenu,
- UINT idResource,
- UINT uSubOffset,
- UINT indexMenu,
- UINT idCmdFirst,
- UINT idCmdLast)
- {
- HMENU hmMerge;
- if (*phMenu == NULL)
- {
- *phMenu = CreatePopupMenu();
- if (*phMenu == NULL)
- return 0;
- indexMenu = 0; // at the bottom
- }
- hmMerge = LoadPopupMenu(idResource, uSubOffset);
- if (!hmMerge)
- return 0;
- idCmdLast = Shell_MergeMenus(*phMenu, hmMerge, indexMenu, idCmdFirst, idCmdLast, MM_ADDSEPARATOR);
- DestroyMenu(hmMerge);
- return idCmdLast;
- }
- HRESULT CControlItem::QueryContextMenu(
- HMENU hmenu,
- UINT indexMenu,
- UINT idCmdFirst,
- UINT idCmdLast,
- UINT uFlags)
- {
- UINT idLastMerged = 0;
- DebugMsg(DM_TRACE, TEXT("ci - cm - QueryContextMenu() called."));
- if (uFlags & CMF_DVFILE)
- {
- idLastMerged = MergePopupMenu(
- &hmenu,
- IDR_FILE_MERGE,
- 0,
- indexMenu,
- idCmdFirst,
- idCmdLast);
- if (IsShowAllFilesEnabled()) {
- CheckMenuItem(hmenu, 1, MF_BYPOSITION | MF_CHECKED);
- }
- else {
- CheckMenuItem(hmenu, 1, MF_BYPOSITION | MF_UNCHECKED);
- }
- }
- else if (!(uFlags & CMF_VERBSONLY))
- {
- DWORD dwState = 0;
- // Must have a connection and not be working offline to be able
- // to update.
- if (InternetGetConnectedState(&dwState, 0) && !IsGlobalOffline()) {
- idLastMerged = MergePopupMenu(
- &hmenu,
- IDR_POPUP_CONTROLCONTEXT,
- 0,
- indexMenu,
- idCmdFirst,
- idCmdLast);
- }
- else {
- idLastMerged = MergePopupMenu(
- &hmenu,
- IDR_POPUP_CONTROLCONTEXT_NO_UPDATE,
- 0,
- indexMenu,
- idCmdFirst,
- idCmdLast);
- }
- SetMenuDefaultItem(hmenu, idLastMerged - idCmdFirst, MF_BYPOSITION); // make the last menu, Properties, the default
- }
- return ResultFromShort(idLastMerged - idCmdFirst); // number of menu items
- }
- HRESULT CControlItem::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
- {
- UINT i;
- int idCmd = GetCmdID((LPCTSTR)(pici->lpVerb));
- HRESULT hres = S_OK;
- // LPOLESTR szMimeType = NULL;
- // LPOLESTR szExtension = NULL;
- // LPOLESTR szCodeBase = NULL;
- // IBindCtx *pbc = NULL;
- // CodeDownloadBSC *pCDLBSC = NULL;
- DebugMsg(DM_TRACE, TEXT("ci - cm - InvokeCommand() called."));
- if (idCmd == IDM_CTRL_REMOVECONTROL)
- {
- hres = Remove(pici->hwnd);
- }
- else if (idCmd == IDM_CTRL_SHOWALL) {
- ToggleShowAllFiles();
- GenerateEvent(SHCNE_UPDATEITEM, m_pCFolder->m_pidl, 0, NULL);
- }
- else
- {
- for (i = 0; i < m_cItems && SUCCEEDED(hres); i++)
- if (m_ppcei[i])
- {
- switch (idCmd)
- {
- case IDM_CTRL_PROPERTIES:
- hres = CreatePropDialog(pici->hwnd, m_ppcei[i]);
- break;;
- case IDM_CTRL_UPDATE:
- hres = Update( pici, m_ppcei[i] );
- /*
- hres = CreateBindCtx(0, &pbc);
- if (SUCCEEDED(hres)) {
- LPITEMIDLIST pidlUpdate = ILCombine(m_pCFolder->m_pidl,(LPITEMIDLIST)(m_ppcei[i]));
- // destructor of CodeDownloadBSC will free pidlUpdate
- if ( pidlUpdate != NULL &&
- (pCDLBSC = new CodeDownloadBSC( pici->hwnd, pidlUpdate )) != NULL &&
- SUCCEEDED(hres = RegisterBindStatusCallback(pbc, pCDLBSC, NULL, 0)))
- {
- PFNASYNCINSTALLDU pfnAsyncInstallDU;
- HINSTANCE hModule;
- pCDLBSC->Release();
- hModule = LoadLibrary("URLMON.DLL");
- #ifdef UNICODE
- WCHAR swzCodeBase = (m_ppcei[i])->ci.szCodeBase;
- WCHAR swzDUName = (m_ppcei[i])->ci.szCLSID;
- #else
- MAKE_WIDEPTR_FROMANSI(swzCodeBase, (m_ppcei[i])->ci.szCodeBase);
- MAKE_WIDEPTR_FROMANSI(swzDUName, (m_ppcei[i])->ci.szCLSID);
- #endif
- pfnAsyncInstallDU = (PFNASYNCINSTALLDU)GetProcAddress((HMODULE)hModule, "AsyncInstallDistributionUnit");
- pfnAsyncInstallDU( swzDUName, szMimeType, szExtension,
- 0xFFFFFFFF, 0xFFFFFFFF,
- swzCodeBase,
- pbc,
- NULL, 0);
- FreeLibrary(hModule);
- }
- else
- {
- if ( pCDLBSC != NULL )
- delete pCDLBSC;
- else if ( pidlUpdate != NULL )
- ILFree( pidlUpdate );
- }
- if (pbc != NULL) {
- pbc->Release();
- }
- }
- */
- break;
- default:
- hres = E_FAIL;
- break;
- }
- }
- }
- return hres;
- }
- HRESULT CControlItem::GetCommandString(
- UINT_PTR idCmd,
- UINT uFlags,
- UINT *pwReserved,
- LPTSTR pszName,
- UINT cchMax)
- {
- HRESULT hres = E_FAIL;
- DebugMsg(DM_TRACE, TEXT("ci - cm - GetCommandString() called."));
- pszName[0] = '';
- if (uFlags == GCS_VERB)
- {
- for (int i = 0; rgcmds[i].pszVerb != NULL; i++)
- if (idCmd == rgcmds[i].idCmd)
- {
- lstrcpyn(pszName, rgcmds[i].pszVerb, cchMax);
- hres = NOERROR;
- }
- }
- else if (uFlags == GCS_HELPTEXT)
- {
- hres = NOERROR;
- switch (idCmd)
- {
- case IDM_CTRL_REMOVECONTROL:
- MLLoadString(IDS_HELP_REMOVECONTROL, pszName, cchMax);
- break;
- case IDM_CTRL_PROPERTIES:
- MLLoadString(IDS_HELP_PROPERTIES, pszName, cchMax);
- break;
- case IDM_CTRL_UPDATE:
- MLLoadString(IDS_HELP_UPDATE, pszName, cchMax);
- break;
- default:
- hres = E_FAIL;
- }
- }
- return hres;
- }
- HRESULT
- CControlItem::Update(LPCMINVOKECOMMANDINFO pici, LPCONTROLPIDL pcpidl )
- {
- HRESULT hres = NOERROR;
- m_piciUpdate = pici;
- m_pcpidlUpdate = pcpidl;
- if (pici->hwnd)
- {
- INT_PTR nRes = DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_OCUPDATE),
- pici->hwnd, CControlItem::DlgProc, (LPARAM)this);
- }
- return hres;
- }
- INT_PTR CControlItem::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- BOOL fRet = TRUE;
- CControlItem* pctlitem = (CControlItem*)GetWindowLongPtr(hDlg, DWLP_USER);
- HRESULT hr = S_OK;
- IBindCtx *pbc = NULL;
- LPOLESTR szMimeType = NULL;
- LPOLESTR szExtension = NULL;
- TCHAR szBuf[MESSAGE_MAXSIZE];
- switch (msg)
- {
- case WM_INITDIALOG:
- SetWindowLongPtr(hDlg, DWLP_USER, lParam);
- pctlitem = (CControlItem*)lParam;
- MLLoadString(IDS_UPDATE_CAPTION, szBuf, ARRAYSIZE(szBuf));
- lstrcatn( szBuf, pctlitem->m_pcpidlUpdate->ci.szName, ARRAYSIZE(szBuf));
- SetWindowText( hDlg, szBuf );
- hr = CreateBindCtx(0, &pbc);
- if (SUCCEEDED(hr))
- {
- LPITEMIDLIST pidlUpdate = ILCombine(pctlitem->m_pCFolder->m_pidl,(LPITEMIDLIST)(pctlitem->m_pcpidlUpdate));
- // destructor of CodeDownloadBSC will free pidlUpdate
- // BUGBUG: if new succeeds but register fails, we'll deallocate pidlUpdate twice.
- if ( pidlUpdate != NULL &&
- (pctlitem->m_pcdlbsc = new CodeDownloadBSC( pctlitem->m_piciUpdate->hwnd, hDlg, pidlUpdate )) != NULL &&
- SUCCEEDED(hr = RegisterBindStatusCallback(pbc, pctlitem->m_pcdlbsc, NULL, 0)))
- {
- PFNASYNCINSTALLDU pfnAsyncInstallDU;
- HINSTANCE hModule;
- hModule = LoadLibrary("URLMON.DLL");
- #ifdef UNICODE
- WCHAR swzCodeBase = pctlitem->m_pcpidlUpdate->ci.szCodeBase;
- WCHAR swzDUName = pctlitem->m_pcpidlUpdate->ci.szCLSID;
- #else
- MAKE_WIDEPTR_FROMANSI(swzCodeBase, pctlitem->m_pcpidlUpdate->ci.szCodeBase);
- MAKE_WIDEPTR_FROMANSI(swzDUName, pctlitem->m_pcpidlUpdate->ci.szCLSID);
- #endif
- pfnAsyncInstallDU = (PFNASYNCINSTALLDU)GetProcAddress((HMODULE)hModule, "AsyncInstallDistributionUnit");
- if ( pfnAsyncInstallDU != NULL )
- hr = pfnAsyncInstallDU( swzDUName, szMimeType, szExtension,
- 0xFFFFFFFF, 0xFFFFFFFF,
- swzCodeBase,
- pbc,
- NULL, 0);
- else
- hr = E_FAIL;
- FreeLibrary(hModule);
- }
- else
- {
- if ( pctlitem->m_pcdlbsc != NULL )
- {
- delete pctlitem->m_pcdlbsc;
- pctlitem->m_pcdlbsc = NULL;
- }
- else if ( pidlUpdate != NULL )
- ILFree( pidlUpdate );
- }
- if (pbc != NULL) {
- pbc->Release();
- }
- }
- if ( SUCCEEDED(hr) )
- {
- Animate_Open(GetDlgItem(hDlg, IDC_DOWNLOADANIMATE), IDA_DOWNLOAD);
- Animate_Play(GetDlgItem(hDlg, IDC_DOWNLOADANIMATE), 0, -1, -1);
- }
- else
- EndDialog(hDlg, FALSE);
- fRet = 0;
- break;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDCANCEL:
- Assert( pctlitem->m_pcdlbsc != NULL );
- hr = pctlitem->m_pcdlbsc->Abort();
- Assert( SUCCEEDED( hr ) );
- EndDialog(hDlg, FALSE);
- break;
- case DOWNLOAD_PROGRESS:
- SendMessage(GetDlgItem(hDlg, IDC_DOWNLOADPROGRESS), PBM_SETPOS,
- lParam, 0);
- break;
- case DOWNLOAD_COMPLETE:
- if (lParam)
- SendMessage(GetDlgItem(hDlg, IDC_DOWNLOADPROGRESS), PBM_SETPOS,
- 100, 0);
- EndDialog(hDlg, lParam);
- break;
- }
- break;
- case WM_CLOSE:
- EndDialog(hDlg, FALSE);
- break;
- case WM_DESTROY:
- Assert( pctlitem->m_pcdlbsc != NULL );
- pctlitem->m_pcdlbsc->_hdlg = NULL;
- pctlitem->m_pcdlbsc->Release();
- break;
- default:
- fRet = FALSE;
- }
- return fRet;
- }
- BOOL CControlItem::IsGlobalOffline()
- {
- DWORD dwState = 0, dwSize = sizeof(DWORD);
- BOOL fRet = FALSE;
- if(InternetQueryOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &dwState,
- &dwSize))
- {
- if(dwState & INTERNET_STATE_DISCONNECTED_BY_USER)
- fRet = TRUE;
- }
- return fRet;
- }