#include "procs.hxx" #pragma hdrstop #include "macro.h" HRESULT PackStringinVariant( BSTR bstrString, VARIANT * pvarInputData ) { HRESULT hr = S_OK; if ( bstrString == NULL ) RRETURN(E_FAIL); VariantInit(pvarInputData); pvarInputData->vt = VT_BSTR; if (!bstrString) { V_BSTR(pvarInputData) = NULL; RRETURN(S_OK); } hr = ADsAllocString(bstrString, &(V_BSTR(pvarInputData))); RRETURN(hr); } HRESULT UnpackStringfromVariant( VARIANT varSrcData, BSTR * pbstrDestString ) { HRESULT hr = S_OK; if( varSrcData.vt != VT_BSTR){ RRETURN(E_ADS_CANT_CONVERT_DATATYPE); } if (!V_BSTR(&varSrcData)) { *pbstrDestString = NULL; RRETURN(S_OK); } hr = ADsAllocString(V_BSTR(&varSrcData), pbstrDestString); RRETURN(hr); } HRESULT PackLONGinVariant( LONG lValue, VARIANT * pvarInputData ) { VariantInit(pvarInputData); pvarInputData->vt = VT_I4; V_I4(pvarInputData) = lValue; RRETURN(S_OK); } HRESULT UnpackLONGfromVariant( VARIANT varSrcData, LONG * plValue ) { if( varSrcData.vt != VT_I4){ RRETURN(E_ADS_CANT_CONVERT_DATATYPE); } *plValue = V_I4(&varSrcData); RRETURN(S_OK); } HRESULT PackDATEinVariant( DATE daValue, VARIANT * pvarInputData ) { VariantInit(pvarInputData); pvarInputData->vt = VT_DATE; V_DATE(pvarInputData) = daValue; RRETURN(S_OK); } HRESULT UnpackDATEfromVariant( VARIANT varSrcData, DATE * pdaValue ) { if( varSrcData.vt != VT_DATE){ RRETURN(E_ADS_CANT_CONVERT_DATATYPE); } *pdaValue = V_DATE(&varSrcData); RRETURN(S_OK); } HRESULT PackFILETIMEinVariant( DATE daValue, VARIANT * pvarInputData ) { IADsLargeInteger *pTime = NULL; VARIANT var; SYSTEMTIME systemtime; FILETIME filetime; HRESULT hr = S_OK; if (VariantTimeToSystemTime(daValue, &systemtime) == 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if (SystemTimeToFileTime(&systemtime, &filetime) == 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if (LocalFileTimeToFileTime(&filetime, &filetime ) == 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } hr = CoCreateInstance( CLSID_LargeInteger, NULL, CLSCTX_ALL, IID_IADsLargeInteger, (void**)&pTime ); BAIL_ON_FAILURE(hr); hr = pTime->put_HighPart(filetime.dwHighDateTime); BAIL_ON_FAILURE(hr); hr = pTime->put_LowPart(filetime.dwLowDateTime); BAIL_ON_FAILURE(hr); VariantInit(pvarInputData); pvarInputData->pdispVal = pTime; pvarInputData->vt = VT_DISPATCH; error: return hr; } HRESULT UnpackFILETIMEfromVariant( VARIANT varSrcData, DATE * pdaValue ) { IADsLargeInteger *pLarge = NULL; IDispatch *pDispatch = NULL; FILETIME filetime; FILETIME locFiletime; SYSTEMTIME systemtime; DATE date; HRESULT hr = S_OK; if( varSrcData.vt != VT_DISPATCH){ RRETURN(E_ADS_CANT_CONVERT_DATATYPE); } pDispatch = varSrcData.pdispVal; hr = pDispatch->QueryInterface(IID_IADsLargeInteger, (VOID **) &pLarge); BAIL_ON_FAILURE(hr); hr = pLarge->get_HighPart((long*)&filetime.dwHighDateTime); BAIL_ON_FAILURE(hr); hr = pLarge->get_LowPart((long*)&filetime.dwLowDateTime); BAIL_ON_FAILURE(hr); // // time is "0" actually means that either user never logs on or property not known // if (filetime.dwLowDateTime == 0 && filetime.dwHighDateTime == 0) { hr = E_ADS_PROPERTY_NOT_FOUND; BAIL_ON_FAILURE(hr); } if (FileTimeToLocalFileTime(&filetime, &locFiletime) == 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if (FileTimeToSystemTime(&locFiletime, &systemtime) == 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } if (SystemTimeToVariantTime(&systemtime, &date) == 0) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } *pdaValue = date; error: if(pLarge) { pLarge->Release(); pLarge = NULL; } return hr; } HRESULT PackVARIANT_BOOLinVariant( VARIANT_BOOL fValue, VARIANT * pvarInputData ) { VariantInit(pvarInputData); pvarInputData->vt = VT_BOOL; V_BOOL(pvarInputData) = fValue; RRETURN(S_OK); } HRESULT UnpackVARIANT_BOOLfromVariant( VARIANT varSrcData, VARIANT_BOOL * pfValue ) { if( varSrcData.vt != VT_BOOL){ RRETURN(E_ADS_CANT_CONVERT_DATATYPE); } *pfValue = V_BOOL(&varSrcData); RRETURN(S_OK); } HRESULT PackVARIANTinVariant( VARIANT vaValue, VARIANT * pvarInputData ) { VariantInit(pvarInputData); pvarInputData->vt = VT_VARIANT; RRETURN( VariantCopy( pvarInputData, &vaValue )); } HRESULT UnpackVARIANTfromVariant( VARIANT varSrcData, VARIANT * pvaValue ) { VariantInit( pvaValue ); RRETURN( VariantCopy( pvaValue, &varSrcData )); } HRESULT PackDATEinLONGVariant( DATE daValue, VARIANT * pvarInputData ) { LONG lValue; HRESULT hr = S_OK; SYSTEMTIME stSystemTime; SYSTEMTIME LocalTime; FILETIME LocalFileTime; FILETIME FileTimeCurrent; DATE date ; BOOL fRetval; VariantInit(pvarInputData); if( hr = ConvertDATEToSYSTEMTIME(daValue, &LocalTime) ) { RRETURN( hr ); } fRetval = SystemTimeToFileTime(&LocalTime, &LocalFileTime); if(!fRetval){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } fRetval = LocalFileTimeToFileTime( &LocalFileTime, &FileTimeCurrent ); if(!fRetval){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } fRetval = FileTimeToSystemTime(&FileTimeCurrent, &stSystemTime); if(!fRetval){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } lValue = stSystemTime.wHour * 60 + stSystemTime.wMinute; pvarInputData->vt = VT_I4; V_I4(pvarInputData) = lValue; RRETURN(S_OK); } HRESULT UnpackDATEfromLONGVariant( VARIANT varSrcData, DATE * pdaValue ) { LONG lValue; SYSTEMTIME stSystemTime; SYSTEMTIME LocalTime; DATE date ; BOOL fRetval; HRESULT hr = S_OK; if( varSrcData.vt != VT_I4){ RRETURN(E_ADS_CANT_CONVERT_DATATYPE); } lValue = V_I4(&varSrcData); GetSystemTime( &stSystemTime); stSystemTime.wHour = (WORD)(lValue)/60; stSystemTime.wMinute = (WORD)(lValue)%60; stSystemTime.wSecond =0; stSystemTime.wMilliseconds = 0; fRetval = SystemTimeToTzSpecificLocalTime( NULL, &stSystemTime, &LocalTime ); if(!fRetval){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } hr = ConvertSystemTimeToDATE (LocalTime, pdaValue); //lpVarDestObject->date = date - (DWORD)date; RRETURN(hr); }