2541 lines
47 KiB
C++
2541 lines
47 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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|