Beispiel #1
0
 void parsePeers (const char *pszPeerAddresses, StringHashset &addresses)
 {
     StringTokenizer tokenizer (pszPeerAddresses, ';', ';');
     const char *pszRemoteAddress;
     while ((pszRemoteAddress = tokenizer.getNextToken()) != NULL) {
         addresses.put (pszRemoteAddress);
     }
 }
int MetadataConfigurationImpl::addCustomMetadata (TiXmlElement *pRoot)
{
    const char *pszMethodName = "MetadataConfiguration::addCustomMetadata (1)";
    _ui16MetadataFieldsNumber = _usMetadataFixedFieldsNumber;
    TiXmlElement *pXmlField = pRoot->FirstChildElement (XML_FIELD_ELEMENT);
    if (pXmlField == nullptr) {
        return -1;
    }

    StringHashset currentFields;
    for (uint16 i = 0; i < _ui16MetadataFieldsNumber; i++) {
        if (_pMetadataFieldInfos[i] != nullptr) {
            currentFields.put (_pMetadataFieldInfos[i]->_sFieldName);
        }
    }

    do {
        TiXmlElement *pXmlElName = pXmlField->FirstChildElement (XML_FIELD_NAME_ELEMENT);
        TiXmlElement *pXmlElType = pXmlField->FirstChildElement (XML_FIELD_TYPE_ELEMENT);
        if ((pXmlElName != nullptr) && (pXmlElType != nullptr)) {
            const String nameText (pXmlElName->GetText());
            const String typeText (pXmlElType->GetText());
            if ((nameText.length () <= 0) || (typeText.length() <= 0)) {
                pXmlField = pXmlField->NextSiblingElement();
                continue;
            }
            if (currentFields.containsKey (nameText)) {
                checkAndLogMsg (pszMethodName, Logger::L_MildError, "trying to add duplicate field %s.\n",
                                nameText.c_str());
                pXmlField = pXmlField->NextSiblingElement ();
                continue;
            }

            String type (typeText);
            type.convertToUpperCase ();
            _ui16MetadataFieldsNumber++;
            _pMetadataFieldInfos = static_cast<MetadataFieldInfo **>(realloc (_pMetadataFieldInfos,
                                   _ui16MetadataFieldsNumber * sizeof (MetadataFieldInfo *)));
            if (_pMetadataFieldInfos == nullptr) {
                checkAndLogMsg (pszMethodName, memoryExhausted);
                return -2;
            }
            if ((type != MetadataType::INTEGER8) && (type != MetadataType::INTEGER16) &&
                (type != MetadataType::INTEGER32) && (type != MetadataType::INTEGER64) &&
                (type != MetadataType::FLOAT) && (type != MetadataType::DOUBLE) &&
                (type != MetadataType::TEXT)) {
                checkAndLogMsg (pszMethodName, Logger::L_Warning, "unsupported data type for %s attribute: "
                    "%s. Setting it to %s.\n", nameText.c_str (), type.c_str (),
                    MetadataType::TEXT.c_str ());
                // Set "TEXT" as default type in case the specified
                // type doesn't match any type in MetadataType.
                type = MetadataType::TEXT;
            }
            _pMetadataFieldInfos[_ui16MetadataFieldsNumber - 1] = new MetadataFieldInfo (nameText, type);
            if ((_pMetadataFieldInfos[_ui16MetadataFieldsNumber - 1] == nullptr) ||
                (_pMetadataFieldInfos[_ui16MetadataFieldsNumber - 1]->_sFieldName.length () <= 0)) {
                checkAndLogMsg ("MetadataConfiguration::addCustomMetadata (1)", memoryExhausted);
                return -3;
            }
            _pMetadataFieldInfos[_ui16MetadataFieldsNumber - 1]->_bVolatile = ((_ui16MetadataFieldsNumber - 1U) == _usPedigreeIndex);

            pXmlField = pXmlField->NextSiblingElement();
        }
    } while (pXmlField != nullptr);

    return 0;
}