windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/smtp/smtpmd/ansimeta.cpp
2020-09-26 16:20:57 +08:00

456 lines
13 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name :
ansimeta.cpp
Abstract:
WRAPPER functions for ANSI calls of UNICODE ADMCOM interface
Environment:
Win32 User Mode
Author:
jaroslad (jan 1997)
--*/
#include "ansimeta.h"
#include <mbstring.h>
WCHAR * ConvertToUnicode(unsigned char * pszString);
WCHAR * ConvertToUnicode(CHAR * pszString)
{
return ConvertToUnicode((unsigned char *) pszString);
}
WCHAR * ConvertToUnicode(unsigned char * pszString)
{
if (pszString==NULL)
return NULL;
int Size_wszString = (_mbslen((const unsigned char *) pszString)+1)*sizeof(WCHAR);
WCHAR * pwszString = new WCHAR[Size_wszString];
if (pwszString== NULL)
{
return NULL;
}
MultiByteToWideChar(0, 0, (char *) pszString, -1, pwszString, Size_wszString);
return pwszString;
}
CHAR * ConvertToMultiByte(WCHAR * pwszString)
{
if(pwszString==NULL)
return NULL;
int Size_szString = (wcslen(pwszString)*sizeof(WCHAR)+1);
CHAR * pszString = new CHAR[Size_szString];
if (pszString== NULL)
{
return NULL;
}
WideCharToMultiByte(0, 0, pwszString, -1, pszString,Size_szString, NULL,NULL );
return pszString;
}
HRESULT ConvertMetadataToAnsi(PMETADATA_RECORD pmdrMDData)
{
HRESULT hRes=ERROR_SUCCESS;
//convert data if STRING, EXPAND STRING or MULTISZ
switch(pmdrMDData->dwMDDataType )
{
case STRING_METADATA:
case EXPANDSZ_METADATA:
{
CHAR * pszData= ConvertToMultiByte((WCHAR *) pmdrMDData->pbMDData);
if (pszData==0) {hRes=E_OUTOFMEMORY; goto Exit;}
strcpy((char *)pmdrMDData->pbMDData,pszData);
pmdrMDData->dwMDDataLen=strlen((char *)pmdrMDData->pbMDData)+1;
delete [] pszData;
break;
}
case MULTISZ_METADATA:
{
WCHAR *pwszMultiString = (WCHAR *) pmdrMDData->pbMDData;
DWORD dwAnsiDataLen=0;
do
{
CHAR * pszData= ConvertToMultiByte(pwszMultiString);
if (pszData==0) {hRes=E_OUTOFMEMORY; goto Exit;}
strcpy((char *)(pmdrMDData->pbMDData)+dwAnsiDataLen,pszData);
dwAnsiDataLen+=strlen(pszData)+1;
pwszMultiString+=_mbslen((const unsigned char *)pszData)+1; //move pointer to the next string in MULTISZ
delete [] pszData;
}while((void *) pwszMultiString < (void *) (pmdrMDData->pbMDData+pmdrMDData->dwMDDataLen));
pmdrMDData->dwMDDataLen=dwAnsiDataLen;
break;
}
}
Exit:
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::AddKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->AddKey(hMDHandle, pwszMDPath);
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::DeleteKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->DeleteKey(hMDHandle, pwszMDPath);
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::EnumKeys(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [size_is][out] */ unsigned char __RPC_FAR *pszMDName,
/* [in] */ DWORD dwMDEnumObjectIndex)
{
HRESULT hRes=0;
CHAR * pszMDName1=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
WCHAR pwszMDName[METADATA_MAX_NAME_LEN];
if ((pwszMDPath==0) || (pwszMDName==0)) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->EnumKeys(hMDHandle, pwszMDPath,pwszMDName,dwMDEnumObjectIndex);
//convert pszMDName to ANSI
pszMDName1=ConvertToMultiByte(pwszMDName);
strcpy((char *)pszMDName,pszMDName1);
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
if( pszMDName1!=0) delete [] pszMDName1;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::CopyKey(
/* [in] */ METADATA_HANDLE hMDSourceHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDSourcePath,
/* [in] */ METADATA_HANDLE hMDDestHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDDestPath,
/* [in] */ BOOL bMDOverwriteFlag,
/* [in] */ BOOL bMDCopyFlag)
{
HRESULT hRes=0;
WCHAR * pwszMDSourcePath=ConvertToUnicode(pszMDSourcePath);
WCHAR * pwszMDDestPath=ConvertToUnicode(pszMDDestPath);
if ((pwszMDSourcePath==0) || (pwszMDDestPath==0) ){ hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->CopyKey(hMDSourceHandle, pwszMDSourcePath,
hMDDestHandle, pwszMDDestPath, bMDOverwriteFlag, bMDCopyFlag);
Exit:
//release memory
if( pwszMDSourcePath!=0) delete [] pwszMDSourcePath;
if( pwszMDDestPath!=0) delete [] pwszMDDestPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::RenameKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDNewName)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
WCHAR * pwszMDNewName=ConvertToUnicode(pszMDNewName);
if ((pwszMDPath==0) || (pwszMDNewName==0)) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->RenameKey(hMDHandle, pwszMDPath,pwszMDNewName);
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
if( pwszMDNewName!=0) delete [] pwszMDNewName;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::SetData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ PMETADATA_RECORD pmdrMDData)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
//convert data if STRING, EXPAND STRING or MULTISZ
switch(pmdrMDData->dwMDDataType )
{
case STRING_METADATA:
case EXPANDSZ_METADATA:
{
WCHAR * pwszData= ConvertToUnicode((CHAR *) pmdrMDData->pbMDData);
if (pwszData==0) {hRes=E_OUTOFMEMORY; goto Exit;}
PBYTE pbMDStoreData=pmdrMDData->pbMDData;
DWORD dwMDStoreDataLen=pmdrMDData->dwMDDataLen;
pmdrMDData->pbMDData= (PBYTE) pwszData;
pmdrMDData->dwMDDataLen=(wcslen((WCHAR *)pmdrMDData->pbMDData)+1)*sizeof(WCHAR);
hRes= this->m_pcAdmCom->SetData(hMDHandle, pwszMDPath,pmdrMDData);
pmdrMDData->dwMDDataLen = dwMDStoreDataLen;
pmdrMDData->pbMDData = pbMDStoreData;
delete [] pwszData;
break;
}
case MULTISZ_METADATA:
{
CHAR *pszMultiString = (CHAR *) pmdrMDData->pbMDData;
WCHAR *pwszMDData=new WCHAR[(pmdrMDData->dwMDDataLen)];
if (pwszMDData==0) {hRes=E_OUTOFMEMORY; goto Exit;}
DWORD dwUniDataLen=0;
do
{
WCHAR * pwszData= ConvertToUnicode(pszMultiString);
if (pwszData==0) {hRes=E_OUTOFMEMORY; goto Exit;}
wcscpy(pwszMDData+dwUniDataLen,pwszData);
dwUniDataLen+=wcslen(pwszData)+1;
delete [] pwszData;
while(*(pszMultiString++)!=0); //move pointer to the next string in MULTISZ
}while(*pszMultiString!=0);
pwszMDData[dwUniDataLen++]=0;
//store original values
PBYTE pbMDStoreData=pmdrMDData->pbMDData;
DWORD dwMDStoreDataLen=pmdrMDData->dwMDDataLen;
pmdrMDData->dwMDDataLen=dwUniDataLen*sizeof(WCHAR);
pmdrMDData->pbMDData= (PBYTE) pwszMDData;
hRes= this->m_pcAdmCom->SetData(hMDHandle, pwszMDPath,pmdrMDData);
delete [] pwszMDData;
//restore original values
pmdrMDData->dwMDDataLen = dwMDStoreDataLen;
pmdrMDData->pbMDData = pbMDStoreData;
break;
}
default:
{
hRes= this->m_pcAdmCom->SetData(hMDHandle, pwszMDPath,pmdrMDData);
}
} //end of switch
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::GetData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [out][in] */ PMETADATA_RECORD pmdrMDData,
/* [out] */ DWORD __RPC_FAR *pdwMDRequiredDataLen)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->GetData(hMDHandle, pwszMDPath,pmdrMDData,pdwMDRequiredDataLen);
if(SUCCEEDED(hRes))
{
ConvertMetadataToAnsi(pmdrMDData);
}
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::DeleteData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ DWORD dwMDIdentifier,
/* [in] */ DWORD dwMDDataType)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->DeleteData(hMDHandle, pwszMDPath,dwMDIdentifier,dwMDDataType);
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::EnumData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [out][in] */ PMETADATA_RECORD pmdrMDData,
/* [in] */ DWORD dwMDEnumDataIndex,
/* [out] */ DWORD __RPC_FAR *pdwMDRequiredDataLen)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->EnumData(hMDHandle, pwszMDPath,pmdrMDData,dwMDEnumDataIndex,pdwMDRequiredDataLen);
if(SUCCEEDED(hRes))
{
ConvertMetadataToAnsi(pmdrMDData);
}
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::CopyData(
/* [in] */ METADATA_HANDLE hMDSourceHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDSourcePath,
/* [in] */ METADATA_HANDLE hMDDestHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDDestPath,
/* [in] */ DWORD dwMDAttributes,
/* [in] */ DWORD dwMDUserType,
/* [in] */ DWORD dwMDDataType,
/* [in] */ BOOL bMDCopyFlag)
{
HRESULT hRes=0;
WCHAR * pwszMDSourcePath=ConvertToUnicode(pszMDSourcePath);
WCHAR * pwszMDDestPath=ConvertToUnicode(pszMDDestPath);
if ((pwszMDSourcePath==0) || (pwszMDDestPath==0) ) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->CopyData(hMDSourceHandle, pwszMDSourcePath,
hMDDestHandle, pwszMDDestPath, dwMDAttributes,
dwMDUserType,dwMDDataType,bMDCopyFlag);
Exit:
//release memory
if( pwszMDSourcePath!=0) delete [] pwszMDSourcePath;
if( pwszMDDestPath!=0) delete [] pwszMDDestPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::OpenKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ DWORD dwMDAccessRequested,
/* [in] */ DWORD dwMDTimeOut,
/* [out] */ PMETADATA_HANDLE phMDNewHandle)
{
HRESULT hRes=0;
WCHAR * pwszMDPath=ConvertToUnicode(pszMDPath);
if (pwszMDPath==0) { hRes=E_OUTOFMEMORY; goto Exit;}
//call real interface function
if(this->m_pcAdmCom==0) {hRes=CO_E_NOTINITIALIZED;goto Exit;}
hRes= this->m_pcAdmCom->OpenKey(hMDHandle, pwszMDPath, dwMDAccessRequested, dwMDTimeOut, phMDNewHandle);
Exit:
//release memory
if( pwszMDPath!=0) delete [] pwszMDPath;
return hRes;
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::CloseKey(
/* [in] */ METADATA_HANDLE hMDHandle)
{
if(this->m_pcAdmCom==0) { return CO_E_NOTINITIALIZED;}
return this->m_pcAdmCom->CloseKey(hMDHandle);
}
HRESULT STDMETHODCALLTYPE ANSI_smallIMSAdminBase::SaveData( void)
{
if(this->m_pcAdmCom==0) {return CO_E_NOTINITIALIZED;}
return this->m_pcAdmCom->SaveData();
}