UtlBoolean NameValueTokenizer::getSubField(const char* textField, ssize_t subFieldIndex, const char* subFieldSeparators, UtlString* subFieldText, ssize_t* lastCharIndex, bool validateChars) { ssize_t subFieldLength = 0; const char* subFieldPtr = NULL; ssize_t fieldLen = ::strlen(textField); // // Maximum size of sip packets is 65536. // Anything greater than this value is definitely garbage and none parseable // if (fieldLen > 65536) return FALSE; UtlBoolean found = getSubField(textField, fieldLen, subFieldIndex, subFieldSeparators, subFieldPtr, subFieldLength, lastCharIndex, validateChars); if(found && subFieldPtr && subFieldLength > 0) { subFieldText->replace(0, subFieldLength, subFieldPtr, subFieldLength); subFieldText->remove(subFieldLength); } else { subFieldText->remove(0); } return(found); }
void PVStructure::removePVField(String const &fieldName) { PVFieldPtr pvField = getSubField(fieldName); if(pvField.get()==NULL) { String message("removePVField "); message += fieldName + " does not exist"; this->message(message, errorMessage); return; } size_t origLength = pvFields.size(); size_t newLength = origLength - 1; PVFieldPtrArray const & origPVFields = pvFields; FieldConstPtrArray origFields = structurePtr->getFields(); PVFieldPtrArray newPVFields; newPVFields.reserve(newLength); StringArray newFieldNames; newFieldNames.reserve(newLength); FieldConstPtrArray fields; fields.reserve(newLength); for(size_t i=0; i<origLength; i++) { if(origPVFields[i]!=pvField) { newFieldNames.push_back(origPVFields[i]->getFieldName()); newPVFields.push_back(origPVFields[i]); fields.push_back(origFields[i]); } } PVFieldPtrArray * xxx = const_cast<PVFieldPtrArray *>(&pvFields); xxx->swap(newPVFields); FieldConstPtr field = getFieldCreate()->createStructure( structurePtr->getID(),newFieldNames,fields); replaceField(field); structurePtr = static_pointer_cast<const Structure>(field); StringArray fieldNames = structurePtr->getFieldNames(); for(size_t i=0; i<newLength; i++) { pvFields[i]->setParentAndName(this,fieldNames[i]); } }