Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

627 lines
16 KiB

//
// Client.cpp - client implementation
//
#include "precomp.h"
#include "bidispl.h"
#include "bidisplp.h"
#ifndef MODULE
#define MODULE "BIDITST:"
#endif
#ifdef DEBUG
MODULE_DEBUG_INIT( DBG_ERROR | DBG_WARNING | DBG_TRACE | DBG_INFO , DBG_ERROR );
#else
MODULE_DEBUG_INIT( DBG_ERROR | DBG_WARNING | DBG_TRACE, DBG_ERROR );
#endif
VOID DbgBreakPoint (VOID)
{
}
void DumpData (DWORD dwType, PBYTE pData, DWORD dwSize)
{
DBGMSG (DBG_INFO, ("dwType = %d, pData = %x, dwSize = %d\n", dwType, pData, dwSize)) ;
DWORD col = 0;
CHAR szBuf[512];
szBuf[0] = 0;
for (DWORD i = 0; i < dwSize; i++) {
sprintf (szBuf + strlen (szBuf), "%02x ", pData[i]);
if ((col ++) % 16 == 15) {
DBGMSG (DBG_INFO, ("%s\n", szBuf));
szBuf[0] = 0;
}
}
DBGMSG (DBG_INFO, ("%s\n", szBuf));
}
void DumpOutputData (DWORD dwType, PBYTE pData, DWORD dwSize)
{
DWORD i, col = 0;
CHAR szBuf[512];
szBuf[0] = 0;
printf ("\tdwType = %d, pData = %x, dwSize = %d\n", dwType, pData, dwSize);
switch (dwType) {
case BIDI_NULL:
printf("\tBIDI_NULL\n");
break;
case BIDI_INT:
printf ("\tBIDI_INT = %d\n", *(INT*)pData);
break;
case BIDI_FLOAT:
printf ("\tBIDI_FLOAT = %f\n", *(FLOAT*)pData);
break;
case BIDI_BOOL:
printf ("\tBIDI_BOOL = %d\n", *(BOOL*)pData);
break;
case BIDI_ENUM:
case BIDI_TEXT:
case BIDI_STRING:
printf ("\tBIDI_STRING = |%ws|\n", pData);
break;
case BIDI_BLOB:
printf ("\tBIDI_BLOB\n", pData);
for (i = 0; i < dwSize; i++) {
sprintf (szBuf + strlen (szBuf), "%02x ", pData[i]);
if ((col ++) % 16 == 15) {
printf ("%s\n", szBuf);
szBuf[0] = 0;
}
}
printf ("%s\n", szBuf);
default:
printf ("\tunsupported\n", pData);
}
}
void DumpRequest (IBidiRequest * pIRequest)
{
DWORD dwTotoal, i;
HRESULT hr, hResult;
LPWSTR pszSchema = NULL;
BYTE *pData;
DWORD uSize;
DWORD dwType;
DWORD dwTotal;
hr = pIRequest->GetResult (&hResult);
SPLASSERT (SUCCEEDED (hr));
hr = pIRequest->GetEnumCount (&dwTotal);
SPLASSERT (SUCCEEDED (hr));
printf("hr = %x; total = %d\n", hResult, dwTotal);
for (i = 0; i < dwTotal; i++) {
hr = pIRequest->GetOutputData (i, &pszSchema, &dwType, &pData, &uSize);
printf("%d: %ws\n", i, (pszSchema)?pszSchema:L"");
DumpOutputData (dwType, pData, uSize);
}
}
void DumpContainer (IBidiRequestContainer * pIReqContainer)
{
IBidiRequest * pRequest = NULL;
DWORD dwRef, i;
DWORD dwTotal;
HRESULT hr;
hr = pIReqContainer->GetRequestCount (&dwTotal);
SPLASSERT (SUCCEEDED (hr));
IEnumUnknown *pEnumIunk;
hr = pIReqContainer->GetEnumObject (&pEnumIunk) ;
SPLASSERT (SUCCEEDED (hr));
for (i = 0; i < dwTotal; i++){
IUnknown *pIunk;
DWORD dwFetched;
hr = pEnumIunk->Next (1, &pIunk, &dwFetched);
SPLASSERT (SUCCEEDED (hr));
SPLASSERT (dwFetched == 1);
IBidiRequest *pIRequest = NULL;
hr = pIunk->QueryInterface (IID_IBidiRequest, (void **) & pIRequest);
SPLASSERT (SUCCEEDED (hr));
DumpRequest (pIRequest);
dwRef = pIunk->Release();
dwRef = pIRequest->Release();
}
pEnumIunk->Release ();
}
void TestBidiRequest ()
{
HRESULT hr;
IBidiRequest * pIReq = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequest,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequest,
(void**)&pIReq) ;
if (SUCCEEDED(hr))
{
hr = pIReq->SetSchema (L"/printer/duplex");
DBGMSG (DBG_TRACE, ("SetSchema hr = %x\n", hr));
DWORD dwData = 30;
DumpData (1, (PBYTE) &dwData, sizeof (DWORD));
hr = pIReq->SetInputData (1, (LPBYTE) &dwData, sizeof (DWORD));
DBGMSG (DBG_TRACE, ("SetInputData hr = 0x%x\n", hr));
IBidiRequestSpl *pISpl = NULL;
hr = pIReq->QueryInterface (IID_IBidiRequestSpl, (void **) & pISpl);
if (SUCCEEDED(hr))
{
LPWSTR pSchema;
DBGMSG (DBG_TRACE, ("Calling GetSchema\n"));
hr = pISpl->GetSchema ( & pSchema);
DBGMSG (DBG_TRACE, ("GetSchema hr=%x, %ws\n", hr, pSchema));
hr = pISpl->SetResult (0x30);
DBGMSG (DBG_TRACE, ("SetResult hr=%x\n", hr, pSchema));
DWORD dwTotal = 2;
for (DWORD i = 0; i <dwTotal; i++ ) {
WCHAR szSchema[512];
DWORD dwType;
BYTE pData[512];
ULONG uSize;
for (int j = 0; j < rand() % 512 - 1; j++) {
szSchema[j] = L'0';
}
dwType = BIDI_BLOB;
uSize = rand () % 512;
for (j = 0; j < (int) uSize; j++) {
pData[j] = (BYTE) (j+i) ;
}
hr = pISpl->AppendOutputData (szSchema, dwType, pData, uSize);
DumpData (dwType, pData, uSize);
DBGMSG (DBG_TRACE, ("AppendOutputData hr = 0x%x\n", hr));
}
}
HRESULT hrResult;
hr = pIReq->GetResult (&hrResult);
DBGMSG (DBG_TRACE, ("GetResult hr = 0x%x, Result=0x%x\n", hr, hrResult));
DWORD dwTotal;
hr = pIReq->GetEnumCount (&dwTotal);
DBGMSG (DBG_TRACE, ("GetEnumCount hr = 0x%x, Result=%d\n", hr, dwTotal));
for (DWORD i = 0; i <dwTotal; i++ ) {
LPWSTR pSchema;
DWORD dwType;
LPBYTE pData;
ULONG uSize;
hr = pIReq->GetOutputData (i, &pSchema, &dwType, &pData, &uSize);
DBGMSG (DBG_TRACE, ("GetOutputData hr = 0x%x, dwType=%d, dwSize=%d\n", hr, dwType, uSize));
DumpData (dwType, pData, uSize);
}
DBGMSG (DBG_TRACE, ("Release IBididRequestSpl interface.\n")) ;
pIReq->Release() ;
DBGMSG (DBG_TRACE, ("Release IBididRequest interface.\n")) ;
pISpl->Release() ;
}
else
{
DBGMSG (DBG_TRACE, ("Client: \t\tCould not create component. hr = %x\n ", hr));
}
}
IBidiRequest * GenRequest ()
{
HRESULT hr;
IBidiRequest * pIReq = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequest,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequest,
(void**)&pIReq) ;
if (SUCCEEDED(hr))
{
hr = pIReq->SetSchema (L"/printer/duplex");
DBGMSG (DBG_TRACE, ("SetSchema hr = %x\n", hr));
DWORD dwData = rand() % 1000;
DumpData (1, (PBYTE) &dwData, sizeof (DWORD));
hr = pIReq->SetInputData (BIDI_INT, (LPBYTE) &dwData, sizeof (DWORD));
DBGMSG (DBG_TRACE, ("SetInputData hr = 0x%x\n", hr));
DBGMSG (DBG_TRACE, ("Release IBididRequestSpl interface.\n")) ;
return pIReq;
}
else
{
DBGMSG (DBG_TRACE, ("Client: \t\tCould not create component. hr = %x\n ", hr));
return NULL;
}
}
IBidiRequestContainer * GenRequestContainer (DWORD dwTotal)
{
HRESULT hr;
ULONG dwRef;
IBidiRequestContainer * pIReqContainer = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequestContainer,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequestContainer,
(void**)&pIReqContainer) ;
SPLASSERT (SUCCEEDED (hr));
IBidiRequest * pRequest = NULL;
for (DWORD i = 0; i < dwTotal; i++) {
pRequest = GenRequest ();
SPLASSERT (pRequest != NULL);
hr = pIReqContainer->AddRequest (pRequest);
SPLASSERT (SUCCEEDED (hr));
dwRef = pRequest->Release ();
SPLASSERT (dwRef == 1);
}
return pIReqContainer;
}
void TestContainer ()
{
HRESULT hr;
ULONG dwRef;
IBidiRequestContainer * pIReqContainer = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequestContainer,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequestContainer,
(void**)&pIReqContainer) ;
SPLASSERT (SUCCEEDED (hr));
IBidiRequest * pRequest = NULL;
DWORD dwTotal = 3;
for (DWORD i = 0; i < dwTotal; i++) {
pRequest = GenRequest ();
SPLASSERT (pRequest != NULL);
hr = pIReqContainer->AddRequest (pRequest);
SPLASSERT (SUCCEEDED (hr));
dwRef = pRequest->Release ();
SPLASSERT (dwRef == 1);
}
DWORD dwTotal2;
hr = pIReqContainer->GetRequestCount (&dwTotal2);
SPLASSERT (SUCCEEDED (hr));
SPLASSERT (dwTotal == dwTotal2);
IEnumUnknown *pEnumIunk;
hr = pIReqContainer->GetEnumObject (&pEnumIunk) ;
SPLASSERT (SUCCEEDED (hr));
for (i = 0; i < dwTotal2; i++){
IUnknown *pIunk;
DWORD dwFetched;
hr = pEnumIunk->Next (1, &pIunk, &dwFetched);
SPLASSERT (SUCCEEDED (hr));
SPLASSERT (dwFetched == 1);
IBidiRequestSpl *pISpl = NULL;
hr = pIunk->QueryInterface (IID_IBidiRequestSpl, (void **) & pISpl);
SPLASSERT (SUCCEEDED (hr));
dwRef = pIunk->Release();
dwRef = pISpl->Release();
}
dwRef = pEnumIunk->Release ();
DBGMSG (DBG_TRACE, ("Release IBididRequestContainer interface.\n")) ;
dwRef = pIReqContainer->Release() ;
SPLASSERT (dwRef == 0);
}
void TestBidiAPI ()
{
HRESULT hr;
ULONG dwRef;
IBidiSpl * pIBidiSpl = NULL ;
IBidiRequestContainer *pIReqContainer;
hr = ::CoCreateInstance(CLSID_BidiSpl,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiSpl,
(void**)&pIBidiSpl) ;
SPLASSERT (SUCCEEDED (hr));
DBGMSG (DBG_TRACE, ("IBidiSpl created.\n")) ;
pIReqContainer = GenRequestContainer (3);
// Test Open/Close
hr = pIBidiSpl->MultiSendRecv (L"Get", pIReqContainer);
SPLASSERT (hr == E_HANDLE);
hr = pIBidiSpl->BindDevice (L"No such Printer", 0);
SPLASSERT (!SUCCEEDED (hr));
hr = pIBidiSpl->BindDevice (L"Test", BIDI_ACCESS_USER);
SPLASSERT (SUCCEEDED (hr));
hr = pIBidiSpl->UnbindDevice ();
SPLASSERT (SUCCEEDED (hr));
hr = pIBidiSpl->UnbindDevice ();
SPLASSERT (!SUCCEEDED (hr));
hr = pIBidiSpl->BindDevice (L"Test", BIDI_ACCESS_USER);
SPLASSERT (SUCCEEDED (hr));
pIReqContainer = GenRequestContainer (3);
hr = pIBidiSpl->MultiSendRecv (L"Get", NULL);
SPLASSERT (!SUCCEEDED (hr));;
hr = pIBidiSpl->MultiSendRecv (L"Get", pIReqContainer);
SPLASSERT (SUCCEEDED (hr));
dwRef = pIReqContainer->Release ();
SPLASSERT (dwRef == 0);
dwRef = pIBidiSpl->Release ();
SPLASSERT (dwRef == 0);
DBGMSG (DBG_TRACE, ("IBidiSpl released.\n")) ;
}
IBidiRequest * GenRequest (LPWSTR pSchema)
{
HRESULT hr;
IBidiRequest * pIReq = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequest,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequest,
(void**)&pIReq) ;
SPLASSERT (SUCCEEDED(hr));
hr = pIReq->SetSchema (pSchema);
SPLASSERT (SUCCEEDED(hr));
return pIReq;
}
IBidiRequestContainer * GenRequestContainer2 (DWORD dwTotal, LPWSTR pSchema)
{
HRESULT hr;
ULONG dwRef;
IBidiRequestContainer * pIReqContainer = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequestContainer,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequestContainer,
(void**)&pIReqContainer) ;
SPLASSERT (SUCCEEDED (hr));
IBidiRequest * pRequest = NULL;
for (DWORD i = 0; i < dwTotal; i++) {
pRequest = GenRequest (pSchema);
SPLASSERT (pRequest != NULL);
hr = pIReqContainer->AddRequest (pRequest);
SPLASSERT (SUCCEEDED (hr));
dwRef = pRequest->Release ();
SPLASSERT (dwRef == 1);
}
return pIReqContainer;
}
IBidiRequestContainer *CreateContainer ()
{
HRESULT hr;
IBidiRequestContainer * pIReqContainer = NULL ;
hr = ::CoCreateInstance(CLSID_BidiRequestContainer,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiRequestContainer,
(void**)&pIReqContainer) ;
SPLASSERT (SUCCEEDED (hr));
return pIReqContainer;
}
void AddRequest (
IBidiRequestContainer * pIReqContainer,
LPWSTR pSchema)
{
IBidiRequest * pRequest = NULL;
HRESULT hr;
DWORD dwRef;
pRequest = GenRequest (pSchema);
SPLASSERT (pRequest != NULL);
hr = pIReqContainer->AddRequest (pRequest);
SPLASSERT (SUCCEEDED (hr));
dwRef = pRequest->Release ();
SPLASSERT (dwRef == 1);
}
void TestBidiAPI2 ()
{
HRESULT hr;
ULONG dwRef;
IBidiSpl * pIBidiSpl = NULL ;
IBidiRequestContainer *pIReqContainer;
IBidiRequest * pRequest = NULL;
hr = ::CoCreateInstance(CLSID_BidiSpl,
NULL,
CLSCTX_INPROC_SERVER,
IID_IBidiSpl,
(void**)&pIBidiSpl) ;
SPLASSERT (SUCCEEDED (hr));
DBGMSG (DBG_TRACE, ("IBidiSpl created.\n")) ;
hr = pIBidiSpl->BindDevice (L"Test", BIDI_ACCESS_USER);
SPLASSERT (SUCCEEDED (hr));
#if 0
pIReqContainer = GenRequestContainer2 (10, L"/Printer/Installableoption/DuplexUnit");
hr = pIBidiSpl->MultiSendRecv (L"Get", pIReqContainer);
SPLASSERT (SUCCEEDED (hr));
DumpContainer (pIReqContainer);
dwRef = pIReqContainer->Release ();
SPLASSERT (dwRef == 0);
#endif
// Case 2
pIReqContainer = CreateContainer ();
//AddRequest (pIReqContainer, L"/Printer/Installableoption/DuplexUnit");
//AddRequest (pIReqContainer, L"/Communication/Version");
AddRequest (pIReqContainer, L"/Communication/BidiProtocol");
AddRequest (pIReqContainer, L"/Printer/BlackInk1/Level");
hr = pIBidiSpl->MultiSendRecv (L"Get", pIReqContainer);
SPLASSERT (SUCCEEDED (hr));
DumpContainer (pIReqContainer);
dwRef = pIReqContainer->Release ();
SPLASSERT (dwRef == 0);
// Case 3
pIReqContainer = CreateContainer ();
AddRequest (pIReqContainer, L"/Printers/Alerts");
hr = pIBidiSpl->MultiSendRecv (L"GetAll", pIReqContainer);
SPLASSERT (SUCCEEDED (hr));
DumpContainer (pIReqContainer);
dwRef = pIReqContainer->Release ();
SPLASSERT (dwRef == 0);
dwRef = pIBidiSpl->Release ();
SPLASSERT (dwRef == 0);
DBGMSG (DBG_TRACE, ("IBidiSpl released.\n")) ;
}
void StartTest ()
{
//TestContainer ();
//TestBidiRequest ();
//TestBidiAPI ();
TestBidiAPI2 ();
}
int __cdecl main(int argc, char **argv)
{
HRESULT hr;
hr = CoInitializeEx (NULL, COINIT_MULTITHREADED) ;
SPLASSERT (SUCCEEDED (hr))
StartTest ();
// Uninitialize COM Library
CoUninitialize() ;
#if 0
hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED ) ;
SPLASSERT (SUCCEEDED (hr))
StartTest ();
// Uninitialize COM Library
CoUninitialize() ;
hr = CoInitialize (NULL);
SPLASSERT (SUCCEEDED (hr))
StartTest ();
// Uninitialize COM Library
CoUninitialize() ;
#endif
printf("Test successfully finished!\n");
return 0 ;
}