00001
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef _CDRIOIMPL_H_
00037 #define _CDRIOIMPL_H_
00038
00039
00040
00041
00042 #include <iosfwd>
00043 #include <map>
00044 #include <list>
00045 #include <set>
00046
00047
00048 #include "osbid.h"
00049 #include "cdrio.h"
00050
00051
00052
00053 namespace OSB_LIB {
00054 class Asn1Writer;
00055 class Date;
00056 class BsPage;
00057 }
00058
00059
00060
00061 namespace OSB_LIB {
00062
00063
00064
00065
00075 class CdrIoImpl : public CdrIo {
00076 public:
00078 CdrIoImpl(const Id<BsPage>& pageId);
00079
00080 public:
00081
00082 std::auto_ptr<CdrIo> clone() const;
00083
00084
00085 const Id<BsPage>& pageId() const;
00086
00087
00088 void read(CdrList& dest);
00089
00090
00091 void prepareWrite();
00092
00093
00094 void write(
00095 const CdrList& cdrs,
00096 Asn1Writer& writer
00097 );
00098
00099
00100 void replace(
00101 const CdrList& newCdrs,
00102 Asn1Writer& writer
00103 );
00104
00105
00106 bool commitChanges();
00107
00108
00109 bool undoChanges();
00110
00111
00112 bool remove();
00113
00114 private:
00116 typedef std::map<Date, CdrList> CdrGroups;
00118 typedef std::set<std::string> PathList;
00119
00120 private:
00131 size_t getCdrFiles(
00132 const std::string& dirName,
00133 PathList& dest
00134 );
00135
00146 size_t getSubDirs(
00147 const std::string& dirName,
00148 PathList& dest
00149 );
00150
00160 void read(
00161 CdrList& dest,
00162 const std::string& path
00163 );
00164
00174 void write(
00175 const CdrList& cdrs,
00176 Asn1Writer& writer,
00177 bool mkBackup
00178 );
00179
00185 std::string pageDir() const;
00186
00194 std::string mkFilename(long n) const;
00195
00208 void moveFileAway(const std::string& path);
00209
00221 void groupCdrsByDate(
00222 CdrGroups& dest,
00223 const CdrList& src
00224 );
00225
00249 FILE* openOutputFile(
00250 std::string& path,
00251 bool mkBackup
00252 );
00253
00268 std::string newCdrFile(
00269 const std::string& dirName,
00270 size_t numFiles
00271 ) const;
00272
00273
00284 std::string renameCdrFile(
00285 const std::string& filePath,
00286 const std::string& extTo
00287 );
00288
00301 void copyFile(
00302 const std::string& from,
00303 const std::string& to
00304 );
00305
00318 bool removeChangedFiles();
00319
00328 bool removeChangedFile(const std::string& path);
00329
00345 bool restoreCdrFiles();
00346
00364 bool restoreCdrFile(const std::string& path);
00365
00366 private:
00368 static const std::string extBak_;
00370 static const std::string extCdr_;
00372 static const std::string extRpl_;
00373
00374 private:
00376 Id<BsPage> pageId_;
00378 PathList changedFiles_;
00380 PathList recoverFiles_;
00381 };
00382 }
00383 #endif // #ifndef _CDRIOIMPL_H_