load / save almost functional

This commit is contained in:
Charles J. Cliffe 2015-01-10 11:00:03 -05:00
parent faa87fcd10
commit 2c5eb4f946
3 changed files with 37 additions and 23 deletions

View File

@ -338,7 +338,7 @@ bool AppFrame::loadSession(std::string fileName) {
try { try {
DataNode *header = l.rootNode()->getNext("header"); DataNode *header = l.rootNode()->getNext("header");
std::string version = *header->getNext("version"); std::string version(*header->getNext("version"));
long long center_freq = *header->getNext("center_freq"); long long center_freq = *header->getNext("center_freq");
long long offset = *header->getNext("offset"); long long offset = *header->getNext("offset");
@ -362,7 +362,7 @@ bool AppFrame::loadSession(std::string fileName) {
float squelch_level = demod->hasAnother("squelch_level")?(float)*demod->getNext("squelch_level"):0; float squelch_level = demod->hasAnother("squelch_level")?(float)*demod->getNext("squelch_level"):0;
int squelch_enabled = demod->hasAnother("squelch_enabled")?(int)*demod->getNext("squelch_enabled"):0; int squelch_enabled = demod->hasAnother("squelch_enabled")?(int)*demod->getNext("squelch_enabled"):0;
int stereo = demod->hasAnother("stereo")?(int)*demod->getNext("stereo"):0; int stereo = demod->hasAnother("stereo")?(int)*demod->getNext("stereo"):0;
std::string output_device = demod->hasAnother("output_device")?*demod->getNext("output_device"):""; std::string output_device = demod->hasAnother("output_device")?string(*(demod->getNext("output_device"))):"";
std::cout << "\tFound demodulator at frequency " << freq << " type " << type << std::endl; std::cout << "\tFound demodulator at frequency " << freq << " type " << type << std::endl;
std::cout << "\t\tBandwidth: " << bandwidth << std::endl; std::cout << "\t\tBandwidth: " << bandwidth << std::endl;

View File

@ -33,23 +33,29 @@ using namespace std;
#define STRINGIFY(A) #A #define STRINGIFY(A) #A
DataElement::DataElement() { DataElement::DataElement() : data_type(DATA_NULL), data_val(NULL), data_size(0), unit_size(0) {
data_type = DATA_NULL;
data_val = NULL;
data_size = 0;
unit_size = 0;
} }
DataElement::~DataElement() { DataElement::~DataElement() {
if (data_val) if (data_val) {
delete data_val; delete data_val;
data_val = NULL;
}
} }
void DataElement::data_init(long data_size_in) { void DataElement::data_init(long data_size_in) {
if (data_val) if (data_val) {
delete data_val; delete data_val;
data_val = NULL;
}
data_size = data_size_in; data_size = data_size_in;
if (data_size) {
data_val = new char[data_size]; data_val = new char[data_size];
}
}
char * DataElement::getDataPointer() {
return data_val;
} }
int DataElement::getDataType() { int DataElement::getDataType() {
@ -84,6 +90,7 @@ DataElementSetNumericDef(DATA_LONGDOUBLE, long double)
void DataElement::set(const char *data_in, long size_in) { void DataElement::set(const char *data_in, long size_in) {
data_type = DATA_VOID; data_type = DATA_VOID;
if (!data_size) { return; }
data_init(size_in); data_init(size_in);
memcpy(data_val, data_in, data_size); memcpy(data_val, data_in, data_size);
} }
@ -220,7 +227,9 @@ void DataElement::get(string &str_in) throw (DataTypeMismatchException) {
str_in.erase(str_in.begin(), str_in.end()); str_in.erase(str_in.begin(), str_in.end());
} }
if (data_val) {
str_in.append(data_val); str_in.append(data_val);
}
} }
void DataElement::get(vector<string> &strvect_in) throw (DataTypeMismatchException) { void DataElement::get(vector<string> &strvect_in) throw (DataTypeMismatchException) {
@ -342,20 +351,23 @@ void DataElement::setSerialized(char *ser_str) {
/* DataNode class */ /* DataNode class */
DataNode::DataNode() { DataNode::DataNode(): ptr(0), parentNode(NULL) {
ptr = 0; data_elem = new DataElement();
parentNode = NULL;
} }
DataNode::DataNode(const char *name_in) { DataNode::DataNode(const char *name_in): ptr(0), parentNode(NULL) {
ptr = 0;
node_name = name_in; node_name = name_in;
parentNode = NULL; data_elem = new DataElement();
} }
DataNode::~DataNode() { DataNode::~DataNode() {
for (vector<DataNode *>::iterator i = children.begin(); i != children.end(); i++) { while (children.size()) {
delete *i; DataNode *del = children.back();
children.pop_back();
delete del;
}
if (data_elem) {
delete data_elem;
} }
} }
@ -364,7 +376,7 @@ void DataNode::setName(const char *name_in) {
} }
DataElement *DataNode::element() { DataElement *DataNode::element() {
return &data_elem; return data_elem;
} }
DataNode *DataNode::newChild(const char *name_in) { DataNode *DataNode::newChild(const char *name_in) {
@ -1541,7 +1553,7 @@ bool DataTree::LoadFromFile(const std::string& filename) {
dtHeader.setSerialized(hdr_serialized); dtHeader.setSerialized(hdr_serialized);
DataNode *header = dtHeader.rootNode(); DataNode *header = dtHeader.rootNode();
string compressionType = *header->getNext("compression"); string compressionType(*header->getNext("compression"));
dataSize = *header->getNext("uncompressed_size"); dataSize = *header->getNext("uncompressed_size");
bool uncompress = false; bool uncompress = false;

View File

@ -131,6 +131,7 @@ public:
~DataElement(); ~DataElement();
int getDataType(); int getDataType();
char *getDataPointer();
long getDataSize(); long getDataSize();
int getUnitSize(); int getUnitSize();
@ -224,7 +225,7 @@ private:
map<string, unsigned int, string_less> childmap_ptr; map<string, unsigned int, string_less> childmap_ptr;
string node_name; string node_name;
DataElement data_elem; DataElement *data_elem;
unsigned int ptr; unsigned int ptr;
@ -259,7 +260,8 @@ public:
void findAll(const char *name_in, vector<DataNode *> &node_list_out); void findAll(const char *name_in, vector<DataNode *> &node_list_out);
operator string () { string s; element()->get(s); return s; } // operator string () { string s; element()->get(s); return s; }
operator const char * () { if (element()->getDataType() == DATA_STRING) return element()->getDataPointer(); else return NULL; }
operator char () { char v; element()->get(v); return v; } operator char () { char v; element()->get(v); return v; }
operator unsigned char () { unsigned char v; element()->get(v); return v; } operator unsigned char () { unsigned char v; element()->get(v); return v; }
operator int () { int v; element()->get(v); return v; } operator int () { int v; element()->get(v); return v; }