Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ex-sax2-1.cpp
#include "p6loader.h"
#include "cconsolestream.h"
#include "ccontenthandler.h"
#include "cerrorhandler.h"
using namespace P6R;
using namespace P6EXAMPLES;
P6DECLARE_CID( p6SAX2XMLReader );
P6DECLARE_IID( p6ISAX2ContentHandler );
P6DECLARE_IID( IContentHandlerInit );
P6DECLARE_IID( IErrorHandlerInit );
namespace {
P6R::P6ERR getSAX2(P6R::p6IDataStream *pOutStream,P6R::p6ISAX2XMLReader **ppIface)
{
P6ERR err;
if(P6SUCCEEDED(err = p6CreateInstance(NULL,CID_p6SAX2XMLReader,VALIDATECOMPTR(p6ISAX2XMLReader,cpSAX)))) {
if (P6SUCCEEDED( err = cpSAX->initialize( P6SAX2_NOFLAGS ))) {
if (P6SUCCEEDED( err = cpSAX->setFeature( "http://xml.org/sax/features/namespaces", P6TRUE ))) {
if (P6SUCCEEDED( err = cpSAX->setFeature( "http://xml.org/sax/features/namespaces-prefixes", P6TRUE ))) {
//
// Using detach() saves a reference counting operation
// and gives ownership to *ppIface.
//
cpSAX.detach(ppIface);
}
}
}
}
return err;
}
P6R::P6ERR getContentHandler( P6R::p6IConsole *pConsole, P6R::p6ISafeString *pStr, P6R::p6ISAX2ContentHandler **ppIface)
{
P6ERR err;
if(P6SUCCEEDED(err = CContentHandler::createInstance(NULL,VALIDATECOMPTR(IContentHandlerInit,cpInit)))) {
if (P6SUCCEEDED( err = cpInit->initialize( pConsole, pStr ))) {
err = cpInit.queryInterface(IID_p6ISAX2ContentHandler,ppIface);
}
}
return err;
}
P6R::P6ERR getErrorHandler( P6R::p6IConsole *pConsole, P6R::p6ISAX2ErrorHandler **ppIface)
{
P6ERR err;
if(P6SUCCEEDED(err = CErrorHandler::createInstance(NULL,VALIDATECOMPTR(IErrorHandlerInit,cpInit)))) {
if (P6SUCCEEDED( err = cpInit->initialize( pConsole ))) {
err = cpInit.queryInterface(IID_p6ISAX2ErrorHandler,ppIface);
}
}
return err;
}
P6R::P6ERR runSAX2( P6R::p6IConsole *pConsole, p6IDataStream *pStreamDebug )
{
P6UINT32 bufSize = 0;
P6ERR err = eOk;
// -> an element, 'mixed', with text and embedded tags
const P6CHAR* pXML =
"<?xml version='1.0' encoding='UTF-8' ?>\n" \
"<first xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>\n" \
"<mixed>\n" \
" <!-- should be ignored an never passed to the content handler -->\n" \
" Now is the time for all good men to spend <money><![CDATA[55 <dollars>]]></money>\n" \
" on \n" \
" <item>33</item> now that we are open.\n" \
" <short id='5' />\n" \
" <xsl:comment> using a namespace here </xsl:comment>\n" \
"</mixed></first>\n";
// [A] Create & initialize the components we need
if (P6FAILED( err = p6GetRuntimeIface( VALIDATECOMPTR( p6ISafeString, cpStr )))) return err;
if (P6FAILED( err = getSAX2(pStreamDebug,cpReader.addressof()))) return err;
err = cpReader.queryInterface(IID_p6IDataStream, cpStream.addressof());
// [B] Define the essential set of content handlers
if(P6SUCCEEDED(err = getContentHandler( pConsole, cpStr, cpContent.addressof() ))) {
err = cpReader->setContentHandler( cpContent );
}
if(P6SUCCEEDED(err = getErrorHandler( pConsole, cpError.addressof() ))) {
err = cpReader->setErrorHandler( cpError );
}
// [C] SAX2 parser generates a stream of events like any SAX2 parser
if (P6SUCCEEDED( err )) err = cpStream->beginStream();
err = cpStr->strlen( pXML, 100000, &bufSize );
if (P6SUCCEEDED( err )) err = cpStream->processStream( pXML, (P6UINT32)bufSize );
err = cpStream->endStream();
cpStream = NULL; // Tell p6ComPtr<> to release() the interface
if (P6FAILED( err )) {
P6ARG args[1];
P6AI_ERR(&args[0],err);
pConsole->writeStdout("ERROR: Example failed with [ %1$ ]\n", &args[0], 1, NULL );
}
return err;
}
} // namespace
int main(int argc,char *argv[])
{
P6ERR err = eOk;
p6ComPtr<p6IDataStream> cpDebugStream;
P6ARG args[1];
if(P6SUCCEEDED(err = CConsoleStream::createInstance(NULL,VALIDATECOMPTR(p6IDataStream,cpDebugStream)))) {
if(P6SUCCEEDED(err = p6InitializeLoader(cpDebugStream,9,P6SCLF_NOFLAGS))) {
err = runSAX2( cpConsole, cpDebugStream );
P6AI_ERR(&args[0],err);
cpConsole->writeStdout("runSAX2 result: [ %1$ ]\n",&args[0],1,NULL);
//
// Make sure to release the console interface
// before calling p6CleanupLoader() !! In this
// instance we don't let the smart pointer
// handle the cleanup.
//
cpConsole = NULL;
}
else printf("ERROR: Failed to retrieve console interface [ %x ]\n", err );
}
else printf("ERROR: Failed to initialize the loader [ %x ]\n", err );
}
else printf( "ERROR: Failed to create CConsoleStream [ %x ]\n", err );
return err;
}