// //Routine Name: // // PrintTicketHandler::CreatePrintTicketHandler // //Routine Description: // // Static factory method that creates an instance of // PrintTicketHandler. // //Arguments: // // pPropertyBag - Property Bag // //Return Value: // // PrintTicketHandler_t (smart ptr) // The new PrintTicketHandler. // PrintTicketHandler_t PrintTicketHandler::CreatePrintTicketHandler( const IPrintPipelinePropertyBag_t &pPropertyBag ) { // // Create MSXML DOM document // IXMLDOMDocument2_t pDOMDoc; THROW_ON_FAILED_HRESULT( ::CoCreateInstance( __uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMDocument2), reinterpret_cast<LPVOID*>(&pDOMDoc) ) ); // // Get the default user Print Ticket Stream Factory // Variant_t varUserPrintTicket; THROW_ON_FAILED_HRESULT( pPropertyBag->GetProperty( XPS_FP_USER_PRINT_TICKET, &varUserPrintTicket ) ); IUnknown_t pUnk = varUserPrintTicket.punkVal; IPrintReadStreamFactory_t pStreamFactory; THROW_ON_FAILED_HRESULT( pUnk.QueryInterface(&pStreamFactory) ); // // Get the default user Print Ticket stream // and wrap it in an IStream // IPrintReadStream_t pUserPrintTicketStream; THROW_ON_FAILED_HRESULT( pStreamFactory->GetStream(&pUserPrintTicketStream) ); IStream_t pUserPrintTicket = CreateIStreamFromIPrintReadStream(pUserPrintTicketStream); // // Get the Printer Name // Variant_t varPrinterName; THROW_ON_FAILED_HRESULT( pPropertyBag->GetProperty( XPS_FP_PRINTER_NAME, &varPrinterName ) ); BSTR_t pPrinterName(varPrinterName.bstrVal); // // Get the User Security Token // Avoid CComVariant if getting the XPS_FP_USER_TOKEN property. // Please refer to http://go.microsoft.com/fwlink/?LinkID=255534 for detailed information. // SafeVariant varUserSecurityToken; THROW_ON_FAILED_HRESULT( pPropertyBag->GetProperty( XPS_FP_USER_TOKEN, &varUserSecurityToken ) ); // // Open the Print Ticket Provider // SafeHPTProvider_t pHProvider( new SafeHPTProvider( pPrinterName, varUserSecurityToken.byref ) ); PrintTicketHandler_t toReturn( new PrintTicketHandler( pDOMDoc, pHProvider, pUserPrintTicket ) ); return toReturn; }
// //Routine Name: // // XPSRasFilter::StartOperation_throws // //Routine Description: // // Iterates over the 'trunk' parts of the document // and calls appropriate processing methods. // //Arguments: // // None // void XPSRasFilter::StartOperation_throws() { // // CoInitialize/CoUninitialize RAII object. // COM is inititalized for the lifetime of this method. // SafeCoInit coInit; IXpsOMObjectFactory_t pOMFactory; // // Create Xps Object Model Object Factory instance // THROW_ON_FAILED_HRESULT( ::CoCreateInstance( __uuidof(XpsOMObjectFactory), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXpsOMObjectFactory), reinterpret_cast<LPVOID*>(&pOMFactory) ) ); IOpcFactory_t pOpcFactory; // // Create Opc Object Factory instance // THROW_ON_FAILED_HRESULT( ::CoCreateInstance( __uuidof(OpcFactory), NULL, CLSCTX_INPROC_SERVER, __uuidof(IOpcFactory), reinterpret_cast<LPVOID*>(&pOpcFactory) ) ); // // Create the rasterization interface // RasterizationInterface_t pRasInterface = RasterizationInterface::CreateRasterizationInterface( m_pIPropertyBag, m_pWriter ); // // Create the Print Ticket Handler // PrintTicketHandler_t pPrintTicketHandler = PrintTicketHandler::CreatePrintTicketHandler( m_pIPropertyBag ); IUnknown_t pUnk; // // Get first part // THROW_ON_FAILED_HRESULT(m_pReader->GetXpsPart(&pUnk)); while (m_pLiveness->IsAlive() && pUnk != NULL) { IXpsDocument_t pDoc; IFixedDocumentSequence_t pFDS; IFixedDocument_t pFD; IFixedPage_t pFP; if (SUCCEEDED(pUnk.QueryInterface(&pFP))) { DoTraceMessage(XPSRASFILTER_TRACE_VERBOSE, L"Handling a Page"); pPrintTicketHandler->ProcessPart(pFP); ParametersFromPrintTicket printTicketParams = pPrintTicketHandler->GetMergedPrintTicketParams(); pRasInterface->RasterizePage( CreateXpsOMPageFromIFixedPage(pFP, pOMFactory, pOpcFactory), printTicketParams, m_pLiveness ); } else if (SUCCEEDED(pUnk.QueryInterface(&pFD))) { pPrintTicketHandler->ProcessPart(pFD); } else if (SUCCEEDED(pUnk.QueryInterface(&pFDS))) { pPrintTicketHandler->ProcessPart(pFDS); } else if (SUCCEEDED(pUnk.QueryInterface(&pDoc))) { // // Do nothing with the XML Document part // } else { // // Any other document 'trunk' parts are ignored. // } pUnk.Release(); // // Get Next Part // THROW_ON_FAILED_HRESULT(m_pReader->GetXpsPart(&pUnk)); } pRasInterface->FinishRasterization(); }