diff --git a/lib/xdrmappings/GwXDRMappings.cpp b/lib/xdrmappings/GwXDRMappings.cpp index a0a70bb..1207693 100644 --- a/lib/xdrmappings/GwXDRMappings.cpp +++ b/lib/xdrmappings/GwXDRMappings.cpp @@ -374,7 +374,7 @@ GwXDRFoundMapping GwXDRMappings::getMapping(GwXDRCategory category,int selector, } return rt; } -#define MAX_UNKNOWN 200 + bool GwXDRMappings::addUnknown(GwXDRCategory category,int selector,int field,int instance){ if (unknown.size() >= 200) return false; unsigned long uk=((int)category) &0x7f; @@ -388,16 +388,14 @@ bool GwXDRMappings::addUnknown(GwXDRCategory category,int selector,int field,int return true; } -char * GwXDRMappings::getUnMapped(){ - const int ESIZE=13; - int sz=(unknown.size()+1)*ESIZE; - char *rt=new char[sz]; - *rt=0; - char *ptr=rt; +const char * GwXDRMappings::getUnMapped(){ + if (unknowAsString == NULL) unknowAsString=new char[(MAX_MAPPINGS+1)*ESIZE]; + *unknowAsString=0; + char *ptr=unknowAsString; for (auto it=unknown.begin();it!=unknown.end();it++){ snprintf(ptr,ESIZE-1,"%lu,",*it); *(ptr+ESIZE-1)=0; while (*ptr != 0) ptr++; } - return rt; + return unknowAsString; } \ No newline at end of file diff --git a/lib/xdrmappings/GwXDRMappings.h b/lib/xdrmappings/GwXDRMappings.h index 3c7e7f0..0cb04b6 100644 --- a/lib/xdrmappings/GwXDRMappings.h +++ b/lib/xdrmappings/GwXDRMappings.h @@ -164,13 +164,18 @@ class GwXDRFoundMapping{ } }; +//the class GwXDRMappings is not intended to be deleted +//the deletion will leave memory leaks! class GwXDRMappings{ + static const int MAX_UNKNOWN=200; + static const int ESIZE=13; private: GwLog *logger; GwConfigHandler *config; GwXDRMapping::N138Map n183Map; GwXDRMapping::N2KMap n2kMap; std::unordered_set unknown; + char *unknowAsString=NULL; GwXDRFoundMapping selectMapping(GwXDRMapping::MappingList *list,int instance,const char * key); bool addUnknown(GwXDRCategory category,int selector,int field=0,int instance=-1); public: @@ -180,8 +185,7 @@ class GwXDRMappings{ //the returned mapping will exactly contain one mapping def GwXDRFoundMapping getMapping(String xName,String xType,String xUnit); GwXDRFoundMapping getMapping(GwXDRCategory category,int selector,int field=0,int instance=-1); - //returns a newly created buffer - user must destroy! - char * getUnMapped(); + const char * getUnMapped(); };