webservices/wsframework/src/senlayeredxmlproperties.cpp
changeset 0 62f9d29f7211
equal deleted inserted replaced
-1:000000000000 0:62f9d29f7211
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:      
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 
       
    23 
       
    24 
       
    25 #include <s32strm.h> // RWriteStream
       
    26 #include <SenXmlReader.h>
       
    27 #include "senpropertieselement.h"   // private: Utils\inc
       
    28 #include "senpropertiesfragment.h"  // private: Utils\inc
       
    29 #include <SenXmlUtils.h>
       
    30 #include <SenXmlConstants.h>
       
    31 
       
    32 #include "senlayeredxmlproperties.h"
       
    33 #include "SenXmlProperties.h"
       
    34 #include "senxmldebug.h"
       
    35 
       
    36 namespace
       
    37     {
       
    38     const TInt KFlatBufSize         = 64;  // CBufFlat
       
    39     }
       
    40 
       
    41 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewL()
       
    42     {
       
    43     CSenLayeredXmlProperties* pNew =
       
    44             CSenLayeredXmlProperties::NewLC();
       
    45     CleanupStack::Pop(); // pNew
       
    46     return pNew;
       
    47     }
       
    48 
       
    49 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewLC()
       
    50     {
       
    51     CSenLayeredXmlProperties* pNew = new (ELeave) CSenLayeredXmlProperties;
       
    52     CleanupStack::PushL(pNew);
       
    53 
       
    54     // omit parsing by passing zero-length descriptor
       
    55     pNew->BaseConstructL(KSenLayeredXmlPropertiesLocalname,
       
    56                          KNullDesC8,
       
    57                          NULL);
       
    58     return pNew;
       
    59     }
       
    60 
       
    61 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewL(const TDesC8& aXmlUtf8,
       
    62                                                          CSenXmlReader& aParser)
       
    63     {
       
    64     CSenLayeredXmlProperties* pNew = NewLC(aXmlUtf8, aParser);
       
    65     CleanupStack::Pop(); // pNew
       
    66     return pNew;
       
    67     }
       
    68 
       
    69 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewLC(const TDesC8& aXmlUtf8,
       
    70                                                           CSenXmlReader& aParser)
       
    71     {
       
    72     CSenLayeredXmlProperties* pNew = new (ELeave) CSenLayeredXmlProperties;
       
    73     CleanupStack::PushL(pNew);
       
    74 
       
    75     // parse the XML document  descriptor into DOM fragment
       
    76     pNew->BaseConstructL(KSenLayeredXmlPropertiesLocalname,
       
    77                          aXmlUtf8,
       
    78                          &aParser);
       
    79     return pNew;
       
    80     }
       
    81 
       
    82 
       
    83 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewL(const CSenElement& aElement)
       
    84     {
       
    85     CSenLayeredXmlProperties* pNew =
       
    86                 CSenLayeredXmlProperties::NewLC(aElement);
       
    87     CleanupStack::Pop(); // pNew
       
    88     return pNew;
       
    89     }
       
    90 
       
    91 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewLC(const CSenElement& aElement)
       
    92     {
       
    93     CSenLayeredXmlProperties* pNew = new (ELeave) CSenLayeredXmlProperties;
       
    94     CleanupStack::PushL(pNew);
       
    95 
       
    96     // Parse the XML document  descriptor into DOM fragment
       
    97     pNew->BaseConstructL(aElement);
       
    98     return pNew;
       
    99     }
       
   100 
       
   101 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewL(RStringPool& aStringPool)
       
   102     {
       
   103     CSenLayeredXmlProperties* pNew =
       
   104             CSenLayeredXmlProperties::NewLC(aStringPool);
       
   105     CleanupStack::Pop(); // pNew
       
   106     return pNew;
       
   107     }
       
   108 
       
   109 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewLC(RStringPool& aStringPool)
       
   110     {
       
   111     CSenLayeredXmlProperties* pNew = new (ELeave) CSenLayeredXmlProperties;
       
   112     CleanupStack::PushL(pNew);
       
   113 
       
   114     // omit parsing by passing zero-length descriptor
       
   115     pNew->BaseConstructL(KSenLayeredXmlPropertiesLocalname,
       
   116                          KNullDesC8,
       
   117                          NULL,
       
   118                          &aStringPool);
       
   119     return pNew;
       
   120     }
       
   121 
       
   122 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewL(const TDesC8& aXmlUtf8,
       
   123                                                          CSenXmlReader& aParser,
       
   124                                                          RStringPool& aStringPool)
       
   125     {
       
   126     CSenLayeredXmlProperties* pNew = NewLC(aXmlUtf8, aParser, aStringPool);
       
   127     CleanupStack::Pop(); // pNew
       
   128     return pNew;
       
   129     }
       
   130 
       
   131 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewLC(const TDesC8& aXmlUtf8,
       
   132                                                           CSenXmlReader& aParser,
       
   133                                                           RStringPool& aStringPool)
       
   134     {
       
   135     CSenLayeredXmlProperties* pNew = new (ELeave) CSenLayeredXmlProperties;
       
   136     CleanupStack::PushL(pNew);
       
   137 
       
   138     // parse the XML document  descriptor into DOM fragment
       
   139     pNew->BaseConstructL(KSenLayeredXmlPropertiesLocalname,
       
   140                          aXmlUtf8,
       
   141                          &aParser,
       
   142                          &aStringPool);
       
   143     return pNew;
       
   144     }
       
   145 
       
   146 
       
   147 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewL(const CSenElement& aElement,
       
   148                                                          RStringPool& aStringPool)
       
   149     {
       
   150     CSenLayeredXmlProperties* pNew =
       
   151                 CSenLayeredXmlProperties::NewLC(aElement, aStringPool);
       
   152     CleanupStack::Pop(); // pNew
       
   153     return pNew;
       
   154     }
       
   155 
       
   156 CSenLayeredXmlProperties* CSenLayeredXmlProperties::NewLC(const CSenElement& aElement,
       
   157                                                           RStringPool& aStringPool)
       
   158     {
       
   159     CSenLayeredXmlProperties* pNew = new (ELeave) CSenLayeredXmlProperties;
       
   160     CleanupStack::PushL(pNew);
       
   161 
       
   162     // Parse the XML document  descriptor into DOM fragment
       
   163     pNew->BaseConstructL(aElement, &aStringPool);
       
   164     return pNew;
       
   165     }
       
   166 
       
   167     
       
   168 void CSenLayeredXmlProperties::SetReader(CSenXmlReader& aReader)
       
   169     {
       
   170     // De-allocate the owned reader, if one exists:
       
   171     if( ipReader )
       
   172         {
       
   173         delete ipReader; 
       
   174         ipReader = NULL;
       
   175         }
       
   176     // Note: ipFragment does not own the reader 
       
   177     // behind the given reference (aReader) 
       
   178     ipFragment->SetReader(aReader);
       
   179     
       
   180     if ( ipChildProperties )
       
   181         {
       
   182         ipChildProperties->SetReader(aReader);
       
   183         }
       
   184     }
       
   185 
       
   186 MSenProperties::TSenPropertiesClassType CSenLayeredXmlProperties::PropertiesClassType() 
       
   187     { 
       
   188     return ESenLayeredXmlProperties; 
       
   189     }
       
   190 
       
   191 void CSenLayeredXmlProperties::WriteToL(RWriteStream& aWriteStream)
       
   192     {
       
   193     // Find out whether we should declare the namespace
       
   194     TPtrC8 nsPrefix = ipFragment->NsPrefix();
       
   195 
       
   196     // Element name
       
   197     aWriteStream.WriteL(KSenLessThan);
       
   198     if ( nsPrefix.Length() > 0 )
       
   199         {
       
   200         aWriteStream.WriteL(nsPrefix);
       
   201         aWriteStream.WriteL(KSenColon);
       
   202         }
       
   203     aWriteStream.WriteL(ipFragment->AsElement().LocalName());
       
   204 
       
   205     RPointerArray<CSenBaseAttribute>& attrs = ipFragment->AsElement().AttributesL();
       
   206     RPointerArray<CSenNamespace>& namespaces = ipFragment->AsElement().NamespacesL();
       
   207     if ( ( attrs.Count() > 0 ) || ( namespaces.Count() > 0 ) )
       
   208         {
       
   209         CSenNamespace* ns = NULL;
       
   210         TInt count = namespaces.Count();
       
   211         for (TInt i=0; i < count; i++)
       
   212             {
       
   213             ns = (namespaces)[i];
       
   214             if (ns)
       
   215                 {
       
   216                 aWriteStream.WriteL(KSenSpaceXmlns);
       
   217                 if (ns->Prefix().Length() > 0)
       
   218                     {
       
   219                     aWriteStream.WriteL(KSenColon);
       
   220                     aWriteStream.WriteL(ns->Prefix());
       
   221                     }
       
   222                 aWriteStream.WriteL(KSenEqualsDblQuot);
       
   223                 aWriteStream.WriteL(ns->URI());
       
   224                 aWriteStream.WriteL(KSenDblQuot);
       
   225                 }
       
   226             }
       
   227         count = attrs.Count();
       
   228         for (TInt j = 0; j < count; j++)
       
   229             {
       
   230             aWriteStream.WriteL(KSenSpace);
       
   231             aWriteStream.WriteL((attrs)[j]->Name());
       
   232             aWriteStream.WriteL(KSenEqualsDblQuot);
       
   233             aWriteStream.WriteL((attrs)[j]->Value());
       
   234             aWriteStream.WriteL(KSenDblQuot);
       
   235             }
       
   236         }
       
   237         
       
   238     // Elements and content
       
   239     RPointerArray<CSenElement> elements;
       
   240     ElementsL(elements);
       
   241     if ( (elements.Count() > 0) || ipFragment->AsElement().HasContent() )
       
   242         {
       
   243         aWriteStream.WriteL(KSenGreaterThan);
       
   244 
       
   245         // Body
       
   246         TInt elementCount(elements.Count());
       
   247         for (TInt k=0; k<elementCount; k++)
       
   248             {
       
   249             elements[k]->WriteAsXMLToL(aWriteStream);
       
   250             }        
       
   251         aWriteStream.WriteL(ipFragment->AsElement().Content());
       
   252 
       
   253         // Closing element
       
   254         aWriteStream.WriteL(KSenLessThanSlash);
       
   255         if (nsPrefix.Length() > 0)
       
   256             {
       
   257             aWriteStream.WriteL(nsPrefix);
       
   258             aWriteStream.WriteL(KSenColon);
       
   259             }
       
   260         aWriteStream.WriteL(ipFragment->AsElement().LocalName());
       
   261         aWriteStream.WriteL(KSenGreaterThan);
       
   262         }
       
   263     else
       
   264         {
       
   265         aWriteStream.WriteL(KSenSlashGreaterThan);
       
   266         }
       
   267     elements.Close();
       
   268     }
       
   269 
       
   270 void CSenLayeredXmlProperties::ReadFromL(const TDesC8& aBuffer)
       
   271     {
       
   272     // Sanity check: ignore zero-length strings
       
   273     if ( aBuffer.Length() == 0)
       
   274         {
       
   275         return;
       
   276         }
       
   277     // Check if fragment already has a reference to *some*
       
   278     // XML reader
       
   279     if ( !ipFragment->Reader() )
       
   280         {
       
   281         // Check if there is already an owned reader instance
       
   282         if( !ipReader )
       
   283             {
       
   284             ipReader = CSenXmlReader::NewL(KXmlParserMimeType); // use libxml2 sax parser
       
   285             }
       
   286         // Sets reference of that XML reader for this fragment:
       
   287         ipFragment->ParseWithL(*ipReader);
       
   288         }
       
   289     ipFragment->ParseL(aBuffer);   
       
   290     }
       
   291     
       
   292 HBufC8* CSenLayeredXmlProperties::AsUtf8L()
       
   293     {
       
   294     CBufFlat *pBuf = CBufFlat::NewL(KFlatBufSize);
       
   295     CleanupStack::PushL(pBuf);
       
   296     RBufWriteStream bufWs(*pBuf);
       
   297     CleanupClosePushL(bufWs);
       
   298     this->WriteToL(bufWs);
       
   299     CleanupStack::PopAndDestroy(); // bufWs.Close();
       
   300     TPtrC8 p = pBuf->Ptr(0);    
       
   301     HBufC8* pRet = p.AllocL();
       
   302     CleanupStack::PopAndDestroy(); // pBuf;
       
   303     return pRet;
       
   304     
       
   305     // return ipFragment->AsXmlL();
       
   306     }
       
   307 
       
   308 HBufC8* CSenLayeredXmlProperties::AsUtf8LC()
       
   309     {
       
   310     HBufC8* pRet = this->AsUtf8L();
       
   311     CleanupStack::PushL(pRet);
       
   312     return pRet;
       
   313     }
       
   314     
       
   315 TInt CSenLayeredXmlProperties::SetPropertyL(const TDesC8& aName,
       
   316                                             const TDesC8& aValue)
       
   317     {
       
   318 	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   319 	if(!pElement)
       
   320 		{
       
   321 		// Add new element
       
   322 		pElement =  &ipFragment->AsElement().AddElementL(aName);
       
   323 		}
       
   324     pElement->SetContentL(aValue);
       
   325     return KErrNone;
       
   326     }
       
   327 
       
   328 TInt CSenLayeredXmlProperties::PropertyL(const TDesC8& aName, TPtrC8& aValue)
       
   329     {
       
   330     if ( ipChildProperties )
       
   331         {
       
   332         TInt retVal = ipChildProperties->PropertyL(aName, aValue);
       
   333         if ( retVal == KErrNotFound )
       
   334             {
       
   335         	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   336         	if ( pElement )
       
   337         		{
       
   338         		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   339         		if ( pAttrValue )
       
   340                     {
       
   341                     if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   342         		        {
       
   343                         return KErrSenOmitted;
       
   344                         }
       
   345                     else if ( *pAttrValue == KSenPropertyTrue)
       
   346                         {
       
   347                         return KErrSenOmitted;
       
   348                         }
       
   349         		    }
       
   350         		aValue.Set(pElement->Content());
       
   351         		return KErrNone;
       
   352         		}
       
   353             else
       
   354                 {
       
   355                 return KErrNotFound;
       
   356                 }
       
   357             }
       
   358             
       
   359         return retVal;
       
   360         }
       
   361     else
       
   362         {
       
   363     	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   364     	if ( pElement )
       
   365     		{
       
   366     		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   367     		if ( pAttrValue )
       
   368                 {
       
   369                 if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   370     		        {
       
   371                     return KErrSenOmitted;
       
   372                     }
       
   373                 else if ( *pAttrValue == KSenPropertyTrue)
       
   374                     {
       
   375                     return KErrSenOmitted;
       
   376                     }
       
   377     		    }
       
   378         	aValue.Set(pElement->Content());
       
   379         	return KErrNone;
       
   380     		}
       
   381         else
       
   382             {
       
   383             return KErrNotFound;
       
   384             }
       
   385         }
       
   386     }
       
   387     
       
   388 TInt CSenLayeredXmlProperties::SetIntPropertyL(const TDesC8& aName,
       
   389                                                const TInt aValue)
       
   390     {
       
   391     TBuf8<KFlatBufSize> buffer;
       
   392     buffer.Num(aValue);
       
   393     return SetPropertyL(aName, buffer);
       
   394     }
       
   395 
       
   396 TInt CSenLayeredXmlProperties::IntPropertyL(const TDesC8& aName, TInt& aValue)
       
   397     {
       
   398     TPtrC8 value;
       
   399     TInt retVal(KErrNone);
       
   400     retVal = PropertyL(aName, value);
       
   401     if ( retVal == KErrNone )
       
   402         {
       
   403         TLex8 lex(value);
       
   404         retVal = lex.Val(aValue);
       
   405         }
       
   406     return retVal;
       
   407     }
       
   408     
       
   409 TInt CSenLayeredXmlProperties::SetBoolPropertyL(const TDesC8& aName,
       
   410                                                 const TBool aValue)
       
   411     {
       
   412     if ( aValue )
       
   413         {
       
   414         return SetPropertyL(aName, KSenPropertyTrue);
       
   415         }
       
   416     else
       
   417         {
       
   418         return SetPropertyL(aName, KSenPropertyFalse);
       
   419         }
       
   420     }
       
   421 
       
   422 TInt CSenLayeredXmlProperties::BoolPropertyL(const TDesC8& aName,
       
   423                                              TBool& aValue)
       
   424     {
       
   425     TInt retVal(KErrNone);
       
   426     TPtrC8 value;
       
   427     retVal = PropertyL(aName, value);
       
   428     if ( retVal == KErrNone )
       
   429         {
       
   430         if (value == KSenPropertyTrue)
       
   431             {
       
   432             aValue = ETrue;
       
   433             }
       
   434         else if (value == KSenPropertyFalse)
       
   435             {
       
   436             aValue = EFalse;
       
   437             }
       
   438         else
       
   439             {
       
   440             retVal = KErrGeneral;
       
   441             }
       
   442         }
       
   443     return retVal;
       
   444     }
       
   445     
       
   446 TInt CSenLayeredXmlProperties::SetOmittedL(const TDesC8& aName, TBool aValue)
       
   447     {
       
   448     TBool newElementCreated = EFalse;
       
   449  	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   450 	if ( !pElement )
       
   451 		{
       
   452 		// Add new element
       
   453 		pElement =  &ipFragment->AsElement().AddElementL(aName);
       
   454 		newElementCreated = ETrue;
       
   455 		}
       
   456     else
       
   457         {
       
   458         const TDesC8* pVal = pElement->AttrValue(KSenOmittedAttributeName);
       
   459         if ( pVal )
       
   460             {
       
   461             delete SenXmlUtils::RemoveAttributeL(*pElement, KSenOmittedAttributeName);
       
   462             }
       
   463         }
       
   464       
       
   465     if ( pElement )  
       
   466         {
       
   467         if ( aValue )
       
   468             {
       
   469             if ( newElementCreated )
       
   470                 {
       
   471                 SenXmlUtils::AddAttributeL(*pElement, KSenOmittedAttributeName, KSenOmittedTrueNoValue);
       
   472                 }
       
   473             else
       
   474                 {
       
   475                 SenXmlUtils::AddAttributeL(*pElement, KSenOmittedAttributeName, KSenPropertyTrue);
       
   476                 }
       
   477             }
       
   478         else
       
   479             {
       
   480             SenXmlUtils::AddAttributeL(*pElement, KSenOmittedAttributeName, KSenPropertyFalse);
       
   481             }
       
   482         }
       
   483     else
       
   484         {
       
   485         return KErrNotFound;
       
   486         }
       
   487         
       
   488     return KErrNone;   
       
   489     }
       
   490     
       
   491 TInt CSenLayeredXmlProperties::RemovePropertyL(const TDesC8& aName)
       
   492     {
       
   493  	CSenElement* pElement = ipFragment->AsElement().RemoveElement(aName);
       
   494 	if ( pElement )
       
   495 		{
       
   496 		delete pElement;
       
   497 		return KErrNone;
       
   498 		}
       
   499     else
       
   500         {
       
   501         return KErrNotFound;
       
   502         }
       
   503     }
       
   504 
       
   505 void CSenLayeredXmlProperties::WriteToL(RWriteStream& aWriteStream, TSenPropertiesLayer aLayer)
       
   506     {
       
   507     if ( aLayer > iLayer )
       
   508         {
       
   509         if ( ipChildProperties )
       
   510             {
       
   511             ipChildProperties->AsUtf8L(aLayer);
       
   512             }
       
   513         }
       
   514     else
       
   515         {
       
   516         if ( aLayer == iLayer )
       
   517             {
       
   518             ipFragment->WriteAsXMLToL(aWriteStream);
       
   519             }
       
   520         }
       
   521     }
       
   522 
       
   523 void CSenLayeredXmlProperties::ReadFromL(const TDesC8& aBuffer, TSenPropertiesLayer aLayer)
       
   524     {
       
   525 
       
   526     // Sanity check: ignore zero-length strings
       
   527     if ( aBuffer.Length() == 0)
       
   528         {
       
   529         return;
       
   530         }
       
   531 
       
   532     if ( aLayer > iLayer )
       
   533         {
       
   534         if ( !ipChildProperties )
       
   535             {
       
   536             CreateChildPropertiesL();	//codescannerwarnings
       
   537             }
       
   538         ipChildProperties->ReadFromL(aBuffer, aLayer);
       
   539         }
       
   540     else
       
   541         {
       
   542         if ( aLayer == iLayer )
       
   543             {
       
   544             if ( !ipFragment->Reader() )
       
   545                 {
       
   546                 if ( !ipReader )
       
   547                     {
       
   548                     ipReader = CSenXmlReader::NewL(KXmlParserMimeType); // use libxml2 sax parser
       
   549                     }
       
   550                 ipFragment->ParseWithL(*ipReader);
       
   551                 }
       
   552             ipFragment->ParseL(aBuffer);   
       
   553             }
       
   554         }
       
   555     }
       
   556 
       
   557 HBufC8* CSenLayeredXmlProperties::AsUtf8L(TSenPropertiesLayer aLayer)
       
   558     {
       
   559     if ( aLayer > iLayer )
       
   560         {
       
   561         if ( !ipChildProperties )
       
   562             {
       
   563             return NULL;
       
   564             }
       
   565         else
       
   566             {
       
   567             return ipChildProperties->AsUtf8L(aLayer);
       
   568             }
       
   569         }
       
   570     else
       
   571         {
       
   572         if ( aLayer == iLayer )
       
   573             {
       
   574             return ipFragment->AsXmlL();
       
   575             }
       
   576         else
       
   577             {
       
   578             return NULL;
       
   579             }
       
   580         }
       
   581     }
       
   582 
       
   583 HBufC8* CSenLayeredXmlProperties::AsUtf8LC(TSenPropertiesLayer aLayer)
       
   584     {
       
   585     if ( aLayer > iLayer )
       
   586         {
       
   587         if ( !ipChildProperties )
       
   588             {
       
   589             return NULL;
       
   590             }
       
   591         else
       
   592             {
       
   593             return ipChildProperties->AsUtf8LC(aLayer);
       
   594             }
       
   595         }
       
   596     else
       
   597         {
       
   598         if ( aLayer == iLayer )
       
   599             {
       
   600             HBufC8* pAsXml = ipFragment->AsXmlL();
       
   601             CleanupStack::PushL(pAsXml);
       
   602             return pAsXml;
       
   603             }
       
   604         else
       
   605             {
       
   606             return NULL;
       
   607             }
       
   608         }
       
   609     }
       
   610     
       
   611 TBool CSenLayeredXmlProperties::IsSafeToCast(TSenPropertiesClassType aClass)
       
   612     {
       
   613     if ( aClass == MSenProperties::ESenLayeredXmlProperties )
       
   614         {
       
   615         return ETrue;
       
   616         }
       
   617     else
       
   618         {
       
   619         return EFalse; // has only abstact, layered TP super classes 
       
   620         }
       
   621     }    
       
   622     
       
   623 TInt CSenLayeredXmlProperties::ShrinkTo(TSenPropertiesLayer aLayer)
       
   624     {
       
   625     if ( ipChildProperties )
       
   626         {
       
   627         return ipChildProperties->ShrinkTo(aLayer);
       
   628         }
       
   629     else
       
   630         {
       
   631         if (iLayer > aLayer)
       
   632             {
       
   633             CSenLayeredXmlProperties* pParent = ipParentProperties;
       
   634             delete this;
       
   635             pParent->ipChildProperties = NULL;
       
   636             return pParent->ShrinkTo(aLayer);
       
   637             }
       
   638         else
       
   639             {
       
   640             if (iLayer < aLayer)
       
   641                 {
       
   642                 return KErrNotFound;
       
   643                 }
       
   644             }
       
   645         }
       
   646     return KErrNone;
       
   647     }
       
   648     
       
   649 void CSenLayeredXmlProperties::ExpandToL(TSenPropertiesLayer aLayer)
       
   650     {
       
   651     if ( ipChildProperties )
       
   652         {
       
   653         if (iLayer < aLayer)
       
   654             {
       
   655             ipChildProperties->ExpandToL(aLayer);
       
   656             }
       
   657         }
       
   658     else
       
   659         {
       
   660         if (iLayer < aLayer)
       
   661             {
       
   662             CreateChildPropertiesL();	//codescannerwarnings
       
   663             ipChildProperties->ExpandToL(aLayer);
       
   664             }
       
   665         }    
       
   666     }
       
   667     
       
   668 MSenLayeredProperties::TSenPropertiesLayer CSenLayeredXmlProperties::TopLayer()
       
   669     {
       
   670     if ( ipChildProperties )
       
   671         {
       
   672         return ipChildProperties->TopLayer();
       
   673         }
       
   674     else
       
   675         {
       
   676         return iLayer;
       
   677         }    
       
   678     }
       
   679     
       
   680 TInt CSenLayeredXmlProperties::SetPropertyL(const TDesC8& aName,
       
   681                                             const TDesC8& aValue,
       
   682                                             TSenPropertiesLayer aLayer)
       
   683     {
       
   684     if ( aLayer > iLayer )
       
   685         {
       
   686         if ( !ipChildProperties )
       
   687             {
       
   688             CreateChildPropertiesL();	//codescannerwarnings
       
   689             }
       
   690         return ipChildProperties->SetPropertyL(aName, aValue, aLayer);
       
   691         }
       
   692     else
       
   693         {
       
   694         if ( aLayer == iLayer )
       
   695             {
       
   696         	CSenElement* pChildElement = ipFragment->AsElement().Element(aName);
       
   697         	if(!pChildElement)
       
   698         		{
       
   699         		// Add new element
       
   700         		pChildElement =  &ipFragment->AsElement().AddElementL(aName);
       
   701         		}
       
   702         	pChildElement->SetContentL(aValue);
       
   703             return KErrNone;
       
   704             }
       
   705         else
       
   706             {
       
   707             return KErrNotFound;
       
   708             }
       
   709         }
       
   710     }
       
   711 
       
   712 TInt CSenLayeredXmlProperties::PropertyL(const TDesC8& aName, TPtrC8& aValue,
       
   713                                          TSenPropertiesLayer aLayer)
       
   714     {
       
   715     if ( aLayer > iLayer )
       
   716         {
       
   717         if ( !ipChildProperties )
       
   718             {
       
   719             return KErrNotFound;
       
   720             }
       
   721         else
       
   722             {
       
   723             return ipChildProperties->PropertyL(aName, aValue, aLayer);
       
   724             }
       
   725         }
       
   726     else
       
   727         {
       
   728         if ( aLayer == iLayer )
       
   729             {
       
   730         	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   731         	if( pElement )
       
   732         		{
       
   733         		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   734         		if ( pAttrValue )
       
   735                     {
       
   736                     if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   737         		        {
       
   738                         return KErrSenOmitted;
       
   739                         }
       
   740                     else if ( *pAttrValue == KSenPropertyTrue)
       
   741                         {
       
   742                         return KErrSenOmitted;
       
   743                         }
       
   744         		    }
       
   745         		aValue.Set(pElement->Content());
       
   746                 return KErrNone;
       
   747         		}
       
   748             else
       
   749                 {
       
   750                 return KErrNotFound;
       
   751                 }
       
   752             }
       
   753         else
       
   754             {
       
   755             return KErrNotFound;
       
   756             }
       
   757         }
       
   758     }
       
   759     
       
   760 TInt CSenLayeredXmlProperties::PropertyL(const TDesC8& aName,
       
   761                                          MSenProperty*& aValue,
       
   762                                          TSenPropertiesLayer aLayer)
       
   763     {
       
   764     if ( aLayer > iLayer )
       
   765         {
       
   766         if ( !ipChildProperties )
       
   767             {
       
   768             return KErrNotFound;
       
   769             }
       
   770         else
       
   771             {
       
   772             return ipChildProperties->PropertyL(aName, aValue, aLayer);
       
   773             }
       
   774         }
       
   775     else
       
   776         {
       
   777         if ( aLayer == iLayer )
       
   778             {
       
   779         	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   780         	if( pElement )
       
   781         		{
       
   782                 CSenPropertiesElement* pPropertiesElement
       
   783                     = (CSenPropertiesElement*)pElement;
       
   784         		aValue = pPropertiesElement;
       
   785                 return KErrNone;
       
   786         		}
       
   787             else
       
   788                 {
       
   789                 return KErrNotFound;
       
   790                 }
       
   791             }
       
   792         else
       
   793             {
       
   794             return KErrNotFound;
       
   795             }
       
   796         }
       
   797     
       
   798     }
       
   799         
       
   800 TInt CSenLayeredXmlProperties::PropertyL(const TDesC8& aName,
       
   801                                          MSenProperty*& aValue)
       
   802     {
       
   803     if ( ipChildProperties )
       
   804         {
       
   805         TInt retVal = ipChildProperties->PropertyL(aName, aValue);
       
   806         if ( retVal == KErrNotFound )
       
   807             {
       
   808         	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   809         	if ( pElement )
       
   810         		{
       
   811         		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   812         		if ( pAttrValue )
       
   813                     {
       
   814                     if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   815         		        {
       
   816                         return KErrSenOmitted;
       
   817                         }
       
   818                     else if ( *pAttrValue == KSenPropertyTrue)
       
   819                         {
       
   820                         return KErrSenOmitted;
       
   821                         }
       
   822         		    }        		
       
   823                 CSenPropertiesElement* pPropertyElement 
       
   824                     = (CSenPropertiesElement*) pElement;
       
   825         		aValue = pPropertyElement;
       
   826         		return KErrNone;
       
   827         		}
       
   828             else
       
   829                 {
       
   830                 return KErrNotFound;
       
   831                 }
       
   832             }
       
   833             
       
   834         return retVal;
       
   835         }
       
   836     else
       
   837         {
       
   838     	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   839         if ( pElement )
       
   840             {
       
   841     		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   842     		if ( pAttrValue )
       
   843                 {
       
   844                 if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   845     		        {
       
   846                     return KErrSenOmitted;
       
   847                     }
       
   848                 else if ( *pAttrValue == KSenPropertyTrue)
       
   849                     {
       
   850                     return KErrSenOmitted;
       
   851                     }
       
   852     		    }            
       
   853             CSenPropertiesElement* pPropertyElement 
       
   854                 = (CSenPropertiesElement*) pElement;
       
   855         	aValue = pPropertyElement;
       
   856             return KErrNone;
       
   857     		}
       
   858         else
       
   859             {
       
   860             return KErrNotFound;
       
   861             }
       
   862         }
       
   863     }
       
   864     
       
   865 TInt CSenLayeredXmlProperties::SetPropertyL(const TDesC8& aName,
       
   866                                             const TDesC8& aValue,
       
   867                                             const TDesC8& aType)
       
   868     {
       
   869 	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   870 	if ( !pElement )
       
   871 		{
       
   872 		// Add new element
       
   873 		pElement =  &ipFragment->AsElement().AddElementL(aName);
       
   874 		}
       
   875     pElement->SetContentL(aValue);
       
   876 	SenXmlUtils::AddAttributeL(*pElement, KSenTypeAttributeName, aType);
       
   877     return KErrNone;
       
   878     }
       
   879 
       
   880 TInt CSenLayeredXmlProperties::PropertyL(const TDesC8& aName,
       
   881                                          TPtrC8& aValue,
       
   882                                          TPtrC8& aType)
       
   883     {
       
   884     if ( ipChildProperties )
       
   885         {
       
   886         TInt retVal = ipChildProperties->PropertyL(aName, aValue);
       
   887         if ( retVal == KErrNotFound )
       
   888             {
       
   889         	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   890         	if ( pElement )
       
   891         		{
       
   892         		/*
       
   893                 CSenPropertiesElement* pPropertyElement 
       
   894                     = (CSenPropertiesElement*) pElement;
       
   895         		aValue.Set(pPropertyElement->Value());
       
   896         		aType.Set(pPropertyElement->Type());
       
   897         		*/
       
   898         		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   899         		if ( pAttrValue )
       
   900                     {
       
   901                     if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   902         		        {
       
   903                         return KErrSenOmitted;
       
   904                         }
       
   905                     else if ( *pAttrValue == KSenPropertyTrue)
       
   906                         {
       
   907                         return KErrSenOmitted;
       
   908                         }
       
   909         		    }
       
   910         		aValue.Set(pElement->Content());
       
   911         		aType.Set(*pElement->AttrValue(KSenTypeAttributeName));
       
   912         		return KErrNone;
       
   913         		}
       
   914             else
       
   915                 {
       
   916                 return KErrNotFound;
       
   917                 }
       
   918             }
       
   919             
       
   920         return retVal;
       
   921         }
       
   922     else
       
   923         {
       
   924     	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
   925         if ( pElement )
       
   926             {
       
   927             /*
       
   928             CSenPropertiesElement* pPropertyElement 
       
   929                 = (CSenPropertiesElement*) pElement;
       
   930     		aValue.Set(pPropertyElement->Value());
       
   931     		aType.Set(pPropertyElement->Type());
       
   932     		*/
       
   933     		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   934     		if ( pAttrValue )
       
   935                 {
       
   936                 if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   937     		        {
       
   938                     return KErrSenOmitted;
       
   939                     }
       
   940                 else if ( *pAttrValue == KSenPropertyTrue)
       
   941                     {
       
   942                     return KErrSenOmitted;
       
   943                     }
       
   944     		    }
       
   945     		aValue.Set(pElement->Content());
       
   946     		aType.Set(*pElement->AttrValue(KSenTypeAttributeName));
       
   947             return KErrNone;
       
   948     		}
       
   949         else
       
   950             {
       
   951             return KErrNotFound;
       
   952             }
       
   953         }
       
   954     }    
       
   955      
       
   956     
       
   957 
       
   958 TInt CSenLayeredXmlProperties::PropertiesByTypeL(const TDesC8& aType,
       
   959                                                  RPointerArray<MSenProperty>& aArray)
       
   960     {
       
   961     TInt retVal(KErrNotFound);
       
   962 
       
   963     retVal = AllPropertiesByTypeL(aType, aArray);
       
   964 
       
   965     // Remove omitted values from the array.
       
   966     TInt propsCount = aArray.Count()-1;
       
   967     for (TInt i=propsCount; i>=0; i--)
       
   968         {
       
   969         CSenPropertiesElement* pElement = (CSenPropertiesElement*)aArray[i];
       
   970 		const TDesC8* pAttrValue = pElement->AttrValue(KSenOmittedAttributeName);
       
   971 		if ( pAttrValue )
       
   972             {
       
   973             if ( *pAttrValue == KSenOmittedTrueNoValue)
       
   974 		        {
       
   975 		        aArray.Remove(i);
       
   976                 }
       
   977             else if ( *pAttrValue == KSenPropertyTrue)
       
   978                 {
       
   979 		        aArray.Remove(i);
       
   980                 }
       
   981             }
       
   982         }
       
   983     
       
   984     if ( aArray.Count() > 0 )
       
   985         {
       
   986         retVal=KErrNone;
       
   987         }
       
   988     
       
   989     return retVal;
       
   990     }
       
   991 
       
   992 TInt CSenLayeredXmlProperties::AllPropertiesByTypeL(const TDesC8& aType,
       
   993                                                     RPointerArray<MSenProperty>& aArray)
       
   994     {
       
   995     TInt retVal(KErrNotFound);
       
   996     if ( ipChildProperties )
       
   997         {
       
   998         retVal = ipChildProperties->AllPropertiesByTypeL(aType, aArray);
       
   999         }
       
  1000 
       
  1001     CSenElement& element = ipFragment->AsElement();
       
  1002     RPointerArray<CSenElement>& elements = element.ElementsL();
       
  1003     TInt elementCount(elements.Count());
       
  1004     TInt propsCount(0);
       
  1005     TBool found(EFalse);
       
  1006     for (TInt i=0; i<elementCount; i++)
       
  1007         {
       
  1008         CSenElement* pElement = elements[i];
       
  1009         found = EFalse;
       
  1010 
       
  1011         // Go through properties which are already added into returned array.
       
  1012         // => If property is already in the array
       
  1013         //    it won't be added into array for the second time.
       
  1014         propsCount = aArray.Count();
       
  1015         for (TInt j=0; j<propsCount; j++)
       
  1016             {
       
  1017              MSenProperty* pProperty = aArray[j];
       
  1018              if ( pElement->LocalName() == pProperty->Name() )
       
  1019                 {
       
  1020                 found = ETrue;
       
  1021                 break;
       
  1022                 }
       
  1023             }
       
  1024         
       
  1025         if ( !found )
       
  1026             {
       
  1027             const TDesC8* propertyType =
       
  1028                         pElement->AttrValue(KSenTypeAttributeName);
       
  1029 
       
  1030             if ( propertyType )
       
  1031                 {
       
  1032                 if ( *propertyType == aType )
       
  1033                     {
       
  1034 #ifdef EKA2
       
  1035                     CSenPropertiesElement* pPropElement
       
  1036                         = (CSenPropertiesElement*)pElement;
       
  1037                     aArray.AppendL(pPropElement);
       
  1038 #else
       
  1039                     CSenPropertiesElement* pPropElement
       
  1040                         = (CSenPropertiesElement*)pElement;
       
  1041 			        User::LeaveIfError(aArray.Append(pPropElement));
       
  1042 #endif
       
  1043                     }
       
  1044                 }
       
  1045             }
       
  1046         }
       
  1047 
       
  1048     if ( aArray.Count() > 0 )
       
  1049         {
       
  1050         retVal=KErrNone;
       
  1051         }
       
  1052         
       
  1053     return retVal;
       
  1054     }
       
  1055     
       
  1056 TInt CSenLayeredXmlProperties::SetIntPropertyL(const TDesC8& aName, const TInt aValue,
       
  1057                                                TSenPropertiesLayer aLayer)
       
  1058     {
       
  1059     TBuf8<KFlatBufSize> buffer;
       
  1060     buffer.Num(aValue);
       
  1061     return SetPropertyL(aName, buffer, aLayer);
       
  1062     }
       
  1063 
       
  1064 TInt CSenLayeredXmlProperties::IntPropertyL(const TDesC8& aName, TInt& aValue,
       
  1065                                             TSenPropertiesLayer aLayer)
       
  1066     {
       
  1067     TPtrC8 value;
       
  1068     TInt retVal(KErrNone);
       
  1069     retVal = PropertyL(aName, value, aLayer);
       
  1070     if ( retVal == KErrNone )
       
  1071         {
       
  1072         TLex8 lex(value);
       
  1073         retVal = lex.Val(aValue);
       
  1074         }
       
  1075     return retVal;
       
  1076     }
       
  1077     
       
  1078 TInt CSenLayeredXmlProperties::SetBoolPropertyL(const TDesC8& aName, const TBool aValue,
       
  1079                                                 TSenPropertiesLayer aLayer)
       
  1080     {
       
  1081     if ( aValue )
       
  1082         {
       
  1083         return SetPropertyL(aName, KSenPropertyTrue, aLayer);
       
  1084         }
       
  1085     else
       
  1086         {
       
  1087         return SetPropertyL(aName, KSenPropertyFalse, aLayer);
       
  1088         }
       
  1089     }
       
  1090 
       
  1091 TInt CSenLayeredXmlProperties::BoolPropertyL(const TDesC8& aName, TBool& aValue,
       
  1092                                              TSenPropertiesLayer aLayer)
       
  1093     {
       
  1094     TPtrC8 value;
       
  1095     TInt retVal(KErrNone);
       
  1096     retVal = PropertyL(aName, value, aLayer);
       
  1097     if ( retVal == KErrNone )
       
  1098         {
       
  1099         if (value == KSenPropertyTrue)
       
  1100             {
       
  1101             aValue = ETrue;
       
  1102             }
       
  1103         else if (value == KSenPropertyFalse)
       
  1104             {
       
  1105             aValue = EFalse;
       
  1106             }
       
  1107         else
       
  1108             {
       
  1109             retVal = KErrGeneral;
       
  1110             }
       
  1111         }
       
  1112     return retVal;
       
  1113     }
       
  1114     
       
  1115 TInt CSenLayeredXmlProperties::SetOmittedL( const TDesC8& aName, 
       
  1116                                             TBool aValue,
       
  1117                                             TSenPropertiesLayer aLayer )
       
  1118     {
       
  1119     if ( aLayer > iLayer )
       
  1120         {
       
  1121         if ( !ipChildProperties )
       
  1122             {
       
  1123             CreateChildPropertiesL();	//codescannerwarnings
       
  1124             }
       
  1125         return ipChildProperties->SetOmittedL(aName, aValue, aLayer);
       
  1126         }
       
  1127     else
       
  1128         {
       
  1129         if ( aLayer == iLayer )
       
  1130             {
       
  1131             TBool newElementCreated = EFalse;
       
  1132          	CSenElement* pElement = ipFragment->AsElement().Element(aName);
       
  1133         	if ( !pElement )
       
  1134         		{
       
  1135         		// Add new element
       
  1136         		pElement =  &ipFragment->AsElement().AddElementL(aName);
       
  1137         		newElementCreated = ETrue;
       
  1138         		}
       
  1139             else
       
  1140                 {
       
  1141                 const TDesC8* pVal = pElement->AttrValue(KSenOmittedAttributeName);
       
  1142                 if ( pVal )
       
  1143                     {
       
  1144                     delete SenXmlUtils::RemoveAttributeL(*pElement, KSenOmittedAttributeName);
       
  1145                     }
       
  1146                 }
       
  1147               
       
  1148             if ( pElement )  
       
  1149                 {
       
  1150                 if ( aValue )
       
  1151                     {
       
  1152                     if ( newElementCreated )
       
  1153                         {
       
  1154                         SenXmlUtils::AddAttributeL(*pElement, KSenOmittedAttributeName, KSenOmittedTrueNoValue);
       
  1155                         }
       
  1156                     else
       
  1157                         {
       
  1158                         SenXmlUtils::AddAttributeL(*pElement, KSenOmittedAttributeName, KSenPropertyTrue);
       
  1159                         }
       
  1160                     }
       
  1161                 else
       
  1162                     {
       
  1163                     SenXmlUtils::AddAttributeL(*pElement, KSenOmittedAttributeName, KSenPropertyFalse);
       
  1164                     }
       
  1165                 }
       
  1166             else
       
  1167                 {
       
  1168                 return KErrNotFound;
       
  1169                 }
       
  1170             }
       
  1171         else
       
  1172             {
       
  1173             return KErrNotFound;
       
  1174             }
       
  1175         }
       
  1176         
       
  1177     return KErrNone;
       
  1178     }
       
  1179 
       
  1180 TInt CSenLayeredXmlProperties::RemovePropertyL(const TDesC8& aName,
       
  1181                                                TSenPropertiesLayer aLayer)
       
  1182     {
       
  1183     if ( aLayer > iLayer )
       
  1184         {
       
  1185         if ( !ipChildProperties )
       
  1186             {
       
  1187             return KErrNotFound;
       
  1188             }
       
  1189         return ipChildProperties->RemovePropertyL(aName, aLayer);
       
  1190         }
       
  1191     else
       
  1192         {
       
  1193         if ( aLayer == iLayer )
       
  1194             {
       
  1195          	CSenElement* pElement = ipFragment->AsElement().RemoveElement(aName);
       
  1196         	if ( pElement )
       
  1197         		{
       
  1198         		delete pElement;
       
  1199         		return KErrNone;
       
  1200         		}
       
  1201             else
       
  1202                 {
       
  1203                 return KErrNotFound;
       
  1204                 }
       
  1205             }
       
  1206         else
       
  1207             {
       
  1208             return KErrNotFound;
       
  1209             }
       
  1210         }
       
  1211     }
       
  1212 
       
  1213 void CSenLayeredXmlProperties::CreateChildPropertiesL()	//codescannerwarnings
       
  1214     {
       
  1215     if ( !ipFragment->Reader() )
       
  1216         {
       
  1217         if( !ipReader )
       
  1218             {
       
  1219             ipReader = CSenXmlReader::NewL(KXmlParserMimeType); // use libxml2 sax parser
       
  1220             }
       
  1221         ipFragment->ParseWithL(*ipReader);
       
  1222         }
       
  1223     
       
  1224     if ( ipFragment->HasStringPool() )
       
  1225         {
       
  1226         ipChildProperties =
       
  1227                 CSenLayeredXmlProperties::NewL(ipFragment->StringPool());
       
  1228         }
       
  1229     else
       
  1230         {
       
  1231         ipChildProperties = CSenLayeredXmlProperties::NewL();
       
  1232         }
       
  1233     ipChildProperties->ipParentProperties = this;
       
  1234     ipChildProperties->ipFragment->ParseWithL(*ipFragment->Reader());
       
  1235     
       
  1236     switch ( iLayer )
       
  1237         {
       
  1238         case ESenTransportLayer:
       
  1239             ipChildProperties->iLayer = ESenSereneLayer;
       
  1240             break;
       
  1241         case ESenSereneLayer:
       
  1242             ipChildProperties->iLayer = ESenFrameworkLayer;
       
  1243             break;
       
  1244         case ESenFrameworkLayer:
       
  1245             ipChildProperties->iLayer = ESenProviderSessionLayer;
       
  1246             break;
       
  1247         case ESenProviderSessionLayer:
       
  1248             ipChildProperties->iLayer = ESenConsumerSessionLayer;
       
  1249             break;
       
  1250         case ESenConsumerSessionLayer:
       
  1251             ipChildProperties->iLayer = ESenMessageLayer;
       
  1252             break;
       
  1253         case ESenMessageLayer:
       
  1254             // Not possible
       
  1255             break;
       
  1256         default:
       
  1257             // Not possible
       
  1258             break;
       
  1259         }
       
  1260     }
       
  1261     
       
  1262 void CSenLayeredXmlProperties::ElementsL(RPointerArray<CSenElement>& aProps) const
       
  1263     {
       
  1264     if ( ipChildProperties )
       
  1265         {
       
  1266         ipChildProperties->ElementsL(aProps);
       
  1267         }
       
  1268             
       
  1269     RPointerArray<CSenElement>& elements = ipFragment->AsElement().ElementsL();
       
  1270     TInt elementCount(elements.Count());
       
  1271     TInt propsCount(0);
       
  1272     TBool found;
       
  1273     for (TInt i=0; i<elementCount; i++)
       
  1274         {
       
  1275         found = EFalse;
       
  1276         propsCount = aProps.Count();
       
  1277         for (TInt j=0; j<propsCount; j++)
       
  1278             {
       
  1279              if ( elements[i]->LocalName() == aProps[j]->LocalName() )
       
  1280                 {
       
  1281                 found = ETrue;
       
  1282                 break;
       
  1283                 }
       
  1284             }
       
  1285         if ( !found )
       
  1286             {
       
  1287 #ifdef EKA2
       
  1288             aProps.AppendL(elements[i]);
       
  1289 #else
       
  1290             User::LeaveIfError(aProps.Append(elements[i]));
       
  1291 #endif
       
  1292             }
       
  1293         }
       
  1294     }
       
  1295 
       
  1296 MSenProperties* CSenLayeredXmlProperties::CloneL() const
       
  1297     {
       
  1298     CSenElement& element = ipFragment->AsElement();
       
  1299     
       
  1300     CSenLayeredXmlProperties* pProperties = NewLC(element);
       
  1301     if ( ipChildProperties )
       
  1302         {
       
  1303         CSenLayeredXmlProperties* pChildProperties =
       
  1304                                 (CSenLayeredXmlProperties*)ipChildProperties->CloneL();
       
  1305         pProperties->ipChildProperties = pChildProperties;
       
  1306         }
       
  1307     
       
  1308     CleanupStack::Pop(pProperties);
       
  1309     return pProperties;
       
  1310     }
       
  1311 
       
  1312 MSenProperties* CSenLayeredXmlProperties::Clone(TInt& aOkOrError) const
       
  1313     {
       
  1314     MSenProperties* pClone = NULL;
       
  1315     TRAP( aOkOrError, pClone = CloneL(); )
       
  1316     return pClone;
       
  1317     }
       
  1318 
       
  1319 void CSenLayeredXmlProperties::BaseConstructL(
       
  1320                                         const TDesC8& aLocalname, 
       
  1321                                         const TDesC8& aXml,
       
  1322                                         CSenXmlReader* aParser,
       
  1323                                         RStringPool* aStringPool)
       
  1324     {
       
  1325     ipFragment = CSenPropertiesFragment::NewL(aLocalname, aStringPool);
       
  1326     if ( aParser && aXml!=KNullDesC8 )
       
  1327         {
       
  1328         // Do parsing
       
  1329         ipFragment->ParseWithL(*aParser);
       
  1330         ipFragment->ParseL(aXml);
       
  1331         }
       
  1332    }
       
  1333 
       
  1334 void CSenLayeredXmlProperties::BaseConstructL(
       
  1335                                         const TDesC8& aNamespace, 
       
  1336                                         const TDesC8& aLocalname, 
       
  1337                                         const TDesC8& aXml,
       
  1338                                         CSenXmlReader* aParser,
       
  1339                                         RStringPool* aStringPool)
       
  1340     {
       
  1341     ipFragment = CSenPropertiesFragment::NewL(aNamespace,
       
  1342                                               aLocalname,
       
  1343                                               aStringPool);
       
  1344     if ( aParser && aXml != KNullDesC8 )
       
  1345         {
       
  1346         // Do parsing
       
  1347         ipFragment->ParseWithL(*aParser);
       
  1348         ipFragment->ParseL(aXml);
       
  1349         }
       
  1350     }
       
  1351 
       
  1352 void CSenLayeredXmlProperties::BaseConstructL(const TDesC8& aNamespace, 
       
  1353                                        const TDesC8& aLocalname, 
       
  1354                                        const TDesC8& aQualifiedName, 
       
  1355                                        const TDesC8& aXml,
       
  1356                                        CSenXmlReader* aParser,
       
  1357                                        RStringPool* aStringPool)
       
  1358     {
       
  1359     ipFragment = CSenPropertiesFragment::NewL(aNamespace, 
       
  1360                                               aLocalname, 
       
  1361                                               aQualifiedName,
       
  1362                                               aStringPool);
       
  1363     if ( aParser && aXml != KNullDesC8 )
       
  1364         {
       
  1365         // Do parsing
       
  1366         ipFragment->ParseWithL(*aParser);
       
  1367         ipFragment->ParseL(aXml);
       
  1368         }
       
  1369     }
       
  1370 
       
  1371 void CSenLayeredXmlProperties::BaseConstructL(const CSenElement& aElement,
       
  1372                                               RStringPool* aStringPool)
       
  1373     {
       
  1374     ipFragment = CSenPropertiesFragment::NewL(aElement.LocalName(),
       
  1375                                               aStringPool);
       
  1376     
       
  1377     CSenElement& element = ipFragment->AsElement();
       
  1378     element.CopyFromL((CSenElement&)aElement);
       
  1379     }
       
  1380 
       
  1381 CSenLayeredXmlProperties::CSenLayeredXmlProperties()
       
  1382     : ipFragment(NULL),
       
  1383       ipChildProperties(NULL),
       
  1384       iLayer(ESenTransportLayer),
       
  1385       ipReader(NULL),
       
  1386       ipParentProperties(NULL)
       
  1387     {
       
  1388     }
       
  1389 
       
  1390 CSenLayeredXmlProperties::~CSenLayeredXmlProperties()
       
  1391     {
       
  1392     delete ipReader;
       
  1393     delete ipFragment;
       
  1394     delete ipChildProperties;
       
  1395     }
       
  1396 
       
  1397 
       
  1398 // END OF FILE