Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

394 lines
10 KiB

/*===================================================================
Microsoft ASP
Microsoft Confidential.
Copyright 1997 Microsoft Corporation. All Rights Reserved.
Component: Package Management Tool
File: main.cpp
Owner: leijin
Note:
===================================================================*/
#include <tchar.h>
#include "admutil.h"
#include <stdio.h>
#include <objbase.h>
#include <initguid.h>
//#ifdef _WAMREG_LINK_DIRECT
//#include "..\wmrgexp.h"
//#endif
#include <iwamreg.h>
#define SIZE_STRING_BUFFER 1024
void CAdmUtil::OpenWamAdm (const CString & strComputer)
{
IClassFactory * pcsfFactory = NULL;
COSERVERINFO csiMachineName;
COSERVERINFO *pcsiParam = NULL;
OLECHAR rgchMachineName[MAX_PATH];
//release previous interface if needed
if(pIWamAdm!=0)
{
//reuse the interface
return;
//pIWamAdm->Release();
//pIWamAdm=0;
}
//convert to OLECHAR[];
#if UNICODE
wsprintfW( rgchMachineName, L"%s", LPCTSTR(strComputer));
#else
wsprintfW( rgchMachineName, L"%S", LPCTSTR(strComputer));
#endif
//fill the structure for CoGetClassObject
ZeroMemory( &csiMachineName, sizeof(csiMachineName) );
// csiMachineName.pAuthInfo = NULL;
// csiMachineName.dwFlags = 0;
// csiMachineName.pServerInfoExt = NULL;
pcsiParam = &csiMachineName;
csiMachineName.pwszName = (strComputer.IsEmpty())?NULL:rgchMachineName;
hresError = CoGetClassObject(CLSID_WamAdmin, CLSCTX_SERVER, pcsiParam,
IID_IClassFactory, (void**) &pcsfFactory);
if (FAILED(hresError))
{
Error(_T("Failed to CoGetClassObject of WamAdm object"));
}
else {
hresError = pcsfFactory->CreateInstance(NULL, IID_IWamAdmin, (void **) &pIWamAdm);
if (FAILED(hresError)) Error(_T("Failed to CreateInstance of WamAdm object"));
pcsfFactory->Release();
}
}
void CAdmUtil::CloseWamAdm (void)
{
if(pIWamAdm!=0)
{
pIWamAdm->Release();
pIWamAdm=0;
}
}
void CAdmUtil::AppCreateInProc(const _TCHAR* szPath,const CString & strComputer)
{
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
HRESULT hr = NOERROR;
//
INT cSize = 0;
INT cch = 0;
#ifndef UNICODE
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
#else
wcscpy(wszMetabasePath,szPath);
#endif
OpenWamAdm(strComputer);
if (SUCCEEDED(hresError) && pIWamAdm!=0)
{
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppCreate(wszMetabasePath, TRUE);
if (FAILED(hresError))
{
Error(_T("create failed"));
}
else
{
Print(_T("application created\n"));
}
}
//CloseWamAdm();
return;
}
void CAdmUtil::AppCreateOutProc(const _TCHAR* szPath,const CString & strComputer)
{
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
INT cSize = 0;
INT cch = 0;
#ifndef UNICODE
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
#else
wcscpy(wszMetabasePath,szPath);
#endif
OpenWamAdm(strComputer);
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
{
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppCreate(wszMetabasePath, FALSE);
if (FAILED(hresError))
{
Error(_T("create failed"));
}
else
{
Print(_T("application created\n"));
}
}
//CloseWamAdm();
return;
}
void CAdmUtil::AppDelete(const _TCHAR* szPath,const CString & strComputer)
{
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
INT cSize = 0;
INT cch = 0;
#ifndef UNICODE
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
#else
wcscpy(wszMetabasePath,szPath);
#endif
OpenWamAdm(strComputer);
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
{
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppDelete(wszMetabasePath,FALSE);
if (FAILED(hresError))
{
Error(_T("delete failed"));
}
else
{
Print(_T("application deleted\n"));
}
}
//CloseWamAdm();
return;
}
void CAdmUtil::AppRename(CAdmNode& a_AdmNode, CAdmNode& a_AdmDstNode, const CString & strComputer)
{
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
WCHAR wszMetabaseDstPath[SIZE_STRING_BUFFER];
INT cSize = 0;
INT cch = 0;
#ifndef UNICODE
cSize = MultiByteToWideChar(0, 0, LPCTSTR(a_AdmNode.GetLMNodePath()), -1, wszMetabasePath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
wcscat(wszMetabaseDstPath,L"/");
cSize = MultiByteToWideChar(0, 0, LPCTSTR(a_AdmDstNode.GetLMNodePath()), -1, wszMetabaseDstPath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
wcscat(wszMetabaseDstPath,L"/");
#else
wcscpy(wszMetabasePath,LPCTSTR(a_AdmNode.GetLMNodePath()));
wcscpy(wszMetabaseDstPath,LPCTSTR(a_AdmDstNode.GetLMNodePath()));
#endif
OpenWamAdm(strComputer);
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
{
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppDeleteRecoverable(wszMetabasePath,TRUE /*Recursive*/);
if (FAILED(hresError))
{
Error(_T("AppDeleteRecoverable() failed"));
}
else
{
RenameObject(a_AdmNode,a_AdmDstNode);
if(FAILED(QueryLastHresError()))
{
Error(_T("node failed to be renamed"));
}
else
{
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppRecover(wszMetabaseDstPath,TRUE /*Recursive*/);
if (FAILED(hresError))
{
Error(_T("AppRecover() failed"));
}
else
{
Print(_T("application renamed\n"));
}
}
}
}
//CloseWamAdm();
return;
}
void CAdmUtil::AppUnLoad(const _TCHAR* szPath,const CString & strComputer)
{
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
INT cSize = 0;
INT cch = 0;
#ifndef UNICODE
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
#else
wcscpy(wszMetabasePath,szPath);
#endif
OpenWamAdm(strComputer);
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
{
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppUnLoad(wszMetabasePath,FALSE);
if (FAILED(hresError))
{
Error(_T("Unload application failed"));
}
else
{
Print(_T("application unloaded\n"));
}
}
//CloseWamAdm();
return;
}
void CAdmUtil::AppGetStatus(const _TCHAR* szPath,const CString & strComputer)
{
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
INT cSize = 0;
INT cch = 0;
#ifndef UNICODE
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
if (cSize == 0)
{
hresError = GetLastError();
if (hresError == ERROR_INSUFFICIENT_BUFFER)
{
Error(_T("The Metabase path exceeds 1024 chars"));
}
else
Error("");
return;
}
#else
wcscpy(wszMetabasePath,szPath);
#endif
OpenWamAdm(strComputer);
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
{
DWORD dwStatus;
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
hresError = pIWamAdm->AppGetStatus(wszMetabasePath, &dwStatus);
if (FAILED(hresError))
{
Error(_T("GetStatus of application %s failed"));
}
else
{
if (dwStatus == APPSTATUS_NOTDEFINED)
{
Print(_T("Application is not defined\n"));
}
else if (dwStatus == APPSTATUS_STOPPED)
{
Print(_T("Application is stopped\n"));
}
else if (dwStatus == APPSTATUS_RUNNING)
{
Print(_T("Application is running\n"));
}
else
{
Print(_T("Application is in unknown state\n"));
}
}
}
//CloseWamAdm();
return;
}