WindowsXP-SP1/ds/adsi/nds/cexsyn.cxx
2020-09-30 16:53:49 +02:00

2544 lines
50 KiB
C++

#include "nds.hxx"
#pragma hdrstop
//////////////////////////////////////////////////////////////////////////
HRESULT
ConvertStringArrayToSafeBstrArray(
LPWSTR *prgszArray,
DWORD dwNumElement,
VARIANT *pvarSafeArray
)
{
HRESULT hr = S_OK;
SAFEARRAY *aList = NULL;
SAFEARRAYBOUND aBound;
CHAR HUGEP *pArray = NULL;
long i;
BSTR bstrAddress;
if ((!prgszArray) || (!pvarSafeArray)) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
aBound.lLbound = 0;
aBound.cElements = dwNumElement;
aList = SafeArrayCreate( VT_VARIANT, 1, &aBound );
if ( aList == NULL ) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
for ( i = 0; i < (long)dwNumElement; i++ ) {
VARIANT v;
VariantInit(&v);
v.vt = VT_BSTR;
hr = ADsAllocString(
prgszArray[i],
&v.bstrVal
);
BAIL_ON_FAILURE(hr);
hr = SafeArrayPutElement( aList, &i, &v);
BAIL_ON_FAILURE(hr);
VariantClear(&v);
}
V_VT(pvarSafeArray) = VT_ARRAY | VT_VARIANT;
V_ARRAY(pvarSafeArray) = aList;
RRETURN(hr);
error:
if ( aList ) {
SafeArrayDestroy( aList );
}
RRETURN(hr);
}
HRESULT
ConvertSafeBstrArrayToStringArray(
VARIANT varSafeArray,
LPWSTR **prgszArray,
PDWORD pdwNumElement
)
{
HRESULT hr = S_OK;
DWORD dwSLBound = 0;
DWORD dwSUBound = 0;
DWORD dwNumVariants = 0;
DWORD i = 0;
LPWSTR* rgszArray = NULL;
SAFEARRAY * pArray = NULL;
if ((!prgszArray ) || (!pdwNumElement)) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
*pdwNumElement = 0;
*prgszArray = NULL;
if(!((V_VT(&varSafeArray) & VT_VARIANT) && V_ISARRAY(&varSafeArray)))
RRETURN(E_FAIL);
//
// This handles by-ref and regular SafeArrays.
//
if (V_VT(&varSafeArray) & VT_BYREF)
pArray = *(V_ARRAYREF(&varSafeArray));
else
pArray = V_ARRAY(&varSafeArray);
//
// Check that there is only one dimension in this array
//
if (pArray->cDims != 1) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
//
// Check that there is at least one element in this array
//
if (pArray->rgsabound[0].cElements == 0){
RRETURN(S_OK); // Return success and null array
}
//
// We know that this is a valid single dimension array
//
hr = SafeArrayGetLBound(pArray,
1,
(long FAR *)&dwSLBound
);
BAIL_ON_FAILURE(hr);
hr = SafeArrayGetUBound(pArray,
1,
(long FAR *)&dwSUBound
);
BAIL_ON_FAILURE(hr);
dwNumVariants = dwSUBound - dwSLBound + 1;
rgszArray = (LPWSTR*)AllocADsMem(
sizeof(LPWSTR)*dwNumVariants
);
if (!rgszArray) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
if ((V_VT(&varSafeArray) & VT_VARIANT) == VT_BSTR) {
BSTR bstrElement;
for (i = dwSLBound; i <= dwSUBound; i++) {
hr = SafeArrayGetElement(pArray,
(long FAR *)&i,
&bstrElement
);
BAIL_ON_FAILURE(hr);
rgszArray[i-dwSLBound] = AllocADsStr(bstrElement);
if (!rgszArray[i-dwSLBound]) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
}
}
else {
VARIANT varElement;
for (i = dwSLBound; i <= dwSUBound; i++) {
VariantInit(&varElement);
hr = SafeArrayGetElement(pArray,
(long FAR *)&i,
&varElement
);
BAIL_ON_FAILURE(hr);
rgszArray[i-dwSLBound] = AllocADsStr(V_BSTR(&varElement));
if (!rgszArray[i-dwSLBound]) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
VariantClear(&varElement);
}
}
*prgszArray = rgszArray;
*pdwNumElement = dwNumVariants;
RRETURN(hr);
error:
if (rgszArray) {
FreeADsMem(rgszArray);
}
RRETURN(hr);
}
HRESULT
ConvertBinaryArrayToSafeVariantArray(
POctetString *prgArray,
DWORD dwNumElement,
VARIANT *pvarSafeArray
)
{
HRESULT hr = S_OK;
SAFEARRAY *aList = NULL;
SAFEARRAYBOUND aBound;
CHAR HUGEP *pArray = NULL;
long i;
VARIANT var;
if ((!prgArray) || (!pvarSafeArray)) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
aBound.lLbound = 0;
aBound.cElements = dwNumElement;
aList = SafeArrayCreate( VT_VARIANT, 1, &aBound );
if ( aList == NULL )
{
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
for ( i = 0; i < (long)dwNumElement; i++ )
{
hr = BinaryToVariant(
(prgArray[i])->Length,
(prgArray[i])->Value,
&var);
BAIL_ON_FAILURE(hr);
hr = SafeArrayPutElement( aList, &i, &var);
BAIL_ON_FAILURE(hr);
}
V_VT(pvarSafeArray) = VT_ARRAY | VT_VARIANT;
V_ARRAY(pvarSafeArray) = aList;
RRETURN(hr);
error:
if ( aList )
SafeArrayDestroy( aList );
RRETURN(hr);
}
HRESULT
ConvertSafeVariantArrayToBinaryArray(
VARIANT varSafeArray,
POctetString **prgArray,
PDWORD pdwNumElement
)
{
HRESULT hr = S_OK;
DWORD dwSLBound = 0;
DWORD dwSUBound = 0;
LONG cIterations = 0;
DWORD dwNumVariants = 0;
DWORD i = 0;
POctetString *rgArray = NULL;
SAFEARRAY * pArray = NULL;
VARIANT var;
if ((!prgArray ) || (!pdwNumElement)) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
*pdwNumElement = 0;
*prgArray = NULL;
if(!((V_VT(&varSafeArray) & VT_VARIANT) && V_ISARRAY(&varSafeArray)))
RRETURN(E_FAIL);
//
// This handles by-ref and regular SafeArrays.
//
if (V_VT(&varSafeArray) & VT_BYREF)
pArray = *(V_ARRAYREF(&varSafeArray));
else
pArray = V_ARRAY(&varSafeArray);
//
// Check that there is only one dimension in this array
//
if (pArray->cDims != 1) {
hr = E_FAIL;
BAIL_ON_FAILURE(hr);
}
//
// Check that there is at least one element in this array
//
if (pArray->rgsabound[0].cElements == 0){
RRETURN(S_OK); // Return success and null array
}
//
// We know that this is a valid single dimension array
//
hr = SafeArrayGetLBound(pArray,
1,
(long FAR *)&dwSLBound
);
BAIL_ON_FAILURE(hr);
hr = SafeArrayGetUBound(pArray,
1,
(long FAR *)&dwSUBound
);
BAIL_ON_FAILURE(hr);
dwNumVariants = dwSUBound - dwSLBound + 1;
rgArray = (POctetString*)AllocADsMem(
sizeof(POctetString)*dwNumVariants
);
if (!rgArray) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
for (i = dwSLBound; i <= dwSUBound; i++) {
rgArray[i-dwSLBound] = (POctetString)AllocADsMem(sizeof(OctetString));
if (!rgArray[i-dwSLBound]) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
rgArray[i-dwSLBound]->Value = NULL;
cIterations++;
VariantInit(&var);
hr = SafeArrayGetElement(pArray,
(long FAR *)&i,
&var
);
BAIL_ON_FAILURE(hr);
hr = VariantToBinary(
&var,
&(rgArray[i-dwSLBound]->Length),
&(rgArray[i-dwSLBound]->Value));
BAIL_ON_FAILURE(hr);
}
*prgArray = rgArray;
*pdwNumElement = dwNumVariants;
RRETURN(hr);
error:
if (rgArray) {
for (i = dwSLBound; i < dwSLBound + cIterations; i++) {
if (rgArray[i-dwSLBound]) {
if (rgArray[i-dwSLBound]->Value)
FreeADsMem(rgArray[i-dwSLBound]->Value);
FreeADsMem(rgArray[i-dwSLBound]);
}
}
FreeADsMem(rgArray);
}
RRETURN(hr);
}
DEFINE_IDispatch_Implementation(CCaseIgnoreList)
CCaseIgnoreList::CCaseIgnoreList():
_pDispMgr(NULL),
_rgszCaseIgnoreList(NULL),
_dwNumElement(0)
{
ENLIST_TRACKING(CCaseIgnoreList);
}
HRESULT
CCaseIgnoreList::CreateCaseIgnoreList(
REFIID riid,
void **ppvObj
)
{
CCaseIgnoreList FAR * pCaseIgnoreList = NULL;
HRESULT hr = S_OK;
hr = AllocateCaseIgnoreListObject(&pCaseIgnoreList);
BAIL_ON_FAILURE(hr);
hr = pCaseIgnoreList->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pCaseIgnoreList->Release();
RRETURN(hr);
error:
delete pCaseIgnoreList;
RRETURN(hr);
}
CCaseIgnoreList::~CCaseIgnoreList( )
{
delete _pDispMgr;
if (_rgszCaseIgnoreList) {
long i;
for (i=0;i<(long)_dwNumElement;i++) {
if (_rgszCaseIgnoreList[i]) {
FreeADsStr(_rgszCaseIgnoreList[i]);
}
}
FreeADsMem(_rgszCaseIgnoreList);
}
}
STDMETHODIMP
CCaseIgnoreList::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsCaseIgnoreList FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsCaseIgnoreList))
{
*ppv = (IADsCaseIgnoreList FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsCaseIgnoreList FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CCaseIgnoreList::AllocateCaseIgnoreListObject(
CCaseIgnoreList ** ppCaseIgnoreList
)
{
CCaseIgnoreList FAR * pCaseIgnoreList = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pCaseIgnoreList = new CCaseIgnoreList();
if (pCaseIgnoreList == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsCaseIgnoreList,
(IADsCaseIgnoreList *)pCaseIgnoreList,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pCaseIgnoreList->_pDispMgr = pDispMgr;
*ppCaseIgnoreList = pCaseIgnoreList;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CCaseIgnoreList::get_CaseIgnoreList(THIS_ VARIANT FAR * pVarDestObject)
{
HRESULT hr = S_OK;
hr = ConvertStringArrayToSafeBstrArray(
_rgszCaseIgnoreList,
_dwNumElement,
pVarDestObject);
RRETURN(hr);
}
STDMETHODIMP
CCaseIgnoreList::put_CaseIgnoreList(THIS_ VARIANT VarSrcObject)
{
HRESULT hr = S_OK;
if (_rgszCaseIgnoreList) {
long i;
for (i=0;i<(long)_dwNumElement;i++) {
if (_rgszCaseIgnoreList[i]) {
FreeADsStr(_rgszCaseIgnoreList[i]);
}
}
FreeADsMem(_rgszCaseIgnoreList);
_rgszCaseIgnoreList = NULL;
_dwNumElement = 0;
}
hr = ConvertSafeBstrArrayToStringArray(
VarSrcObject,
&_rgszCaseIgnoreList,
&_dwNumElement);
RRETURN(hr);
}
DEFINE_IDispatch_Implementation(CFaxNumber)
CFaxNumber::CFaxNumber():
_pDispMgr(NULL),
_szTelephoneNumber(NULL),
_NumberOfBits(0),
_Parameters(NULL)
{
ENLIST_TRACKING(CFaxNumber);
}
HRESULT
CFaxNumber::CreateFaxNumber(
REFIID riid,
void **ppvObj
)
{
CFaxNumber FAR * pFaxNumber = NULL;
HRESULT hr = S_OK;
hr = AllocateFaxNumberObject(&pFaxNumber);
BAIL_ON_FAILURE(hr);
hr = pFaxNumber->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pFaxNumber->Release();
RRETURN(hr);
error:
delete pFaxNumber;
RRETURN(hr);
}
CFaxNumber::~CFaxNumber( )
{
delete _pDispMgr;
if (_szTelephoneNumber) {
FreeADsStr(_szTelephoneNumber);
}
if (_Parameters) {
FreeADsMem(_Parameters);
}
}
STDMETHODIMP
CFaxNumber::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsFaxNumber FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsFaxNumber))
{
*ppv = (IADsFaxNumber FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsFaxNumber FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CFaxNumber::AllocateFaxNumberObject(
CFaxNumber ** ppFaxNumber
)
{
CFaxNumber FAR * pFaxNumber = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pFaxNumber = new CFaxNumber();
if (pFaxNumber == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsFaxNumber,
(IADsFaxNumber *)pFaxNumber,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pFaxNumber->_pDispMgr = pDispMgr;
*ppFaxNumber = pFaxNumber;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CFaxNumber::get_Parameters(THIS_ VARIANT FAR * pVarDestObject)
{
HRESULT hr = S_OK;
SAFEARRAY *aList = NULL;
SAFEARRAYBOUND aBound;
CHAR HUGEP *pArray = NULL;
aBound.lLbound = 0;
aBound.cElements = _NumberOfBits;
aList = SafeArrayCreate( VT_UI1, 1, &aBound );
if ( aList == NULL ) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
hr = SafeArrayAccessData( aList,
(void HUGEP * FAR *) &pArray );
BAIL_ON_FAILURE(hr);
memcpy( pArray,
_Parameters,
aBound.cElements );
SafeArrayUnaccessData( aList );
V_VT(pVarDestObject) = VT_ARRAY | VT_UI1;
V_ARRAY(pVarDestObject) = aList;
RRETURN(hr);
error:
if ( aList ) {
SafeArrayDestroy( aList );
}
RRETURN(hr);
}
STDMETHODIMP
CFaxNumber::put_Parameters(THIS_ VARIANT VarSrcObject)
{
HRESULT hr = S_OK;
LONG dwSLBound = 0;
LONG dwSUBound = 0;
CHAR HUGEP *pArray = NULL;
VARIANT *pVarSrcObject = &VarSrcObject;
if (_Parameters) {
FreeADsMem(_Parameters);
}
if( pVarSrcObject->vt != (VT_ARRAY | VT_UI1)) {
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
hr = SafeArrayGetLBound(V_ARRAY(pVarSrcObject),
1,
(long FAR *) &dwSLBound );
BAIL_ON_FAILURE(hr);
hr = SafeArrayGetUBound(V_ARRAY(pVarSrcObject),
1,
(long FAR *) &dwSUBound );
BAIL_ON_FAILURE(hr);
_Parameters =
(BYTE*) AllocADsMem( dwSUBound - dwSLBound + 1);
if ( _Parameters == NULL) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
_NumberOfBits = dwSUBound - dwSLBound + 1;
hr = SafeArrayAccessData( V_ARRAY(pVarSrcObject),
(void HUGEP * FAR *) &pArray );
BAIL_ON_FAILURE(hr);
memcpy( _Parameters,
pArray,
_NumberOfBits);
SafeArrayUnaccessData( V_ARRAY(pVarSrcObject) );
error:
RRETURN(hr);
}
STDMETHODIMP
CFaxNumber::get_TelephoneNumber(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_szTelephoneNumber,
retval);
RRETURN(hr);
}
STDMETHODIMP
CFaxNumber::put_TelephoneNumber(THIS_ BSTR bstrTelephoneNumber)
{
if (_szTelephoneNumber) {
FreeADsStr(_szTelephoneNumber);
}
_szTelephoneNumber = AllocADsStr(bstrTelephoneNumber);
if (!_szTelephoneNumber) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
DEFINE_IDispatch_Implementation(CNetAddress)
CNetAddress::CNetAddress():
_pDispMgr(NULL),
_dwAddressType(0),
_dwAddressLength(0),
_pbAddress(NULL)
{
ENLIST_TRACKING(CNetAddress);
}
HRESULT
CNetAddress::CreateNetAddress(
REFIID riid,
void **ppvObj
)
{
CNetAddress FAR * pNetAddress = NULL;
HRESULT hr = S_OK;
hr = AllocateNetAddressObject(&pNetAddress);
BAIL_ON_FAILURE(hr);
hr = pNetAddress->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pNetAddress->Release();
RRETURN(hr);
error:
delete pNetAddress;
RRETURN(hr);
}
CNetAddress::~CNetAddress( )
{
delete _pDispMgr;
if (_pbAddress) {
FreeADsMem(_pbAddress);
}
}
STDMETHODIMP
CNetAddress::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsNetAddress FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsNetAddress))
{
*ppv = (IADsNetAddress FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsNetAddress FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CNetAddress::AllocateNetAddressObject(
CNetAddress ** ppNetAddress
)
{
CNetAddress FAR * pNetAddress = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pNetAddress = new CNetAddress();
if (pNetAddress == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsNetAddress,
(IADsNetAddress *)pNetAddress,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pNetAddress->_pDispMgr = pDispMgr;
*ppNetAddress = pNetAddress;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CNetAddress::get_AddressType(THIS_ long FAR * retval)
{
*retval = _dwAddressType;
RRETURN(S_OK);
}
STDMETHODIMP
CNetAddress::put_AddressType(THIS_ long lnAddressType)
{
_dwAddressType = lnAddressType;
RRETURN(S_OK);
}
STDMETHODIMP
CNetAddress::get_Address(THIS_ VARIANT FAR * pVarDestObject)
{
HRESULT hr = S_OK;
SAFEARRAY *aList = NULL;
SAFEARRAYBOUND aBound;
CHAR HUGEP *pArray = NULL;
aBound.lLbound = 0;
aBound.cElements = _dwAddressLength;
aList = SafeArrayCreate( VT_UI1, 1, &aBound );
if ( aList == NULL ) {
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
hr = SafeArrayAccessData( aList, (void HUGEP * FAR *) &pArray );
BAIL_ON_FAILURE(hr);
memcpy( pArray,
_pbAddress,
aBound.cElements );
SafeArrayUnaccessData( aList );
V_VT(pVarDestObject) = VT_ARRAY | VT_UI1;
V_ARRAY(pVarDestObject) = aList;
RRETURN(hr);
error:
if ( aList ) {
SafeArrayDestroy( aList );
}
RRETURN(hr);
}
STDMETHODIMP
CNetAddress::put_Address(THIS_ VARIANT VarSrcObject)
{
HRESULT hr = S_OK;
LONG dwSLBound = 0;
LONG dwSUBound = 0;
CHAR HUGEP *pArray = NULL;
VARIANT *pVarSrcObject = &VarSrcObject;
if (_pbAddress) {
FreeADsMem(_pbAddress);
}
if( pVarSrcObject->vt != (VT_ARRAY | VT_UI1)) {
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
}
hr = SafeArrayGetLBound(V_ARRAY(pVarSrcObject),
1,
(long FAR *) &dwSLBound );
BAIL_ON_FAILURE(hr);
hr = SafeArrayGetUBound(V_ARRAY(pVarSrcObject),
1,
(long FAR *) &dwSUBound );
BAIL_ON_FAILURE(hr);
_pbAddress =
(BYTE*) AllocADsMem( dwSUBound - dwSLBound + 1);
if ( _pbAddress == NULL)
{
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
_dwAddressLength = dwSUBound - dwSLBound + 1;
hr = SafeArrayAccessData( V_ARRAY(pVarSrcObject),
(void HUGEP * FAR *) &pArray );
BAIL_ON_FAILURE(hr);
memcpy( _pbAddress,
pArray,
_dwAddressLength );
SafeArrayUnaccessData( V_ARRAY(pVarSrcObject) );
error:
RRETURN(hr);
}
DEFINE_IDispatch_Implementation(COctetList)
COctetList::COctetList():
_pDispMgr(NULL),
_rgOctetList(NULL)
{
ENLIST_TRACKING(COctetList);
}
HRESULT
COctetList::CreateOctetList(
REFIID riid,
void **ppvObj
)
{
COctetList FAR * pOctetList = NULL;
HRESULT hr = S_OK;
hr = AllocateOctetListObject(&pOctetList);
BAIL_ON_FAILURE(hr);
hr = pOctetList->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pOctetList->Release();
RRETURN(hr);
error:
delete pOctetList;
RRETURN(hr);
}
COctetList::~COctetList( )
{
delete _pDispMgr;
if (_rgOctetList) {
long i;
for (i=0;i<(long)_dwNumElement;i++) {
if (_rgOctetList[i]) {
FreeADsMem(_rgOctetList[i]);
}
}
FreeADsMem(_rgOctetList);
}
}
STDMETHODIMP
COctetList::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsOctetList FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsOctetList))
{
*ppv = (IADsOctetList FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsOctetList FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
COctetList::AllocateOctetListObject(
COctetList ** ppOctetList
)
{
COctetList FAR * pOctetList = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pOctetList = new COctetList();
if (pOctetList == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsOctetList,
(IADsOctetList *)pOctetList,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pOctetList->_pDispMgr = pDispMgr;
*ppOctetList = pOctetList;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
COctetList::get_OctetList(THIS_ VARIANT FAR * pVarDestObject)
{
HRESULT hr = S_OK;
hr = ConvertBinaryArrayToSafeVariantArray(
_rgOctetList,
_dwNumElement,
pVarDestObject);
RRETURN(hr);
}
STDMETHODIMP
COctetList::put_OctetList(THIS_ VARIANT VarSrcObject)
{
HRESULT hr = S_OK;
if (_rgOctetList) {
long i;
for (i=0;i<(long)_dwNumElement;i++) {
if (_rgOctetList[i]) {
FreeADsMem(_rgOctetList[i]);
}
}
FreeADsMem(_rgOctetList);
}
hr = ConvertSafeVariantArrayToBinaryArray(
VarSrcObject,
&_rgOctetList,
&_dwNumElement);
RRETURN(hr);
}
DEFINE_IDispatch_Implementation(CEmail)
CEmail::CEmail():
_pDispMgr(NULL),
_szAddress(NULL),
_dwType(0)
{
ENLIST_TRACKING(CEmail);
}
HRESULT
CEmail::CreateEmail(
REFIID riid,
void **ppvObj
)
{
CEmail FAR * pEmail = NULL;
HRESULT hr = S_OK;
hr = AllocateEmailObject(&pEmail);
BAIL_ON_FAILURE(hr);
hr = pEmail->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pEmail->Release();
RRETURN(hr);
error:
delete pEmail;
RRETURN(hr);
}
CEmail::~CEmail( )
{
delete _pDispMgr;
if (_szAddress) {
FreeADsStr(_szAddress);
}
}
STDMETHODIMP
CEmail::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsEmail FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsEmail))
{
*ppv = (IADsEmail FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsEmail FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CEmail::AllocateEmailObject(
CEmail ** ppEmail
)
{
CEmail FAR * pEmail = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pEmail = new CEmail();
if (pEmail == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsEmail,
(IADsEmail *)pEmail,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pEmail->_pDispMgr = pDispMgr;
*ppEmail = pEmail;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CEmail::get_Address(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_szAddress, retval);
RRETURN(hr);
}
STDMETHODIMP
CEmail::put_Address(THIS_ BSTR bstrAddress)
{
if (!bstrAddress) {
RRETURN(E_FAIL);
}
if (_szAddress) {
FreeADsStr(_szAddress);
}
_szAddress = AllocADsStr(bstrAddress);
if (!_szAddress) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
STDMETHODIMP
CEmail::get_Type(THIS_ long FAR * retval)
{
*retval = _dwType;
RRETURN(S_OK);
}
STDMETHODIMP
CEmail::put_Type(THIS_ long lnType)
{
_dwType = lnType;
RRETURN(S_OK);
}
DEFINE_IDispatch_Implementation(CPath)
CPath::CPath():
_pDispMgr(NULL),
_dwType(0),
_lpVolumeName(NULL),
_lpPath(NULL)
{
ENLIST_TRACKING(CPath);
}
HRESULT
CPath::CreatePath(
REFIID riid,
void **ppvObj
)
{
CPath FAR * pPath = NULL;
HRESULT hr = S_OK;
hr = AllocatePathObject(&pPath);
BAIL_ON_FAILURE(hr);
hr = pPath->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pPath->Release();
RRETURN(hr);
error:
delete pPath;
RRETURN(hr);
}
CPath::~CPath( )
{
delete _pDispMgr;
if (_lpVolumeName) {
FreeADsStr(_lpVolumeName);
}
if (_lpPath) {
FreeADsStr(_lpPath);
}
}
STDMETHODIMP
CPath::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsPath FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsPath))
{
*ppv = (IADsPath FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsPath FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CPath::AllocatePathObject(
CPath ** ppPath
)
{
CPath FAR * pPath = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pPath = new CPath();
if (pPath == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsPath,
(IADsPath *)pPath,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pPath->_pDispMgr = pDispMgr;
*ppPath = pPath;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CPath::get_Type(THIS_ long FAR * retval)
{
*retval = _dwType;
RRETURN(S_OK);
}
STDMETHODIMP
CPath::put_Type(THIS_ long lnType)
{
_dwType = lnType;
RRETURN(S_OK);
}
STDMETHODIMP
CPath::get_VolumeName(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_lpVolumeName, retval);
RRETURN(hr);
}
STDMETHODIMP
CPath::put_VolumeName(THIS_ BSTR bstrVolumeName)
{
if (!bstrVolumeName) {
RRETURN(E_FAIL);
}
if (_lpVolumeName) {
FreeADsStr(_lpVolumeName);
}
_lpVolumeName= AllocADsStr(bstrVolumeName);
if (!_lpVolumeName) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
STDMETHODIMP
CPath::get_Path(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_lpPath, retval);
RRETURN(hr);
}
STDMETHODIMP
CPath::put_Path(THIS_ BSTR bstrPath)
{
if (!bstrPath) {
RRETURN(E_FAIL);
}
if (_lpPath) {
FreeADsStr(_lpPath);
}
_lpPath= AllocADsStr(bstrPath);
if (!_lpPath) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
//////////////////////////////////////////////////////////////////////////
DEFINE_IDispatch_Implementation(CReplicaPointer)
CReplicaPointer::CReplicaPointer():
_pDispMgr(NULL),
_lpServerName(NULL),
_dwReplicaType(0),
_dwReplicaNumber(0),
_dwCount(0)
{
ENLIST_TRACKING(CReplicaPointer);
_ReplicaAddressHints.AddressType = 0;
_ReplicaAddressHints.AddressLength = 0;
_ReplicaAddressHints.Address = NULL;
}
HRESULT
CReplicaPointer::CreateReplicaPointer(
REFIID riid,
void **ppvObj
)
{
CReplicaPointer FAR * pReplicaPointer = NULL;
HRESULT hr = S_OK;
hr = AllocateReplicaPointerObject(&pReplicaPointer);
BAIL_ON_FAILURE(hr);
hr = pReplicaPointer->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pReplicaPointer->Release();
RRETURN(hr);
error:
delete pReplicaPointer;
RRETURN(hr);
}
CReplicaPointer::~CReplicaPointer( )
{
delete _pDispMgr;
if (_lpServerName) {
FreeADsStr(_lpServerName);
}
if (_ReplicaAddressHints.Address) {
FreeADsMem(_ReplicaAddressHints.Address);
}
}
STDMETHODIMP
CReplicaPointer::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsReplicaPointer FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsReplicaPointer))
{
*ppv = (IADsReplicaPointer FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsReplicaPointer FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CReplicaPointer::AllocateReplicaPointerObject(
CReplicaPointer ** ppReplicaPointer
)
{
CReplicaPointer FAR * pReplicaPointer = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pReplicaPointer = new CReplicaPointer();
if (pReplicaPointer == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsReplicaPointer,
(IADsReplicaPointer *)pReplicaPointer,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pReplicaPointer->_pDispMgr = pDispMgr;
*ppReplicaPointer = pReplicaPointer;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CReplicaPointer::get_ReplicaType(THIS_ long FAR * retval)
{
*retval = _dwReplicaType;
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::put_ReplicaType(THIS_ long lnReplicaType)
{
_dwReplicaType = lnReplicaType;
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::get_ReplicaNumber(THIS_ long FAR * retval)
{
*retval = _dwReplicaNumber;
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::put_ReplicaNumber(THIS_ long lnReplicaNumber)
{
_dwReplicaNumber = lnReplicaNumber;
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::get_Count(THIS_ long FAR * retval)
{
*retval = _dwCount;
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::put_Count(THIS_ long lnCount)
{
_dwCount = lnCount;
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::get_ServerName(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_lpServerName, retval);
RRETURN(hr);
}
STDMETHODIMP
CReplicaPointer::put_ServerName(THIS_ BSTR bstrServerName)
{
if (!bstrServerName) {
RRETURN(E_FAIL);
}
if (_lpServerName) {
FreeADsStr(_lpServerName);
}
_lpServerName= AllocADsStr(bstrServerName);
if (!_lpServerName) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
STDMETHODIMP
CReplicaPointer::get_ReplicaAddressHints(THIS_ VARIANT* pValAddress)
{
HRESULT hr = S_OK;
NDSOBJECT object;
memcpy(&object.NdsValue.value_12,
&_ReplicaAddressHints,
sizeof(NDS_ASN1_TYPE_12));
hr = NdsTypeToVarTypeCopyNDSSynId12(
&object,
pValAddress
);
RRETURN(hr);
}
STDMETHODIMP
CReplicaPointer::put_ReplicaAddressHints(THIS_ VARIANT ValAddress)
{
HRESULT hr;
NDSOBJECT object;
if (_ReplicaAddressHints.Address) {
FreeADsMem(_ReplicaAddressHints.Address);
}
hr = VarTypeToNdsTypeCopyNDSSynId12(
&ValAddress,
&object
);
BAIL_ON_FAILURE(hr);
memcpy(&_ReplicaAddressHints,
&object.NdsValue.value_12,
sizeof(NDS_ASN1_TYPE_12));
error:
RRETURN(hr);
}
DEFINE_IDispatch_Implementation(CTimestamp)
CTimestamp::CTimestamp():
_pDispMgr(NULL),
_dwWholeSeconds(0),
_dwEventID(0)
{
ENLIST_TRACKING(CTimestamp);
}
HRESULT
CTimestamp::CreateTimestamp(
REFIID riid,
void **ppvObj
)
{
CTimestamp FAR * pTime = NULL;
HRESULT hr = S_OK;
hr = AllocateTimestampObject(&pTime);
BAIL_ON_FAILURE(hr);
hr = pTime->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pTime->Release();
RRETURN(hr);
error:
delete pTime;
RRETURN(hr);
}
CTimestamp::~CTimestamp( )
{
delete _pDispMgr;
}
STDMETHODIMP
CTimestamp::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsTimestamp FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsTimestamp))
{
*ppv = (IADsTimestamp FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsTimestamp FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CTimestamp::AllocateTimestampObject(
CTimestamp ** ppTime
)
{
CTimestamp FAR * pTime = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pTime = new CTimestamp();
if (pTime == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsTimestamp,
(IADsTimestamp *)pTime,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pTime->_pDispMgr = pDispMgr;
*ppTime = pTime;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CTimestamp::get_WholeSeconds(THIS_ long FAR * retval)
{
*retval = _dwWholeSeconds;
RRETURN(S_OK);
}
STDMETHODIMP
CTimestamp::put_WholeSeconds(THIS_ long lnWholeSeconds)
{
_dwWholeSeconds = lnWholeSeconds;
RRETURN(S_OK);
}
STDMETHODIMP
CTimestamp::get_EventID(THIS_ long FAR * retval)
{
*retval = _dwEventID;
RRETURN(S_OK);
}
STDMETHODIMP
CTimestamp::put_EventID(THIS_ long lnEventID)
{
_dwEventID = lnEventID;
RRETURN(S_OK);
}
DEFINE_IDispatch_Implementation(CPostalAddress)
CPostalAddress::CPostalAddress():
_pDispMgr(NULL),
_rgszPostalAddress(NULL),
_dwNumElement(0)
{
ENLIST_TRACKING(CPostalAddress);
}
HRESULT
CPostalAddress::CreatePostalAddress(
REFIID riid,
void **ppvObj
)
{
CPostalAddress FAR * pPostalAddress = NULL;
HRESULT hr = S_OK;
hr = AllocatePostalAddressObject(&pPostalAddress);
BAIL_ON_FAILURE(hr);
hr = pPostalAddress->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pPostalAddress->Release();
RRETURN(hr);
error:
delete pPostalAddress;
RRETURN(hr);
}
CPostalAddress::~CPostalAddress( )
{
delete _pDispMgr;
if (_rgszPostalAddress) {
long i;
for (i=0;i<(long)_dwNumElement;i++) {
if (_rgszPostalAddress[i]) {
FreeADsStr(_rgszPostalAddress[i]);
}
}
FreeADsMem(_rgszPostalAddress);
}
}
STDMETHODIMP
CPostalAddress::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsPostalAddress FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsPostalAddress))
{
*ppv = (IADsPostalAddress FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsPostalAddress FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CPostalAddress::AllocatePostalAddressObject(
CPostalAddress ** ppPostalAddress
)
{
CPostalAddress FAR * pPostalAddress = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pPostalAddress = new CPostalAddress();
if (pPostalAddress == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsPostalAddress,
(IADsPostalAddress *)pPostalAddress,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pPostalAddress->_pDispMgr = pDispMgr;
*ppPostalAddress = pPostalAddress;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CPostalAddress::get_PostalAddress(THIS_ VARIANT FAR * pVarDestObject)
{
HRESULT hr = S_OK;
hr = ConvertStringArrayToSafeBstrArray(
_rgszPostalAddress,
_dwNumElement,
pVarDestObject);
RRETURN(hr);
}
STDMETHODIMP
CPostalAddress::put_PostalAddress(THIS_ VARIANT VarSrcObject)
{
HRESULT hr = S_OK;
SAFEARRAY * pArray = NULL;
if (_rgszPostalAddress) {
long i;
for (i=0;i<(long)_dwNumElement;i++) {
if (_rgszPostalAddress[i]) {
FreeADsStr(_rgszPostalAddress[i]);
}
}
FreeADsMem(_rgszPostalAddress);
}
//
// Make sure it has 6 elements
//
if(!((V_VT(&VarSrcObject) & VT_VARIANT) && V_ISARRAY(&VarSrcObject)))
RRETURN(E_FAIL);
if (V_VT(&VarSrcObject) & VT_BYREF)
pArray = *(V_ARRAYREF(&VarSrcObject));
else
pArray = V_ARRAY(&VarSrcObject);
if ((pArray->rgsabound[0].cElements > 6) || (pArray->rgsabound[0].cElements <= 0)){
RRETURN(E_FAIL);
}
hr = ConvertSafeBstrArrayToStringArray(
VarSrcObject,
&_rgszPostalAddress,
&_dwNumElement);
RRETURN(hr);
}
//////////////////////////////////////////////////////////////////////////
DEFINE_IDispatch_Implementation(CBackLink)
CBackLink::CBackLink():
_pDispMgr(NULL),
_lpObjectName(NULL),
_dwRemoteID(0)
{
ENLIST_TRACKING(CBackLink);
}
HRESULT
CBackLink::CreateBackLink(
REFIID riid,
void **ppvObj
)
{
CBackLink FAR * pBackLink = NULL;
HRESULT hr = S_OK;
hr = AllocateBackLinkObject(&pBackLink);
BAIL_ON_FAILURE(hr);
hr = pBackLink->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pBackLink->Release();
RRETURN(hr);
error:
delete pBackLink;
RRETURN(hr);
}
CBackLink::~CBackLink( )
{
delete _pDispMgr;
if (_lpObjectName) {
FreeADsStr(_lpObjectName);
}
}
STDMETHODIMP
CBackLink::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsBackLink FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsBackLink))
{
*ppv = (IADsBackLink FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsBackLink FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CBackLink::AllocateBackLinkObject(
CBackLink ** ppBackLink
)
{
CBackLink FAR * pBackLink = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pBackLink = new CBackLink();
if (pBackLink == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsBackLink,
(IADsBackLink *)pBackLink,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pBackLink->_pDispMgr = pDispMgr;
*ppBackLink = pBackLink;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CBackLink::get_RemoteID(THIS_ long FAR * retval)
{
*retval = _dwRemoteID;
RRETURN(S_OK);
}
STDMETHODIMP
CBackLink::put_RemoteID(THIS_ long lnRemoteID)
{
_dwRemoteID = lnRemoteID;
RRETURN(S_OK);
}
STDMETHODIMP
CBackLink::get_ObjectName(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_lpObjectName, retval);
RRETURN(hr);
}
STDMETHODIMP
CBackLink::put_ObjectName(THIS_ BSTR bstrObjectName)
{
if (!bstrObjectName) {
RRETURN(E_FAIL);
}
if (_lpObjectName) {
FreeADsStr(_lpObjectName);
}
_lpObjectName= AllocADsStr(bstrObjectName);
if (!_lpObjectName) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
//////////////////////////////////////////////////////////////////////////
DEFINE_IDispatch_Implementation(CTypedName)
CTypedName::CTypedName():
_pDispMgr(NULL),
_lpObjectName(NULL),
_dwLevel(0),
_dwInterval(0)
{
ENLIST_TRACKING(CTypedName);
}
HRESULT
CTypedName::CreateTypedName(
REFIID riid,
void **ppvObj
)
{
CTypedName FAR * pTypedName = NULL;
HRESULT hr = S_OK;
hr = AllocateTypedNameObject(&pTypedName);
BAIL_ON_FAILURE(hr);
hr = pTypedName->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pTypedName->Release();
RRETURN(hr);
error:
delete pTypedName;
RRETURN(hr);
}
CTypedName::~CTypedName( )
{
delete _pDispMgr;
if (_lpObjectName) {
FreeADsStr(_lpObjectName);
}
}
STDMETHODIMP
CTypedName::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsTypedName FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsTypedName))
{
*ppv = (IADsTypedName FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsTypedName FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CTypedName::AllocateTypedNameObject(
CTypedName ** ppTypedName
)
{
CTypedName FAR * pTypedName = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pTypedName = new CTypedName();
if (pTypedName == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsTypedName,
(IADsTypedName *)pTypedName,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pTypedName->_pDispMgr = pDispMgr;
*ppTypedName = pTypedName;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CTypedName::get_Interval(THIS_ long FAR * retval)
{
*retval = _dwInterval;
RRETURN(S_OK);
}
STDMETHODIMP
CTypedName::put_Interval(THIS_ long lnInterval)
{
_dwInterval = lnInterval;
RRETURN(S_OK);
}
STDMETHODIMP
CTypedName::get_Level(THIS_ long FAR * retval)
{
*retval = _dwLevel;
RRETURN(S_OK);
}
STDMETHODIMP
CTypedName::put_Level(THIS_ long lnLevel)
{
_dwLevel = lnLevel;
RRETURN(S_OK);
}
STDMETHODIMP
CTypedName::get_ObjectName(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_lpObjectName, retval);
RRETURN(hr);
}
STDMETHODIMP
CTypedName::put_ObjectName(THIS_ BSTR bstrObjectName)
{
if (!bstrObjectName) {
RRETURN(E_FAIL);
}
if (_lpObjectName) {
FreeADsStr(_lpObjectName);
}
_lpObjectName= AllocADsStr(bstrObjectName);
if (!_lpObjectName) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}
DEFINE_IDispatch_Implementation(CHold)
CHold::CHold():
_pDispMgr(NULL),
_lpObjectName(NULL),
_dwAmount(0)
{
ENLIST_TRACKING(CHold);
}
HRESULT
CHold::CreateHold(
REFIID riid,
void **ppvObj
)
{
CHold FAR * pHold = NULL;
HRESULT hr = S_OK;
hr = AllocateHoldObject(&pHold);
BAIL_ON_FAILURE(hr);
hr = pHold->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pHold->Release();
RRETURN(hr);
error:
delete pHold;
RRETURN(hr);
}
CHold::~CHold( )
{
delete _pDispMgr;
if (_lpObjectName) {
FreeADsStr(_lpObjectName);
}
}
STDMETHODIMP
CHold::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsHold FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsHold))
{
*ppv = (IADsHold FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsHold FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT
CHold::AllocateHoldObject(
CHold ** ppHold
)
{
CHold FAR * pHold = NULL;
CDispatchMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pHold = new CHold();
if (pHold == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CDispatchMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsHold,
(IADsHold *)pHold,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pHold->_pDispMgr = pDispMgr;
*ppHold = pHold;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP
CHold::get_Amount(THIS_ long FAR * retval)
{
*retval = _dwAmount;
RRETURN(S_OK);
}
STDMETHODIMP
CHold::put_Amount(THIS_ long lnAmount)
{
_dwAmount = lnAmount;
RRETURN(S_OK);
}
STDMETHODIMP
CHold::get_ObjectName(THIS_ BSTR FAR * retval)
{
HRESULT hr = S_OK;
hr = ADsAllocString(_lpObjectName, retval);
RRETURN(hr);
}
STDMETHODIMP
CHold::put_ObjectName(THIS_ BSTR bstrObjectName)
{
if (!bstrObjectName) {
RRETURN(E_FAIL);
}
if (_lpObjectName) {
FreeADsStr(_lpObjectName);
}
_lpObjectName= AllocADsStr(bstrObjectName);
if (!_lpObjectName) {
RRETURN(E_OUTOFMEMORY);
}
RRETURN(S_OK);
}