Leaked source code of windows server 2003
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

//---------------------------------------------------------------------------
//
// 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;
}