diff -r 889504eac4fb -r 604ca70b6235 xml/xmlparser/src/CXMLReader.cpp --- a/xml/xmlparser/src/CXMLReader.cpp Tue Aug 31 17:02:56 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1123 +0,0 @@ -/* -* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: ?Description -* -*/ - - - -// INCLUDE FILES -#include "CXMLReader.h" - - -/* Dictionar Public ID's */ -#define WML_1_1_PUBLIC_ID 4 -#define WML_1_2_PUBLIC_ID 9 -#define WML_1_3_PUBLIC_ID 10 -#define XHTML_1_0_PUBLIC_ID 55 -#define SYNCML_1_0_PUBLIC_ID 0xFD1 -#define WAP_PROV_1_0_PUBLIC_ID 11 -#define SI_1_0_PUBLIC_ID 5 -#define SL_1_0_PUBLIC_ID 6 -#define PUSH_PROV_1_0_PUBLIC_ID 1 -extern "C" -{ - extern NW_WBXML_Dictionary_t NW_Wml_1_0_WBXMLDictionary; - extern NW_WBXML_Dictionary_t NW_Wml_1_1_WBXMLDictionary; - extern NW_WBXML_Dictionary_t NW_Wml_1_2_WBXMLDictionary; - extern NW_WBXML_Dictionary_t NW_Wml_1_3_WBXMLDictionary; - extern NW_WBXML_Dictionary_t NW_XHTML_WBXMLDictionary; - extern NW_WBXML_Dictionary_t NW_SyncML_1_0_WBXMLDictionary; - extern NW_WBXML_Dictionary_t NW_SL_WBXMLDictionary; -// extern NW_WBXML_Dictionary_t NW_wap_prov_doc_WBXMLDictionary; -// extern NW_WBXML_Dictionary_t SI_dictionary; -// extern NW_WBXML_Dictionary_t SL_dictionary; -// extern NW_WBXML_Dictionary_t push_nokprov_dictionary; -} -#define DICTIONARY_COUNT 7 - - -// ============================= LOCAL FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// BeginElementCB -// BeginElement callback, stores elemntname in elemntlist -// ----------------------------------------------------------------------------- -// -NW_Status_t BeginElementCB(NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aName, - void* aParser) -{ - CXMLObserver *wObserver = (CXMLObserver*)aParser; - TPtrC wElementName( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - TRAPD(error, wObserver->SetElementL(wElementName)); - if(error) - { - (wObserver->GetAttributes())->Reset(); - return NW_STAT_FAILURE; - } - // New element, reset attributes list - (wObserver->GetAttributes())->Reset(); - return NW_STAT_SUCCESS; -} - -// ----------------------------------------------------------------------------- -// EndElementCB. calls MXMLContentHandler::EndElement with elemntname, -// removes closed element from elemntlist. -// ----------------------------------------------------------------------------- -// -NW_Status_t EndElementCB(NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aName, - NW_Uint32 /*aEmpFlag*/, - void* aParser) -{ - _LIT(KEmpty,""); - TPtrC wEmpty(KEmpty); - CXMLObserver* wObserver = (CXMLObserver*)aParser; - wObserver->RemoveElement(); - MXMLContentHandler* aContentHandler = wObserver->GetContentHandler(); - TPtrC aElementName( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - TInt result = aContentHandler->EndElement(wEmpty, wEmpty, aElementName); - aContentHandler->ReaderIndex( aReader->charIndex ); - return result ? NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// AttributesStartCB -// ----------------------------------------------------------------------------- -// -NW_Status_t AttributeStartCB (NW_XML_Reader_t*, - const NW_XML_Reader_Interval_t* /*pI_name*/, - void*) -{ - return NW_STAT_SUCCESS; -} - -// ----------------------------------------------------------------------------- -// AttreibuteValueCB Adds new attribute to attributes list. -// Adds URI to URI list if namespaces is used -// ----------------------------------------------------------------------------- -// -NW_Status_t AttributeValueCB(NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aName, - const NW_XML_Reader_Interval_t* aValue, - void* aParser) -{ - _LIT(KNamespace,"xmlns:"); - TPtrC wNamespace(KNamespace); - CXMLObserver* wObserver = (CXMLObserver*)aParser; - CXMLAttributes* wAttr = wObserver->GetAttributes(); - - // Append new attribute to attributes list - TPtrC wAttributeName( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - TPtrC wAttributeValue( (TUint16*)aReader->pBuf + aValue->charStart, aValue->charStop - aValue->charStart ); - TRAPD(error,wAttr->AppendL(wAttributeName, wAttributeValue)); - if(error) - { - return NW_STAT_FAILURE; - } - // namespace declaration, store URI and extension - if(wAttributeName.Left(6).Match(wNamespace)!=KErrNotFound) - { - TPtrC wExtension = wAttributeName.Right(wAttributeName.Length()-6); - TRAP(error, wObserver->SetURIL(wAttributeValue, wExtension)); - if(error) - { - return NW_STAT_FAILURE; - } - } - return NW_STAT_SUCCESS; -} - -// ----------------------------------------------------------------------------- -// AttributesEndCB Calls MXMLContentHandler::StartElement with element name and -// attributes list. -// ----------------------------------------------------------------------------- -// -NW_Status_t AttributesEndCB(NW_XML_Reader_t* /*aReader*/, - NW_Uint32 /*aLength*/, - void* aParser) -{ - _LIT(KLocalName,""); - TPtrC wLocalName(KLocalName); - _LIT(KURI,""); - TPtrC wURI(KURI); - CXMLObserver* wObserver = (CXMLObserver*)aParser; - MXMLContentHandler* wContentHandler = wObserver->GetContentHandler(); - - TPtrC wElementName = wObserver->GetElement(); - CXMLAttributes* wAttributes = wObserver->GetAttributes(); - - // if using namespace, get URI and localname - TInt wIndex = wElementName.Locate(':'); - if(wIndex > 0) - { - wLocalName.Set(wElementName.Right(wElementName.Length()-wIndex-1)); - TPtrC temp = wElementName.Left(wIndex); - wURI.Set(wObserver->GetURI(temp)); - } - // Call StartElement, now that we have all the attributes - return wContentHandler->StartElement(wURI, wLocalName, wElementName, wAttributes) ? NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// CDataCB Reports actual CData as MXMLContentHandler::Characters (between -// MXMLContentHandler::StartCData and MXMLContentHandler::EndCData -// ----------------------------------------------------------------------------- -// -NW_Status_t CdataCB (NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aName, - void* aParser) -{ - CXMLObserver* wObserver = (CXMLObserver*)aParser; - MXMLContentHandler* aContentHandler = wObserver->GetContentHandler(); - TPtrC wChar( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - - aContentHandler->StartCDATA(); - aContentHandler->Charecters( wChar, aName->charStart, (aName->charStop - aName->charStart) ); - return aContentHandler->EndCDATA()? NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// ContentCB Content reported as MXMLContentHandler::Characters -// ----------------------------------------------------------------------------- -// -NW_Status_t ContentCB (NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aValue, - void* aParser) -{ - - CXMLObserver* wObserver = (CXMLObserver*)aParser; - TPtrC wChar( (TUint16*)aReader->pBuf + aValue->charStart, aValue->charStop - aValue->charStart ); - - MXMLContentHandler* aContentHandler = wObserver->GetContentHandler(); - - return (aContentHandler->Charecters(wChar, aValue->charStart, (aValue->charStop - aValue->charStart)))?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - - -// ----------------------------------------------------------------------------- -// AttrEntityVarValCB Adds new attribute to attributes list. -// Adds URI to URI list if namespaces is used -// ----------------------------------------------------------------------------- -// -NW_Status_t AttrEntityVarValCB (NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aName, - NW_Uint8* aValue, - NW_Uint32 aValueByteLength, - void* aParser) - { - _LIT(KNamespace, "xmlns:"); - TPtrC wNamespace(KNamespace); - CXMLObserver* wObserver = (CXMLObserver*)aParser; - CXMLAttributes* wAttr = wObserver->GetAttributes(); - - // Append new attribute to attributes list - TPtrC wAttributeName( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - TPtrC wAttributeValue( (TUint16*)aValue, aValueByteLength/2 ); - - TRAPD(error,wAttr->AppendL(wAttributeName, wAttributeValue)); - if(error) - { - return NW_STAT_FAILURE; - } - - // namespace declaration, store URI and extension - if(wAttributeName.Left(6).Match(wNamespace)!=KErrNotFound) - { - TPtrC wExtension = wAttributeName.Right(wAttributeName.Length()-6); - TRAP(error, wObserver->SetURIL(wAttributeValue, wExtension)); - if(error) - { - return NW_STAT_FAILURE; - } - } - return NW_STAT_SUCCESS; - } - - -// ----------------------------------------------------------------------------- -// EntityCB Entity reported as MXMLContentHandler::StartEntity -// ----------------------------------------------------------------------------- -// -NW_Status_t EntityCB (NW_XML_Reader_t* aReader, - NW_Uint32 aNumEntity, - void* aParser, - CXML_Uint8* aIntEntityValStr) -{ - - CXMLObserver *wObserver = (CXMLObserver*)aParser; - - NW_String_t *tempString = NW_String_new(); - // handle OOM - if(tempString == NULL) - { - return NW_STAT_FAILURE; - } - - if(aIntEntityValStr == NULL) - { - //It is character/predefined entities - NW_String_entityToString(aNumEntity, tempString, aReader->encoding); - } - - if(aIntEntityValStr != NULL) - { - //It is the internal entity - tempString->storage = aIntEntityValStr; - } - - TPtrC wTmpEntityPtr((TUint16*)tempString->storage); - TInt result(wObserver->GetContentHandler()->StartEntity(wTmpEntityPtr)); - - if (result == 0) - { - NW_String_delete(tempString); - return NW_STAT_FAILURE; - } - result = wObserver->GetContentHandler()->EndEntity(wTmpEntityPtr); - NW_String_delete(tempString); - - return (result?NW_STAT_SUCCESS:NW_STAT_FAILURE); - -} - -// ----------------------------------------------------------------------------- -// CommentCB -// ----------------------------------------------------------------------------- -// -NW_Status_t CommentCB (NW_XML_Reader_t* aReader, - const NW_XML_Reader_Interval_t* aName, - void* aParser ) -{ - CXMLObserver* wObserver = (CXMLObserver*)aParser; - TPtrC wComment( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - return (wObserver->GetContentHandler())->Comment(wComment)?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// StartDocumentCB -// ----------------------------------------------------------------------------- -// -NW_Status_t StartDocumentCB (NW_XML_Reader_t* /*aReader*/, - void* aParser ) - -{ - CXMLObserver* wObserver = (CXMLObserver*)aParser; - return (wObserver->GetContentHandler())->StartDocument()?NW_STAT_SUCCESS:NW_STAT_FAILURE; - -} - -// ----------------------------------------------------------------------------- -// EndDocumentCB -// ----------------------------------------------------------------------------- -// -NW_Status_t EndDocumentCB (NW_XML_Reader_t* /*aReader*/, - void* aParser) -{ - CXMLObserver* wObserver = (CXMLObserver*)aParser; - return (wObserver->GetContentHandler())->EndDocument()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// PiCB Report Processing Instruction with MXMLProcessingInstruction(Target, Data) -// ----------------------------------------------------------------------------- -// -NW_Status_t PiCB (NW_XML_Reader_t* aReader, - NW_PiFormTypeTag_t aTag, - const NW_XML_Reader_Interval_t* aName, - const NW_XML_Reader_Interval_t* aVersion, - const NW_XML_Reader_Interval_t* /*aEncoding*/, - const NW_XML_Reader_Interval_t* /*aStandalone*/, - const NW_XML_Reader_Interval_t* aContent, - void* aParser) -{ - CXMLObserver* wObserver = (CXMLObserver*)aParser; - TPtrC aTarget( (TUint16*)aReader->pBuf + aName->charStart, aName->charStop - aName->charStart ); - if(aTag==XMLDECL) - { - TPtrC aData( (TUint16*)aReader->pBuf + aVersion->charStart, aVersion->charStop - aVersion->charStart ); - return (wObserver->GetContentHandler())->ProcessingInstructions(aTarget, aData)?NW_STAT_SUCCESS:NW_STAT_FAILURE; - } - else - { - TPtrC aData( (TUint16*)aReader->pBuf + aContent->charStart, aContent->charStop - aContent->charStart ); - return (wObserver->GetContentHandler())->ProcessingInstructions(aTarget, aData)?NW_STAT_SUCCESS:NW_STAT_FAILURE; - } -} - - -// Binary Call backs - -// ----------------------------------------------------------------------------- -// Binary_StartDocument_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_StartDocument_CB (NW_WBXML_Parser_t* /*aParser*/, - NW_WBXML_Document_t* /*aDocument*/, - void * aContext) -{ - CXMLObserver* wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->StartDocument()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_EndDocument_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_EndDocument_CB(NW_WBXML_Parser_t* /*aParser*/, - void * aContext) -{ - CXMLObserver* wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->EndDocument()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Pi_CB ?description. -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Pi_CB (NW_WBXML_Parser_t* /*aParser*/, - void * aContext) -{ - CXMLObserver* wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->ProcessingInstruction()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Pi_End_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Pi_End_CB (NW_WBXML_Parser_t* /*aParser*/, - void* aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->ProcessingInstructionEnd()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Tag_Start_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Tag_Start_CB(NW_WBXML_Parser_t* /*aParser*/, - void *aContext) -{ - - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->TagStart()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Tag_End_CB ?description. -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Tag_End_CB(NW_WBXML_Parser_t* /*aParser*/, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->TagEnd()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Attr_Start_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Attr_Start_CB(NW_WBXML_Parser_t* /*aParser*/, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->AttributeStart()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Attr_Val_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Attr_Val_CB(NW_WBXML_Parser_t* /*aParser*/, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->AttributeValue()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Content_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Content_CB(NW_WBXML_Parser_t* /*aParser*/, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->Content()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_CodePage_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_CodePage_CB(NW_WBXML_Parser_t* /*aParser*/, - void* aContext) -{ - // Code page switch in WBXML doc - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->CodePageSwitch()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Extension_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Extension_CB(NW_WBXML_Parser_t* /*aParser*/, - void* aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->Extension()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Token_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Token_CB(NW_WBXML_Parser_t* /*aParser*/, - NW_Uint8 aToken, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - NW_String_UCS2Buff_t *wTemp = NW_WBXML_Dictionary_getTagByFqToken (aToken); - TPtrC wString((TUint16*)wTemp); - return (wObserver->GetBinaryContentHandler())->Token(aToken, wString)?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_FQToken_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_FQToken_CB(NW_WBXML_Parser_t* /*aParser*/, - NW_Uint32 aFQToken, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - NW_Byte aToken = (NW_Byte) (aFQToken & NW_WBXML_MASK_TOKEN); - if( (aToken & NW_WBXML_MASK_TAG_ID) != NW_WBXML_LITERAL) - { - NW_String_UCS2Buff_t *wTemp = NW_WBXML_Dictionary_getTagByFqToken(aFQToken); - if(wTemp) - { - TPtrC wString((TUint16*)wTemp); - return (wObserver->GetBinaryContentHandler())->Token(aToken, wString)?NW_STAT_SUCCESS:NW_STAT_FAILURE; - } - return NW_STAT_FAILURE; - } - return NW_STAT_SUCCESS; -} - -// ----------------------------------------------------------------------------- -// Binary_InlineString_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_InlineString_CB(NW_WBXML_Parser_t *aParser, - NW_Uint32 /*aIndex*/, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - NW_String_t *tempString = NW_String_new(); - // handle OOM - if(tempString == NULL) - { - return NW_STAT_FAILURE; - } - NW_WBXML_Document_t *doc = aParser->doc; - - NW_WBXML_Parser_getStringInline(aParser, doc, tempString); - - /**! - * This was changed because of MNUI-68TAZP - German umlauts were displayed wrong. - * This was caused by NW_String_byteToUCS2Char() function - this is not recognize utf-8 encoding and treats - * all characters as a 1byte ASCII. In case of character encoded on more than 1 byte - * we get two or more separate symbols instead of one compound of these bytes. - * The CnvUtfConverter::ConvertToUnicodeFromUtf8() recognizes utf-8 properly. - - NW_Ucs2 *ucs2; - NW_String_byteToUCS2Char(tempString->storage, ((*tempString).length) & ~0x80000000, &ucs2); //VC, AM - // handle OOM - if(ucs2 == NULL) - { - NW_String_delete(tempString); - return NW_STAT_FAILURE; - } - TPtrC wString((TUint16*)ucs2); - NW_String_delete(tempString); - */ - - TPtrC8 string8(tempString->storage); - HBufC *string16=NULL; - TRAPD(err, string16 = HBufC::NewL(string8.Length())); - if(err) - { - NW_String_delete(tempString); - return NW_STAT_FAILURE; - } - TPtr wString(string16->Des()); - -#if defined(_UNICODE) - err = CnvUtfConverter::ConvertToUnicodeFromUtf8(wString,string8); - if(err != KErrNone) - { - NW_String_delete(tempString); - delete string16; - return NW_STAT_FAILURE; - } -#else - wString.Copy(string8); -#endif - - TInt result((wObserver->GetBinaryContentHandler())->InlineString(wString)); - - NW_String_delete(tempString); - delete string16; - - return (result?NW_STAT_SUCCESS:NW_STAT_FAILURE); -} - -// ----------------------------------------------------------------------------- -// Binary_TableString_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_TableString_CB(NW_WBXML_Parser_t *aParser, - NW_Uint32 aIndex, - void *aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - NW_String_t *tempString = NW_String_new(); - // handle OOM - if(tempString == NULL) - { - return NW_STAT_FAILURE; - } - NW_WBXML_Document_t *doc = aParser->doc; - NW_WBXML_Document_getTableString(doc, aIndex, tempString); - /**! - * This was changed because of MNUI-68TAZP - German umlauts were displayed wrong. - * This was caused by NW_String_byteToUCS2Char() function - this is not recognize utf-8 encoding and treats - * all characters as a 1byte ASCII. In case of character encoded on more than 1 byte - * we get two or more separate symbols instead of one compound of these bytes. - * The CnvUtfConverter::ConvertToUnicodeFromUtf8() recognizes utf-8 properly. - - NW_Ucs2 *ucs2; - NW_String_byteToUCS2Char(tempString->storage, ((*tempString).length) & ~0x80000000, &ucs2); //VC, AM - // handle OOM - if(ucs2 == NULL) - { - NW_String_delete(tempString); - return NW_STAT_FAILURE; - } - TPtrC wString((TUint16*)ucs2); - NW_String_delete(tempString); - */ - - TPtrC8 string8(tempString->storage); - HBufC *string16=NULL; - TRAPD(err, string16 = HBufC::NewL(string8.Length())); - if(err) - { - NW_String_delete(tempString); - return NW_STAT_FAILURE; - } - - TPtr wString(string16->Des()); - -#if defined(_UNICODE) - err = CnvUtfConverter::ConvertToUnicodeFromUtf8(wString,string8); - if(err != KErrNone) - { - NW_String_delete(tempString); - delete string16; - return NW_STAT_FAILURE; - } -#else - wString.Copy(string8); -#endif - - TInt result((wObserver->GetBinaryContentHandler())->TableString(wString)); - - NW_String_delete(tempString); - delete string16; - - return (result?NW_STAT_SUCCESS:NW_STAT_FAILURE); -} - -// ----------------------------------------------------------------------------- -// Binary_Binary_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Binary_CB(NW_WBXML_Parser_t* /*aParser*/, - NW_Uint32 aIndex, - void* aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->Binary(aIndex)?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Opaque_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Opaque_CB(NW_WBXML_Parser_t *aParser, - NW_Uint32 aLength, - void * aContext) -{ - CXMLObserver *wObserver = (CXMLObserver*)aContext; - TPtrC wString((TUint16*)aParser->p, aLength); - return (wObserver->GetBinaryContentHandler())->Opaque(aLength, wString)?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - -// ----------------------------------------------------------------------------- -// Binary_Entity_CB -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Entity_CB(NW_WBXML_Parser_t *aParser, - NW_Uint32 aIndex, - void* aContext) -{ - NW_String_t *tempString = NW_String_new(); - // handle OOM - if(tempString == NULL) - { - return NW_STAT_FAILURE; - } - NW_String_entityToString(aIndex, tempString, aParser->doc->charset); - NW_Ucs2 *ucs2; - NW_String_byteToUCS2Char(tempString->storage, tempString->length, &ucs2); - // handle OOM - if(ucs2 == NULL) - { - NW_String_delete(tempString); - return NW_STAT_FAILURE; - } - TPtrC wString((TUint16*)ucs2); - NW_String_delete(tempString); - - CXMLObserver *wObserver = (CXMLObserver*)aContext; - TInt result((wObserver->GetBinaryContentHandler())->Entity(aIndex, wString)); - delete (void*)wString.Ptr(); - - return (result?NW_STAT_SUCCESS:NW_STAT_FAILURE); -} - -// ----------------------------------------------------------------------------- -// Binary_Exception_CB For parse errors -// ----------------------------------------------------------------------------- -// -NW_Status_t Binary_Exception_CB(NW_WBXML_Parser_t* /*aParser*/, - NW_WBXML_Exception_t /*aException*/, - void* aContext) -{ - - CXMLObserver *wObserver = (CXMLObserver*)aContext; - return (wObserver->GetBinaryContentHandler())->Exception()?NW_STAT_SUCCESS:NW_STAT_FAILURE; -} - - - - -// ============================ MEMBER FUNCTIONS =============================== - - -// ----------------------------------------------------------------------------- -// CXMLReader::CXMLReader -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CXMLReader::CXMLReader() -{ - -} - -// ----------------------------------------------------------------------------- -// CXMLReader::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CXMLReader::ConstructL() -{ - iParserObserver = CXMLObserver::NewL(); - // Default parser = XML , not WBXML - iIsBinary = FALSE; -} - -// ----------------------------------------------------------------------------- -// ?classname::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CXMLReader* CXMLReader::NewL() -{ - CXMLReader* self = new( ELeave ) CXMLReader(); - - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - - return self; -} - -// Destructor -CXMLReader::~CXMLReader() -{ - if(iParserObserver) - { - delete iParserObserver; - } - -} - -// ----------------------------------------------------------------------------- -// CXMLReader::SetFeature -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CXMLReader::SetFeature(TXMLFeature aFeature, TBool aStatus) -{ - TInt wReturn; - wReturn=0; - - switch(aFeature) - { - case EXMLBinary: - iIsBinary = aStatus; - wReturn = KErrNone; - break; - case EXMLValidation: - wReturn = KErrNotSupported; - break; - default: - wReturn = KErrNotSupported; - break; - } - return wReturn; -} - -// ----------------------------------------------------------------------------- -// CXMLReader::GetFeature -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CXMLReader::GetFeature(TXMLFeature aFeature, TBool &aStatus) -{ - TInt wReturn; - wReturn=0; - - switch(aFeature) - { - case EXMLBinary: - aStatus = iIsBinary; - wReturn = KErrNone; - break; - case EXMLValidation: - aStatus = FALSE; - wReturn = KErrNotSupported; - break; - default: - wReturn = KErrNotSupported; - break; - } - return wReturn; -} - -// ----------------------------------------------------------------------------- -// CXMLReader::SetContentHandler -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CXMLReader::SetContentHandler(MXMLContentHandler* aParserObserver) -{ - iParserObserver->SetContentHandler(aParserObserver); - return KErrNone; -} - -// ----------------------------------------------------------------------------- -// CXMLReader::SetContentHandler -// Set binary XML content handler -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CXMLReader::SetContentHandler(MWBXMLContentHandler* aParserObserver) -{ - iParserObserver->SetContentHandler(aParserObserver); - return KErrNone; -} - -// ----------------------------------------------------------------------------- -// CXMLReader::Parse -// Reades the input file, and calls ParseL(RFile&). -// @ exception can Leave due to OOM -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CXMLReader::ParseL(RFs& aRFs, const TDesC& aFileToParse) -{ - RFile wXMLFile; - - //Open file - User::LeaveIfError(wXMLFile.Open(aRFs, aFileToParse, EFileRead | EFileShareReadersOnly)); - CleanupClosePushL(wXMLFile); - ParseL(wXMLFile); - CleanupStack::PopAndDestroy(); // wXMLFile -} - -// ----------------------------------------------------------------------------- -// CXMLReader::Parse -// Reades the input from the opened file into buffer, and calls RunL. -// @ exception can Leave due to OOM -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CXMLReader::ParseL(RFile& aOpenedFile) -{ - TInt wSize; - User::LeaveIfError(aOpenedFile.Size(wSize)); - - HBufC8 * binaryBuffer = HBufC8::NewLC(wSize); - TPtr8 binaryBufferPtr = binaryBuffer->Des(); - User::LeaveIfError(aOpenedFile.Read(binaryBufferPtr, wSize)); - - if(!iIsBinary) - { - TInt hichar = (CEditableText::EReversedByteOrderMark & 0xFF00)>>8; - TInt lochar = CEditableText::EReversedByteOrderMark & 0xFF; - TInt bytesPerChar = 1; - if(binaryBufferPtr.Ptr()[0] == hichar && binaryBufferPtr.Ptr()[1] == lochar) - { - bytesPerChar = 2; - } - - HBufC * dataBuffer = HBufC::NewLC(wSize/bytesPerChar); - TPtr dataBufferPtr = dataBuffer->Des(); - - if(bytesPerChar == 2) - { - dataBufferPtr.Set((TUint16*)binaryBufferPtr.Ptr()+1, - wSize/bytesPerChar-1, - wSize/bytesPerChar-1); - } - else - { - CnvUtfConverter::ConvertToUnicodeFromUtf8(dataBufferPtr, binaryBuffer->Des()); - } - User::LeaveIfError(ParseXML(dataBufferPtr)); - CleanupStack::Pop(); // dataBuffer - CleanupStack::PopAndDestroy(); // binaryBuffer - delete dataBuffer; - } - else - { - User::LeaveIfError(ParseWBXML(binaryBufferPtr)); - CleanupStack::PopAndDestroy(); // binaryBuffer - } -} - -// ----------------------------------------------------------------------------- -// CXMLReader::ParseL -// Copies aBuff into input buffer and calls RunL -// @ exception can Leave due to OOM -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CXMLReader::ParseL(const TDesC8& aBuff) // change the allocations -{ - - - if(!iIsBinary) - { - HBufC * dataBuffer = HBufC::NewLC(aBuff.Size()); - TPtr dataBufferPtr = dataBuffer->Des(); - CnvUtfConverter::ConvertToUnicodeFromUtf8(dataBufferPtr, aBuff); - User::LeaveIfError(ParseXML(dataBufferPtr)); - CleanupStack::PopAndDestroy(); // dataBuffer - } - else - { - User::LeaveIfError(ParseWBXML(aBuff)); - } -} - - - -// ----------------------------------------------------------------------------- -// CXMLReader::ParseXML -// -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CXMLReader::ParseXML(const TDesC& aBuff) -{ - NW_Status_t status; - struct NW_XML_Parser_EventCallbacks_s cb; - struct NW_XML_Reader_s reader; - - Mem::FillZ(&cb, sizeof(NW_XML_Parser_EventCallbacks_s)); - - // cXML callbacks - cb.StartDocument_CB = StartDocumentCB; - cb.EndDocument_CB = EndDocumentCB; - cb.Tag_Start_CB = BeginElementCB; - cb.Attr_Start_CB = AttributeStartCB; - cb.Attr_VarVal_CB = AttributeValueCB; - cb.Attributes_End_CB = AttributesEndCB; - cb.Tag_End_CB = EndElementCB; - cb.Content_CB = ContentCB; - cb.Cdata_CB = CdataCB; - cb.Comment_CB = CommentCB; - cb.PiForm_CB = PiCB; - cb.pClientPointer = (void*)iParserObserver; - cb.Entity_CB = EntityCB; - cb.Attr_Entity_VarVal_CB = AttrEntityVarValCB; - - // Remove whitespace from beginning - TInt start(aBuff.Locate('<')); - - if (start == -1) - { - return KErrParseFailed; - } - - status = NW_XML_Reader_InitFromBuffer(&reader, aBuff.Right(aBuff.Length()-start).Size(), - (unsigned char*)aBuff.Right(aBuff.Length()-start).Ptr()); - NW_XML_Reader_SetEncoding(&reader, HTTP_iso_10646_ucs_2); - - // parse it! - status = NW_XML_Parse(&reader, &cb); - - ASSERT(!(reader.length % 2)); - TPtrC16 wChar((const TUint16*)reader.pBuf, reader.length / 2); - MXMLContentHandler* aContentHandler = iParserObserver->GetContentHandler(); - aContentHandler->DataBuffer(wChar); - - - if (!NW_STAT_IS_SUCCESS(status)) - { - return KErrParseFailed; - } - return KErrNone; -} - -// ----------------------------------------------------------------------------- -// CXMLReader::ParseWBXML -// -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CXMLReader::ParseWBXML(const TDesC8& aBuff) -{ - // WBXML CallBacks - struct NW_WBXML_EventHandler_s binaryCB; - - Mem::FillZ(&binaryCB, sizeof(NW_WBXML_EventHandler_s)); - - // State change events - binaryCB.StartDocument_CB = Binary_StartDocument_CB; - binaryCB.EndDocument_CB = Binary_EndDocument_CB; - binaryCB.Pi_CB = Binary_Pi_CB; - binaryCB.Pi_End_CB = Binary_Pi_End_CB; - binaryCB.Tag_Start_CB = Binary_Tag_Start_CB; - binaryCB.Tag_End_CB = Binary_Tag_End_CB; - binaryCB.Attr_Start_CB = Binary_Attr_Start_CB; - binaryCB.Attr_Val_CB = Binary_Attr_Val_CB; - binaryCB.Content_CB = Binary_Content_CB; - binaryCB.CodePage_CB = Binary_CodePage_CB; - binaryCB.Extension_CB = Binary_Extension_CB; - // Handle data types - binaryCB.Token_CB = Binary_Token_CB; - binaryCB.FQToken_CB = Binary_FQToken_CB; - binaryCB.InlineString_CB = Binary_InlineString_CB; - binaryCB.TableString_CB = Binary_TableString_CB; - binaryCB.Binary_CB = Binary_Binary_CB; - binaryCB.Opaque_CB = Binary_Opaque_CB; - binaryCB.Entity_CB = Binary_Entity_CB; - // For parse errors - binaryCB.Exception_CB = Binary_Exception_CB; - - // init dictionarys - NW_WBXML_Dictionary_t *dictionaries[DICTIONARY_COUNT]; - dictionaries[0] = (NW_WBXML_Dictionary_t *)&NW_SyncML_1_0_WBXMLDictionary; - dictionaries[1] = (NW_WBXML_Dictionary_t *)&NW_Wml_1_0_WBXMLDictionary; - dictionaries[2] = (NW_WBXML_Dictionary_t *)&NW_Wml_1_1_WBXMLDictionary; - dictionaries[3] = (NW_WBXML_Dictionary_t *)&NW_Wml_1_2_WBXMLDictionary; - dictionaries[4] = (NW_WBXML_Dictionary_t *)&NW_Wml_1_3_WBXMLDictionary; - dictionaries[5] = (NW_WBXML_Dictionary_t *)&NW_XHTML_WBXMLDictionary; - dictionaries[6] = (NW_WBXML_Dictionary_t *)&NW_SL_WBXMLDictionary; -// dictionaries[7] = (NW_WBXML_Dictionary_t *)&SL_dictionary; -// dictionaries[8] = (NW_WBXML_Dictionary_t *)&NW_wap_prov_doc_WBXMLDictionary; -// dictionaries[9] = (NW_WBXML_Dictionary_t *)&push_nokprov_dictionary; - - if ((NW_WBXML_Dictionary_initialize (DICTIONARY_COUNT, dictionaries)) != NW_STAT_SUCCESS) - { - return KErrDictionaryInitFailed; - } - - NW_Status_t status; - - // create parser - NW_WBXML_Parser_t *parser = (NW_WBXML_Parser_t*)User::Alloc(sizeof(NW_WBXML_Parser_t)); - if(parser == NULL) - { - NW_WBXML_Dictionary_destroy(); - return KErrParseFailed; - } - NW_WBXML_Parser_newInPlace(parser); - - // create document - NW_WBXML_Document_t *doc = (NW_WBXML_Document_t*)User::Alloc(sizeof(NW_WBXML_Document_t)); - if(doc == NULL) - { - NW_WBXML_Dictionary_destroy(); - User::Free(parser); - parser = NULL; - return KErrParseFailed; - } - status = NW_WBXML_Document_construct(doc, SL_1_0_PUBLIC_ID); - if(status != NW_STAT_SUCCESS) - { - NW_WBXML_Dictionary_destroy(); - User::Free(parser); - parser = NULL; - User::Free(doc); - doc = NULL; - return KErrParseFailed; - } - - - status =NW_WBXML_Parser_registerHandler(parser, &binaryCB, (void*)iParserObserver); - - - if (status == NW_STAT_SUCCESS) - { - status = NW_WBXML_Parser_parseBuffer(parser, doc, (NW_Byte*)aBuff.Ptr(), (NW_Uint32)aBuff.Length()); - } - - NW_WBXML_Dictionary_destroy(); - - User::Free(parser); - parser = NULL; - NW_WBXML_Document_destruct(doc); - User::Free(doc); - doc = NULL; - if(status != NW_STAT_SUCCESS) - { - return KErrParseFailed; - } - return KErrNone; -} - -// End of File