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 __BARRY_M_DESKTOP_H__
00023 #define __BARRY_M_DESKTOP_H__
00024
00025 #include "dll.h"
00026 #include "m_mode_base.h"
00027 #include "data.h"
00028 #include "socket.h"
00029 #include "record.h"
00030 #include "parser.h"
00031 #include "builder.h"
00032
00033 namespace Barry {
00034
00035
00036 class Parser;
00037 class IConverter;
00038
00039 namespace Mode {
00040
00041 class DBLoader;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 class BXEXPORT Desktop : public Mode
00059 {
00060 friend class DBLoader;
00061
00062 public:
00063 enum CommandType { Unknown, DatabaseAccess };
00064
00065 private:
00066
00067 Data m_command, m_response;
00068
00069 CommandTable m_commandTable;
00070 DatabaseDatabase m_dbdb;
00071
00072
00073 const IConverter *m_ic;
00074
00075 protected:
00076 void LoadCommandTable();
00077 void LoadDBDB();
00078
00079
00080
00081
00082 virtual void OnOpen();
00083
00084 public:
00085 Desktop(Controller &con);
00086 Desktop(Controller &con, const IConverter &ic);
00087 ~Desktop();
00088
00089
00090
00091
00092
00093
00094 const DatabaseDatabase& GetDBDB() const { return m_dbdb; }
00095 unsigned int GetDBID(const std::string &name) const;
00096 unsigned int GetDBCommand(CommandType ct);
00097
00098 void SetIConverter(const IConverter &ic);
00099
00100
00101
00102
00103
00104 void GetRecordStateTable(unsigned int dbId, RecordStateTable &result);
00105 void AddRecord(unsigned int dbId, Builder &build);
00106
00107
00108 void GetRecord(unsigned int dbId, unsigned int stateTableIndex, Parser &parser);
00109 void SetRecord(unsigned int dbId, unsigned int stateTableIndex, Builder &build);
00110 void ClearDirty(unsigned int dbId, unsigned int stateTableIndex);
00111 void DeleteRecord(unsigned int dbId, unsigned int stateTableIndex);
00112
00113
00114 void LoadDatabase(unsigned int dbId, Parser &parser);
00115 void ClearDatabase(unsigned int dbId);
00116 void SaveDatabase(unsigned int dbId, Builder &builder);
00117
00118 template <class RecordT, class StorageT> void LoadDatabaseByType(StorageT &store);
00119 template <class RecordT, class StorageT> void SaveDatabaseByType(StorageT &store);
00120
00121 template <class StorageT> void LoadDatabaseByName(const std::string &name, StorageT &store);
00122 template <class StorageT> void SaveDatabaseByName(const std::string &name, StorageT &store);
00123
00124 template <class RecordT> void AddRecordByType(uint32_t recordId, const RecordT &rec);
00125
00126 };
00127
00128
00129 struct DBLoaderData;
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 class BXEXPORT DBLoader
00143 {
00144 Desktop &m_desktop;
00145 Data m_send;
00146 bool m_loading;
00147 std::string m_dbName;
00148 DBLoaderData *m_loader;
00149
00150 public:
00151 explicit DBLoader(Desktop &desktop);
00152 ~DBLoader();
00153
00154
00155 bool IsBusy() const { return m_loading; }
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 bool StartDBLoad(unsigned int dbId, DBData &data);
00166 bool GetNextRecord(DBData &data);
00167 };
00168
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 class BXEXPORT DeviceBuilder : public Builder
00182 {
00183 typedef unsigned int dbid_type;
00184
00185 struct DBLabel
00186 {
00187 dbid_type id;
00188 std::string name;
00189
00190 DBLabel(dbid_type id, const std::string &name)
00191 : id(id)
00192 , name(name)
00193 {
00194 }
00195 };
00196
00197 typedef std::vector<DBLabel> list_type;
00198
00199
00200 list_type m_dbIds;
00201 list_type::iterator m_current;
00202 bool m_started;
00203
00204 Mode::Desktop &m_desktop;
00205
00206
00207
00208 Mode::DBLoader m_loader;
00209
00210 public:
00211 explicit DeviceBuilder(Mode::Desktop &desktop);
00212
00213
00214
00215
00216 bool Add(const std::string &dbname);
00217
00218
00219 void Add(const Barry::DatabaseDatabase &dbdb);
00220
00221
00222
00223 void Restart() { m_current = m_dbIds.begin(); m_started = false; }
00224
00225
00226
00227
00228
00229
00230
00231 virtual bool BuildRecord(DBData &data, size_t &offset,
00232 const IConverter *ic);
00233 virtual bool FetchRecord(DBData &data, const IConverter *ic);
00234 virtual bool EndOfFile() const;
00235 };
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 class BXEXPORT DeviceParser : public Barry::Parser
00250 {
00251 public:
00252 enum WriteMode {
00253
00254
00255 ERASE_ALL_WRITE_ALL,
00256
00257
00258
00259 INDIVIDUAL_OVERWRITE,
00260
00261
00262
00263
00264 ADD_BUT_NO_OVERWRITE,
00265
00266
00267
00268
00269 ADD_WITH_NEW_ID,
00270
00271
00272
00273
00274 DECIDE_BY_CALLBACK,
00275
00276
00277
00278 DROP_RECORD
00279 };
00280
00281 private:
00282 Mode::Desktop &m_desktop;
00283 WriteMode m_mode;
00284
00285 std::string m_current_db;
00286 unsigned int m_current_dbid;
00287 RecordStateTable m_rstate;
00288
00289 protected:
00290 void StartDB(const DBData &data, const IConverter *ic);
00291 void WriteNext(const DBData &data, const IConverter *ic);
00292
00293 public:
00294 DeviceParser(Mode::Desktop &desktop, WriteMode mode);
00295 virtual ~DeviceParser();
00296
00297
00298
00299
00300 virtual WriteMode DecideWrite(const DBData &record) const
00301 {
00302 return DROP_RECORD;
00303 }
00304
00305
00306 virtual void ParseRecord(const DBData &data, const IConverter *ic);
00307 };
00308
00309
00310 }
00311
00312 #endif
00313