17 #ifndef AMEFENCODER_H_
18 #define AMEFENCODER_H_
20 #include "AMEFObject.h"
43 static char* longTocharArray(
long l,
int ind)
45 char* result =
new char[ind];
46 for (
int i = 0; i<ind; i++)
48 int offset = (ind - 1 - i) * 8;
49 result[i] = (char) ((l >> offset) & 0xFF);
54 static string longTocharArrayS(
long l,
int ind)
56 char* result =
new char[ind];
57 for (
int i = 0; i<ind; i++)
59 int offset = (ind - 1 - i) * 8;
60 result[i] = (char) ((l >> offset) & 0xFF);
66 static string intTocharArray(
int l,
int ind)
69 for (
int i = 0; i<ind; i++)
71 int offset = (ind - 1 - i) * 8;
72 result.push_back((
char) ((l >> offset) & 0xFF));
77 static string intTocharArrayWI(
int l)
89 for (
int i = 0; i<ind; i++)
91 int offset = (ind - 1 - i) * 8;
92 result.push_back((
char) ((l >> offset) & 0xFF));
97 static int charArrayToInt(
char l[])
101 for (
int i = 0; i < ind; i++)
103 int offset = (ind -1 - i) * 8;
104 t += (l[i] & 0x000000FF) << offset;
109 static int charArrayToInt(
char* l,
int off,
int ind)
112 for (
int i = 0; i < ind; i++)
114 int offset = (ind -1 - i) * 8;
115 t += (l[off+i] & 0x000000FF) << offset;
120 static long charArrayToLong(
char l[])
124 for (
int i = 0; i < ind; i++)
126 int offset = (ind -1 - i) * 8;
127 t += (l[i] & 0x000000FF) << offset;
131 static long charArrayToLong(
char* l,
int off,
int ind)
134 for (
int i = 0; i < ind; i++)
136 int offset = (ind -1 - i) * 8;
137 t += (l[off+i] & 0x000000FF) << offset;
141 static long charArrayToLong(
char* l,
int ind)
144 for (
int i = 0; i < ind; i++)
146 int offset = (ind -1 - i) * 8;
147 t += (l[i] & 0x000000FF) << offset;
152 static string intTocharArrayS(
int l,
int ind)
154 char* result =
new char[ind];
155 for (
int i = 0; i<ind; i++)
157 int offset = (ind - 1 - i) * 8;
158 result[i] = (char) ((l >> offset) & 0xFF);
161 for (
int i = 0; i < ind; i++)
162 tem.push_back(result[ind]);
167 string encodeB(
AMEFObject* packet,
bool ignoreName)
170 string enc = encodeSinglePacketB(packet, ignoreName);
171 string len = intTocharArray(enc.length(), 4);
178 string encodeWL(
AMEFObject* packet,
bool ignoreName)
181 string enc = encodeSinglePacketB(packet, ignoreName);
227 void getValue(
string value,
char type,
string buffer)
275 buffer.append(value);
278 string getFinalVal(
char type,
string buffer,
int length,
string delim,
string name)
280 string retval = type + delim + name + delim;
281 if(type==AMEFObject::DATE_TYPE || type==AMEFObject::STRING_256_TYPE
282 || type==AMEFObject::DOUBLE_FLOAT_TYPE)
284 retval += intTocharArrayS(length, 1) + buffer;
286 else if(type==AMEFObject::STRING_65536_TYPE)
288 retval += intTocharArrayS(length, 2) + buffer;
290 else if(type==AMEFObject::STRING_16777216_TYPE)
292 retval += intTocharArrayS(length, 3) + buffer;
294 else if(type==AMEFObject::STRING_TYPE)
296 retval += intTocharArrayS(length, 4) + buffer;
298 else if(type==AMEFObject::BOOLEAN_TYPE || type==AMEFObject::CHAR_TYPE
299 || type==AMEFObject::SMALL_INT_TYPE || type==AMEFObject::VERY_SMALL_INT_TYPE
300 || type==AMEFObject::BIG_INT_TYPE || type==AMEFObject::INT_TYPE
301 || type==AMEFObject::VS_LONG_INT_TYPE || type==AMEFObject::S_LONG_INT_TYPE
302 || type==AMEFObject::B_LONG_INT_TYPE || type==AMEFObject::LONG_INT_TYPE)
306 else if(type==AMEFObject::OBJECT_TYPE)
310 retval = AMEFObject::VS_OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 1) + buffer;
312 else if(length<65536)
314 retval = AMEFObject::S_OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 2) + buffer;
316 else if(length<16777216)
318 retval = AMEFObject::B_OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 3) + buffer;
322 retval = AMEFObject::OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 4) + buffer;
325 else if(type==AMEFObject::VS_OBJECT_TYPE)
327 retval = AMEFObject::VS_OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 1) + buffer;
329 else if(type==AMEFObject::S_OBJECT_TYPE)
331 retval = AMEFObject::S_OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 2) + buffer;
333 else if(type==AMEFObject::B_OBJECT_TYPE)
335 retval = AMEFObject::B_OBJECT_TYPE + delim + name + delim + intTocharArrayS(length, 3) + buffer;
468 if(value.length()<=256)
469 type = AMEFObject::STRING_256_TYPE;
470 else if(value.length()<=65536)
471 type = AMEFObject::STRING_65536_TYPE;
472 else if(value.length()<=16777216)
473 type = AMEFObject::STRING_16777216_TYPE;
475 type = AMEFObject::STRING_TYPE;
477 if(type==AMEFObject::DATE_TYPE || type==AMEFObject::STRING_256_TYPE
478 || type==AMEFObject::DOUBLE_FLOAT_TYPE)
480 arr.push_back((
char)type);
481 string len = intTocharArray(value.length(), 1);
485 else if(type==AMEFObject::STRING_65536_TYPE)
487 arr.push_back((
char)type);
488 string len = intTocharArray(value.length(), 2);
489 arr.append(len);arr.append(value);
491 else if(type==AMEFObject::STRING_16777216_TYPE)
493 arr.push_back((
char)type);
494 string len = intTocharArray(value.length(), 3);
495 arr.append(len);arr.append(value);
497 else if(type==AMEFObject::STRING_TYPE)
499 arr.push_back((
char)type);
500 string len = intTocharArray(value.length(), 4);
501 arr.append(len);arr.append(value);
503 else if(type==AMEFObject::BOOLEAN_TYPE || type==AMEFObject::CHAR_TYPE
504 || type==AMEFObject::SMALL_INT_TYPE || type==AMEFObject::VERY_SMALL_INT_TYPE
505 || type==AMEFObject::BIG_INT_TYPE || type==AMEFObject::INT_TYPE
506 || type==AMEFObject::VS_LONG_INT_TYPE || type==AMEFObject::S_LONG_INT_TYPE
507 || type==AMEFObject::B_LONG_INT_TYPE || type==AMEFObject::LONG_INT_TYPE)
511 else if(type==AMEFObject::OBJECT_TYPE)
513 int length = value.length();
516 arr[0] = (char)AMEFObject::VS_OBJECT_TYPE;
517 string len = intTocharArray(value.length(), 1);
518 arr.append(len);arr.append(value);
520 else if(length<65536)
522 arr[0] = (char)AMEFObject::S_OBJECT_TYPE;
523 string len = intTocharArray(value.length(), 2);
526 else if(length<16777216)
528 arr[0] = (char)AMEFObject::B_OBJECT_TYPE;
529 string len = intTocharArray(value.length(),3);
534 arr[0] = (char)AMEFObject::OBJECT_TYPE;
535 string len = intTocharArray(value.length(),4);
547 type = AMEFObject::VERY_SMALL_INT_TYPE;
548 else if(integer<65536)
550 type = AMEFObject::SMALL_INT_TYPE;
553 else if(integer<16777216)
555 type = AMEFObject::BIG_INT_TYPE;
560 type = AMEFObject::INT_TYPE;
564 arr.push_back((
char)type);
565 string len = intTocharArray(integer, ind);
576 type = AMEFObject::VERY_SMALL_INT_TYPE;
579 type = AMEFObject::SMALL_INT_TYPE;
582 else if(lon<16777216)
584 type = AMEFObject::BIG_INT_TYPE;
587 else if(lon<4294967296ULL)
589 type = AMEFObject::INT_TYPE;
592 else if(lon<1099511627776ULL)
594 type = AMEFObject::VS_LONG_INT_TYPE;
597 else if(lon<281474976710656ULL)
599 type = AMEFObject::S_LONG_INT_TYPE;
602 else if(lon<72057594037927936ULL)
604 type = AMEFObject::B_LONG_INT_TYPE;
609 type = AMEFObject::LONG_INT_TYPE;
613 arr.push_back((
char)type);
614 char* len = longTocharArray(lon, ind);
623 type = AMEFObject::VERY_SMALL_INT_TYPE;
626 type = AMEFObject::SMALL_INT_TYPE;
629 else if(lon<16777216)
631 type = AMEFObject::BIG_INT_TYPE;
634 else if(lon<(
long)4294967296ULL)
636 type = AMEFObject::INT_TYPE;
639 else if(lon<(
long)1099511627776ULL)
641 type = AMEFObject::VS_LONG_INT_TYPE;
644 else if(lon<(
long)281474976710656ULL)
646 type = AMEFObject::S_LONG_INT_TYPE;
649 else if(lon<(
long)72057594037927936ULL)
651 type = AMEFObject::B_LONG_INT_TYPE;
656 type = AMEFObject::LONG_INT_TYPE;
660 arr.push_back((
char)type);
661 char* len = longTocharArray(lon, ind);
671 type = AMEFObject::VERY_SMALL_INT_TYPE;
674 type = AMEFObject::SMALL_INT_TYPE;
677 else if(lon<16777216)
679 type = AMEFObject::BIG_INT_TYPE;
682 else if(lon<4294967296ULL)
684 type = AMEFObject::INT_TYPE;
687 else if(lon<1099511627776ULL)
689 type = AMEFObject::VS_LONG_INT_TYPE;
692 else if(lon<281474976710656ULL)
694 type = AMEFObject::S_LONG_INT_TYPE;
697 else if(lon<72057594037927936ULL)
699 type = AMEFObject::B_LONG_INT_TYPE;
704 type = AMEFObject::LONG_INT_TYPE;
708 arr.push_back((
char)type);
709 char* len = longTocharArray(lon, ind);
718 type = AMEFObject::VERY_SMALL_INT_TYPE;
721 type = AMEFObject::SMALL_INT_TYPE;
724 else if(lon<16777216)
726 type = AMEFObject::BIG_INT_TYPE;
731 type = AMEFObject::INT_TYPE;
735 arr.push_back((
char)type);
736 char* len = longTocharArray(lon, ind);
745 char type = AMEFObject::DOUBLE_FLOAT_TYPE;
747 string retVal = getFinalVal(type, buffer, 1,
"",
"");
754 char type = AMEFObject::DOUBLE_FLOAT_TYPE;
756 string retVal = getFinalVal(type, buffer, 1,
"",
"");
762 return (AMEFObject::BOOLEAN_TYPE+(lon?
"1":
"0"));
767 return (AMEFObject::CHAR_TYPE+
""+lon);
779 string encodeSinglePacketB(
AMEFObject *packet,
bool ignoreName)
781 int bufferlength = packet->getNamedLength(ignoreName);
786 if(packet->getType()==
'o')
788 if(bufferlength+4<256)
790 buffer.push_back(AMEFObject::VS_OBJECT_TYPE);
792 else if(bufferlength+4<65536)
794 buffer.push_back(AMEFObject::S_OBJECT_TYPE);
796 else if(bufferlength+4<16777216)
798 buffer.push_back(AMEFObject::B_OBJECT_TYPE);
802 buffer.push_back((
char)packet->getType());
803 buffer.push_back((
char)
',');
804 buffer.append(packet->getName());
807 buffer.push_back((
char)
',');
809 if(packet->getType()!=
'n' && packet->getType()!=
'w' && packet->getType()!=
'r'
810 && packet->getType()!=
'i' && packet->getType()!=
'f' && packet->getType()!=
'x'
811 && packet->getType()!=
'e' && packet->getType()!=
'l' && packet->getType()!=
'b'
812 && packet->getType()!=
'c' && packet->getType()!=
'a' && packet->getType()!=
'g'
813 && packet->getType()!=
'j' && packet->getType()!=
'v' && packet->getType()!=
'z')
815 string lengthb = intTocharArrayWI(packet->getlength());
816 buffer.append(lengthb);
823 buffer.push_back((
char)packet->getType());
825 if(packet->getType()!=
'n' && packet->getType()!=
'w' && packet->getType()!=
'r'
826 && packet->getType()!=
'i' && packet->getType()!=
'f' && packet->getType()!=
'x'
827 && packet->getType()!=
'e' && packet->getType()!=
'l' && packet->getType()!=
'b'
828 && packet->getType()!=
'c' && packet->getType()!=
'a' && packet->getType()!=
'g'
829 && packet->getType()!=
'j' && packet->getType()!=
'v' && packet->getType()!=
'z')
831 string lengthb = intTocharArrayWI(packet->getlength());
832 buffer.append(lengthb);
838 for (
int i=0;i<(int)packet->getPackets().size();i++)
840 AMEFObject *pack = packet->getPackets().at(i);
841 string val = encodeSinglePacketB(pack,ignoreName);
846 if(packet->getPackets().size()==0 && packet->getType()!=
'a' && packet->getType()!=
'g'
847 && packet->getType()!=
'j' && packet->getType()!=
'v' && packet->getType()!=
'z')
849 buffer.append(packet->getValue());