예제 #1
0
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);
}
예제 #2
0
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]);
    }
}