1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include "xml_cdim.hxx" 25 26 const char ComponentDescriptionImpl::C_sTagDescription[] 27 = "COMPONENTDESCRIPTION"; 28 const char ComponentDescriptionImpl::C_sStatus[] 29 = "Status"; 30 const char * ComponentDescriptionImpl::C_sSubTags[ComponentDescription::tag_MAX] 31 = { "None", 32 "Name", 33 "Description", 34 "ModuleName", 35 "LoaderName", 36 "SupportedService", 37 "ProjectBuildDependency", 38 "RuntimeModuleDependency", 39 "ServiceDependency", 40 "Language", 41 C_sStatus, 42 "Type" 43 }; 44 45 ComponentDescriptionImpl::ComponentDescriptionImpl() 46 // : aTags 47 { 48 const int i_max = tag_MAX; 49 aTags.reserve(i_max); 50 51 for (int i = 0; i < i_max; ++i) 52 { 53 aTags.push_back( new ValueList(E_Tag(i)) ); 54 } // end for 55 } 56 57 ComponentDescriptionImpl::~ComponentDescriptionImpl() 58 { 59 for ( std::vector< ValueList* >::iterator aIter = aTags.begin(); 60 aIter != aTags.end(); 61 ++aIter ) 62 { 63 delete *aIter; 64 } 65 } 66 67 inline void 68 GetStatusValue( ByteString & o_sValue, const ByteString & i_sStatusTag ) 69 { 70 // o_sValue is always == "" at the beginning. 71 72 const char * pStatusValue = strchr(i_sStatusTag.GetBuffer(), '"'); 73 if (pStatusValue == 0) 74 return; 75 pStatusValue++; 76 const char * pStatusValueEnd = strrchr(pStatusValue,'"'); 77 if (pStatusValueEnd == 0 || pStatusValueEnd - pStatusValue < 1) 78 return ; 79 80 ByteString sValue(pStatusValue, pStatusValueEnd - pStatusValue); 81 o_sValue = sValue; 82 } 83 84 ComponentDescriptionImpl::ValueList * 85 ComponentDescriptionImpl::GetBeginTag( ByteString & o_sValue, 86 const char *& io_pStartOfTag ) const 87 { 88 o_sValue = ""; 89 90 const char * pCurTextEnd = strchr(io_pStartOfTag,'>'); 91 if ( 0 == pCurTextEnd ) 92 return 0; 93 94 if ( ComponentDescriptionImpl::CheckEndOfDescription(io_pStartOfTag) ) 95 return 0; 96 97 ByteString sTag(io_pStartOfTag + 1, pCurTextEnd - io_pStartOfTag - 1); 98 io_pStartOfTag += sTag.Len() + 2; 99 100 // Special case <Status ... > 101 if ( strnicmp(C_sStatus, sTag.GetBuffer(), (sizeof C_sStatus) - 1 ) == 0 ) 102 { 103 GetStatusValue(o_sValue,sTag); 104 return aTags[tag_Status]; 105 } 106 107 // Regular seeking for matching data list: 108 for ( INT32 i = 0; i < tag_MAX; i++ ) 109 { 110 if ( 0 == stricmp(sTag.GetBuffer(), C_sSubTags[i]) ) 111 return aTags[i]; 112 } // end for 113 114 return 0; 115 } 116 117 const std::vector< ByteString > & 118 ComponentDescriptionImpl::DataOf( ComponentDescriptionImpl::E_Tag i_eTag ) const 119 { 120 if (0 < i_eTag && i_eTag < tag_MAX) 121 return *aTags[i_eTag]; 122 else 123 return ValueList::Null_(); 124 } 125 126 ByteString 127 ComponentDescriptionImpl::DatumOf( ComponentDescriptionImpl::E_Tag i_eTag ) const 128 { 129 if (0 < i_eTag && i_eTag < tag_MAX) 130 { 131 ValueList & rValues = *aTags[i_eTag]; 132 if (rValues.size() > 0) 133 return rValues[0]; 134 } 135 return ""; 136 } 137 138 void 139 ComponentDescriptionImpl::ParseUntilStartOfDescription( const char * & io_pBufferPosition ) 140 { 141 for ( const char * pSearch = strchr(io_pBufferPosition,'<'); 142 pSearch != 0; 143 pSearch = strchr(pSearch+1,'<') ) 144 { 145 if ( pSearch != io_pBufferPosition 146 && 0 == strnicmp(pSearch+1,C_sTagDescription, strlen(C_sTagDescription)) 147 && *(pSearch + strlen(C_sTagDescription) + 1) == '>' ) 148 { 149 io_pBufferPosition = pSearch + strlen(C_sTagDescription) + 2; 150 return; 151 } 152 } // end for 153 154 io_pBufferPosition = 0; 155 } 156 157 BOOL 158 ComponentDescriptionImpl::ValueList::MatchesEndTag( const char * i_pTextPosition ) const 159 { 160 return strnicmp( i_pTextPosition+2, C_sSubTags[eTag], strlen(C_sSubTags[eTag]) ) == 0 161 && strncmp(i_pTextPosition,"</",2) == 0 162 && *(i_pTextPosition + 2 + strlen(C_sSubTags[eTag]) ) == '>'; 163 } 164 165 INT32 166 ComponentDescriptionImpl::ValueList::EndTagLength() const 167 { 168 return strlen(C_sSubTags[eTag]) + 3; 169 } 170 171 172 const ComponentDescriptionImpl::ValueList & 173 ComponentDescriptionImpl::ValueList::Null_() 174 { 175 static const ValueList aNull_(ComponentDescription::tag_None); 176 return aNull_; 177 } 178 179 180