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