/*++ Routine Name: CXDSmplFilter::InitializePrintTicketManager Routine Description: This routine initializes the PrintTicket manager with the default devmode Arguments: None Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CXDSmplFilter::InitializePrintTicketManager( VOID ) { ASSERTMSG(m_pPrintPropertyBag != NULL, "NULL property bag pointer\n"); HRESULT hr = S_OK; if (SUCCEEDED(hr = CHECK_POINTER(m_pPrintPropertyBag, E_PENDING))) { // // Get the printer name and user PrintTicket from the property bag // CComVariant varName; CComVariant varPTReadStreamFactory; // // Avoid CComVariant if getting the XPS_FP_USER_TOKEN property. // Please refer to http://go.microsoft.com/fwlink/?LinkID=255534 for detailed information. // VARIANT varUserToken; VariantInit(&varUserToken); if (SUCCEEDED(hr = m_pPrintPropertyBag->GetProperty(XPS_FP_USER_PRINT_TICKET, &varPTReadStreamFactory)) && SUCCEEDED(hr = m_pPrintPropertyBag->GetProperty(XPS_FP_PRINTER_NAME, &varName)) && SUCCEEDED(hr = m_pPrintPropertyBag->GetProperty(XPS_FP_USER_TOKEN, &varUserToken))) { // // Retrieve the PrintReadStream for the user PrintTicket // CComPtr<IUnknown> pUnk(varPTReadStreamFactory.punkVal); CComPtr<IPrintReadStreamFactory> pPrintReadStreamFactory(NULL); CComPtr<IPrintReadStream> pPrintReadStream(NULL); if (SUCCEEDED(hr = pUnk.QueryInterface(&pPrintReadStreamFactory)) && SUCCEEDED(hr = pPrintReadStreamFactory->GetStream(&pPrintReadStream))) { // // Initialise the PT manager with the user PrintTicket and device name // hr = m_ptManager.Initialise(pPrintReadStream, varName.bstrVal, varUserToken.byref); } } VariantClear(&varUserToken); } ERR_ON_HR(hr); return hr; }
/*++ Routine Name: CXDSmplFilter::InitializePrintTicketManager Routine Description: This routine initializes the PrintTicket manager with the default devmode Arguments: None Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CXDSmplFilter::InitializePrintTicketManager( VOID ) { ASSERTMSG(m_pPrintPropertyBag != NULL, "NULL property bag pointer\n"); HRESULT hr = S_OK; if (SUCCEEDED(hr = CHECK_POINTER(m_pPrintPropertyBag, E_PENDING))) { // // Get the printer name and user PrintTicket from the property bag // CComVariant varName; CComVariant varPTReadStreamFactory; CComVariant varUserToken; if (SUCCEEDED(hr = m_pPrintPropertyBag->GetProperty(XPS_FP_USER_PRINT_TICKET, &varPTReadStreamFactory)) && SUCCEEDED(hr = m_pPrintPropertyBag->GetProperty(XPS_FP_PRINTER_NAME, &varName)) && SUCCEEDED(hr = m_pPrintPropertyBag->GetProperty(XPS_FP_USER_TOKEN, &varUserToken))) { // // Retrieve the PrintReadStream for the user PrintTicket // CComPtr<IUnknown> pUnk(varPTReadStreamFactory.punkVal); CComPtr<IPrintReadStreamFactory> pPrintReadStreamFactory(NULL); CComPtr<IPrintReadStream> pPrintReadStream(NULL); if (SUCCEEDED(hr = pUnk.QueryInterface(&pPrintReadStreamFactory)) && SUCCEEDED(hr = pPrintReadStreamFactory->GetStream(&pPrintReadStream))) { // // Initialise the PT manager with the user PrintTicket and device name // hr = m_ptManager.Initialise(pPrintReadStream, varName.bstrVal, varUserToken.byref); } } } ERR_ON_HR(hr); return hr; }
/*++ Routine Name: CXDXpsFilter::StartOperation Routine Description: This is the XPS Doxument interface implementation of IPrintPipelineFilter::StartOperation shared by all XPS Document filters Arguments: None Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CXDXpsFilter::StartOperation( VOID ) { VERBOSE("Starting filter operation.\n"); HRESULT hr = S_OK; if (SUCCEEDED(hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)) && SUCCEEDED(hr = InitialiseXDIO()) && SUCCEEDED(hr = InitializePrintTicketManager())) { CComPtr<IUnknown> pUnk(NULL); while (SUCCEEDED(hr) && SUCCEEDED(hr = m_pXDReader->GetXpsPart(&pUnk)) && pUnk != NULL && !m_bFilterFinished) { CComPtr<IXpsDocument> pXD(NULL); CComPtr<IFixedDocumentSequence> pFDS(NULL); CComPtr<IFixedDocument> pFD(NULL); CComPtr<IFixedPage> pFP(NULL); // // Query interface to find the part type and pass to the // appropriate part handler // if (SUCCEEDED(pUnk.QueryInterface(&pXD))) { hr = ProcessPart(pXD); } else if (SUCCEEDED(pUnk.QueryInterface(&pFDS))) { hr = ProcessPart(pFDS); } else if (SUCCEEDED(pUnk.QueryInterface(&pFD))) { hr = ProcessPart(pFD); } else if (SUCCEEDED(pUnk.QueryInterface(&pFP))) { hr = ProcessPart(pFP); } else { // // Unrecognised part - send as unknown. // hr = m_pXDWriter->SendXpsUnknown(pUnk); } // // Must call release since pUnk is declared outside of the while loop // pUnk.Release(); } if (SUCCEEDED(hr)) { // // Call finalize letting derived classes know we have // processed all parts // hr = Finalize(); } // // Close the xps package consumer // m_pXDWriter->CloseSender(); } // // If the filter failed make sure we shutdown the pipeline // if (FAILED(hr)) { if (m_bFilterFinished) { // // Filter is already closing down so report S_OK // hr = S_OK; } else { // // Request the pipeline manager shutdown the filter // ERR("Requesting filter shutdown\n"); RequestShutdown(hr); } } // // Let the filter pipe manager know the filter is finished // CoUninitialize(); FilterFinished(); ERR_ON_HR(hr); return hr; }
int Extension::foreachCmd ( ClientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { if (objc != 4) { Tcl_WrongNumArgs( interp, 1, objv, "varList collectionHandle script"); return TCL_ERROR; } Tcl_Obj *pVarList = objv[1]; Tcl_Obj *pBody = objv[3]; Reference *pCollection = referenceHandles.find(interp, objv[2]); if (pCollection == 0) { const char *arg = Tcl_GetStringFromObj(objv[2], 0); Tcl_AppendResult( interp, "invalid interface pointer handle ", arg, 0); return TCL_ERROR; } // Collections should implement a _NewEnum method which returns an object // that enumerates the elements. HRESULT hr; PositionalArguments arguments; _variant_t varResult; hr = pCollection->invoke( DISPID_NEWENUM, DISPATCH_METHOD | DISPATCH_PROPERTYGET, arguments, &varResult); if (FAILED(hr) || V_VT(&varResult) != VT_UNKNOWN) { Tcl_AppendResult(interp, "object is not a collection", NULL); return TCL_ERROR; } IUnknownPtr pUnk(V_UNKNOWN(&varResult)); // Get a specific kind of enumeration. IEnumVARIANTPtr pEnumVARIANT; IEnumUnknownPtr pEnumUnknown; enum EnumKind { ENUM_VARIANT, ENUM_UNKNOWN }; EnumKind enumKind; hr = pUnk->QueryInterface( IID_IEnumVARIANT, reinterpret_cast<void **>(&pEnumVARIANT)); if (SUCCEEDED(hr)) { enumKind = ENUM_VARIANT; } else { hr = pUnk->QueryInterface( IID_IEnumUnknown, reinterpret_cast<void **>(&pEnumUnknown)); if (SUCCEEDED(hr)) { enumKind = ENUM_UNKNOWN; } } if (FAILED(hr)) { Tcl_AppendResult(interp, "Unknown enumerator type: not IEnumVARIANT or IEnumUnknown", NULL); return TCL_ERROR; } int completionCode; int varc; // number of loop variables completionCode = Tcl_ListObjLength(interp, pVarList, &varc); if (completionCode != TCL_OK) { return TCL_ERROR; } if (varc < 1) { Tcl_AppendResult(interp, "foreach varlist is empty", NULL); return TCL_ERROR; } while (true) { // If the variable list has been converted to another kind of Tcl // object, convert it back to a list and refetch the pointer to its // element array. Tcl_Obj **varv; completionCode = Tcl_ListObjGetElements(interp, pVarList, &varc, &varv); if (completionCode != TCL_OK) { return TCL_ERROR; } // Assign values to all loop variables. int v = 0; for (; v < varc; ++v) { TclObject value; ULONG count; switch (enumKind) { case ENUM_VARIANT: { _variant_t elementVar; hr = pEnumVARIANT->Next(1, &elementVar, &count); if (hr == S_OK && count > 0) { value = TclObject(&elementVar, Type::variant(), interp, 0); } } break; case ENUM_UNKNOWN: { IUnknown *pElement; hr = pEnumUnknown->Next(1, &pElement, &count); if (hr == S_OK && count > 0) { value = referenceHandles.newObj( interp, Reference::newReference(pElement)); } } break; } if (FAILED(hr)) { _com_issue_error(hr); } if (hr != S_OK || count == 0) { break; } Tcl_Obj *varValuePtr = Tcl_ObjSetVar2( interp, varv[v], NULL, value, TCL_LEAVE_ERR_MSG); if (varValuePtr == NULL) { return TCL_ERROR; } } if (v == 0) { completionCode = TCL_OK; break; } if (v < varc) { TclObject empty; for (; v < varc; ++v) { Tcl_Obj *varValuePtr = Tcl_ObjSetVar2( interp, varv[v], NULL, empty, TCL_LEAVE_ERR_MSG); if (varValuePtr == NULL) { return TCL_ERROR; } } } // Execute the script body. completionCode = #if TCL_MINOR_VERSION >= 1 Tcl_EvalObjEx(interp, pBody, 0); #else Tcl_EvalObj(interp, pBody); #endif if (completionCode == TCL_CONTINUE) { // do nothing } else if (completionCode == TCL_BREAK) { completionCode = TCL_OK; break; } else if (completionCode == TCL_ERROR) { std::ostringstream oss; oss << "\n (\"foreach\" body line %d)" << interp->errorLine; Tcl_AddObjErrorInfo( interp, const_cast<char *>(oss.str().c_str()), -1); break; } else if (completionCode != TCL_OK) { break; } } if (completionCode == TCL_OK) { Tcl_ResetResult(interp); } return completionCode; }