2025-04-27 07:49:33 -04:00

318 lines
8.8 KiB
C++

/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
PIPEPRXO.CPP
Abstract:
Definees the proxy pipe operation classes
History:
alanbos 18-Dec-97 Created.
--*/
#include "precomp.h"
// CProxyOperation_LPipe_CreateEnum
void CProxyOperation_LPipe_CreateEnum::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_parent);
encodeStream.WriteLong(m_flags);
EncodeContext (encodeStream);
if (IsAsync ())
encodeStream.WriteDWORD(m_pHandler);
}
// CProxyOperation_LPipe_Delete
void CProxyOperation_LPipe_Delete::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_path);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
if (IsAsync ())
encodeStream.WriteDWORD (m_pHandler);
else
encodeStream.WriteLong((long) GetResultObjectPP ());
}
// CProxyOperation_LPipe_ExecQuery
void CProxyOperation_LPipe_ExecQuery::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_queryLanguage);
encodeStream.WriteBSTR(m_query);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
if (IsAsync ())
encodeStream.WriteDWORD(m_pHandler);
}
// CProxyOperation_LPipe_GetObject
void CProxyOperation_LPipe_GetObject::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_path);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
if (IsAsync ())
encodeStream.WriteDWORD((DWORD)m_pHandler);
else
{
encodeStream.WriteLong((long) m_ppObject);
encodeStream.WriteLong((long) GetResultObjectPP ());
}
}
void CProxyOperation_LPipe_GetObject::DecodeOp (CTransportStream& decodeStream)
{
if (!IsAsync () && ( SUCCEEDED (GetStatus ())))
{
*m_ppObject = CreateClassObject(&decodeStream);
SetStatus ((bVerifyPointer(*m_ppObject)) ? WBEM_NO_ERROR : WBEM_E_OUT_OF_MEMORY);
if(WBEM_NO_ERROR == GetStatus ())
{
// bVerifyPointer AddRef's if successul
IUnknown *pIUnknown = (IUnknown *)*m_ppObject;
pIUnknown->Release();
}
}
// Look for stub address of IWbemCallResult if client requested it
if (GetResultObjectPP ())
DecodeStubAddress (CALLRESULT, decodeStream);
}
// CProxyOperation_LPipe_OpenNamespace
void CProxyOperation_LPipe_OpenNamespace::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_path);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
encodeStream.WriteLong((long) GetResultObjectPP ());
}
void CProxyOperation_LPipe_OpenNamespace::DecodeOp (CTransportStream& decodeStream)
{
if ( SUCCEEDED (GetStatus ()))
// It's OK to have an invalid stub address if we're doing semisynchronous
DecodeStubAddress (PROVIDER, decodeStream, !(GetResultObjectPP ()));
if (GetResultObjectPP ())
DecodeStubAddress (CALLRESULT, decodeStream);
}
// CProxyOperation_LPipe_Put
void CProxyOperation_LPipe_Put::EncodeOp (CTransportStream& encodeStream)
{
((CWbemObject *)(m_pObject))->WriteToStream(&encodeStream);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
if (IsAsync ())
encodeStream.WriteDWORD (m_pHandler);
else
encodeStream.WriteLong((long) GetResultObjectPP ());
}
// CProxyOperation_LPipe_ExecMethod
void CProxyOperation_LPipe_ExecMethod::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_path);
encodeStream.WriteBSTR(m_method);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
if (m_pInParams)
{
encodeStream.WriteLong (1);
((CWbemObject *)(m_pInParams))->WriteToStream(&encodeStream);
}
else
encodeStream.WriteLong (0);
if (IsAsync ())
encodeStream.WriteDWORD((DWORD)m_pHandler);
else
{
encodeStream.WriteLong((long) m_ppOutParams);
encodeStream.WriteLong((long) GetResultObjectPP());
}
}
void CProxyOperation_LPipe_ExecMethod::DecodeOp (CTransportStream& decodeStream)
{
if (!IsAsync () && ( SUCCEEDED (GetStatus ())))
{
*m_ppOutParams = CreateClassObject(&decodeStream);
SetStatus ((bVerifyPointer(*m_ppOutParams)) ? WBEM_NO_ERROR : WBEM_E_OUT_OF_MEMORY);
if( WBEM_NO_ERROR == GetStatus ())
{
// bVerifyPointer AddRef's if successul
IUnknown *pIUnknown = (IUnknown *)*m_ppOutParams;
pIUnknown->Release();
}
}
// Look for stub address of IWbemCallResult if client requested it
if (GetResultObjectPP ())
DecodeStubAddress (CALLRESULT, decodeStream);
}
// CProxyOperation_LPipe_RequestChallenge
void CProxyOperation_LPipe_RequestChallenge::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_pNetworkResource);
encodeStream.WriteBSTR(m_pUser);
}
void CProxyOperation_LPipe_RequestChallenge::DecodeOp (CTransportStream& decodeStream)
{
if(SUCCEEDED( GetStatus ()))
SetStatus (decodeStream.ReadBytes((void *)m_pNonce, DIGEST_SIZE));
}
// CProxyOperation_LPipe_EstablishPosition
void CProxyOperation_LPipe_EstablishPosition::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_pClientMachineName);
encodeStream.WriteDWORD(m_processId);
}
void CProxyOperation_LPipe_EstablishPosition::DecodeOp (CTransportStream& decodeStream)
{
if( SUCCEEDED (GetStatus ()))
SetStatus (decodeStream.ReadDWORD(m_pAuthEventHandle));
}
// CProxyOperation_LPipe_WBEMLogin
void CProxyOperation_LPipe_WBEMLogin::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_pPreferredLocale);
encodeStream.WriteBytes(m_accessToken,DIGEST_SIZE);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
}
// CProxyOperation_LPipe_SspiPreLogin
void CProxyOperation_LPipe_SspiPreLogin::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteLPSTR(m_pszSSPIPkg);
encodeStream.WriteLong(m_flags);
encodeStream.WriteLong(m_bufSize);
encodeStream.WriteBytes(m_pInToken,m_bufSize);
encodeStream.WriteLong(m_outBufSize);
encodeStream.WriteBSTR(m_pClientMachineName);
encodeStream.WriteDWORD(m_dwProcessID);
}
void CProxyOperation_LPipe_SspiPreLogin::DecodeOp (CTransportStream& decodeStream)
{
if( ! FAILED ( GetStatus () ) )
{
decodeStream.ReadLong(m_OutBufBytes);
if(decodeStream.Status() != CTransportStream::no_error)
SetStatus (WBEM_E_INVALID_STREAM);
else
{
HRESULT dwRet = decodeStream.ReadBytes(m_pOutToken, *m_OutBufBytes);
if(m_pAuthEventHandle)
dwRet |= decodeStream.ReadDWORD(m_pAuthEventHandle);
if ( FAILED ( dwRet ) )
SetStatus (dwRet);
}
}
}
// CProxyOperation_LPipe_Login
void CProxyOperation_LPipe_Login::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteBSTR(m_pNetworkResource);
encodeStream.WriteBSTR(m_pPreferredLocale);
encodeStream.WriteBytes(m_accessToken,DIGEST_SIZE);
encodeStream.WriteLong(m_flags);
EncodeContext(encodeStream);
}
// CProxyOperation_LPipe_Next
void CProxyOperation_LPipe_Next::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteLong(m_timeout);
// TODO - m_count was a LONG - should we really be writing a DWORD??
encodeStream.WriteDWORD(m_count);
}
void CProxyOperation_LPipe_Next::DecodeOp (CTransportStream& decodeStream)
{
if( SUCCEEDED ( GetStatus () ) )
{
decodeStream.ReadDWORD(m_pReturned);
for(DWORD dwLoop = 0; dwLoop < *m_pReturned &&
decodeStream.Status() == CTransportStream::no_error; dwLoop++)
{
// For each object, create a proxy and add a pointer to the
// object into the array.
// ========================================================
m_objArray [dwLoop] = CreateClassObject(&decodeStream);
if(!bVerifyPointer(m_objArray[dwLoop]))
break; // also do this in noteclie.cpp
m_objArray[dwLoop]->Release(); // set ref count to 1
}
if(dwLoop < *m_pReturned)
{
// got some sort of error, free all the ones that were
// allocated, set the error code.
DWORD dwDelTo = dwLoop;
for(dwLoop = 0; dwLoop < dwDelTo; dwLoop++)
delete m_objArray[dwLoop];
SetStatus (WBEM_E_FAILED);
}
}
}
// CProxyOperation_LPipe_GetResultObject
void CProxyOperation_LPipe_GetResultObject::EncodeOp (CTransportStream& encodeStream)
{
encodeStream.WriteLong (m_timeout);
if (*m_ppStatusObject)
{
if (CTransportStream::no_error !=
((CWbemObject *)*m_ppStatusObject)->WriteToStream (&encodeStream))
SetStatus (WBEM_E_INVALID_STREAM);
}
}
void CProxyOperation_LPipe_GetResultObject::DecodeOp (CTransportStream& decodeStream)
{
if (SUCCEEDED (GetStatus ()))
{
*m_ppStatusObject = CreateClassObject(&decodeStream);
if(!bVerifyPointer(*m_ppStatusObject))
SetStatus (WBEM_E_FAILED);
else
(*m_ppStatusObject)->Release(); // set ref count back to 1
}
}