#ifndef UBASEPROPCREATOR_H #define UBASEPROPCREATOR_H #include "UBasePropCreatorTempl.h" namespace RDK { // Отвечает за создание функции для формирования базовых свойств class UBasePropCreator: public UBasePropCreatorTempl { public: // Основная функция создания свойств всех возможных типов (добавляется в Storage) static bool BaseCrPropMock(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция вызывает необходимые фукнции в зависимости от типа (строка) свойства template class PropType, unsigned int TypeInt> static void CreateProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Проверяет тип на встроенные типы данных и создает, если это так template class PropType, unsigned int TypeInt> static bool CreateSimpleTypeProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); /* // Функция для создания свойства типа вектор template class PropType, unsigned int TypeInt> static void CreatePropertyVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа вектор с простейшими типами данным (simpleVector) template class PropType, unsigned int TypeInt> static void CreatePropertySimpleVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа вектор простейших векторов std::vector > template class PropType, unsigned int TypeInt> static void CreatePropertyVectorOfSimVec(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа вектор пар template class PropType, unsigned int TypeInt> static void CreatePropertyVectorOfPair(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа вектор из MVector template class PropType, unsigned int TypeInt> static void CreatePropertyVectorOfMVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа вектор из MDMatrix template class PropType, unsigned int TypeInt> static void CreatePropertyVectorOfMDMatrix(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); */ // Функция для создания свойства типа list template class PropType, unsigned int TypeInt> static void CreatePropertyList(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); /* // Функция для создания свойства типа MDMatrix template class PropType, unsigned int TypeInt> static void CreatePropertyMDMatrix(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа MDVector template class PropType, unsigned int TypeInt> static void CreatePropertyMDVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа MVector size - 2,3,4 тип - double template class PropType, unsigned int TypeInt> static void CreatePropertyMVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа MMatrix [rows,cols] - [3,3][4,4] типы - double, int, bool template class PropType, unsigned int TypeInt> static void CreatePropertyMMatrix(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); */ // Функция для создания свойства типа std::pair template class PropType, unsigned int TypeInt> static void CreatePropertyPair(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция для создания свойства типа std::map template class PropType, unsigned int TypeInt> static void CreatePropertyMap(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); }; // Функция вызывает необходимые фукнции в зависимости от типа (строка) свойства template class PropType, unsigned int TypeInt> void UBasePropCreator::CreateProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string type = serstorage->GetNodeAttribute("Type"); // Проверка на встроенный ли тип данных у свойства // Если да - создание и выход if(CreateSimpleTypeProperty(serstorage,mock_unet)) return; // Строка if(type == "std::string") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet); return; } // Для list if(type == "std::list") { CreatePropertyList(serstorage,mock_unet); return; } // Для pair if(type == "std::pair") { CreatePropertyPair(serstorage,mock_unet); return; } // Для map if(type == "std::map") { CreatePropertyMap(serstorage,mock_unet); return; } //UBMColorModel if(type == "UBMColorModel") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet); return; } // UColorT if(type == "UColorT") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet); return; } // UBitmap if(type == "UBitmap") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet); return; } // UBRect if(type == "UBRect") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet); return; } // UBPoint if(type == "UBPoint") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet); return; } /* // pointer // не знаю как обрабатывать if(type == "pointer") { // CreatorProperty::CreatePropertyByType(serstorage,this); return; } */ /* // MDMatrix if(type.find("MDMatrix",0) == 0) { CreatePropertyMDMatrix(serstorage,mock_unet); return; } // MDVector if(type.find("MDVector",0) == 0) { CreatePropertyMDVector(serstorage,mock_unet); return; } //#ifndef __BORLANDC__ // TODO: Разобраться как обеспечить сборку в билдере этой части кода (возможно убрать теперь?) // MVector if(type.find("MVector",0) == 0) { CreatePropertyMVector(serstorage,mock_unet); return; } // MMatrix if(type.find("MMatrix",0) == 0) { CreatePropertyMMatrix(serstorage,mock_unet); return; } //#endif */ } // Проверяет тип на встроенные типы данных и создает, если это так template class PropType, unsigned int TypeInt> bool UBasePropCreator::CreateSimpleTypeProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet * mock_unet) { std::string type = serstorage->GetNodeAttribute("Type"); std::string prop_name = serstorage->GetNodeName(); // Встроенные типы if(type == typeid(bool).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(char).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(unsigned char).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(short).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(unsigned short).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(int).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(unsigned int).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(unsigned long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(long long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(unsigned long long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(float).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(double).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } if(type == typeid(long double).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet); return true; } //throw ParseException("can't handle simple type: " + type); return false; } /* // Функция для создания свойства типа вектор из MVector template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyVectorOfMVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string prop_name = serstorage->GetNodeName(); if(!(serstorage->SelectNode("elem"))) return; std::string type = serstorage->GetNodeAttribute("Type"); int size= RDK::atoi(serstorage->GetNodeAttribute("Size")); // Удаление слова MVector size_t pos = type.find("MVector"); if (pos != std::string::npos) { type.erase(pos, std::string("MVector").length()); } // Удаление символов '<' и '>' type.erase(std::remove(type.begin(), type.end(), '>'), type.end()); type.erase(std::remove(type.begin(), type.end(), '<'), type.end()); if(type == typeid(double).name()) { if(size == 2) { CreatorProperty > >::CreatePropertyByType(serstorage, mock_unet); return; } if(size == 3) { CreatorProperty > >::CreatePropertyByType(serstorage, mock_unet); return; } if(size == 4) { CreatorProperty > >::CreatePropertyByType(serstorage, mock_unet); return; } if(size == 6) { CreatorProperty > >::CreatePropertyByType(serstorage, mock_unet); return; } } } // Функция для создания свойства типа вектор из MDMatrix template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyVectorOfMDMatrix(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string prop_name = serstorage->GetNodeName(); int size=serstorage->GetNumNodes(); // если вектор пуст берем тип - elemType // если есть элементы берем тип элементов std::string type; if(size == 0) { type = serstorage->GetNodeAttribute("elemType"); } else { serstorage->SelectNode("elem",size-1); type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); } // Удаление слова MDMatrix size_t pos = type.find("MDMatrix"); if (pos != std::string::npos) { type.erase(pos, std::string("MDMatrix").length()); } // Удаление символов '<' и '>' type.erase(std::remove(type.begin(), type.end(), '>'), type.end()); type.erase(std::remove(type.begin(), type.end(), '<'), type.end()); if(type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(float).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } */ // Функция для создания свойства типа list template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyList(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string prop_name = serstorage->GetNodeName(); int size=serstorage->GetNumNodes(); // если вектор пуст берем тип - elemType // если есть элементы берем тип элементов std::string type; if(size == 0) { type = serstorage->GetNodeAttribute("elemType"); } else { serstorage->SelectNode("elem",size-1); type = serstorage->GetNodeAttribute("elemType"); serstorage->SelectUp(); } if(type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(float).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } /* // Функция для создания свойства типа MDMatrix template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyMDMatrix(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string type = serstorage->GetNodeAttribute("Type"); std::string prop_name = serstorage->GetNodeName(); // Удаление слова MDMatrix size_t pos = type.find("MDMatrix"); if (pos != std::string::npos) { type.erase(pos, std::string("MDMatrix").length()); } // Удаление символов '<' и '>' type.erase(std::remove(type.begin(), type.end(), '>'), type.end()); type.erase(std::remove(type.begin(), type.end(), '<'), type.end()); std::string matrix_type = type; if(type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(float).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } // Функция для создания свойства типа MDVector template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyMDVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string type = serstorage->GetNodeAttribute("Type"); std::string prop_name = serstorage->GetNodeName(); // Удаление слова MDVector size_t pos = type.find("MDVector"); if (pos != std::string::npos) { type.erase(pos, std::string("MDVector").length()); } // Удаление символов '<' и '>' type.erase(std::remove(type.begin(), type.end(), '>'), type.end()); type.erase(std::remove(type.begin(), type.end(), '<'), type.end()); std::string matrix_type = type; if(type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(unsigned long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(float).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(type == typeid(long double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } // Функция для создания свойства типа MVector size - 2,3,4 тип - double template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyMVector(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string type = serstorage->GetNodeAttribute("Type"); std::string prop_name = serstorage->GetNodeName(); int size= RDK::atoi(serstorage->GetNodeAttribute("Size")); // Удаление слова MVector size_t pos = type.find("MVector"); if (pos != std::string::npos) { type.erase(pos, std::string("MVector").length()); } // Удаление символов '<' и '>' type.erase(std::remove(type.begin(), type.end(), '>'), type.end()); type.erase(std::remove(type.begin(), type.end(), '<'), type.end()); if(type == typeid(double).name()) { if(size == 2) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(size == 3) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(size == 4) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(size == 6) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } } // Функция для создания свойства типа MMatrix [rows,cols] - [3,3][4,4] типы - double, int, bool template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyMMatrix(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string type = serstorage->GetNodeAttribute("Type"); std::string prop_name = serstorage->GetNodeName(); int rows= RDK::atoi(serstorage->GetNodeAttribute("Rows")); int cols= RDK::atoi(serstorage->GetNodeAttribute("Cols")); // Удаление слова MMatrix size_t pos = type.find("MMatrix"); if (pos != std::string::npos) { type.erase(pos, std::string("MMatrix").length()); } // Удаление символов '<' и '>' для выделения символа типа type.erase(std::remove(type.begin(), type.end(), '>'), type.end()); type.erase(std::remove(type.begin(), type.end(), '<'), type.end()); if(type == typeid(bool).name()) { if( (rows == 3) && (cols == 3)) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if( (rows == 4) && (cols == 4)) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } if(type == typeid(int).name()) { if( (rows == 3) && (cols == 3)) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if( (rows == 4) && (cols == 4)) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } if(type == typeid(double).name()) { if( (rows == 3) && (cols == 3)) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if( (rows == 4) && (cols == 4)) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } } */ // Функция для создания свойства типа std::pair template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyPair(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string prop_name = serstorage->GetNodeName(); int size=serstorage->GetNumNodes(); if(size!=2) return; std::string first_type; std::string second_type; serstorage->SelectNode("first"); first_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); serstorage->SelectNode("second"); second_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); if(first_type == "std::string") { if(second_type == "std::string") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(second_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(second_type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } if(second_type == "std::string") { if(first_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } if(first_type == typeid(int).name()) { if(second_type == "UColorT") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } if(first_type == typeid(double).name()) { if(second_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } } // Функция для создания свойства типа std::map template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyMap(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet) { std::string prop_name = serstorage->GetNodeName(); int size=serstorage->GetNumNodes(); if(!(serstorage->SelectNode("elem",size-1))) return; size=serstorage->GetNumNodes(); if(size!=2) return; std::string first_type; std::string second_type; serstorage->SelectNode("first"); first_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); serstorage->SelectNode("second"); second_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); if(first_type == "std::string") { if(second_type == "std::string") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(second_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } if(second_type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } // if(second_type == "UBPtzPelcoCmd") // { // CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); // return; // } } if(second_type == "std::string") { if(first_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } if(first_type == typeid(int).name()) { if(second_type == "UColorT") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet); return; } } } } #endif // UBASEPROPCREATOR_H