meta/SaiAttributeList.cpp (102 lines of code) (raw):

#include "SaiAttributeList.h" #include "sai_serialize.h" using namespace saimeta; SaiAttributeList::SaiAttributeList( _In_ const sai_object_type_t objectType, _In_ const std::vector<swss::FieldValueTuple> &values, _In_ bool countOnly) { SWSS_LOG_ENTER(); size_t attr_count = values.size(); for (size_t i = 0; i < attr_count; ++i) { const std::string &str_attr_id = fvField(values[i]); const std::string &str_attr_value = fvValue(values[i]); if (str_attr_id == "NULL") { continue; } sai_attribute_t attr; memset(&attr, 0, sizeof(sai_attribute_t)); sai_deserialize_attr_id(str_attr_id, attr.id); // TODO object type is not necessary, we can use get attr metadata from attr id name auto meta = sai_metadata_get_attr_metadata(objectType, attr.id); if (meta == NULL) { SWSS_LOG_THROW("FATAL: failed to find metadata for object type %d and attr id %d", objectType, attr.id); } sai_deserialize_attr_value(str_attr_value, *meta, attr, countOnly); m_attr_list.push_back(attr); m_attr_value_type_list.push_back(meta->attrvaluetype); } } SaiAttributeList::SaiAttributeList( _In_ const sai_object_type_t objectType, _In_ const std::unordered_map<std::string, std::string>& hash, _In_ bool countOnly) { SWSS_LOG_ENTER(); for (auto it = hash.begin(); it != hash.end(); it++) { const std::string &str_attr_id = it->first; const std::string &str_attr_value = it->second; if (str_attr_id == "NULL") { continue; } sai_attribute_t attr; memset(&attr, 0, sizeof(sai_attribute_t)); sai_deserialize_attr_id(str_attr_id, attr.id); // TODO object type is not necessary, we can use get attr metadata from attr id name auto meta = sai_metadata_get_attr_metadata(objectType, attr.id); if (meta == NULL) { SWSS_LOG_THROW("FATAL: failed to find metadata for object type %d and attr id %d", objectType, attr.id); } sai_deserialize_attr_value(str_attr_value, *meta, attr, countOnly); m_attr_list.push_back(attr); m_attr_value_type_list.push_back(meta->attrvaluetype); } } SaiAttributeList::~SaiAttributeList() { SWSS_LOG_ENTER(); size_t attr_count = m_attr_list.size(); for (size_t i = 0; i < attr_count; ++i) { sai_attribute_t &attr = m_attr_list[i]; sai_attr_value_type_t serialization_type = m_attr_value_type_list[i]; sai_deserialize_free_attribute_value(serialization_type, attr); } } std::vector<swss::FieldValueTuple> SaiAttributeList::serialize_attr_list( _In_ sai_object_type_t objectType, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list, _In_ bool countOnly) { SWSS_LOG_ENTER(); std::vector<swss::FieldValueTuple> entry; for (uint32_t index = 0; index < attr_count; ++index) { const sai_attribute_t *attr = &attr_list[index]; auto meta = sai_metadata_get_attr_metadata(objectType, attr->id); if (meta == NULL) { SWSS_LOG_THROW("FATAL: failed to find metadata for object type %d and attr id %d", objectType, attr->id); } std::string str_attr_id = sai_serialize_attr_id(*meta); std::string str_attr_value = sai_serialize_attr_value(*meta, *attr, countOnly); swss::FieldValueTuple fvt(str_attr_id, str_attr_value); entry.push_back(fvt); } return entry; } sai_attribute_t* SaiAttributeList::get_attr_list() { SWSS_LOG_ENTER(); return m_attr_list.data(); } uint32_t SaiAttributeList::get_attr_count() { SWSS_LOG_ENTER(); return (uint32_t)m_attr_list.size(); }