6 #include "state_data.h"
9 csp_state_data_saver::csp_state_data_saver(FILEIO *_fio)
14 csp_state_data_saver::~csp_state_data_saver()
18 size_t csp_state_data_saver::save_string_data(const _TCHAR *p, uint32_t *sumseed, int maxlen, bool *__stat)
21 if(__stat != NULL) *__stat = false;
22 if(p == NULL) return -1;
26 locallen = strnlen(p, maxlen);
28 if(locallen < 0) return locallen;
29 locallen += 1; // Include "\0";
31 *sumseed = calc_crc32(*sumseed, (uint8_t *)p, locallen * sizeof(char));
34 for(cp = 0; cp < locallen; cp++) {
35 int _t = (int)(p[cp]);
36 int res = fio->Fputc(_t);
37 if((_t == '\0') || (_t == 0x00)){
39 if(__stat != NULL) *__stat = true;
41 } else if(_t == EOF) {
42 return (size_t)EOF; // ERROR
48 size_t csp_state_data_saver::load_string_data(_TCHAR *p, uint32_t *sumseed, int maxlen, bool *__stat)
52 if(__stat != NULL) *__stat = false;
53 if(p == NULL) return -1;
54 if(maxlen <= 0) return -1;
55 memset(p, 0x00, sizeof(_TCHAR) * maxlen);
56 for(cp = 0; cp < maxlen; cp++) {
57 int _t = fio->Fgetc();
58 if((_t == '\0') || (_t == 0x00)){
61 if(__stat != NULL) *__stat = true;
63 } else if(_t == EOF) {
66 if(__stat != NULL) *__stat = false;
68 } else if((cp + 1) >= maxlen) {
70 if(__stat != NULL) *__stat = true;
82 *sumseed = calc_crc32(*sumseed, (uint8_t *)p, _nlen * sizeof(_TCHAR));
86 // ALL OF BYNARY VALUES SHOULD BE SAVED BY BIG ENDIAN
87 int csp_state_data_saver::save_and_change_byteorder_be(uint32_t *sum, void *val, int bytes, int rep)
89 //int swapoffset = bytes;
92 uint8_t *srcp = (uint8_t *)val;
94 if((bytes <= 0) || (rep < 1)) return 0;
95 if(val == NULL) return 0;
96 buf = (uint8_t *)malloc(bytes); // swap buffer
97 if(buf == NULL) return 0;
98 for(members = 0; members < rep; members++) {
99 #if defined(__LITTLE_ENDIAN__)
101 for(int j = (bytes - 1); j >= 0; j--) {
106 memcpy(buf, srcp, bytes);
108 if(fio->Fwrite(buf, bytes, 1) != 1) {
112 *sum = calc_crc32(*sum, buf, bytes);
119 int csp_state_data_saver::load_and_change_byteorder_be(uint32_t *sum, void *val, int bytes, int rep)
121 //int swapoffset = bytes;
124 uint8_t *srcp = (uint8_t *)val;
126 if((bytes <= 0) || (rep < 1)) return 0;
127 if(val == NULL) return 0;
128 buf = (uint8_t *)malloc(bytes); // swap buffer
129 if(buf == NULL) return 0;
130 for(members = 0; members < rep; members++) {
131 if(fio->Fread(buf, bytes, 1) != 1) {
135 *sum = calc_crc32(*sum, buf, bytes);
136 #if defined(__LITTLE_ENDIAN__)
138 for(int j = (bytes - 1); j >= 0; j--) {
143 memcpy(srcp, buf, bytes);
151 void csp_state_data_saver::put_byte(uint8_t val, uint32_t *sumseed, bool *__stat)
155 if(fio->IsOpened()) {
157 if(sumseed != NULL) {
158 *sumseed = calc_crc32(*sumseed, &val, 1);
160 if(__stat != NULL) *__stat = true;
164 if(__stat != NULL) *__stat = false;
168 uint8_t csp_state_data_saver::get_byte(uint32_t *sumseed, bool *__stat)
171 if(fio->IsOpened()) {
172 uint8_t val = fio->FgetUint8();
173 if(sumseed != NULL) {
174 *sumseed = calc_crc32(*sumseed, &val, 1);
176 if(__stat != NULL) *__stat = true;
180 if(__stat != NULL) *__stat = false;
184 void csp_state_data_saver::put_bool(bool val, uint32_t *sumseed, bool *__stat)
187 tv = (val == false) ? 0x00 : 0x01;
189 if(fio->IsOpened()) {
191 if(sumseed != NULL) {
192 *sumseed = calc_crc32(*sumseed, &tv, 1);
194 if(__stat != NULL) *__stat = true;
198 if(__stat != NULL) *__stat = false;
202 bool csp_state_data_saver::get_bool(uint32_t *sumseed, bool *__stat)
205 if(fio->IsOpened()) {
206 uint8_t val = fio->FgetUint8();
207 if(val != 0x00) val = 0x01;
208 if(sumseed != NULL) {
209 *sumseed = calc_crc32(*sumseed, &val, 1);
211 if(__stat != NULL) *__stat = true;
212 return (val == 0x00) ? false : true;
215 if(__stat != NULL) *__stat = false;
219 void csp_state_data_saver::put_word(uint16_t val, uint32_t *sumseed, bool *__stat)
222 if(fio->IsOpened()) {
223 fio->FputUint16_BE(val);
224 if(sumseed != NULL) {
228 tval.write_2bytes_be_to(buf);
229 *sumseed = calc_crc32(*sumseed, buf, 2);
231 if(__stat != NULL) *__stat = true;
235 if(__stat != NULL) *__stat = false;
239 uint16_t csp_state_data_saver::get_word(uint32_t *sumseed, bool *__stat)
242 if(fio->IsOpened()) {
243 uint16_t val = fio->FgetUint16_BE();
244 if(__stat != NULL) *__stat = true;
245 if(sumseed != NULL) {
249 tval.write_2bytes_be_to(buf);
250 *sumseed = calc_crc32(*sumseed, buf, 2);
255 if(__stat != NULL) *__stat = false;
259 void csp_state_data_saver::put_dword(uint32_t val, uint32_t *sumseed, bool *__stat)
263 if(fio->IsOpened()) {
264 fio->FputUint32_BE(val);
265 if(__stat != NULL) *__stat = true;
266 if(sumseed != NULL) {
270 tval.write_4bytes_be_to(buf);
271 *sumseed = calc_crc32(*sumseed, buf, 4);
276 if(__stat != NULL) *__stat = false;
280 uint32_t csp_state_data_saver::get_dword(uint32_t *sumseed, bool *__stat)
283 if(fio->IsOpened()) {
284 uint32_t val = fio->FgetUint32_BE();
285 if(__stat != NULL) *__stat = true;
286 if(sumseed != NULL) {
290 tval.write_4bytes_be_to(buf);
291 *sumseed = calc_crc32(*sumseed, buf, 4);
296 if(__stat != NULL) *__stat = false;
300 void csp_state_data_saver::put_qword(uint64_t val, uint32_t *sumseed, bool *__stat)
304 if(fio->IsOpened()) {
305 fio->FputUint64_BE(val);
306 if(__stat != NULL) *__stat = true;
307 if(sumseed != NULL) {
311 tval.write_8bytes_be_to(buf);
312 *sumseed = calc_crc32(*sumseed, buf, 8);
317 if(__stat != NULL) *__stat = false;
321 uint64_t csp_state_data_saver::get_qword(uint32_t *sumseed, bool *__stat)
324 if(fio->IsOpened()) {
325 uint64_t val = fio->FgetUint64_BE();
326 if(__stat != NULL) *__stat = true;
327 if(sumseed != NULL) {
331 tval.write_8bytes_be_to(buf);
332 *sumseed = calc_crc32(*sumseed, buf, 8);
337 if(__stat != NULL) *__stat = false;
341 void csp_state_data_saver::put_int8(int8_t val, uint32_t *sumseed, bool *__stat)
345 if(fio->IsOpened()) {
347 if(__stat != NULL) *__stat = true;
348 if(sumseed != NULL) {
349 *sumseed = calc_crc32(*sumseed, &val, 1);
354 if(__stat != NULL) *__stat = false;
358 int8_t csp_state_data_saver::get_int8(uint32_t *sumseed, bool *__stat)
361 if(fio->IsOpened()) {
362 int8_t val = fio->FgetInt8();
363 if(__stat != NULL) *__stat = true;
364 if(sumseed != NULL) {
365 *sumseed = calc_crc32(*sumseed, &val, 1);
370 if(__stat != NULL) *__stat = false;
374 void csp_state_data_saver::put_int16(int16_t val, uint32_t *sumseed, bool *__stat)
378 if(fio->IsOpened()) {
379 fio->FputInt16_BE(val);
380 if(__stat != NULL) *__stat = true;
381 if(sumseed != NULL) {
385 tval.write_2bytes_be_to(buf);
386 *sumseed = calc_crc32(*sumseed, buf, 2);
391 if(__stat != NULL) *__stat = false;
395 int16_t csp_state_data_saver::get_int16(uint32_t *sumseed, bool *__stat)
398 if(fio->IsOpened()) {
399 int16_t val = fio->FgetInt16_BE();
400 if(__stat != NULL) *__stat = true;
401 if(sumseed != NULL) {
405 tval.write_2bytes_be_to(buf);
406 *sumseed = calc_crc32(*sumseed, buf, 2);
411 if(__stat != NULL) *__stat = false;
415 void csp_state_data_saver::put_int32(int32_t val, uint32_t *sumseed, bool *__stat)
419 if(fio->IsOpened()) {
420 fio->FputInt32_BE(val);
421 if(__stat != NULL) *__stat = true;
422 if(sumseed != NULL) {
426 tval.write_4bytes_be_to(buf);
427 *sumseed = calc_crc32(*sumseed, buf, 4);
432 if(__stat != NULL) *__stat = false;
436 int32_t csp_state_data_saver::get_int32(uint32_t *sumseed, bool *__stat)
439 if(fio->IsOpened()) {
440 int32_t val = fio->FgetInt32_BE();
441 if(__stat != NULL) *__stat = true;
442 if(sumseed != NULL) {
446 tval.write_4bytes_be_to(buf);
447 *sumseed = calc_crc32(*sumseed, buf, 4);
452 if(__stat != NULL) *__stat = false;
456 void csp_state_data_saver::put_int64(int64_t val, uint32_t *sumseed, bool *__stat)
460 if(fio->IsOpened()) {
461 fio->FputInt64_BE(val);
462 if(__stat != NULL) *__stat = true;
463 if(sumseed != NULL) {
467 tval.write_8bytes_be_to(buf);
468 *sumseed = calc_crc32(*sumseed, buf, 8);
473 if(__stat != NULL) *__stat = false;
477 int64_t csp_state_data_saver::get_int64(uint32_t *sumseed, bool *__stat)
480 if(fio->IsOpened()) {
481 int64_t val = fio->FgetInt64_BE();
482 if(__stat != NULL) *__stat = true;
483 if(sumseed != NULL) {
487 tval.write_8bytes_be_to(buf);
488 *sumseed = calc_crc32(*sumseed, buf, 8);
493 if(__stat != NULL) *__stat = false;
498 * For floating values, internal format is differnt by ARCHTECTURE, OS, COMPILER etc.
499 * So, saving / loading those values by ascii, not binary.
500 * -- 20180520 K.Ohta.
504 float csp_state_data_saver::get_float(uint32_t *sumseed, bool *__stat)
508 char tmps[1024]; // OK?
510 size_t _nlen = sizeof(tmps) / sizeof(char);
513 memset(tmps, 0x00, sizeof(tmps));
514 donelen = load_string_data(tmps, sumseed, _nlen - 1);
515 if((donelen <= 0) || (donelen >= _nlen)) { //
516 if(__stat != NULL) *__stat = false;
519 _s = std::string(tmps);
521 _v = std::stof(_s, &_sp);
522 } catch(const std::invalid_argument& e) {
523 if(__stat != NULL) *__stat = false;
525 } catch(const std::out_of_range& e) {
526 if(__stat != NULL) *__stat = false;
529 if(__stat != NULL) *__stat = true;
530 if(sumseed != NULL) {
531 *sumseed = calc_crc32(*sumseed, tmps, donelen);
535 if(__stat != NULL) *__stat = true;
539 void csp_state_data_saver::put_float(float val, uint32_t *sumseed, bool *__stat)
542 char tmps[1024]; // OK?
544 int _nlen = sizeof(tmps) / sizeof(char);
547 memset(tmps, 0x00, sizeof(tmps));
548 _s = std::to_string(_v);
549 _s.copy(tmps, _nlen - 1);
550 size_t rlen = strnlen(tmps, _nlen);
551 if((rlen <= 0) || (rlen >= _nlen)) { //
552 if(__stat != NULL) *__stat = false;
555 donelen = save_string_data(tmps, sumseed, rlen);
556 if((donelen <= 0) || (donelen != (rlen + 1))) {
557 if(__stat != NULL) *__stat = false;
560 if(sumseed != NULL) {
561 *sumseed = calc_crc32(*sumseed, tmps, donelen);
563 if(__stat != NULL) *__stat = true;
566 if(__stat != NULL) *__stat = false;
570 double csp_state_data_saver::get_double(uint32_t *sumseed, bool *__stat)
573 char tmps[1024]; // OK?
575 size_t _nlen = sizeof(tmps) / sizeof(char);
579 memset(tmps, 0x00, sizeof(tmps));
580 donelen = load_string_data(tmps, sumseed, _nlen - 1);
581 if((donelen <= 0) || (donelen >= _nlen)) { //
582 if(__stat != NULL) *__stat = false;
585 _s = std::string(tmps);
587 _v = std::stod(_s, &_sp);
588 } catch(const std::invalid_argument& e) {
589 if(__stat != NULL) *__stat = false;
591 } catch(const std::out_of_range& e) {
592 if(__stat != NULL) *__stat = false;
595 if(__stat != NULL) *__stat = true;
596 if(sumseed != NULL) {
597 *sumseed = calc_crc32(*sumseed, tmps, donelen);
601 if(__stat != NULL) *__stat = true;
605 void csp_state_data_saver::put_double(double val, uint32_t *sumseed, bool *__stat)
608 char tmps[1024]; // OK?
610 int _nlen = sizeof(tmps) / sizeof(char);
613 memset(tmps, 0x00, sizeof(tmps));
614 _s = std::to_string(_v);
615 _s.copy(tmps, _nlen - 1);
616 size_t rlen = strnlen(tmps, _nlen);
617 if((rlen <= 0) || (rlen >= _nlen)) { //
618 if(__stat != NULL) *__stat = false;
621 donelen = save_string_data(tmps, sumseed, rlen);
622 if((donelen <= 0) || (donelen != (rlen + 1))) {
623 if(__stat != NULL) *__stat = false;
626 if(sumseed != NULL) {
627 *sumseed = calc_crc32(*sumseed, tmps, donelen);
629 if(__stat != NULL) *__stat = true;
632 if(__stat != NULL) *__stat = false;
636 long double csp_state_data_saver::get_long_double(uint32_t *sumseed, bool *__stat)
640 char tmps[1024]; // OK?
642 size_t _nlen = sizeof(tmps) / sizeof(char);
645 memset(tmps, 0x00, sizeof(tmps));
646 donelen = load_string_data(tmps, sumseed, _nlen - 1);
647 if((donelen <= 0) || (donelen >= _nlen)) { //
648 if(__stat != NULL) *__stat = false;
651 _s = std::string(tmps);
653 _v = std::stold(_s, &_sp);
654 } catch(const std::invalid_argument& e) {
655 if(__stat != NULL) *__stat = false;
657 } catch(const std::out_of_range& e) {
658 if(__stat != NULL) *__stat = false;
661 if(__stat != NULL) *__stat = true;
662 if(sumseed != NULL) {
663 *sumseed = calc_crc32(*sumseed, tmps, donelen);
667 if(__stat != NULL) *__stat = true;
671 void csp_state_data_saver::put_long_double(long double val, uint32_t *sumseed, bool *__stat)
674 char tmps[1024]; // OK?
675 long double _v = val;
676 int _nlen = sizeof(tmps) / sizeof(char);
679 memset(tmps, 0x00, sizeof(tmps));
680 _s = std::to_string(_v);
681 _s.copy(tmps, _nlen - 1);
682 size_t rlen = strnlen(tmps, _nlen);
683 if((rlen <= 0) || (rlen >= _nlen)) { //
684 if(__stat != NULL) *__stat = false;
687 donelen = save_string_data(tmps, sumseed, rlen);
688 if((donelen <= 0) || (donelen != (rlen + 1))) {
689 if(__stat != NULL) *__stat = false;
692 if(sumseed != NULL) {
693 *sumseed = calc_crc32(*sumseed, tmps, donelen);
695 if(__stat != NULL) *__stat = true;
698 if(__stat != NULL) *__stat = false;
702 size_t csp_state_data_saver::get_byte_array(uint8_t *p, size_t len, size_t repeat, uint32_t *sumseed, bool *__stat)
706 if((len <= 0) || (repeat <= 0) || (p == NULL)) {
709 if(fio == NULL) _nstat = false;
711 donelen = fio->Fread(p, len, repeat);
712 if(donelen != repeat) {
716 int calcsize = len * donelen;
717 if((calcsize > 0) && (sumseed != NULL)) {
718 *sumseed = calc_crc32(*sumseed, p, calcsize);
723 if(__stat != NULL) *__stat = _nstat;
725 return len * donelen; // RETURN BYTES;
731 size_t csp_state_data_saver::put_byte_array(uint8_t *p, size_t len, size_t repeat, uint32_t *sumseed, bool *__stat)
735 if((len <= 0) || (repeat <= 0) || (p == NULL)) {
738 if(fio == NULL) _nstat = false;
740 donelen = fio->Fwrite(p, len, repeat);
741 if(donelen != repeat) {
745 int calcsize = len * donelen;
746 if((calcsize > 0) && (sumseed != NULL)) {
747 *sumseed = calc_crc32(*sumseed, p, calcsize);
752 if(__stat != NULL) *__stat = _nstat;
754 return len * donelen; // RETURN BYTES;
761 void csp_state_data_saver::put_pair32(pair_t val, uint32_t *sumseed, bool *__stat)
765 if(fio->IsOpened()) {
767 val.write_4bytes_be_to(buf);
768 size_t memb = fio->Fwrite(buf, 1, 4);
770 if(__stat != NULL) *__stat = false;
773 if(__stat != NULL) *__stat = true;
774 if(sumseed != NULL) {
775 *sumseed = calc_crc32(*sumseed, buf, 4);
780 if(__stat != NULL) *__stat = false;
784 pair_t csp_state_data_saver::get_pair32(uint32_t *sumseed, bool *__stat)
789 if(fio->IsOpened()) {
791 size_t memb = fio->Fread(buf, 1, 4);
793 if(__stat != NULL) *__stat = false;
796 val.read_4bytes_be_from(buf);
797 if(__stat != NULL) *__stat = true;
798 if(sumseed != NULL) {
799 *sumseed = calc_crc32(*sumseed, buf, 4);
804 if(__stat != NULL) *__stat = false;
808 pair64_sav_t csp_state_data_saver::get_pair64(uint32_t *sumseed, bool *__stat)
813 if(fio->IsOpened()) {
815 size_t memb = fio->Fread(buf, 1, 8);
817 if(__stat != NULL) *__stat = false;
820 val.read_8bytes_be_from(buf);
821 if(__stat != NULL) *__stat = true;
822 if(sumseed != NULL) {
823 *sumseed = calc_crc32(*sumseed, buf, 8);
828 if(__stat != NULL) *__stat = false;
832 void csp_state_data_saver::put_pair64(pair64_sav_t val, uint32_t *sumseed, bool *__stat)
835 if(fio->IsOpened()) {
837 val.write_8bytes_be_to(buf);
838 size_t memb = fio->Fwrite(buf, 1, 8);
840 if(__stat != NULL) *__stat = false;
843 if(__stat != NULL) *__stat = true;
844 if(sumseed != NULL) {
845 *sumseed = calc_crc32(*sumseed, buf, 8);
850 if(__stat != NULL) *__stat = false;
854 bool csp_state_data_saver::pre_proc_saving(uint32_t *sumseed, bool *__stat)
857 if(sumseed != NULL) {
858 const uint8_t headdata[4] = {0xff, 0xff, 0xff, 0xff};
859 *sumseed = calc_crc32(*sumseed, headdata, 4);
862 if(__stat != NULL) *__stat = mb;
866 bool csp_state_data_saver::post_proc_saving(uint32_t *sumseed, bool *__stat)
869 if(sumseed != NULL) {
870 const uint8_t taildata[4] = {0x00, 0x00, 0x00, 0x00};
871 *sumseed = calc_crc32(*sumseed, taildata, 4);
873 if(fio->IsOpened()) {
874 fio->FputUint32_BE(*sumseed);
879 if(__stat != NULL) *__stat = mb;
883 bool csp_state_data_saver::pre_proc_loading(uint32_t *sumseed, bool *__stat)
886 if(sumseed != NULL) {
887 const uint8_t headdata[4] = {0xff, 0xff, 0xff, 0xff};
888 *sumseed = calc_crc32(*sumseed, headdata, 4);
891 if(__stat != NULL) *__stat = mb;
895 bool csp_state_data_saver::post_proc_loading(uint32_t *sumseed, bool *__stat)
899 if(sumseed != NULL) {
900 const uint8_t taildata[4] = {0x00, 0x00, 0x00, 0x00};
901 *sumseed = calc_crc32(*sumseed, taildata, 4);
903 if(fio->IsOpened()) {
904 tmp_crc = fio->FgetUint32_BE();
905 if(*sumseed == tmp_crc) mb = true;
909 if(__stat != NULL) *__stat = mb;
914 csp_state_utils::csp_state_utils(int _version, int device_id, const _TCHAR *classname, CSP_Logger* p_logger)
920 this_device_id = device_id;
921 this_device_id_bak = this_device_id;
924 memset(__classname, 0x00, sizeof(__classname));
925 memset(__classname_bak, 0x00, sizeof(__classname_bak));
926 memset(magic, 0x00, sizeof(magic));
927 memset(magic_bak, 0x00, sizeof(magic_bak));
929 strncpy(magic, _T("CSP_SAVE"), 16 - 1);
930 strncpy(magic_bak, magic, 16 - 1);
932 if(classname != NULL) {
933 strncpy(__classname, classname, sizeof(__classname) - 1);
935 strncpy(__classname, "Unknown Class", sizeof(__classname) - 1);
937 strncpy(__classname_bak, __classname, sizeof(__classname_bak) - 1);
939 class_version = _version;
940 class_version_bak = _version;
942 internal_version = 1;
943 internal_version_bak = internal_version;
944 out_debug_log("NEW SAVE STATE: NAME=%s DEVID=%d VER=%d", classname, device_id, _version);
946 add_entry_tchar(_T("HEADER"), magic_bak, strlen(magic_bak) + 1);
947 add_entry_tchar(_T("CLASSNAME"), __classname_bak, strlen(__classname_bak) + 1);
948 add_entry(_T("DEVICE_ID"), &this_device_id_bak);
949 add_entry(_T("STAVE_VER"), &class_version_bak);
950 add_entry(_T("INTERNAL_VER"), &internal_version_bak);
955 csp_state_utils::~csp_state_utils()
961 * With MinGW and DLL linker, not able top find extern symbols.
965 #include "csp_logger.h"
967 void csp_state_utils::out_debug_log(const char *fmt, ...)
969 if(logger == NULL) return;
970 // Temporally disabled 20180618
971 //#if !defined(__MINGW32__) && !defined(__MINGW64__)
975 vsnprintf(strbuf, 8192, fmt, ap);
976 logger->debug_log(CSP_LOG_DEBUG, CSP_LOG_TYPE_VM_STATE, strbuf);
981 std::list<std::string> csp_state_utils::get_entries_list(void)
984 std::list<std::string> _rlist;
985 std::string _tname, _vname;
988 for(auto p = listptr.begin(); p != listptr.end(); ++p) {
989 void *pp = (*p).ptr.p;
991 _vname = _T("NAME:");
992 switch((*p).type_id) {
993 case csp_saver_entry_float:
994 _tname = _T("TYPE: float");
996 case csp_saver_entry_double:
997 _tname = _T("TYPE: double");
999 case csp_saver_entry_long_double:
1000 _tname = _T("TYPE: long double");
1002 case csp_saver_entry_pair:
1003 _tname = _T("TYPE: pair_t");
1005 case csp_saver_entry_int:
1006 _tname = _T("TYPE: int");
1008 case csp_saver_entry_uint8:
1009 _tname = _T("TYPE: uint8_t");
1011 case csp_saver_entry_int8:
1012 _tname = _T("TYPE: int8_t");
1014 case csp_saver_entry_uint16:
1015 _tname = _T("TYPE: uint16_t");
1017 case csp_saver_entry_int16:
1018 _tname = _T("TYPE: int16_t");
1020 case csp_saver_entry_uint32:
1021 _tname = _T("TYPE: uint32_t");
1023 case csp_saver_entry_int32:
1024 _tname = _T("TYPE: int32_t");
1026 case csp_saver_entry_uint64:
1027 _tname = _T("TYPE: uint64_t");
1029 case csp_saver_entry_int64:
1030 _tname = _T("TYPE: int64_t");
1032 case csp_saver_entry_bool:
1033 _tname = _T("TYPE: bool");
1035 case csp_saver_entry_tchar:
1036 _tname = _T("TYPE: _TCHAR");
1038 case csp_saver_entry_any:
1039 _tname = _T("TYPE: ANY");
1042 _tname = _T("TYPE: ANY(UNKNOWN)");
1045 _vname = _vname + (*p).name;
1046 _rlist.push_back(_vname);
1047 _rlist.push_back(_tname);
1052 uint32_t csp_state_utils::get_crc_value(void)
1056 void csp_state_utils::get_class_name(_TCHAR *buf, int len)
1058 strncpy(buf, __classname_bak, ((size_t)len >= sizeof(__classname_bak)) ? (sizeof(__classname_bak) - 1) : len);
1062 void csp_state_utils::add_entry_fifo(const _TCHAR *__name, FIFO **p, int _len, int __num)
1065 std::string _name = std::string(__name);
1066 if(__num >= 0) _name = _name + std::string("_#[") +std::to_string(__num) + std::string("]");
1067 _l.ptr.p = (void *)p;
1071 _l.datalenptr = NULL;
1072 _l.local_num = __num;
1073 _l.assume_byte = false;
1074 _l.type_id = csp_saver_entry_fifo;
1075 _l.use_is_null = false;
1076 _l._null_atomlen = 1;
1077 _l._null_type_id = csp_saver_entry_any;
1078 _l.is_null_value.u = 0;
1079 _l.is_null_value_const = false;
1080 _l.not_null_value.u = 0;
1081 _l.not_null_value_const = false;
1084 out_debug_log("ADD ENTRY: NAME=%s TYPE=FIFO len=%d atomlen=%d", _name.c_str(), _len, _l.atomlen);
1085 listptr.push_back(_l);
1088 void csp_state_utils::add_entry_cur_time_t(const _TCHAR *__name, cur_time_t *p, int _len, int __num)
1091 std::string _name = std::string(__name);
1092 if(__num >= 0) _name = _name + std::string("_#[") +std::to_string(__num) + std::string("]");
1093 _l.ptr.p = (void *)p;
1097 _l.datalenptr = NULL;
1098 _l.local_num = __num;
1099 _l.assume_byte = false;
1100 _l.use_is_null = false;
1101 _l.type_id = csp_saver_entry_cur_time_t;
1102 _l._null_atomlen = 1;
1103 _l._null_type_id = csp_saver_entry_any;
1104 _l.is_null_value.u = 0;
1105 _l.is_null_value_const = false;
1106 _l.not_null_value.u = 0;
1107 _l.not_null_value_const = false;
1109 out_debug_log("ADD ENTRY: NAME=%s TYPE=CUR_TIME_T len=%d atomlen=%d", _name.c_str(), _len, _l.atomlen);
1110 listptr.push_back(_l);
1113 void csp_state_utils::add_entry_tchar(const _TCHAR *__name, _TCHAR *p, int _len, int __num, bool is_const)
1116 std::string _name = std::string(__name);
1117 if(__num >= 0) _name = _name + std::string("_#[") +std::to_string(__num) + std::string("]");
1119 if(p == NULL) return;
1120 _l.ptr.p = (void *)p;
1121 _l.type_id = csp_saver_entry_tchar;
1123 _l.atomlen = sizeof(_TCHAR);
1125 _l.local_num = __num;
1126 _l.assume_byte = true;
1127 _l.use_is_null = false;
1128 _l._null_atomlen = 1;
1129 _l._null_type_id = csp_saver_entry_any;
1130 _l.is_null_value.u = 0;
1131 _l.is_null_value_const = false;
1132 _l.not_null_value.u = 0;
1133 _l.not_null_value_const = false;
1136 if(is_const) _l.type_id = _l.type_id | csp_saver_entry_const;
1138 out_debug_log("ADD ENTRY: NAME=%s TYPE=_TCHAR* VAL=%s len=%d atomlen=%d HEAD=%08x", __name, p, _len, _l.atomlen, p);
1139 listptr.push_back(_l);
1142 bool csp_state_utils::save_state(FILEIO *__fio, uint32_t *pcrc)
1144 const uint8_t initdata[4] = {0xff, 0xff, 0xff, 0xff};
1145 const uint8_t taildata[4] = {0x00, 0x00, 0x00, 0x00};
1149 class_version_bak = class_version;
1150 this_device_id_bak = this_device_id;
1151 memset(__classname_bak, 0x00, sizeof(__classname_bak));
1152 strncpy(__classname_bak, __classname, sizeof(__classname) - 1);
1155 crc_value = 0xffffffff;
1160 out_debug_log("SAVE STATE: NAME=%s DEVID=%d VER=%d", __classname, this_device_id, class_version);
1161 //printf("SAVE STATE: NAME=%s DEVID=%d VER=%d", __classname, this_device_id, class_version);
1163 fio = new csp_state_data_saver(__fio);
1165 bool need_mfree = false;
1166 fio->pre_proc_saving(&crc_value, &_stat);
1168 for(auto p = listptr.begin(); p != listptr.end(); ++p) {
1170 void *_ppshadow = NULL;
1171 int _tid = (*p).type_id;
1172 int _asize = (*p).atomlen;
1173 int _len = (*p).len;
1174 bool _use_is_null = (*p).use_is_null;
1177 } else if((_tid & csp_saver_entry_const) != 0) {
1178 _ppshadow = (*p).ptr.p;
1179 if((*p).assume_byte) {
1181 memcpy(pp, _ppshadow, _len);
1183 pp = malloc(_len * _asize);
1184 memcpy(pp, _ppshadow, _len * _asize);
1186 _tid = _tid & 0xffff;
1188 if(((*p).assume_byte)) {
1190 _len = _len / _asize;
1193 } else if((_tid & csp_saver_entry_vararray) != 0) {
1194 if((*p).datalenptr != NULL) {
1195 _len = *((*p).datalenptr);
1200 _tid = _tid & ((int)~csp_saver_entry_vararray);
1201 void **xp = (void **)((*p).ptr.p);
1208 fio->put_int32(_len, &crc_value, &_stat);
1209 //out_debug_log("SAVE VARARRAY p=%08x len=%d atom=%d CRC=%08x",pp, _len, _asize, crc_value);
1210 //printf("SAVE VARARRAY p=%08x len=%d atom=%d CRC=%08x\n",pp, _len, _asize, crc_value);
1211 if(((*p).assume_byte) && (_asize > 1)) {
1212 _len = _len / _asize;
1217 if((pp != NULL) && (_len > 0)) {
1221 _tid = (*p)._null_type_id;
1222 _asize = (*p)._null_atomlen;
1223 void **_pp = (void **)pp;
1224 if(*_pp == NULL) { // is_null
1225 if((*p).is_null_value_const) {
1226 tval = (*p).is_null_value.s;
1228 _tid = typeid_map[typeid(int64_t)];
1231 // ToDo: Apply type.
1232 tval = *((int *)((*p).is_null_value.p));
1234 _tid = typeid_map[typeid(int64_t)];
1237 } else { // not_null
1238 if((*p).not_null_value_const) {
1239 tval = (*p).not_null_value.s;
1241 _tid = typeid_map[typeid(int64_t)];
1244 // ToDo: Apply type.
1245 tval = *((int *)((*p).not_null_value.p));
1247 _tid = typeid_map[typeid(int64_t)];
1251 fio->put_bool(nval, &crc_value, &_stat);
1254 case csp_saver_entry_float:
1257 float *px = (float *)pp;
1258 for(int i = 0; i < _len; i++) {
1259 fio->put_float(px[i], &crc_value, &_stat);
1268 case csp_saver_entry_double:
1271 double *px = (double *)pp;
1272 for(int i = 0; i < _len; i++) {
1273 fio->put_double(px[i], &crc_value, &_stat);
1282 case csp_saver_entry_long_double:
1285 long double *px = (long double *)pp;
1286 for(int i = 0; i < _len; i++) {
1287 fio->put_long_double(px[i], &crc_value, &_stat);
1296 case csp_saver_entry_pair:
1299 pair_t *px = (pair_t *)pp;
1300 for(int i = 0; i < _len; i++) {
1301 fio->put_pair32(px[i], &crc_value, &_stat);
1310 case csp_saver_entry_int:
1313 int *px = (int *)pp;
1314 for(int i = 0; i < _len; i++) {
1315 fio->put_int32(px[i], &crc_value, &_stat);
1324 case csp_saver_entry_uint8:
1327 uint8_t *px = (uint8_t *)pp;
1329 size_t _n = __fio->Fwrite(px, _len, 1);
1336 crc_value = calc_crc32(crc_value, px, _len);
1339 fio->put_byte(*px, &crc_value, &_stat);
1348 case csp_saver_entry_int8:
1351 int8_t *px = (int8_t *)pp;
1353 size_t _n = __fio->Fwrite(px, _len, 1);
1360 crc_value = calc_crc32(crc_value, (uint8_t *)px, _len);
1363 fio->put_int8(*px, &crc_value, &_stat);
1372 case csp_saver_entry_uint16:
1375 uint16_t *px = (uint16_t *)pp;
1376 for(int i = 0; i < _len; i++) {
1377 fio->put_word(px[i], &crc_value, &_stat);
1386 case csp_saver_entry_int16:
1389 int16_t *px = (int16_t *)pp;
1390 for(int i = 0; i < _len; i++) {
1391 fio->put_int16(px[i], &crc_value, &_stat);
1400 case csp_saver_entry_uint32:
1403 uint32_t *px = (uint32_t *)pp;
1404 for(int i = 0; i < _len; i++) {
1405 fio->put_dword(px[i], &crc_value, &_stat);
1414 case csp_saver_entry_int32:
1417 int32_t *px = (int32_t *)pp;
1418 for(int i = 0; i < _len; i++) {
1419 fio->put_int32(px[i], &crc_value, &_stat);
1428 case csp_saver_entry_uint64:
1431 uint64_t *px = (uint64_t *)pp;
1432 for(int i = 0; i < _len; i++) {
1433 fio->put_qword(px[i], &crc_value, &_stat);
1442 case csp_saver_entry_int64:
1445 int64_t *px = (int64_t *)pp;
1446 for(int i = 0; i < _len; i++) {
1447 fio->put_int64(px[i], &crc_value, &_stat);
1456 case csp_saver_entry_bool:
1459 bool *px = (bool *)pp;
1460 for(int i = 0; i < _len ; i++) {
1461 fio->put_bool(px[i], &crc_value, &_stat);
1470 case csp_saver_entry_tchar:
1472 retval = fio->save_string_data((const _TCHAR *)pp, &crc_value, _len, &_stat);
1473 if(!_stat) retval = -1;
1476 case csp_saver_entry_any:
1478 retval = fio->put_byte_array((uint8_t *)pp, _asize, _len, &crc_value, &_stat);
1479 if(!_stat) retval = -1;
1482 case csp_saver_entry_fifo:
1484 FIFO **fp = (FIFO **)pp;
1485 for(int i = 0; i < _len; i++) {
1486 fp[i]->save_state_helper(fio, &crc_value, &_stat);
1491 case csp_saver_entry_cur_time_t:
1493 cur_time_t *fp = (cur_time_t *)pp;
1494 for(int i = 0; i < _len; i++) {
1495 fp[i].save_state_helper(fio, &crc_value, &_stat);
1504 if((retval <= 0) || (!_stat)) {
1506 if(pp != NULL) free(pp);
1513 //out_debug_log("CRC=%08x", crc_value);
1515 if(pp != NULL) free(pp);
1519 fio->post_proc_saving(&crc_value, &_stat);
1524 out_debug_log("CRC: VAL=%08x", crc_value);
1525 if(pcrc != NULL) *pcrc = crc_value;
1529 bool csp_state_utils::load_state(FILEIO *__fio, uint32_t *pcrc)
1533 bool crc_stat = false;
1535 //class_version_bak = class_version;
1536 //this_device_id_bak = this_device_id;
1537 memset(__classname_bak, 0x00, sizeof(__classname_bak));
1538 //strncpy(__classname_bak, __classname, sizeof(__classname));
1540 crc_value = 0xffffffff;
1545 fio = new csp_state_data_saver(__fio);
1546 out_debug_log("LOAD STATE: NAME=%s DEVID=%d VER=%d", __classname, this_device_id, class_version);
1548 bool need_mfree = false;
1549 fio->pre_proc_loading(&crc_value, &_stat);
1550 for(auto p = listptr.begin(); p != listptr.end(); ++p) {
1552 int _tid = (*p).type_id;
1553 int _asize = (*p).atomlen;
1554 int _len = (*p).len;
1555 std::string _name = (*p).name;
1556 bool _use_is_null = (*p).use_is_null;
1561 } else if((_tid & csp_saver_entry_const) != 0) {
1562 //_ppshadow = (*p).ptr;
1563 if((*p).assume_byte) {
1565 //memcpy(pp, _ppshadow, _len);
1567 pp = malloc(_len * _asize);
1568 //memcpy(pp, _ppshadow, _len * asize);
1570 _tid = _tid & 0xffff;
1572 if(((*p).assume_byte)) {
1574 _len = _len / _asize;
1577 } else if((_tid & csp_saver_entry_vararray) != 0) {
1578 _len = fio->get_int32(&crc_value, &_stat);
1579 void **xp = (void **)((*p).ptr.p);
1585 if(((*p).assume_byte)) {
1588 *xp = malloc(_asize * _len);
1590 if(*xp == NULL) _len = 0;
1592 if((*p).datalenptr != NULL) {
1593 *((*p).datalenptr) = _len;
1596 _tid = _tid & ((int)~csp_saver_entry_vararray);
1597 if(((*p).assume_byte)) {
1599 _len = _len / _asize;
1602 //out_debug_log("LOAD VARARRAY p=%08x len=%d atom=%d CRC=%08x",pp, _len, _asize, crc_value);
1603 //printf("LOAD VARARRAY p=%08x len=%d atom=%d CRC=%08x\n",pp, _len, _asize, crc_value);
1607 if((pp != NULL) && (_len > 0)) {
1609 nval = fio->get_bool(&crc_value, &_stat);
1611 if((*p).is_null_value_const) {
1612 _tid = typeid_map[typeid(int64_t)];
1614 _asize = sizeof(int64_t);
1616 _tid = (*p)._null_type_id;
1617 pp = (*p).recv_ptr.p;
1618 _asize = (*p)._null_atomlen;
1621 if((*p).not_null_value_const) {
1622 _tid = typeid_map[typeid(int64_t)];
1624 _asize = sizeof(int64_t);
1626 _tid = (*p)._null_type_id;
1627 pp = (*p).recv_ptr.p;
1628 _asize = (*p)._null_atomlen;
1633 case csp_saver_entry_float:
1636 float *px = (float *)pp;
1637 for(int i = 0; i < _len; i++) {
1638 px[i] = fio->get_float(&crc_value, &_stat);
1646 out_debug_log("NAME=%s FLOAT: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1648 case csp_saver_entry_double:
1651 double *px = (double *)pp;
1652 for(int i = 0; i < _len; i++) {
1653 px[i] = fio->get_double(&crc_value, &_stat);
1661 out_debug_log("NAME=%s DOUBLE: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1663 case csp_saver_entry_long_double:
1666 long double *px = (long double *)pp;
1667 for(int i = 0; i < _len; i++) {
1668 px[i] = fio->get_long_double(&crc_value, &_stat);
1676 out_debug_log("NAME=%s LONG DOUBLE: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1678 case csp_saver_entry_pair:
1681 pair_t *px = (pair_t *)pp;
1682 for(int i = 0; i < _len; i++) {
1683 px[i] = fio->get_pair32(&crc_value, &_stat);
1691 out_debug_log("NAME=%s PAIR_T: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0,pp);
1693 case csp_saver_entry_int:
1696 int *px = (int *)pp;
1697 for(int i = 0; i < _len; i++) {
1698 px[i] = fio->get_int32(&crc_value, &_stat);
1706 out_debug_log("NAME=%s INT: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1708 case csp_saver_entry_uint8:
1711 uint8_t *px = (uint8_t *)pp;
1712 if((_len > 1) && (px != NULL)) {
1713 size_t _n = __fio->Fread(px, _len, 1);
1720 crc_value = calc_crc32(crc_value, px, _len);
1723 *px = fio->get_byte(&crc_value, &_stat);
1731 out_debug_log("NAME=%s UINT8: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1733 case csp_saver_entry_int8:
1736 int8_t *px = (int8_t *)pp;
1737 if((_len > 1) && (px != NULL)) {
1738 size_t _n = __fio->Fread(px, _len, 1);
1745 crc_value = calc_crc32(crc_value, px, _len);
1748 *px = fio->get_int8(&crc_value, &_stat);
1756 out_debug_log("NAME=%s INT8: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1758 case csp_saver_entry_uint16:
1761 uint16_t *px = (uint16_t *)pp;
1762 for(int i = 0; i < _len; i++) {
1763 px[i] = fio->get_word(&crc_value, &_stat);
1771 out_debug_log("NAMEE=%s UINT16: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1773 case csp_saver_entry_int16:
1776 int16_t *px = (int16_t *)pp;
1777 for(int i = 0; i < _len; i++) {
1778 px[i] = fio->get_int16(&crc_value, &_stat);
1786 out_debug_log("NAME=%s INT16: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1788 case csp_saver_entry_uint32:
1791 uint32_t *px = (uint32_t *)pp;
1792 for(int i = 0; i < _len; i++) {
1793 px[i] = fio->get_dword(&crc_value, &_stat);
1801 out_debug_log("NAME=%s UINT32: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1803 case csp_saver_entry_int32:
1806 int32_t *px = (int32_t *)pp;
1807 for(int i = 0; i < _len; i++) {
1808 px[i] = fio->get_int32(&crc_value, &_stat);
1816 out_debug_log("NAME=%s INT32: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1818 case csp_saver_entry_uint64:
1821 uint64_t *px = (uint64_t *)pp;
1822 for(int i = 0; i < _len; i++) {
1823 px[i] = fio->get_qword(&crc_value, &_stat);
1832 out_debug_log("NAME=%s UINT64: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1834 case csp_saver_entry_int64:
1837 int64_t *px = (int64_t *)pp;
1838 for(int i = 0; i < _len; i++) {
1839 px[i] = fio->get_int64(&crc_value, &_stat);
1847 out_debug_log("NAME=%s INT64: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1849 case csp_saver_entry_bool:
1852 bool *px = (bool *)pp;
1853 for(int i = 0; i < _len; i++) {
1854 px[i] = fio->get_bool(&crc_value, &_stat);
1862 out_debug_log("NAME=%s BOOL: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1864 case csp_saver_entry_tchar:
1866 retval = fio->load_string_data((const _TCHAR *)pp, &crc_value, _len, &_stat);
1867 out_debug_log("NAME=%s STR: LEN=%d STAT=%d S=%s", _name.c_str(), retval, (_stat) ? 1 : 0, (_TCHAR *)pp);
1868 if(!_stat) retval = -1;
1871 case csp_saver_entry_any:
1873 retval = fio->get_byte_array((uint8_t *)pp, _asize, _len, &crc_value, &_stat);
1874 if(!_stat) retval = -1;
1875 out_debug_log("NAME=%s BYTE-ARRAY: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1878 case csp_saver_entry_fifo:
1880 FIFO **fp = (FIFO **)pp;
1882 for(int i = 0; i < _len; i++) {
1883 _s = fp[i]->load_state_helper(fio, &crc_value, &_stat);
1890 if(_s) retval = _len;
1893 case csp_saver_entry_cur_time_t:
1895 cur_time_t *fp = (cur_time_t *)pp;
1897 for(int i = 0; i < _len; i++) {
1898 _s = fp[i].load_state_helper(fio, &crc_value, &_stat);
1905 if(_s) retval = _len;
1910 out_debug_log("NAME=%s UNKNOWN TID=%d: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), _tid, retval, (_stat) ? 1 : 0, pp);
1913 if((retval <= 0) || (!_stat)) {
1915 if(pp != NULL) free(pp);
1921 out_debug_log("CRC=%08x", crc_value);
1923 if(memcmp(pp, (*p).ptr.p , _len * _asize) != 0) {
1931 if((_use_is_null) && ((*p).recv_ptr.p != NULL)){
1935 if((*p).is_null_value_const) {
1939 if((*p).not_null_value_const) {
1944 switch((*p)._null_type_id) {
1945 case csp_saver_entry_int:
1946 case csp_saver_entry_int32:
1947 *((int32_t *)((*p).recv_ptr.p)) = (int32_t)tval;
1949 case csp_saver_entry_uint32:
1950 *((uint32_t *)((*p).recv_ptr.p)) = (uint32_t)tval;
1952 case csp_saver_entry_int8:
1953 *((int8_t *)((*p).recv_ptr.p)) = (int8_t)tval;
1955 case csp_saver_entry_uint8:
1956 *((uint8_t *)((*p).recv_ptr.p)) = (uint8_t)tval;
1958 case csp_saver_entry_int16:
1959 *((int16_t *)((*p).recv_ptr.p)) = (int16_t)tval;
1961 case csp_saver_entry_uint16:
1962 *((uint16_t *)((*p).recv_ptr.p)) = (uint16_t)tval;
1964 case csp_saver_entry_int64:
1965 *((int64_t *)((*p).recv_ptr.p)) = (int64_t)tval;
1967 case csp_saver_entry_uint64:
1968 *((uint64_t *)((*p).recv_ptr.p)) = (uint64_t)tval;
1970 case csp_saver_entry_bool:
1971 *((bool *)((*p).recv_ptr.p)) = (tval == 0) ? false : true;
1979 crc_stat = fio->post_proc_loading(&crc_value, &_stat);
1984 if(pcrc != NULL) *pcrc = crc_value;
1986 out_debug_log("WRONG crc_value: expects=%08x", crc_value);
1990 if(this_device_id != this_device_id_bak) {
1991 out_debug_log("WRONG device_id %d", this_device_id_bak);
1994 if(class_version != class_version_bak) {
1995 out_debug_log("WRONG crass_version %d", class_version_bak);
1998 if(strncmp(__classname, __classname_bak, sizeof(__classname)) != 0) {
1999 out_debug_log("WRONG CRASS NAME %s", __classname_bak);
2002 out_debug_log("OK CRC=%08x", crc_value);