00001 #ifndef UTIL_COMPRESS__COMPRESS__HPP
00002 #define UTIL_COMPRESS__COMPRESS__HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <corelib/ncbistd.hpp>
00036 #include <corelib/version.hpp>
00037
00038
00039
00040
00041
00042
00043
00044 BEGIN_NCBI_SCOPE
00045
00046
00047
00048 const streamsize kCompressionDefaultBufSize = 16*1024;
00049
00050
00051 #define ERR_COMPRESS(subcode, message) ERR_POST_X(subcode, Warning << message)
00052
00053
00054 class CCompressionFile;
00055 class CCompressionStreambuf;
00056
00057
00058
00059
00060
00061
00062
00063 class ICompression
00064 {
00065 public:
00066
00067
00068
00069
00070
00071
00072
00073 enum ELevel {
00074 eLevel_Default = -1,
00075 eLevel_NoCompression = 0,
00076 eLevel_Lowest = 1,
00077 eLevel_VeryLow = 2,
00078 eLevel_Low = 3,
00079 eLevel_MediumLow = 4,
00080 eLevel_Medium = 5,
00081 eLevel_MediumHigh = 6,
00082 eLevel_High = 7,
00083 eLevel_VeryHigh = 8,
00084 eLevel_Best = 9
00085 };
00086
00087
00088
00089 typedef unsigned int TFlags;
00090
00091 public:
00092
00093 virtual ~ICompression(void) {}
00094
00095
00096 virtual CVersionInfo GetVersion(void) const = 0;
00097
00098
00099 virtual void SetLevel(ELevel level) = 0;
00100 virtual ELevel GetLevel(void) const = 0;
00101
00102
00103 virtual ELevel GetDefaultLevel(void) const = 0;
00104
00105
00106
00107 virtual int GetErrorCode(void) const = 0;
00108 virtual string GetErrorDescription(void) const = 0;
00109
00110
00111 virtual TFlags GetFlags(void) const = 0;
00112 virtual void SetFlags(TFlags flags) = 0;
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 virtual bool CompressBuffer(
00124 const void* src_buf, size_t src_len,
00125 void* dst_buf, size_t dst_size,
00126 size_t* dst_len
00127 ) = 0;
00128
00129 virtual bool DecompressBuffer(
00130 const void* src_buf, size_t src_len,
00131 void* dst_buf, size_t dst_size,
00132 size_t* dst_len
00133 ) = 0;
00134
00135
00136
00137 virtual bool CompressFile(
00138 const string& src_file,
00139 const string& dst_file,
00140 size_t buf_size = kCompressionDefaultBufSize
00141 ) = 0;
00142 virtual bool DecompressFile(
00143 const string& src_file,
00144 const string& dst_file,
00145 size_t buf_size = kCompressionDefaultBufSize
00146 ) = 0;
00147 };
00148
00149
00150
00151
00152
00153
00154
00155 class CCompression : public ICompression
00156 {
00157 public:
00158
00159 CCompression(ELevel level = eLevel_Default);
00160 virtual ~CCompression(void);
00161
00162
00163 virtual CVersionInfo GetVersion(void) const = 0;
00164
00165
00166
00167
00168
00169
00170 virtual void SetLevel(ELevel level);
00171 virtual ELevel GetLevel(void) const;
00172
00173
00174
00175 virtual int GetErrorCode(void) const;
00176 virtual string GetErrorDescription(void) const;
00177
00178
00179 virtual TFlags GetFlags(void) const;
00180
00181 virtual void SetFlags(TFlags flags);
00182
00183 protected:
00184
00185
00186 virtual bool x_CompressFile(
00187 const string& src_file,
00188 CCompressionFile& dst_file,
00189 size_t buf_size = kCompressionDefaultBufSize
00190 );
00191 virtual bool x_DecompressFile(
00192 CCompressionFile& src_file,
00193 const string& dst_file,
00194 size_t buf_size = kCompressionDefaultBufSize
00195 );
00196
00197
00198 void SetError(int status, const char* description = 0);
00199 void SetError(int status, const string& description);
00200
00201 protected:
00202
00203 enum EDecompressMode {
00204 eMode_Unknown,
00205 eMode_Decompress,
00206 eMode_TransparentRead
00207 };
00208
00209 EDecompressMode m_DecompressMode;
00210
00211 private:
00212 ELevel m_Level;
00213 int m_ErrorCode;
00214 string m_ErrorMsg;
00215 TFlags m_Flags;
00216
00217
00218 friend class CCompressionStreambuf;
00219 };
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 class CCompressionFile
00234 {
00235 public:
00236
00237 typedef void* TFile;
00238
00239
00240 enum EMode {
00241 eMode_Read,
00242 eMode_Write
00243 };
00244
00245
00246 CCompressionFile(void);
00247 CCompressionFile(const string& path, EMode mode);
00248 virtual ~CCompressionFile(void);
00249
00250
00251
00252 virtual bool Open(const string& path, EMode mode) = 0;
00253
00254
00255
00256
00257 virtual long Read(void* buf, size_t len) = 0;
00258
00259
00260
00261 virtual long Write(const void* buf, size_t len) = 0;
00262
00263
00264
00265 virtual bool Close(void) = 0;
00266
00267 protected:
00268 TFile m_File;
00269 EMode m_Mode;
00270 };
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 class CCompressionProcessor
00282 {
00283 public:
00284
00285 enum EStatus {
00286
00287 eStatus_Success,
00288
00289
00290
00291 eStatus_EndOfData,
00292
00293 eStatus_Error,
00294
00295
00296 eStatus_Overflow,
00297
00298 eStatus_Repeat,
00299
00300 eStatus_Unknown
00301 };
00302
00303
00304 CCompressionProcessor(void);
00305 virtual ~CCompressionProcessor(void);
00306
00307
00308
00309
00310 bool IsBusy(void) const;
00311
00312
00313 unsigned long GetProcessedSize(void);
00314 unsigned long GetOutputSize(void);
00315
00316 protected:
00317
00318
00319 virtual EStatus Init(void) = 0;
00320
00321
00322
00323
00324
00325 virtual EStatus Process
00326 (const char* in_buf,
00327 size_t in_len,
00328 char* out_buf,
00329 size_t out_size,
00330 size_t* in_avail,
00331 size_t* out_avail
00332 ) = 0;
00333
00334
00335
00336
00337 virtual EStatus Flush
00338 (char* out_buf,
00339 size_t out_size,
00340 size_t* out_avail
00341 ) = 0;
00342
00343
00344
00345
00346
00347 virtual EStatus Finish
00348 (char* out_buf,
00349 size_t out_size,
00350 size_t* out_avail
00351 ) = 0;
00352
00353
00354
00355
00356 virtual EStatus End(void) = 0;
00357
00358 protected:
00359
00360 void Reset(void);
00361
00362
00363 void SetBusy(bool busy = true);
00364
00365
00366 void IncreaseProcessedSize(unsigned long n_bytes);
00367 void IncreaseOutputSize(unsigned long n_bytes);
00368
00369 private:
00370 unsigned long m_ProcessedSize;
00371 unsigned long m_OutputSize;
00372 bool m_Busy;
00373
00374
00375 friend class CCompressionStream;
00376 friend class CCompressionStreambuf;
00377 friend class CCompressionStreamProcessor;
00378 };
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 class CCompressionException : public CCoreException
00389 {
00390 public:
00391 enum EErrCode {
00392 eCompression,
00393 eCompressionFile
00394 };
00395 virtual const char* GetErrCodeString(void) const
00396 {
00397 switch (GetErrCode()) {
00398 case eCompression : return "eCompression";
00399 case eCompressionFile : return "eCompressionFile";
00400 default : return CException::GetErrCodeString();
00401 }
00402 }
00403 NCBI_EXCEPTION_DEFAULT(CCompressionException,CCoreException);
00404 };
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 class CCompressionUtil
00415 {
00416 public:
00417
00418 static void StoreUI4(void* buf, unsigned long value);
00419
00420
00421 static Uint4 GetUI4(void* buf);
00422
00423
00424 static void StoreUI2(void* buf, unsigned long value);
00425
00426
00427 static Uint2 GetUI2(void* buf);
00428 };
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 inline
00441 void CCompressionProcessor::Reset(void)
00442 {
00443 m_ProcessedSize = 0;
00444 m_OutputSize = 0;
00445 m_Busy = false;
00446 }
00447
00448 inline
00449 bool CCompressionProcessor::IsBusy(void) const
00450 {
00451 return m_Busy;
00452 }
00453
00454 inline
00455 void CCompressionProcessor::SetBusy(bool busy)
00456 {
00457 if ( busy && m_Busy ) {
00458 NCBI_THROW(CCompressionException, eCompression,
00459 "CCompression::SetBusy(): The compressor is busy now");
00460 }
00461 m_Busy = busy;
00462 }
00463
00464 inline
00465 void CCompressionProcessor::IncreaseProcessedSize(unsigned long n_bytes)
00466 {
00467 m_ProcessedSize += n_bytes;
00468 }
00469
00470 inline
00471 void CCompressionProcessor::IncreaseOutputSize(unsigned long n_bytes)
00472 {
00473 m_OutputSize += n_bytes;
00474 }
00475
00476 inline
00477 unsigned long CCompressionProcessor::GetProcessedSize(void)
00478 {
00479 return m_ProcessedSize;
00480 }
00481
00482 inline
00483 unsigned long CCompressionProcessor::GetOutputSize(void)
00484 {
00485 return m_OutputSize;
00486 }
00487
00488
00489 END_NCBI_SCOPE
00490
00491
00492 #endif
00493
00494