data.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __SB_DATA_H__
00023 #define __SB_DATA_H__
00024
00025 #include "dll.h"
00026 #include <iosfwd>
00027 #include <vector>
00028 #include <string>
00029 #include <stdint.h>
00030
00031 namespace Barry {
00032
00033 class BXEXPORT Data
00034 {
00035 unsigned char *m_data;
00036 size_t m_bufsize;
00037 size_t m_datasize;
00038 int m_endpoint;
00039
00040
00041 const unsigned char *m_externalData;
00042 bool m_external;
00043
00044
00045 static bool bPrintAscii;
00046
00047 protected:
00048 void MakeSpace(size_t desiredsize);
00049 void CopyOnWrite(size_t desiredsize);
00050
00051 public:
00052 Data();
00053 explicit Data(int endpoint, size_t startsize = 0x4000);
00054 Data(const void *ValidData, size_t size);
00055 Data(const Data &other);
00056 ~Data();
00057
00058 void InputHexLine(std::istream &is);
00059 void DumpHexLine(std::ostream &os, size_t index, size_t size) const;
00060 void DumpHex(std::ostream &os) const;
00061
00062 int GetEndpoint() const { return m_endpoint; }
00063
00064 const unsigned char * GetData() const { return m_external ? m_externalData : m_data; }
00065 size_t GetSize() const { return m_datasize; }
00066
00067 unsigned char * GetBuffer(size_t requiredsize = 0);
00068 size_t GetBufSize() const { return m_bufsize; }
00069 void ReleaseBuffer(int datasize = -1);
00070
00071 void AppendHexString(const char *str);
00072
00073
00074 void QuickZap() { m_datasize = 0; }
00075 void Zap();
00076
00077 Data& operator=(const Data &other);
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 void MemCpy(size_t &offset, const void *src, size_t size);
00090 void Append(const void *buf, size_t size);
00091 template <class ValueT>
00092 void SetValue(size_t &offset, ValueT value)
00093 {
00094 this->MemCpy(offset, &value, sizeof(value));
00095 }
00096
00097
00098
00099 static void PrintAscii(bool setting) { bPrintAscii = setting; }
00100 static bool PrintAscii() { return bPrintAscii; }
00101 };
00102
00103 BXEXPORT std::istream& operator>> (std::istream &is, Data &data);
00104 BXEXPORT std::ostream& operator<< (std::ostream &os, const Data &data);
00105
00106
00107 class BXEXPORT Diff
00108 {
00109 const Data &m_old, &m_new;
00110
00111 BXLOCAL void Compare(std::ostream &os, size_t index, size_t size) const;
00112
00113 public:
00114 Diff(const Data &old, const Data &new_);
00115
00116 void Dump(std::ostream &os) const;
00117 };
00118
00119 BXEXPORT std::ostream& operator<< (std::ostream &os, const Diff &diff);
00120
00121
00122
00123 BXEXPORT bool LoadDataArray(const std::string &filename, std::vector<Data> &array);
00124 BXEXPORT bool ReadDataArray(std::istream &is, std::vector<Data> &array);
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 class BXEXPORT DBData
00155 {
00156 public:
00157 enum RecordFormatVersion
00158 {
00159 REC_VERSION_1,
00160 REC_VERSION_2
00161 };
00162
00163 private:
00164
00165 RecordFormatVersion m_version;
00166 std::string m_dbName;
00167 uint8_t m_recType;
00168 uint32_t m_uniqueId;
00169 size_t m_offset;
00170
00171
00172 Data *m_localData;
00173
00174
00175
00176 Data &m_data;
00177
00178 public:
00179
00180 DBData();
00181
00182
00183 DBData(const void *ValidData, size_t size);
00184 DBData(RecordFormatVersion ver, const std::string &dbName,
00185 uint8_t recType, uint32_t uniqueId, size_t offset,
00186 const void *ValidData, size_t size);
00187
00188
00189
00190
00191
00192
00193
00194 DBData(Data &externalData, bool copy);
00195 DBData(RecordFormatVersion ver, const std::string &dbName,
00196 uint8_t recType, uint32_t uniqueId, size_t offset,
00197 Data &externalData, bool copy);
00198
00199 ~DBData();
00200
00201
00202 RecordFormatVersion GetVersion() const { return m_version; }
00203 const std::string& GetDBName() const { return m_dbName; }
00204 uint8_t GetRecType() const { return m_recType; }
00205 uint32_t GetUniqueId() const { return m_uniqueId; }
00206 size_t GetOffset() const { return m_offset; }
00207
00208 const Data& GetData() const { return m_data; }
00209 Data& UseData();
00210
00211
00212 void SetVersion(RecordFormatVersion ver)
00213 {
00214 m_version = ver;
00215 }
00216
00217 void SetDBName(const std::string &dbName)
00218 {
00219 m_dbName = dbName;
00220 }
00221
00222 void SetIds(uint8_t recType, uint32_t uniqueId)
00223 {
00224 m_recType = recType;
00225 m_uniqueId = uniqueId;
00226 }
00227
00228 void SetOffset(size_t offset)
00229 {
00230 m_offset = offset;
00231 }
00232
00233 void CopyMeta(const DBData &src)
00234 {
00235 m_version = src.m_version;
00236 m_dbName = src.m_dbName;
00237 m_recType = src.m_recType;
00238 m_uniqueId = src.m_uniqueId;
00239 m_offset = src.m_offset;
00240 }
00241
00242 DBData& operator=(const DBData &other);
00243 };
00244
00245 }
00246
00247 #endif
00248