webservices/wsutils/src/sensaxutils.cpp
changeset 0 62f9d29f7211
equal deleted inserted replaced
-1:000000000000 0:62f9d29f7211
       
     1 /*
       
     2 * Copyright (c) 2002-2005 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 FILES
       
    26 #include "sensaxutils.h"
       
    27 #include <SenXmlConstants.h>
       
    28 
       
    29 
       
    30 EXPORT_C TInt SenSaxUtils::SearchStartTagL(const TDesC8& aDocument,
       
    31                                            const TDesC8& aLocalName,
       
    32                                            TInt& aStartTagStart,
       
    33                                            TInt& aStartTagEnd,
       
    34                                            TPtrC8& aPrefix)
       
    35     {
       
    36     return SearchStartTagL(aDocument, aLocalName, aStartTagStart, aStartTagEnd,
       
    37                            aPrefix, EFalse);
       
    38     }
       
    39 
       
    40 
       
    41 EXPORT_C TInt SenSaxUtils::SearchStartTagL(const TDesC8& aDocument,
       
    42                                            const TDesC8& aPrefix,
       
    43                                            const TDesC8& aLocalName,
       
    44                                            TInt& aStartTagStart,
       
    45                                            TInt& aStartTagEnd)
       
    46     {
       
    47     TPtrC8 tmpPrefix(aPrefix);
       
    48     return SearchStartTagL(aDocument, aLocalName, aStartTagStart, aStartTagEnd,
       
    49                            tmpPrefix, ETrue);
       
    50     }
       
    51 
       
    52 EXPORT_C TInt SenSaxUtils::SearchEndTagL(const TDesC8& aDocument,
       
    53                                                 const TDesC8& aLocalName,
       
    54                                                 TInt& aEndTagStart,
       
    55                                                 TInt& aEndTagEnd,
       
    56                                                 TPtrC8& aPrefix)
       
    57     {
       
    58     return SearchEndTagL(aDocument, aLocalName, aEndTagStart, aEndTagEnd,
       
    59                          aPrefix, EFalse);
       
    60     }
       
    61 
       
    62 EXPORT_C TInt SenSaxUtils::SearchEndTagL(const TDesC8& aDocument,
       
    63                                                 const TDesC8& aPrefix,
       
    64                                                 const TDesC8& aLocalName,
       
    65                                                 TInt& aEndTagStart,
       
    66                                                 TInt& aEndTagEnd)
       
    67     {
       
    68     TPtrC8 tmpPrefix(aPrefix);
       
    69     return SearchEndTagL(aDocument, aLocalName, aEndTagStart, aEndTagEnd,
       
    70                          tmpPrefix, ETrue);
       
    71     }
       
    72 
       
    73 TInt SenSaxUtils::SearchStartTagL(const TDesC8& aDocument,
       
    74                                   const TDesC8& aLocalName,
       
    75                                   TInt& aStartTagStart,
       
    76                                   TInt& aStartTagEnd,
       
    77                                   TPtrC8& aPrefix,
       
    78                                   TBool aSearchPrefix = EFalse)
       
    79 
       
    80     {
       
    81     TPtrC8 localNamePtr(KNullDesC8);
       
    82     TPtrC8 stPrefixPtr(KNullDesC8);
       
    83         
       
    84     TInt i;
       
    85     TBool tagFound(EFalse);
       
    86     TInt colon(KErrNotFound);
       
    87     TInt lessThan(KErrNotFound);
       
    88     TInt space(KErrNotFound);
       
    89     
       
    90     TInt size = aDocument.Size()-(aLocalName.Size()+3); // </a> <=> at least size-4
       
    91     TPtrC8 currentCharacter(KNullDesC8);
       
    92     for (i = 0; i < size; i++)
       
    93         {
       
    94         currentCharacter.Set(aDocument.Ptr()+i,1);
       
    95         
       
    96         // ************* Handle Quotes <=> ' or " ******** //
       
    97         if ( currentCharacter == KSenDblQuot ) // Check "\""
       
    98             {
       
    99             i = SearchMarkStartingFromPlus(aDocument, KSenDblQuot, i+1, size);
       
   100             if ( i == KErrNotFound )
       
   101                 {
       
   102                 return i;
       
   103                 }
       
   104             }
       
   105         else if ( currentCharacter == KSenQuot ) // Check "'"
       
   106             {
       
   107             i = SearchMarkStartingFromPlus(aDocument, KSenQuot, i+1, size);
       
   108             if ( i == KErrNotFound )
       
   109                 {
       
   110                 return i;
       
   111                 }
       
   112             }
       
   113         else
       
   114             {
       
   115             // ************* Handle "<" ****************** //
       
   116             if ( currentCharacter == KSenLessThan )   // Check "<"
       
   117                 {
       
   118                 currentCharacter.Set(aDocument.Ptr()+i,4);
       
   119                 // ************* Handle comments ********* //
       
   120                 if ( currentCharacter == KSenXmlCommentStart )          // Check "<!--"
       
   121                     {
       
   122                     i+=3;
       
   123                     i = SearchEndOfCommentStartingFrom(aDocument, i, size);
       
   124                     if ( i == KErrNotFound )
       
   125                         {
       
   126                         return i;
       
   127                         }
       
   128                     }
       
   129                 else
       
   130                     {
       
   131                     currentCharacter.Set(aDocument.Ptr()+i,2);
       
   132                     if ( currentCharacter == KSenXmlInstructionStart || // Check "<?"
       
   133                          currentCharacter == KSenXmlEntityStart ||      // Check "<!"
       
   134                          currentCharacter == KSenLessThanSlash )        // Check "<\"
       
   135                         {
       
   136                         i+=1;
       
   137                         i = SearchMatchingGreaterThanStartingFrom(aDocument,
       
   138                                                                   i,
       
   139                                                                   size);
       
   140                         if ( i == KErrNotFound )
       
   141                             {
       
   142                             return i;
       
   143                             }
       
   144                         }
       
   145                     else
       
   146                         {
       
   147                         colon = KErrNotFound;
       
   148                         space = KErrNotFound;
       
   149                         lessThan = i;
       
   150                         }
       
   151                     }
       
   152                 }
       
   153             // ************* Handle ">" ****************** //                
       
   154             else if ( currentCharacter == KSenGreaterThan ) // Check ">"
       
   155                 {
       
   156                 if ( lessThan != KErrNotFound )
       
   157                     {
       
   158                     if ( colon != KErrNotFound )
       
   159                         {
       
   160                         // Both Prefix and LocalName can be found.
       
   161                         if ( space != KErrNotFound )
       
   162                             {
       
   163                             localNamePtr.Set(aDocument.Ptr()+colon+1, space-colon-1);
       
   164                             }
       
   165                         else
       
   166                             {
       
   167                             localNamePtr.Set(aDocument.Ptr()+colon+1, i-colon-1);
       
   168                             }
       
   169                         if ( !aSearchPrefix )
       
   170                             {
       
   171                             aPrefix.Set(aDocument.Ptr()+lessThan+1, colon-lessThan-1);
       
   172                             }
       
   173                         else
       
   174                             {
       
   175                             stPrefixPtr.Set(aDocument.Ptr()+lessThan+1, colon-lessThan-1);
       
   176                             }
       
   177                         }
       
   178                     else
       
   179                         {
       
   180                         // Only LocalName can be found.
       
   181                         if ( space != KErrNotFound )
       
   182                             {
       
   183                             localNamePtr.Set(aDocument.Ptr()+lessThan+1, space-lessThan-1);
       
   184                             }
       
   185                         else
       
   186                             {
       
   187                             localNamePtr.Set(aDocument.Ptr()+lessThan+1, i-lessThan-1);
       
   188                             }
       
   189                         stPrefixPtr.Set(KNullDesC8);                            
       
   190                         }
       
   191 
       
   192                     if ( localNamePtr == aLocalName )
       
   193                         {
       
   194                         if ( aSearchPrefix )              
       
   195                             {
       
   196                             if ( stPrefixPtr == aPrefix )
       
   197                                 {
       
   198                                 tagFound = ETrue;
       
   199                                 break;
       
   200                                 }
       
   201                             else
       
   202                                 {
       
   203                                 tagFound = EFalse;
       
   204                                 lessThan = KErrNotFound;
       
   205                                 colon = KErrNotFound;
       
   206                                 space = KErrNotFound;
       
   207                                 }
       
   208                             }
       
   209                         else
       
   210                             {
       
   211                             tagFound = ETrue;
       
   212                             break;
       
   213                             }
       
   214                         }
       
   215                     else
       
   216                         {
       
   217                         tagFound = EFalse;
       
   218                         lessThan = KErrNotFound;
       
   219                         colon = KErrNotFound;
       
   220                         space = KErrNotFound;
       
   221                         }
       
   222                     }
       
   223                 }
       
   224             // ************* Handle ":" ****************** //                
       
   225             else if ( currentCharacter == KSenColon ) // Check ":"
       
   226                 {
       
   227                 if ( lessThan != KErrNotFound &&
       
   228                      space == KErrNotFound &&
       
   229                      colon == KErrNotFound )
       
   230                     {
       
   231                     colon = i;
       
   232                     }
       
   233                 }
       
   234             // ************* Handle " " ****************** //                
       
   235             else if ( currentCharacter == KSenSpace ) // Check " "
       
   236                 {
       
   237                 if ( lessThan != KErrNotFound && 
       
   238                      space == KErrNotFound )
       
   239                     {
       
   240                     space = i;
       
   241                     }
       
   242                 }
       
   243             }        
       
   244         }
       
   245 
       
   246     if ( tagFound )
       
   247         {
       
   248         aStartTagStart   = lessThan;
       
   249         aStartTagEnd     = i;
       
   250         }
       
   251     else
       
   252         {
       
   253         aStartTagStart   = KErrNotFound;
       
   254         aStartTagEnd     = KErrNotFound;
       
   255         return KErrNotFound;
       
   256         }
       
   257 
       
   258     return KErrNone;
       
   259     }
       
   260 
       
   261 TInt SenSaxUtils::SearchEndTagL(const TDesC8& aDocument,
       
   262                                 const TDesC8& aLocalName,
       
   263                                 TInt& aEndTagStart,
       
   264                                 TInt& aEndTagEnd,
       
   265                                 TPtrC8& aPrefix,
       
   266                                 TBool aSearchPrefix)
       
   267     {
       
   268     // Search EndTag starting from the end
       
   269     // of XML Document
       
   270     TPtrC8 localNamePtr(KNullDesC8);
       
   271     TPtrC8 etPrefixPtr(KNullDesC8);
       
   272     
       
   273     TInt colon(KErrNotFound);
       
   274     TInt greaterThan(KErrNotFound);
       
   275     TBool tagFound      = EFalse;
       
   276 
       
   277     TInt i=aDocument.Size()-1;
       
   278     TPtrC8 currentCharacter(KNullDesC8);
       
   279     for (; i > 2; i--)
       
   280         {
       
   281         currentCharacter.Set(aDocument.Ptr()+i,1);
       
   282         
       
   283         // ************* Handle Quotes <=> ' or " ******** //
       
   284         if ( currentCharacter == KSenDblQuot ) // Check "\""
       
   285             {
       
   286             i = SearchMarkStartingFromMinus(aDocument, KSenDblQuot, i-1);
       
   287             if ( i == KErrNotFound )
       
   288                 {
       
   289                 return i;
       
   290                 }
       
   291             }
       
   292         else if ( currentCharacter == KSenQuot ) // Check "'"
       
   293             {
       
   294             i = SearchMarkStartingFromMinus(aDocument, KSenQuot, i-1);
       
   295             if ( i == KErrNotFound )
       
   296                 {
       
   297                 return i;
       
   298                 }
       
   299             }
       
   300         else
       
   301             {
       
   302             // ************* Handle ">" ****************** //
       
   303             if ( currentCharacter == KSenGreaterThan ) // Check ">"
       
   304                 {
       
   305                 currentCharacter.Set(aDocument.Ptr()+i-2,3);
       
   306                 // ************* Handle comments ********* //
       
   307                 if ( currentCharacter == KSenXmlCommentEnd ) // Check "-->"
       
   308                     {
       
   309                     i-=3;
       
   310                     i = SearchStartOfCommentStartingFrom(aDocument, i);
       
   311                     if ( i == KErrNotFound )
       
   312                         {
       
   313                         return i;
       
   314                         }
       
   315                     }
       
   316                 else
       
   317                     {
       
   318                     greaterThan = i;
       
   319                     colon = KErrNotFound;
       
   320                     }
       
   321                 }
       
   322             // ************* Handle "<" ****************** //
       
   323             else if ( currentCharacter == KSenLessThan ) // Check "<"
       
   324                 {
       
   325                 currentCharacter.Set(aDocument.Ptr()+i,2);
       
   326                 if ( currentCharacter == KSenXmlInstructionStart || // Check "<?"
       
   327                      currentCharacter == KSenXmlEntityStart)        // Check "<!" 
       
   328                     {
       
   329                     greaterThan = KErrNotFound;
       
   330                     colon = KErrNotFound;
       
   331                     }
       
   332                 else if ( currentCharacter == KSenLessThanSlash )   // Check "</"
       
   333                     {
       
   334                     if ( greaterThan != KErrNotFound )
       
   335                         {
       
   336                         if ( colon != KErrNotFound )
       
   337                             {
       
   338                             // Both Prefix and LocalName was found.
       
   339                             localNamePtr.Set(aDocument.Ptr()+colon+1, greaterThan-colon-1);
       
   340                             if ( !aSearchPrefix )
       
   341                                 {
       
   342                                 aPrefix.Set(aDocument.Ptr()+i+2, colon-i-2);
       
   343                                 }
       
   344                             else
       
   345                                 {
       
   346                                 etPrefixPtr.Set(aDocument.Ptr()+i+2, colon-i-2);
       
   347                                 }
       
   348                             }
       
   349                         else
       
   350                             {
       
   351                             // Only LocalName was found.
       
   352                             localNamePtr.Set(aDocument.Ptr()+i+2, greaterThan-i-2);
       
   353                             etPrefixPtr.Set(KNullDesC8);
       
   354                             }
       
   355 
       
   356                         if ( localNamePtr == aLocalName )
       
   357                             {
       
   358                             if ( aSearchPrefix )              
       
   359                                 {
       
   360                                 if ( etPrefixPtr == aPrefix )
       
   361                                     {
       
   362                                     tagFound = ETrue;
       
   363                                     break;
       
   364                                     }
       
   365                                 else
       
   366                                     {
       
   367                                     tagFound = EFalse;
       
   368                                     greaterThan = KErrNotFound;
       
   369                                     colon = KErrNotFound;
       
   370                                     }
       
   371                                 }
       
   372                             else
       
   373                                 {
       
   374                                 tagFound = ETrue;
       
   375                                 break;
       
   376                                 }
       
   377                             }
       
   378                         else
       
   379                             {
       
   380                             tagFound = EFalse;
       
   381                             greaterThan = KErrNotFound;
       
   382                             colon = KErrNotFound;
       
   383                             }
       
   384                         }
       
   385                     }
       
   386                 }
       
   387             else if ( currentCharacter == KSenColon ) // Check ":"
       
   388                 {
       
   389                 if ( greaterThan != KErrNotFound )
       
   390                     {
       
   391                     colon = i;
       
   392                     }
       
   393                 }
       
   394             }
       
   395         }
       
   396         
       
   397     if ( tagFound )
       
   398         {
       
   399         aEndTagStart = i;
       
   400         aEndTagEnd   = greaterThan;
       
   401         }
       
   402     else
       
   403         {
       
   404         aEndTagStart = KErrNotFound;
       
   405         aEndTagEnd   = KErrNotFound;
       
   406         return KErrNotFound;
       
   407         }
       
   408         
       
   409     return KErrNone;
       
   410     }
       
   411 
       
   412 TInt SenSaxUtils::SearchMarkStartingFromPlus(const TDesC8& aDocument,
       
   413                                              const TDesC8& aMark,
       
   414                                              TInt position,
       
   415                                              TInt size)
       
   416     {
       
   417     TPtrC8 currentCharacter;
       
   418     TInt i = position;
       
   419     for (; i < size; i++ )
       
   420         {
       
   421         currentCharacter.Set(aDocument.Ptr()+i,1);
       
   422         if ( currentCharacter == aMark )
       
   423             {
       
   424             return i;
       
   425             }
       
   426         }
       
   427     
       
   428     return KErrNotFound;
       
   429     }
       
   430 
       
   431 TInt SenSaxUtils::SearchMarkStartingFromMinus(const TDesC8& aDocument,
       
   432                                               const TDesC8& aMark,
       
   433                                               TInt position)
       
   434     {
       
   435     TPtrC8 currentCharacter;
       
   436     TInt i = position;
       
   437     for (; i >= 0; i--)
       
   438         {
       
   439         currentCharacter.Set(aDocument.Ptr()+i,1);
       
   440         if ( currentCharacter == aMark )
       
   441             {
       
   442             return i;
       
   443             }
       
   444         }
       
   445     
       
   446     return KErrNotFound;
       
   447     }
       
   448 
       
   449 TInt SenSaxUtils::SearchMatchingGreaterThanStartingFrom(const TDesC8& aDocument,
       
   450                                                         TInt position,
       
   451                                                         TInt size)
       
   452     {
       
   453     TInt lessThanCount = 1;
       
   454     TPtrC8 currentCharacter;
       
   455     
       
   456     for (TInt i = position; i < size; i++)
       
   457         {
       
   458         currentCharacter.Set(aDocument.Ptr()+i,1);
       
   459         
       
   460         if ( currentCharacter == KSenDblQuot ) // Check "\""
       
   461             {
       
   462             i = SearchMarkStartingFromPlus(aDocument, KSenDblQuot, i+1, size);
       
   463             if ( i == KErrNotFound )
       
   464                 {
       
   465                 return i;
       
   466                 }
       
   467             }
       
   468         else if ( currentCharacter == KSenQuot ) // Check "'"
       
   469             {
       
   470             i = SearchMarkStartingFromPlus(aDocument, KSenQuot, i+1, size);
       
   471             if ( i == KErrNotFound )
       
   472                 {
       
   473                 return i;
       
   474                 }
       
   475             }
       
   476         else
       
   477             {
       
   478             if ( currentCharacter == KSenLessThan )   // Check "<"
       
   479                 {
       
   480                 currentCharacter.Set(aDocument.Ptr()+i,4);
       
   481                 if ( currentCharacter == KSenXmlCommentStart )          // Check "<!--"
       
   482                     {
       
   483                     i+=3;
       
   484                     i = SearchEndOfCommentStartingFrom(aDocument, i, size);
       
   485                     }
       
   486                 else
       
   487                     {
       
   488                     lessThanCount++;
       
   489                     }
       
   490                 }
       
   491             else if ( currentCharacter == KSenGreaterThan ) // Check ">"
       
   492                 {
       
   493                 lessThanCount--;
       
   494                 if ( lessThanCount == 0)
       
   495                     {
       
   496                     return i;
       
   497                     }
       
   498                 }
       
   499             }            
       
   500         }
       
   501     
       
   502     return KErrNotFound;
       
   503     }
       
   504 
       
   505 TInt SenSaxUtils::SearchEndOfCommentStartingFrom(const TDesC8& aDocument,
       
   506                                                  TInt position,
       
   507                                                  TInt size)
       
   508     {
       
   509     TPtrC8 currentCharacter;
       
   510 
       
   511     for (TInt i = position; i < size; i++)
       
   512         {
       
   513         currentCharacter.Set(aDocument.Ptr()+i,1);
       
   514         
       
   515         if ( currentCharacter == KSenGreaterThan ) // Check ">"
       
   516             {
       
   517             currentCharacter.Set(aDocument.Ptr()+i-2,3);
       
   518             if ( currentCharacter == KSenXmlCommentEnd ) // Check "-->"
       
   519                 {
       
   520                 return i;
       
   521                 }
       
   522             }
       
   523         }
       
   524         
       
   525     return KErrNotFound;        
       
   526     }
       
   527 
       
   528 TInt SenSaxUtils::SearchStartOfCommentStartingFrom(const TDesC8& aDocument,
       
   529                                                    TInt position)
       
   530     {
       
   531     TPtrC8 currentCharacter;
       
   532 
       
   533     for (TInt i = position; i >= 0; i--)
       
   534         {
       
   535         currentCharacter.Set(aDocument.Ptr()+i,1);
       
   536         
       
   537         if ( currentCharacter == KSenLessThan ) // Check "<"
       
   538             {
       
   539             currentCharacter.Set(aDocument.Ptr()+i,4);
       
   540             if ( currentCharacter == KSenXmlCommentStart ) // Check "<!--"
       
   541                 {
       
   542                 return i;
       
   543                 }
       
   544             }
       
   545         }
       
   546         
       
   547     return KErrNotFound;        
       
   548     }
       
   549 
       
   550 // End of File
       
   551