/*++ Routine Name: CRemoteDictionary::WriteData Routine Description: This method handles the parsing of a new dictionary and the writing out the new dictionary Arguments: pWriter - Pointer to a stream to write the resource out to Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CRemoteDictionary::WriteData( _In_ IPartBase* pResource, _In_ IPrintWriteStream* pWriter ) { HRESULT hr = S_OK; if (SUCCEEDED(hr = CHECK_POINTER(pResource, E_POINTER)) && SUCCEEDED(hr = CHECK_POINTER(pWriter, E_POINTER))) { try { CComPtr<IUnknown> pRead(NULL); CComPtr<IPartResourceDictionary> pResDictPart(NULL); CComPtr<IPrintReadStream> pReader(NULL); if (SUCCEEDED(hr = m_pFixedPage->GetPagePart(m_bstrDictionaryURI, &pRead)) && SUCCEEDED(hr = pRead->QueryInterface(&pResDictPart)) && SUCCEEDED(hr = pResDictPart->GetStream(&pReader))) { // // Create a SAX handler to parse the markup in the fixed page // CCMSaxHandler cmSaxHndlr(pWriter, m_pBmpConverter, m_pRefConverter, NULL); // // Set-up the SAX reader and begin parsing the mark-up // CComPtr<ISAXXMLReader> pSaxRdr(NULL); if (SUCCEEDED(hr = pSaxRdr.CoCreateInstance(CLSID_SAXXMLReader60)) && SUCCEEDED(hr = pSaxRdr->putContentHandler(&cmSaxHndlr))) { CComPtr<ISequentialStream> pReadStreamToSeq(NULL); pReadStreamToSeq.Attach(new pfp::PrintReadStreamToSeqStream(pReader)); if (SUCCEEDED(hr = CHECK_POINTER(pReadStreamToSeq, E_OUTOFMEMORY))) { hr = pSaxRdr->parse(CComVariant(static_cast<ISequentialStream*>(pReadStreamToSeq))); } } } } catch (CXDException& e) { hr = e; } } ERR_ON_HR(hr); return hr; }
/*++ Routine Name: CPTManager::MergeTicket Routine Description: This routine merges a PrintTicket (supplied as a IPartPrintTicket pointer) into the DOM representation of the PrintTicket at the requested scope Arguments: ptScope - The scope at which the PrintTicket is to be merged pPTRef - Pointer to an IPartPrintTicket interface containing the PrintTicket to be merged Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CPTManager::MergeTicket( _In_ CONST EPrintTicketScope ptScope, _In_ CONST IPartPrintTicket* pPTRef ) { HRESULT hr = S_OK; if (SUCCEEDED(hr = CHECK_POINTER(pPTRef, E_POINTER))) { // // Create a DOM document from the PT ref stream // CComPtr<IXMLDOMDocument2> pNewPT(NULL); CComPtr<IPrintReadStream> pRead(NULL); if (SUCCEEDED(hr = pNewPT.CoCreateInstance(CLSID_DOMDocument60)) && SUCCEEDED(hr = const_cast<IPartPrintTicket*>(pPTRef)->GetStream(&pRead))) { CComPtr<ISequentialStream> pReadStreamToSeq(NULL); VARIANT_BOOL fLoaded = VARIANT_FALSE; pReadStreamToSeq.Attach(new(std::nothrow) pfp::PrintReadStreamToSeqStream(pRead)); if (SUCCEEDED(hr = CHECK_POINTER(pReadStreamToSeq, E_OUTOFMEMORY)) && SUCCEEDED(hr = pNewPT->load(CComVariant(pReadStreamToSeq), &fLoaded))) { if (fLoaded == VARIANT_TRUE) { hr = MergeTicket(ptScope, pNewPT); } else { hr = E_FAIL; } } } } ERR_ON_HR(hr); return hr; }