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

269 lines
6.3 KiB
C++

// RcULProvider.cpp : Implementation of CRcULProvider
#include "stdafx.h"
//#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") implementation_only
#include "RcHandler.h"
#include "RcULProvider.h"
//#include <adoid.h>
//#include <adoint.h>
/*static _variant_t GetXmlValues (IXMLDOMDocument *pxdDoc,
_bstr_t sElement,
_bstr_t sAttr,
HRESULT *hr);
static HRESULT UploadRCData (_variant_t vtType,
_variant_t vtName,
_variant_t vtDesc,
_variant_t vtShareLoc);
#define __UNICODE_MARKER_ 0xfeff
struct InitOle {
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;
*/
/////////////////////////////////////////////////////////////////////////////
// CRcULProvider
HRESULT CRcULProvider::ValidateClient(IULServer* pServer, IULSession* pJob)
{
// This is not used for this provider
return NOERROR;
}
HRESULT CRcULProvider::DataAvailable(IULServer* pServer, IULSession* pJob)
{
// This is not used for this provider
return NOERROR;
}
HRESULT CRcULProvider::TransferComplete(IULServer* pSrv, IULSession* pJob)
{
HRESULT hr = NOERROR;
IStream *pStm = NULL;
DWORD dwPassHigh, dwPassLow, cbAvail;
/* LARGE_INTEGER liSeekPos = {0, 0};
ULARGE_INTEGER luNewPos;
WCHAR *xmlString = NULL;
STATSTG statIStream;
ULONG iStmSize, cbRead;
VARIANT_BOOL vtbRes;
CComPtr<IXMLDOMDocument> pxdDoc;
_variant_t vtTypeVal, vtNameVal, vtDescVal, vtShareLocation;
if (pSrv == NULL || pJob == NULL)
{
hr = E_INVALIDARG;
goto done;
}
hr = pJob->get_SizeAvailable(&cbAvail);
if (FAILED(hr) || cbAvail <=0 )
{
hr = E_FAIL;
goto done;
}
hr = pJob->get_Data(&pStm);
if (FAILED(hr))
{
// No data available
hr = E_FAIL;
goto done;
}
// Get the size of the stream
hr = pStm->Seek (liSeekPos, STREAM_SEEK_END, &luNewPos);
if (hr != S_OK)
goto done;
hr = pStm->Stat (&statIStream, STATFLAG_NONAME);
if (hr != S_OK)
goto done;
iStmSize = (int) statIStream.cbSize.QuadPart;
xmlString = (WCHAR *) malloc (iStmSize);
if (xmlString == (WCHAR *) NULL)
goto done;
//Rewind and read from the stream
hr = pStm->Seek (liSeekPos, STREAM_SEEK_SET, &luNewPos);
if (hr != S_OK)
goto done;
_ASSERT (liSeekPos.QuadPart == luNewPos.QuadPart);
hr = pStm->Read (xmlString, iStmSize, &cbRead);
if (hr != S_OK)
goto done;
_ASSERT (stmSize == cbRead);
hr = CoCreateInstance(CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument,
(void**)&pxdDoc);
if (hr != S_OK)
goto done;
// Read the xml string into the xml document
if (*(xmlString+0) == __UNICODE_MARKER_)
hr = pxdDoc->loadXML ((xmlString+1), &vtbRes);
else
hr = pxdDoc->loadXML (xmlString, &vtbRes);
if (hr != S_OK || vtbRes != VARIANT_TRUE)
goto done;
// Don't know if we need the Type value at all.
// There's only one type that we handle now
vtTypeVal = GetXmlValues (pxdDoc, L"UPLOADINFO", L"TYPE", &hr);
if (hr != S_OK)
goto done;
vtNameVal = GetXmlValues (pxdDoc, L"UPLOADDATA", L"USERNAME", &hr);
if (hr != S_OK)
goto done;
vtDescVal = GetXmlValues (pxdDoc, L"UPLOADDATA", L"PROBLEMDESCRIPTION", &hr);
if (hr != S_OK)
goto done;
//Fill in these values in the database
vtShareLocation.SetString ("\\\\prav02\\shared\\XML\\");
hr = UploadRCData (vtTypeVal, vtNameVal, vtDescVal,
vtShareLocation);
if (hr != S_OK)
goto done;
*/
done:
return hr;
}
// Utility functions internal to this file
/*
static _variant_t GetXmlValues (IXMLDOMDocument *pxdDoc,
_bstr_t sElement,
_bstr_t sAttr,
HRESULT *hr)
{
_variant_t vtAttrVal;
CComPtr<IXMLDOMNodeList> pxnlElement;
CComPtr<IXMLDOMNode> pxnElement, pxnAttr;
CComPtr<IXMLDOMNamedNodeMap> pxnmAttr;
*hr = E_FAIL;
vtAttrVal.SetString ("");
*hr = pxdDoc->getElementsByTagName (sElement, &pxnlElement);
if (*hr != S_OK)
return vtAttrVal;
*hr = pxnlElement->get_item (0L, &pxnElement);
if (*hr != S_OK)
return vtAttrVal;
*hr = pxnElement->get_attributes(&pxnmAttr);
if (*hr != S_OK)
return vtAttrVal;
*hr = pxnmAttr->getNamedItem (sAttr, &pxnAttr);
if (*hr != S_OK)
return vtAttrVal;
*hr = pxnAttr->get_nodeValue (&vtAttrVal);
if (*hr != S_OK)
return vtAttrVal;
*hr = S_OK;
return vtAttrVal;
}
static HRESULT UploadRCData (_variant_t vtType,
_variant_t vtName,
_variant_t vtDesc,
_variant_t vtShareLoc)
{
_ConnectionPtr pConn;
_CommandPtr pCmd;
_ParameterPtr pParam;
HRESULT hr;
_variant_t vtParam;
// Open the connection
hr = pConn.CreateInstance (__uuidof(Connection));
if (hr != S_OK)
return hr;
// hard coded connection string for now
pConn->ConnectionString = L"driver={sql server};server=prav02;Database=test;UID=sa;PWD=;";
pConn->Open ("", "", "", -1);
hr = pCmd.CreateInstance(__uuidof(Command));
if (hr != S_OK)
return hr;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText = L"sp_AddRCIncident";
pCmd->CommandType = adCmdStoredProc;
hr = pCmd->Parameters->Append
(pCmd->CreateParameter (L"sDescription",
adVarWChar,
adParamInput,
1000,
vtDesc));
if (hr != S_OK)
return hr;
hr = pCmd->Parameters->Append
(pCmd->CreateParameter (L"sUserName",
adVarWChar,
adParamInput,
200,
vtName));
if (hr != S_OK)
return hr;
hr = pCmd->Parameters->Append
(pCmd->CreateParameter (L"sShare",
adVarWChar,
adParamInput,
1000,
vtShareLoc));
if (hr != S_OK)
return hr;
hr = pCmd->Parameters->Append
(pCmd->CreateParameter (L"iError",
adInteger,
adParamOutput,
0));
if (hr != S_OK)
return hr;
pCmd->Execute (NULL, NULL, adExecuteNoRecords);
// check the return value for errors
pParam = pCmd->Parameters->GetItem (_variant_t (L"iError"));
vtParam = pParam->GetAttributes();
if ((vtParam.vt != VT_I4) || (vtParam.intVal != 0))
hr = E_FAIL;
return hr;
}
*/