/[svn]/libgig/trunk/src/Serialization.cpp
ViewVC logotype

Diff of /libgig/trunk/src/Serialization.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3153 by schoenebeck, Sat May 6 13:43:43 2017 UTC revision 3156 by schoenebeck, Mon May 8 17:18:07 2017 UTC
# Line 30  Line 30 
30    
31  #include "helper.h"  #include "helper.h"
32    
33    #define LIBGIG_EPOCH_TIME ((time_t)0)
34    
35  namespace Serialization {  namespace Serialization {
36    
37      // *************** DataType ***************      // *************** DataType ***************
# Line 277  namespace Serialization { Line 279  namespace Serialization {
279          m_operation = OPERATION_NONE;          m_operation = OPERATION_NONE;
280          m_root = NO_UID;          m_root = NO_UID;
281          m_isModified = false;          m_isModified = false;
282            m_timeCreated = m_timeModified = LIBGIG_EPOCH_TIME;
283      }      }
284    
285      Archive::Archive(const RawData& data) {      Archive::Archive(const RawData& data) {
286          m_operation = OPERATION_NONE;          m_operation = OPERATION_NONE;
287          m_root = NO_UID;          m_root = NO_UID;
288          m_isModified = false;          m_isModified = false;
289            m_timeCreated = m_timeModified = LIBGIG_EPOCH_TIME;
290          decode(m_rawData);          decode(m_rawData);
291      }      }
292    
# Line 290  namespace Serialization { Line 294  namespace Serialization {
294          m_operation = OPERATION_NONE;          m_operation = OPERATION_NONE;
295          m_root = NO_UID;          m_root = NO_UID;
296          m_isModified = false;          m_isModified = false;
297            m_timeCreated = m_timeModified = LIBGIG_EPOCH_TIME;
298          decode(data, size);          decode(data, size);
299      }      }
300    
# Line 311  namespace Serialization { Line 316  namespace Serialization {
316          return _encodeBlob(s);          return _encodeBlob(s);
317      }      }
318    
319        static String _encode(const time_t& time) {
320            return _encodeBlob(ToString(time));
321        }
322    
323      static String _encode(const DataType& type) {      static String _encode(const DataType& type) {
324          String s;          String s;
325          s += _encodeBlob(type.baseTypeName());          s += _encodeBlob(type.baseTypeName());
# Line 426  namespace Serialization { Line 435  namespace Serialization {
435          s += _encodeBlob(ToString(ENCODING_FORMAT_MINOR_VERSION));          s += _encodeBlob(ToString(ENCODING_FORMAT_MINOR_VERSION));
436          s += _encode(m_root);          s += _encode(m_root);
437          s += _encode(m_allObjects);          s += _encode(m_allObjects);
438            s += _encodeBlob(m_name);
439            s += _encodeBlob(m_comment);
440            s += _encode(m_timeCreated);
441            s += _encode(m_timeModified);
442          return _encodeBlob(s);          return _encodeBlob(s);
443      }      }
444    
# Line 436  namespace Serialization { Line 449  namespace Serialization {
449          m_rawData.resize(s.length() + 1);          m_rawData.resize(s.length() + 1);
450          memcpy(&m_rawData[0], &s[0], s.length() + 1);          memcpy(&m_rawData[0], &s[0], s.length() + 1);
451          m_isModified = false;          m_isModified = false;
452            m_timeModified = time(NULL);
453            if (m_timeCreated == LIBGIG_EPOCH_TIME)
454                m_timeCreated = m_timeModified;
455      }      }
456    
457      struct _Blob {      struct _Blob {
# Line 535  namespace Serialization { Line 551  namespace Serialization {
551          return s;          return s;
552      }      }
553    
554        static time_t _popTimeBlob(const char*& p, const char* end) {
555            const uint64_t i = _popIntBlob<uint64_t>(p, end);
556            return (time_t) i;
557        }
558    
559      DataType _popDataTypeBlob(const char*& p, const char* end) {      DataType _popDataTypeBlob(const char*& p, const char* end) {
560          _Blob blob = _decodeBlob(p, end);          _Blob blob = _decodeBlob(p, end);
561          p   = blob.p;          p   = blob.p;
# Line 711  namespace Serialization { Line 732  namespace Serialization {
732          _popObjectsBlob(p, end);          _popObjectsBlob(p, end);
733          if (!m_allObjects[m_root])          if (!m_allObjects[m_root])
734              throw Exception("Decode Error: Missing declared root object");              throw Exception("Decode Error: Missing declared root object");
735    
736            m_name = _popStringBlob(p, end);
737            m_comment = _popStringBlob(p, end);
738            m_timeCreated = _popTimeBlob(p, end);
739            m_timeModified = _popTimeBlob(p, end);
740      }      }
741    
742      void Archive::decode(const RawData& data) {      void Archive::decode(const RawData& data) {
743          m_rawData = data;          m_rawData = data;
744          m_allObjects.clear();          m_allObjects.clear();
745          m_isModified = false;          m_isModified = false;
746            m_timeCreated = m_timeModified = LIBGIG_EPOCH_TIME;
747          const char* p   = (const char*) &data[0];          const char* p   = (const char*) &data[0];
748          const char* end = p + data.size();          const char* end = p + data.size();
749          if (memcmp(p, MAGIC_START, std::min(strlen(MAGIC_START), data.size())))          if (memcmp(p, MAGIC_START, std::min(strlen(MAGIC_START), data.size())))
# Line 751  namespace Serialization { Line 778  namespace Serialization {
778          m_root = NO_UID;          m_root = NO_UID;
779          m_rawData.clear();          m_rawData.clear();
780          m_isModified = false;          m_isModified = false;
781            m_timeCreated = m_timeModified = LIBGIG_EPOCH_TIME;
782        }
783    
784        String Archive::name() const {
785            return m_name;
786        }
787    
788        void Archive::setName(String name) {
789            if (m_name == name) return;
790            m_name = name;
791            m_isModified = true;
792        }
793    
794        String Archive::comment() const {
795            return m_comment;
796        }
797    
798        void Archive::setComment(String comment) {
799            if (m_comment == comment) return;
800            m_comment = comment;
801            m_isModified = true;
802        }
803    
804        static tm _convertTimeStamp(const time_t& time, time_base_t base) {
805            tm* pTm;
806            switch (base) {
807                case LOCAL_TIME:
808                    pTm = localtime(&time);
809                    break;
810                case UTC_TIME:
811                    pTm = gmtime(&time);
812                    break;
813                default:
814                    throw Exception("Time stamp with unknown time base (" + ToString((int64_t)base) + ") requested");
815            }
816            if (!pTm)
817                throw Exception("Failed assembling time stamp structure");
818            return *pTm;
819        }
820    
821        time_t Archive::timeStampCreated() const {
822            return m_timeCreated;
823        }
824    
825        time_t Archive::timeStampModified() const {
826            return m_timeModified;
827        }
828    
829        tm Archive::dateTimeCreated(time_base_t base) const {
830            return _convertTimeStamp(m_timeCreated, base);
831        }
832    
833        tm Archive::dateTimeModified(time_base_t base) const {
834            return _convertTimeStamp(m_timeModified, base);
835      }      }
836    
837      void Archive::removeMember(Object& parent, const Member& member) {      void Archive::removeMember(Object& parent, const Member& member) {

Legend:
Removed from v.3153  
changed lines
  Added in v.3156

  ViewVC Help
Powered by ViewVC