Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*==================================================================================================
     18 
     19 Source Name: dmToken.cc
     20 
     21 General Description: This file contains implementation of utility classes DMToken, DMURI, DMParser
     22 
     23 ==================================================================================================*/
     24 
     25 #include "dmtoken.h"
     26 #include "dmdefs.h"
     27 #include "xpl_Logger.h"
     28 #include "syncml_dm_data_types.h"
     29 #include "dm_tree_class.H"
     30 
     31 DMToken::DMToken()
     32 {
     33     m_pDelimPos = NULL;
     34     m_pStr = NULL;
     35     m_pTokenPos = NULL;
     36     m_cDelim = SYNCML_DM_COMMA;
     37     m_bIsAlloc = TRUE;
     38 }
     39 
     40 DMToken::DMToken(char delimeter)
     41 {
     42     m_pDelimPos = NULL;
     43     m_pStr = NULL;
     44     m_pTokenPos = NULL;
     45     m_cDelim = delimeter;
     46     m_bIsAlloc = TRUE;
     47 }
     48 
     49 
     50 DMToken::DMToken(BOOLEAN bIsAlloc, CPCHAR str, char delimeter)
     51 {
     52 
     53     m_pDelimPos = NULL;
     54     m_pStr = NULL;
     55     m_bIsAlloc = bIsAlloc;
     56     m_cDelim = delimeter;
     57     assign(str);
     58 }
     59 
     60 
     61 DMToken::~DMToken()
     62 {
     63     if ( m_bIsAlloc == TRUE )
     64     {
     65         FreeAndSetNull(m_pStr);
     66     }
     67     else
     68         reset();
     69 }
     70 
     71 
     72 CPCHAR DMToken::assign(CPCHAR szStr)
     73 {
     74     if ( m_bIsAlloc == TRUE )
     75     {
     76         FreeAndSetNull(m_pStr);
     77 
     78         if ( szStr && szStr[0] )
     79         { // copy non empty string only
     80             m_pStr = (char *)DmAllocMem( DmStrlen(szStr)+1);
     81             if ( m_pStr != NULL) {
     82                 DmStrcpy( m_pStr, szStr );
     83             }
     84             else {
     85                 XPL_LOG_DM_TMN_Error(("DMToken::assign : unable allocate memory\n"));
     86             }
     87         }
     88     }
     89     else
     90     {
     91         reset();
     92         m_pStr = (char*)szStr;
     93     }
     94 
     95     m_pDelimPos = m_pStr;
     96     m_pTokenPos = m_pStr;
     97     return m_pStr;
     98 }
     99 
    100 CPCHAR DMToken::nextSegment()
    101 {
    102 
    103     if ( m_pDelimPos == NULL )
    104         return NULL;
    105 
    106     if ( m_pDelimPos != m_pStr )
    107     {
    108         *m_pDelimPos = m_cDelim;
    109         m_pTokenPos = m_pDelimPos+1;
    110     }
    111     m_pDelimPos = DmStrchr(m_pTokenPos, m_cDelim);
    112     if(m_pDelimPos != NULL)
    113     {
    114        *m_pDelimPos = SYNCML_DM_NULL;
    115     }
    116 
    117     if ( m_pTokenPos[0] == SYNCML_DM_NULL )
    118         return NULL;
    119 
    120     return (m_pTokenPos);
    121 
    122 }
    123 
    124 
    125 UINT32 DMToken::getSegmentsCount()
    126 {
    127     UINT32 count = 0;
    128     char * sTokenPos = m_pStr;
    129 
    130     if ( !sTokenPos )
    131         return 0;
    132 
    133     reset();
    134 
    135     m_pDelimPos = DmStrchr(m_pTokenPos,m_cDelim);
    136     while ( m_pDelimPos )
    137     {
    138         count++;
    139         m_pTokenPos = m_pDelimPos + 1;
    140         m_pDelimPos = DmStrchr(m_pTokenPos,m_cDelim);
    141     }
    142 
    143     if ( *m_pTokenPos == SYNCML_DM_NULL )
    144         return count;
    145 
    146     m_pDelimPos = m_pStr;
    147     m_pTokenPos = m_pStr;
    148     return count+1;
    149 }
    150 
    151 void DMToken::reset()
    152 {
    153     if ( m_pDelimPos && m_pDelimPos != m_pStr )
    154         *m_pDelimPos = m_cDelim;
    155     m_pDelimPos = m_pStr;
    156     m_pTokenPos = m_pStr;
    157 }
    158 
    159 DMURI::DMURI() : DMToken(TRUE, NULL,SYNCML_DM_FORWARD_SLASH)
    160 {
    161 }
    162 
    163 DMURI::DMURI(BOOLEAN bIsAlloc) : DMToken(bIsAlloc, NULL,SYNCML_DM_FORWARD_SLASH)
    164 {
    165 }
    166 
    167 DMURI::DMURI(BOOLEAN bIsAlloc, CPCHAR szURI) : DMToken(bIsAlloc, szURI,SYNCML_DM_FORWARD_SLASH)
    168 {
    169 }
    170 
    171 
    172 CPCHAR DMURI::getTailSegments() const
    173 {
    174     if ( m_pDelimPos == NULL )
    175         return NULL;
    176 
    177     if ( m_pDelimPos == m_pStr && *m_pStr != SYNCML_DM_FORWARD_SLASH )
    178         return m_pStr;
    179 
    180     return m_pDelimPos+1;
    181 }
    182 
    183 
    184 CPCHAR DMURI::getLastSegment()
    185 {
    186 
    187     if ( m_pStr == NULL )
    188         return NULL;
    189 
    190     reset();
    191     char * sPos = DmStrrchr(m_pStr,m_cDelim);
    192     if ( sPos == NULL )
    193         return NULL;
    194     else
    195         return sPos+1;
    196 }
    197 
    198 CPCHAR DMURI::getParentURI()
    199 {
    200 
    201      if ( m_pStr == NULL )
    202         return NULL;
    203 
    204      char * pDelimPosPrev = m_pDelimPos;
    205      m_pDelimPos = DmStrrchr(m_pStr, SYNCML_DM_FORWARD_SLASH);
    206      if ( !m_pDelimPos || m_pDelimPos == m_pStr )
    207      {
    208         m_pDelimPos = pDelimPosPrev;
    209         return NULL;
    210      }
    211 
    212      *m_pDelimPos = SYNCML_DM_NULL;
    213      if ( pDelimPosPrev != m_pStr )
    214         *pDelimPosPrev = SYNCML_DM_FORWARD_SLASH;
    215 
    216 
    217      return m_pStr;
    218 }
    219 
    220 DMParser::DMParser(char delimeter)
    221 {
    222     m_pDelimPos = NULL;
    223     m_pStr = NULL;
    224     m_cDelim = delimeter;
    225 
    226     m_nCurrentSegment = 0;
    227     m_nSegmentsCount = 0;
    228 
    229     m_aSegments = (DM_URI_SEGMENT_T*)DmAllocMem( dmTreeObj.GetMaxPathDepth() * sizeof(DM_URI_SEGMENT_T));
    230 
    231 }
    232 
    233 DMParser::DMParser(CPCHAR szURI, char delimeter)
    234 {
    235     m_pDelimPos = NULL;
    236     m_pStr = NULL;
    237     m_cDelim = delimeter;
    238 
    239 
    240     m_nCurrentSegment = 0;
    241     m_nSegmentsCount = 0;
    242     m_aSegments = (DM_URI_SEGMENT_T*)DmAllocMem( dmTreeObj.GetMaxPathDepth() * sizeof(DM_URI_SEGMENT_T));
    243     assign(szURI);
    244 }
    245 
    246 
    247 DMParser::~DMParser()
    248 {
    249   reset();
    250   FreeAndSetNull(m_aSegments);
    251 }
    252 
    253 CPCHAR DMParser::nextSegment()
    254 {
    255 
    256     if ( m_nCurrentSegment == m_nSegmentsCount )
    257         return NULL;
    258 
    259     char * pStr = m_aSegments[m_nCurrentSegment].m_pStr;
    260 //    XPL_LOG_DM_TMN_Debug(("DMParser::nextSegment, pStr:%s, m_nCurrentSegment:%d, m_nLen:%d\n", pStr, m_nCurrentSegment, m_aSegments[m_nCurrentSegment].m_nLen));
    261     pStr[m_aSegments[m_nCurrentSegment].m_nLen] = SYNCML_DM_NULL;
    262 //    XPL_LOG_DM_TMN_Debug(("DMParser::nextSegment, pStr:%s, m_nCurrentSegment:%d, m_nLen:%d\n", pStr, m_nCurrentSegment, m_aSegments[m_nCurrentSegment].m_nLen));
    263 
    264     m_nCurrentSegment++;
    265 
    266     return pStr;
    267 }
    268 
    269 
    270 CPCHAR DMParser::assign(CPCHAR szStr)
    271 {
    272     DM_URI_SEGMENT_T segment;
    273 
    274     if ( !m_aSegments )
    275         return NULL;
    276 
    277     m_pStr = (char*)szStr;
    278 
    279     m_nCurrentSegment = 0;
    280     m_nSegmentsCount = 0;
    281 
    282     if ( !m_pStr )
    283         return m_pStr;
    284 
    285 
    286     m_pTokenPos = m_pStr;
    287     m_pDelimPos = DmStrchr(m_pTokenPos,m_cDelim);
    288 
    289     while ( m_pDelimPos )
    290     {
    291         segment.m_pStr = m_pTokenPos;
    292         segment.m_nLen = m_pDelimPos - m_pTokenPos;
    293         m_aSegments[m_nSegmentsCount++] = segment;
    294         m_pTokenPos = m_pDelimPos + 1;
    295         m_pDelimPos = DmStrchr(m_pTokenPos,m_cDelim);
    296     }
    297 
    298     if ( *m_pTokenPos == SYNCML_DM_NULL )
    299         return m_pStr;
    300 
    301 
    302     segment.m_pStr = m_pTokenPos;
    303     segment.m_nLen = DmStrlen(m_pTokenPos);
    304     m_aSegments[m_nSegmentsCount++] = segment;
    305     return m_pStr;
    306 
    307 }
    308 
    309 void DMParser::reset()
    310 {
    311     if ( !m_aSegments )
    312         return;
    313 
    314     if ( m_nCurrentSegment > 0 )
    315     {
    316         for (int i=0; i<m_nSegmentsCount-1; i++)
    317             m_aSegments[i].m_pStr[m_aSegments[i].m_nLen] = m_cDelim;
    318     }
    319 
    320     m_nCurrentSegment = 0;
    321 }
    322 
    323 BOOLEAN DMParser::findSegment(CPCHAR szSegment)
    324 {
    325 
    326      for (int i=0; i<m_nSegmentsCount; i++)
    327      {
    328         m_aSegments[i].m_pStr[m_aSegments[i].m_nLen] = SYNCML_DM_NULL;
    329         if ( DmStrcmp(m_aSegments[i].m_pStr,szSegment) == 0)
    330             return TRUE;
    331      }
    332 
    333      return FALSE;
    334 }
    335