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.
393 lines
9.0 KiB
393 lines
9.0 KiB
//
|
|
// Client.cpp - client implementation
|
|
//
|
|
#include "precomp.h"
|
|
#include "tchar.h"
|
|
#include "bidispl.h"
|
|
|
|
#define IS_ARG(c) (((c) == '-') || ((c) == '/'))
|
|
|
|
#ifndef MODULE
|
|
|
|
#define MODULE "BIDIUTIL:"
|
|
|
|
#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 = %s\n", (*(BOOL*)pData)?"TRUE":"FALSE");
|
|
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 response = %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));
|
|
|
|
printf("Request No.%d\n", i);
|
|
|
|
DumpRequest (pIRequest);
|
|
|
|
dwRef = pIunk->Release();
|
|
dwRef = pIRequest->Release();
|
|
}
|
|
|
|
pEnumIunk->Release ();
|
|
}
|
|
|
|
|
|
IBidiRequest * GenRequest (LPWSTR pSchema)
|
|
{
|
|
HRESULT hr;
|
|
|
|
IUnknown * pIUnk = NULL ;
|
|
|
|
IBidiRequest * pIReq = NULL ;
|
|
|
|
hr = ::CoCreateInstance(CLSID_BidiRequest,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IUnknown,
|
|
(void**)&pIUnk) ;
|
|
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("CoCreateInstance\n"));
|
|
exit (0);
|
|
}
|
|
|
|
hr = pIUnk->QueryInterface (IID_IBidiRequest, (void **)&pIReq);
|
|
|
|
pIUnk->Release();
|
|
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("QueryInterface\n"));
|
|
exit (0);
|
|
}
|
|
|
|
if (pSchema) {
|
|
hr = pIReq->SetSchema (pSchema);
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("SetSchema\n"));
|
|
exit (0);
|
|
}
|
|
}
|
|
return pIReq;
|
|
}
|
|
|
|
|
|
IBidiRequestContainer *CreateContainer ()
|
|
{
|
|
HRESULT hr;
|
|
IBidiRequestContainer * pIReqContainer = NULL ;
|
|
|
|
|
|
hr = ::CoCreateInstance(CLSID_BidiRequestContainer,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IBidiRequestContainer,
|
|
(void**)&pIReqContainer) ;
|
|
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("CoCreateInstance\n"));
|
|
exit (0);
|
|
}
|
|
|
|
return pIReqContainer;
|
|
}
|
|
|
|
void AddRequest (
|
|
IBidiRequestContainer * pIReqContainer,
|
|
LPWSTR pSchema)
|
|
{
|
|
IBidiRequest * pRequest = NULL;
|
|
HRESULT hr;
|
|
DWORD dwRef;
|
|
|
|
pRequest = GenRequest (pSchema);
|
|
if (!pRequest) {
|
|
DBGMSG (DBG_WARNING, ("GenRequest\n"));
|
|
exit (0);
|
|
}
|
|
|
|
hr = pIReqContainer->AddRequest (pRequest);
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("AddRequest\n"));
|
|
exit (0);
|
|
}
|
|
|
|
dwRef = pRequest->Release ();
|
|
|
|
}
|
|
|
|
void usage()
|
|
{
|
|
printf("\n"
|
|
"usage: bidiutil [-p pname] [-t] [-d] [-a action] [-s schema1 schema2 schema3 ... ] \n"
|
|
"\n"
|
|
"where: -p printer name\n"
|
|
" -t SendRecv (default: MultiSendRecv)\n"
|
|
" -d admin (default: User) \n"
|
|
" -a action e.g. Enum, Get, GetAll) \n"
|
|
" -s schema e.g. /printer/installalableoption/duplexunit\n");
|
|
exit (0);
|
|
}
|
|
|
|
extern "C"
|
|
INT
|
|
_cdecl
|
|
_tmain(
|
|
int argc,
|
|
TCHAR **argv)
|
|
{
|
|
|
|
|
|
HRESULT hr;
|
|
ULONG dwRef;
|
|
IBidiSpl * pIBidiSpl = NULL ;
|
|
IBidiRequestContainer *pIReqContainer;
|
|
IBidiRequest * pRequest = NULL;
|
|
LPTSTR pPrinter = NULL;
|
|
LPTSTR pAction = NULL;;
|
|
BOOL bLoop = TRUE;
|
|
BOOL bSingle = FALSE;
|
|
BOOL dwAccess = BIDI_ACCESS_USER;
|
|
|
|
for (--argc, ++argv; argc && bLoop; --argc, ++argv) {
|
|
|
|
if (IS_ARG(**argv)) {
|
|
switch (tolower(*++*argv)) {
|
|
case L'?':
|
|
usage();
|
|
break;
|
|
|
|
case L'p':
|
|
++argv;
|
|
--argc;
|
|
pPrinter = *argv;
|
|
break;
|
|
|
|
case L's':
|
|
bLoop = FALSE;
|
|
break;
|
|
|
|
case L'a':
|
|
++argv;
|
|
--argc;
|
|
pAction = *argv;
|
|
break;
|
|
|
|
case L't':
|
|
bSingle = TRUE;
|
|
break;
|
|
|
|
case L'd':
|
|
dwAccess = BIDI_ACCESS_ADMINISTRATOR;
|
|
break;
|
|
|
|
default:
|
|
usage();
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
printf("Invalid Argument %s\n", *argv);
|
|
exit (1);
|
|
}
|
|
}
|
|
if (!pAction || !pPrinter) {
|
|
usage ();
|
|
}
|
|
|
|
|
|
hr = CoInitializeEx (NULL, COINIT_MULTITHREADED) ;
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("CoInitilaizeEx\n"));
|
|
exit (0);
|
|
}
|
|
|
|
hr = CoCreateInstance(CLSID_BidiSpl,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IBidiSpl,
|
|
(void**)&pIBidiSpl) ;
|
|
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("CoCreateInstance\n"));
|
|
exit (0);
|
|
}
|
|
|
|
hr = pIBidiSpl->BindDevice (pPrinter, dwAccess);
|
|
if (FAILED (hr)) {
|
|
DBGMSG (DBG_WARNING, ("BindDevice\n"));
|
|
exit (0);
|
|
}
|
|
|
|
if (bSingle) {
|
|
|
|
if (argc > 0)
|
|
pRequest = GenRequest (*argv);
|
|
else
|
|
pRequest = GenRequest (NULL);
|
|
|
|
hr = pIBidiSpl->SendRecv (pAction, pRequest);
|
|
if (FAILED (hr)) {
|
|
printf ("SendRecv failed (0x%x)\n", hr);
|
|
exit (0);
|
|
}
|
|
|
|
DumpRequest (pRequest);
|
|
dwRef = pRequest->Release ();
|
|
|
|
}
|
|
else {
|
|
pIReqContainer = CreateContainer ();
|
|
|
|
if (argc > 0) {
|
|
while (argc-- > 0)
|
|
AddRequest (pIReqContainer, *argv++);
|
|
}
|
|
else
|
|
AddRequest (pIReqContainer, NULL);
|
|
|
|
|
|
hr = pIBidiSpl->MultiSendRecv (pAction, pIReqContainer);
|
|
if (FAILED (hr)) {
|
|
printf ("MultiSendRecv failed (0x%x)\n", hr);
|
|
exit (0);
|
|
}
|
|
|
|
DumpContainer (pIReqContainer);
|
|
|
|
dwRef = pIReqContainer->Release ();
|
|
}
|
|
|
|
dwRef = pIBidiSpl->Release ();
|
|
|
|
DBGMSG (DBG_TRACE, ("IBidiSpl released.\n")) ;
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
|