00001 #ifndef Impala_Persistency_ImageArchiveRepositoryInFile_h
00002 #define Impala_Persistency_ImageArchiveRepositoryInFile_h
00003
00004 #include "Persistency/RepositoryInFileSystem.h"
00005 #include "Core/Array/ImageArchiveFile.h"
00006 #include "Core/Array/ImageArchiveFileFset.h"
00007 #include "Persistency/ImageArchiveLocator.h"
00008 #include "Core/Array/ArrayListDelete.h"
00009
00010 namespace Impala
00011 {
00012 namespace Persistency
00013 {
00014
00015
00016 class ImageArchiveRepositoryInFile
00017 {
00018 public:
00019
00020 typedef Core::Array::ImageArchive ImageArchive;
00021 typedef Core::Array::Array2dScalarUInt8 Array2dScalarUInt8;
00022
00023 ImageArchiveRepositoryInFile()
00024 {
00025 }
00026
00027 bool
00028 Exists(const ImageArchiveLocator& loc)
00029 {
00030 String dir = GetDir(loc);
00031 File file = RepFS().GetFile(loc, dir, loc.GetName(), false, true);
00032 return file.Valid();
00033 }
00034
00035 ImageArchive*
00036 Get(const ImageArchiveLocator& loc)
00037 {
00038 String dir = GetDir(loc);
00039 File file = RepFS().GetFile(loc, dir, loc.GetName(), false, false);
00040 if (!file.Valid())
00041 return 0;
00042
00043 ImageArchive* res = 0;
00044 if (loc.GetIsFset())
00045 res = new Core::Array::ImageArchiveFileFset(file);
00046 else
00047 res = new Core::Array::ImageArchiveFile(file);
00048 return res;
00049 }
00050
00051 void
00052 Add(const ImageArchiveLocator& loc, ImageArchive* archive)
00053 {
00054 std::vector<Array2dScalarUInt8*> images;
00055 if (archive->GetImageDataList() != 0)
00056 {
00057 images = *(archive->GetImageDataList());
00058 }
00059 else
00060 {
00061 for (int i=0 ; i<archive->NrImages() ; i++)
00062 {
00063 size_t blockSize = 0;
00064 UInt8* data = archive->GetImageData(i, blockSize);
00065 Array2dScalarUInt8* im = new Array2dScalarUInt8(blockSize, 1, 0,
00066 0, data, false);
00067 images.push_back(im);
00068 }
00069 }
00070
00071 String dir = GetDir(loc);
00072 File file = RepFS().GetFile(loc, dir, loc.GetName(), true, false);
00073 WriteRawListVar(images, file, true, true);
00074 if (archive->GetImageDataList() == 0)
00075 Core::Array::ArrayListDelete(&images);
00076 }
00077
00078 void
00079 Delete(const ImageArchiveLocator& loc)
00080 {
00081 String dir = GetDir(loc);
00082 File file = RepFS().GetFile(loc, dir, loc.GetName(), true, true);
00083 file.Delete();
00084 file = RepFS().GetFile(loc, dir, loc.GetName() + ".idx", true, true);
00085 file.Delete();
00086 }
00087
00088 private:
00089
00090 RepositoryInFileSystem&
00091 RepFS()
00092 {
00093 return RepositoryInFileSystem::GetInstance();
00094 }
00095
00096 String
00097 GetDir(const ImageArchiveLocator& loc)
00098 {
00099 String dir = loc.GetFramesString();
00100 dir = FileNameConcat(dir, loc.GetContainer());
00101 return dir;
00102 }
00103
00104 ILOG_VAR_DEC;
00105 };
00106
00107 ILOG_VAR_INIT(ImageArchiveRepositoryInFile, Impala.Persistency);
00108
00109 }
00110 }
00111
00112 #endif