Added some functionality to the DTSC::Scan class
This commit is contained in:
parent
194d1ae9a3
commit
ec831a98c1
2 changed files with 88 additions and 0 deletions
|
@ -71,17 +71,22 @@ namespace DTSC {
|
||||||
public:
|
public:
|
||||||
Scan();
|
Scan();
|
||||||
Scan(char * pointer, size_t len);
|
Scan(char * pointer, size_t len);
|
||||||
|
operator bool() const;
|
||||||
std::string toPrettyString(unsigned int indent = 0);
|
std::string toPrettyString(unsigned int indent = 0);
|
||||||
|
bool hasMember(std::string indice);
|
||||||
|
bool hasMember(const char * indice, const unsigned int ind_len);
|
||||||
Scan getMember(std::string indice);
|
Scan getMember(std::string indice);
|
||||||
Scan getMember(const char * indice);
|
Scan getMember(const char * indice);
|
||||||
Scan getMember(const char * indice, const unsigned int ind_len);
|
Scan getMember(const char * indice, const unsigned int ind_len);
|
||||||
Scan getIndice(unsigned int num);
|
Scan getIndice(unsigned int num);
|
||||||
|
unsigned int getSize();
|
||||||
|
|
||||||
char getType();
|
char getType();
|
||||||
bool asBool();
|
bool asBool();
|
||||||
long long asInt();
|
long long asInt();
|
||||||
std::string asString();
|
std::string asString();
|
||||||
void getString(char *& result, unsigned int & len);
|
void getString(char *& result, unsigned int & len);
|
||||||
|
JSON::Value asJSON();
|
||||||
private:
|
private:
|
||||||
char * p;
|
char * p;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
|
@ -366,6 +366,11 @@ namespace DTSC {
|
||||||
len = length;
|
len = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether the DTSC::Scan object contains valid data.
|
||||||
|
Scan::operator bool() const {
|
||||||
|
return (p && len);
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an object representing the named indice of this object.
|
/// Returns an object representing the named indice of this object.
|
||||||
/// Returns an invalid object if this indice doesn't exist or this isn't an object type.
|
/// Returns an invalid object if this indice doesn't exist or this isn't an object type.
|
||||||
Scan Scan::getMember(std::string indice) {
|
Scan Scan::getMember(std::string indice) {
|
||||||
|
@ -398,12 +403,81 @@ namespace DTSC {
|
||||||
return Scan();
|
return Scan();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an object representing the named indice of this object.
|
||||||
|
/// Returns an invalid object if this indice doesn't exist or this isn't an object type.
|
||||||
|
bool Scan::hasMember(std::string indice){
|
||||||
|
return hasMember(indice.data(), indice.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns whether an object representing the named indice of this object exists.
|
||||||
|
/// Returns false if this indice doesn't exist or this isn't an object type.
|
||||||
|
bool Scan::hasMember(const char * indice, const unsigned int ind_len) {
|
||||||
|
if (getType() != DTSC_OBJ && getType() != DTSC_CON) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char * i = p + 1;
|
||||||
|
//object, scan contents
|
||||||
|
while (i[0] + i[1] != 0 && i < p + len) { //while not encountering 0x0000 (we assume 0x0000EE)
|
||||||
|
if (i + 2 >= p + len) {
|
||||||
|
return false;//out of packet!
|
||||||
|
}
|
||||||
|
unsigned int strlen = i[0] * 256 + i[1];
|
||||||
|
i += 2;
|
||||||
|
if (ind_len == strlen && strncmp(indice, i, strlen) == 0) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
i = skipDTSC(i + strlen, p + len);
|
||||||
|
if (!i) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an object representing the named indice of this object.
|
/// Returns an object representing the named indice of this object.
|
||||||
/// Returns an invalid object if this indice doesn't exist or this isn't an object type.
|
/// Returns an invalid object if this indice doesn't exist or this isn't an object type.
|
||||||
Scan Scan::getMember(const char * indice) {
|
Scan Scan::getMember(const char * indice) {
|
||||||
return getMember(indice, strlen(indice));
|
return getMember(indice, strlen(indice));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the amount of indices if an array, the amount of members if an object, or zero otherwise.
|
||||||
|
unsigned int Scan::getSize() {
|
||||||
|
if (getType() == DTSC_ARR) {
|
||||||
|
char * i = p + 1;
|
||||||
|
unsigned int arr_indice = 0;
|
||||||
|
//array, scan contents
|
||||||
|
while (i[0] + i[1] != 0 && i < p + len) { //while not encountering 0x0000 (we assume 0x0000EE)
|
||||||
|
//search through contents...
|
||||||
|
arr_indice++;
|
||||||
|
i = skipDTSC(i, p + len);
|
||||||
|
if (!i) {
|
||||||
|
return arr_indice;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr_indice;
|
||||||
|
}
|
||||||
|
if (getType() == DTSC_OBJ || getType() == DTSC_CON) {
|
||||||
|
char * i = p + 1;
|
||||||
|
unsigned int arr_indice = 0;
|
||||||
|
//object, scan contents
|
||||||
|
while (i[0] + i[1] != 0 && i < p + len) { //while not encountering 0x0000 (we assume 0x0000EE)
|
||||||
|
if (i + 2 >= p + len) {
|
||||||
|
return Scan();//out of packet!
|
||||||
|
}
|
||||||
|
unsigned int strlen = i[0] * 256 + i[1];
|
||||||
|
i += 2;
|
||||||
|
arr_indice++;
|
||||||
|
i = skipDTSC(i + strlen, p + len);
|
||||||
|
if (!i) {
|
||||||
|
return arr_indice;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr_indice;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an object representing the num-th indice of this array.
|
/// Returns an object representing the num-th indice of this array.
|
||||||
/// If not an array but an object, it returns the num-th member, instead.
|
/// If not an array but an object, it returns the num-th member, instead.
|
||||||
/// Returns an invalid object if this indice doesn't exist or this isn't an array or object type.
|
/// Returns an invalid object if this indice doesn't exist or this isn't an array or object type.
|
||||||
|
@ -523,6 +597,15 @@ namespace DTSC {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the DTSC scan object as a JSON value
|
||||||
|
/// Returns an empty object on error.
|
||||||
|
JSON::Value Scan::asJSON(){
|
||||||
|
JSON::Value result;
|
||||||
|
unsigned int i = 0;
|
||||||
|
JSON::fromDTMI2((const unsigned char*)p, len, i, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/// \todo Move this function to some generic area. Duplicate from json.cpp
|
/// \todo Move this function to some generic area. Duplicate from json.cpp
|
||||||
static inline char hex2c(char c) {
|
static inline char hex2c(char c) {
|
||||||
if (c < 10) {
|
if (c < 10) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue