You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
4.8 KiB
185 lines
4.8 KiB
//---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (c) Microsoft Corporation
|
|
//
|
|
// File: instapp.cpp
|
|
//
|
|
// Installed applications
|
|
//
|
|
// History:
|
|
// 1-18-97 by dli
|
|
//------------------------------------------------------------------------
|
|
#include "priv.h"
|
|
|
|
#include "darapp.h"
|
|
#include "util.h"
|
|
#include "appwizid.h"
|
|
|
|
// constructor
|
|
CDarwinPublishedApp::CDarwinPublishedApp(MANAGEDAPPLICATION * pma) : _cRef(1)
|
|
{
|
|
DllAddRef();
|
|
|
|
TraceAddRef(CDarwinPublishedApp, _cRef);
|
|
|
|
hmemcpy(&_ma, pma, SIZEOF(_ma));
|
|
_dwAction |= APPACTION_INSTALL;
|
|
}
|
|
|
|
|
|
// destructor
|
|
CDarwinPublishedApp::~CDarwinPublishedApp()
|
|
{
|
|
ClearManagedApplication(&_ma);
|
|
DllRelease();
|
|
}
|
|
|
|
|
|
|
|
// IShellApps::GetAppInfo
|
|
STDMETHODIMP CDarwinPublishedApp::GetAppInfo(PAPPINFODATA pai)
|
|
{
|
|
if (pai->cbSize != SIZEOF(APPINFODATA))
|
|
return E_FAIL;
|
|
|
|
DWORD dwInfoFlags = pai->dwMask;
|
|
pai->dwMask = 0;
|
|
|
|
if (dwInfoFlags & AIM_DISPLAYNAME)
|
|
{
|
|
if (SUCCEEDED(SHStrDupW(_ma.pszPackageName, &pai->pszDisplayName)))
|
|
pai->dwMask |= AIM_DISPLAYNAME;
|
|
}
|
|
|
|
if ((dwInfoFlags & AIM_PUBLISHER) && _ma.pszPublisher && _ma.pszPublisher[0])
|
|
{
|
|
if (SUCCEEDED(SHStrDupW(_ma.pszPublisher, &pai->pszPublisher)))
|
|
pai->dwMask |= AIM_PUBLISHER;
|
|
}
|
|
|
|
if ((dwInfoFlags & AIM_SUPPORTURL) && _ma.pszSupportUrl && _ma.pszSupportUrl[0])
|
|
{
|
|
if (SUCCEEDED(SHStrDupW(_ma.pszSupportUrl, &pai->pszSupportUrl)))
|
|
pai->dwMask |= AIM_SUPPORTURL;
|
|
}
|
|
|
|
if ((dwInfoFlags & AIM_VERSION) && (_ma.dwVersionHi != 0))
|
|
{
|
|
pai->pszVersion = (LPWSTR)SHAlloc(SIZEOF(WCHAR) * MAX_PATH);
|
|
if (pai->pszVersion)
|
|
{
|
|
StringCchPrintf(pai->pszVersion, MAX_PATH, L"%d.%d.%d.%d", HIWORD(_ma.dwVersionHi), LOWORD(_ma.dwVersionHi), HIWORD(_ma.dwVersionLo), LOWORD(_ma.dwVersionLo));
|
|
}
|
|
pai->dwMask |= AIM_VERSION;
|
|
}
|
|
|
|
|
|
// REARCHITECT: get more info for Darwin apps
|
|
// original comment: don't know how to retrieve other infomation, need to talk to the Darwin guys about it
|
|
TraceMsg(TF_GENERAL, "(DarPubApp) GetAppInfo with %x but got %x", dwInfoFlags, pai->dwMask);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// IShellApps::GetPossibleActions
|
|
STDMETHODIMP CDarwinPublishedApp::GetPossibleActions(DWORD * pdwActions)
|
|
{
|
|
ASSERT(pdwActions);
|
|
*pdwActions = _dwAction;
|
|
return S_OK;
|
|
}
|
|
|
|
// IShellApps::GetSlowAppInfo
|
|
STDMETHODIMP CDarwinPublishedApp::GetSlowAppInfo(PSLOWAPPINFO psai)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// IShellApps::GetSlowAppInfo
|
|
STDMETHODIMP CDarwinPublishedApp::GetCachedSlowAppInfo(PSLOWAPPINFO psai)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// IShellApps::IsInstalled
|
|
STDMETHODIMP CDarwinPublishedApp::IsInstalled()
|
|
{
|
|
return _ma.bInstalled ? S_OK : S_FALSE;
|
|
}
|
|
|
|
// IPublishedApps::Install
|
|
STDMETHODIMP CDarwinPublishedApp::Install(LPSYSTEMTIME pftInstall)
|
|
{
|
|
INSTALLDATA id;
|
|
id.Type = APPNAME;
|
|
id.Spec.AppName.Name = _ma.pszPackageName;
|
|
id.Spec.AppName.GPOId = _ma.GpoId;
|
|
LONG lRet = InstallApplication(&id);
|
|
|
|
HRESULT hres = HRESULT_FROM_WIN32(lRet);
|
|
// Tell the users what is wrong with this install.
|
|
if (FAILED(hres))
|
|
_ARPErrorMessageBox(lRet);
|
|
else
|
|
_ma.bInstalled = TRUE;
|
|
|
|
return hres;
|
|
}
|
|
|
|
// IPublishedApps::GetPublishedTime
|
|
STDMETHODIMP CDarwinPublishedApp::GetPublishedAppInfo(PPUBAPPINFO ppai)
|
|
{
|
|
if (ppai->cbSize != SIZEOF(PUBAPPINFO))
|
|
return E_FAIL;
|
|
|
|
DWORD dwInfoFlags = ppai->dwMask;
|
|
ppai->dwMask = 0;
|
|
|
|
if ((dwInfoFlags & PAI_SOURCE) && _ma.pszPolicyName && _ma.pszPolicyName[0])
|
|
{
|
|
if (SUCCEEDED(SHStrDupW(_ma.pszPolicyName, &ppai->pszSource)))
|
|
ppai->dwMask |= PAI_SOURCE;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
// IPublishedApps::GetAssignedTime
|
|
STDMETHODIMP CDarwinPublishedApp::Unschedule(void)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// IPublishedApp::QueryInterface
|
|
HRESULT CDarwinPublishedApp::QueryInterface(REFIID riid, LPVOID * ppvOut)
|
|
{
|
|
static const QITAB qit[] = {
|
|
QITABENT(CDarwinPublishedApp, IPublishedApp), // IID_IPublishedApp
|
|
QITABENTMULTI(CDarwinPublishedApp, IShellApp, IPublishedApp), // IID_IShellApp
|
|
{ 0 },
|
|
};
|
|
|
|
return QISearch(this, qit, riid, ppvOut);
|
|
}
|
|
|
|
// IPublishedApp::AddRef
|
|
ULONG CDarwinPublishedApp::AddRef()
|
|
{
|
|
ULONG cRef = InterlockedIncrement(&_cRef);
|
|
TraceAddRef(CDarwinPublishedApp, cRef);
|
|
return cRef;
|
|
}
|
|
|
|
// IPublishedApp::Release
|
|
ULONG CDarwinPublishedApp::Release()
|
|
{
|
|
ASSERT( 0 != _cRef );
|
|
ULONG cRef = InterlockedDecrement(&_cRef);
|
|
TraceRelease(CDarwinPublishedApp, cRef);
|
|
if ( 0 == cRef )
|
|
{
|
|
delete this;
|
|
}
|
|
return cRef;
|
|
}
|
|
|
|
|