changeset 234:7c1faef915a4

cleaning room
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 30 Nov 2012 14:34:42 +0100
parents c11273198cef
children 1e0595885a81
files CMakeLists.txt Core/FileStorage.cpp Core/FileStorage.h Core/FileStorage/CompressedFileStorageAccessor.h Core/FileStorage/FileStorage.cpp Core/FileStorage/FileStorage.h Core/FileStorage/FileStorageAccessor.h Core/HttpServer/FilesystemHttpSender.h OrthancServer/ServerContext.h OrthancServer/ServerToolbox.cpp OrthancServer/ServerToolbox.h UnitTests/FileStorage.cpp
diffstat 12 files changed, 428 insertions(+), 428 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Fri Nov 30 14:30:05 2012 +0100
+++ b/CMakeLists.txt	Fri Nov 30 14:34:42 2012 +0100
@@ -103,7 +103,7 @@
   Core/DicomFormat/DicomTag.cpp
   Core/DicomFormat/DicomIntegerPixelAccessor.cpp
   Core/DicomFormat/DicomInstanceHasher.cpp
-  Core/FileStorage.cpp
+  Core/FileStorage/FileStorage.cpp
   Core/FileStorage/StorageAccessor.cpp
   Core/FileStorage/CompressedFileStorageAccessor.cpp
   Core/FileStorage/FileStorageAccessor.cpp
--- a/Core/FileStorage.cpp	Fri Nov 30 14:30:05 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,323 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * This program is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * In addition, as a special exception, the copyright holders of this
- * program give permission to link the code of its release with the
- * OpenSSL project's "OpenSSL" library (or with modified versions of it
- * that use the same license as the "OpenSSL" library), and distribute
- * the linked executables. You must obey the GNU General Public License
- * in all respects for all of the code used other than "OpenSSL". If you
- * modify file(s) with this exception, you may extend this exception to
- * your version of the file(s), but you are not obligated to do so. If
- * you do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source files
- * in the program, then also delete it here.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#include "FileStorage.h"
-
-// http://stackoverflow.com/questions/1576272/storing-large-number-of-files-in-file-system
-// http://stackoverflow.com/questions/446358/storing-a-large-number-of-images
-
-#include "OrthancException.h"
-#include "Toolbox.h"
-#include "Uuid.h"
-
-#include <boost/filesystem/fstream.hpp>
-#include <glog/logging.h>
-
-static std::string ToString(const boost::filesystem::path& p)
-{
-#if BOOST_HAS_FILESYSTEM_V3 == 1
-  return p.filename().string();
-#else
-  return p.filename();
-#endif
-}
-
-
-namespace Orthanc
-{
-  boost::filesystem::path FileStorage::GetPath(const std::string& uuid) const
-  {
-    namespace fs = boost::filesystem;
-
-    if (!Toolbox::IsUuid(uuid))
-    {
-      throw OrthancException(ErrorCode_ParameterOutOfRange);
-    }
-
-    fs::path path = root_;
-
-    path /= std::string(&uuid[0], &uuid[2]);
-    path /= std::string(&uuid[2], &uuid[4]);
-    path /= uuid;
-
-#if BOOST_HAS_FILESYSTEM_V3 == 1
-    path.make_preferred();
-#endif
-
-    return path;
-  }
-
-  FileStorage::FileStorage(std::string root)
-  {
-    namespace fs = boost::filesystem;
-
-    //root_ = boost::filesystem::absolute(root).string();
-    root_ = root;
-
-    if (fs::exists(root))
-    {
-      if (!fs::is_directory(root))
-      {
-        throw OrthancException("The file storage root directory is a file");
-      }
-    }
-    else
-    {
-      if (!fs::create_directories(root))
-      {
-        throw OrthancException("Unable to create the file storage root directory");
-      }
-    }
-  }
-
-  std::string FileStorage::CreateFileWithoutCompression(const void* content, size_t size)
-  {
-    std::string uuid;
-    boost::filesystem::path path;
-    
-    for (;;)
-    {
-      uuid = Toolbox::GenerateUuid();
-      path = GetPath(uuid);
-
-      if (!boost::filesystem::exists(path))
-      {
-        // OK, this is indeed a new file
-        break;
-      }
-
-      // Extremely improbable case: This Uuid has already been created
-      // in the past. Try again.
-    }
-
-    if (boost::filesystem::exists(path.parent_path()))
-    {
-      if (!boost::filesystem::is_directory(path.parent_path()))
-      {
-        throw OrthancException("The subdirectory to be created is already occupied by a regular file");        
-      }
-    }
-    else
-    {
-      if (!boost::filesystem::create_directories(path.parent_path()))
-      {
-        throw OrthancException("Unable to create a subdirectory in the file storage");        
-      }
-    }
-
-    boost::filesystem::ofstream f;
-    f.open(path, std::ofstream::out | std::ios::binary);
-    if (!f.good())
-    {
-      throw OrthancException("Unable to create a new file in the file storage");
-    }
-
-    if (size != 0)
-    {
-      f.write(static_cast<const char*>(content), size);
-      if (!f.good())
-      {
-        f.close();
-        throw OrthancException("Unable to write to the new file in the file storage");
-      }
-    }
-
-    f.close();
-
-    return uuid;
-  } 
-
-
-  std::string FileStorage::Create(const void* content, size_t size)
-  {
-    if (!HasBufferCompressor() || size == 0)
-    {
-      return CreateFileWithoutCompression(content, size);
-    }
-    else
-    {
-      std::string compressed;
-      compressor_->Compress(compressed, content, size);
-      assert(compressed.size() > 0);
-      return CreateFileWithoutCompression(&compressed[0], compressed.size());
-    }
-  }
-
-
-  std::string FileStorage::Create(const std::vector<uint8_t>& content)
-  {
-    if (content.size() == 0)
-      return Create(NULL, 0);
-    else
-      return Create(&content[0], content.size());
-  }
-
-  std::string FileStorage::Create(const std::string& content)
-  {
-    if (content.size() == 0)
-      return Create(NULL, 0);
-    else
-      return Create(&content[0], content.size());
-  }
-
-  void FileStorage::ReadFile(std::string& content,
-                             const std::string& uuid) const
-  {
-    content.clear();
-
-    if (HasBufferCompressor())
-    {
-      std::string compressed;
-      Toolbox::ReadFile(compressed, ToString(GetPath(uuid)));
-
-      if (compressed.size() != 0)
-      {
-        compressor_->Uncompress(content, compressed);
-      }
-    }
-    else
-    {
-      Toolbox::ReadFile(content, GetPath(uuid).string());
-    }
-  }
-
-
-  uintmax_t FileStorage::GetCompressedSize(const std::string& uuid) const
-  {
-    boost::filesystem::path path = GetPath(uuid);
-    return boost::filesystem::file_size(path);
-  }
-
-
-
-  void FileStorage::ListAllFiles(std::set<std::string>& result) const
-  {
-    namespace fs = boost::filesystem;
-
-    result.clear();
-
-    if (fs::exists(root_) && fs::is_directory(root_))
-    {
-      for (fs::recursive_directory_iterator current(root_), end; current != end ; ++current)
-      {
-        if (fs::is_regular_file(current->status()))
-        {
-          try
-          {
-            fs::path d = current->path();
-            std::string uuid = ToString(d);
-            if (Toolbox::IsUuid(uuid))
-            {
-              fs::path p0 = d.parent_path().parent_path().parent_path();
-              std::string p1 = ToString(d.parent_path().parent_path());
-              std::string p2 = ToString(d.parent_path());
-              if (p1.length() == 2 &&
-                  p2.length() == 2 &&
-                  p1 == uuid.substr(0, 2) &&
-                  p2 == uuid.substr(2, 2) &&
-                  p0 == root_)
-              {
-                result.insert(uuid);
-              }
-            }
-          }
-          catch (fs::filesystem_error)
-          {
-          }
-        }
-      }
-    }
-  }
-
-
-  void FileStorage::Clear()
-  {
-    namespace fs = boost::filesystem;
-    typedef std::set<std::string> List;
-
-    List result;
-    ListAllFiles(result);
-
-    for (List::const_iterator it = result.begin(); it != result.end(); it++)
-    {
-      Remove(*it);
-    }
-  }
-
-
-  void FileStorage::Remove(const std::string& uuid)
-  {
-    LOG(INFO) << "Deleting file " << uuid;
-    namespace fs = boost::filesystem;
-
-    fs::path p = GetPath(uuid);
-
-    try
-    {
-      fs::remove(p);
-    }
-    catch (...)
-    {
-      // Ignore the error
-    }
-
-    // Remove the two parent directories, ignoring the error code if
-    // these directories are not empty
-
-    try
-    {
-#if BOOST_HAS_FILESYSTEM_V3 == 1
-      boost::system::error_code err;
-      fs::remove(p.parent_path(), err);
-      fs::remove(p.parent_path().parent_path(), err);
-#else
-      fs::remove(p.parent_path());
-      fs::remove(p.parent_path().parent_path());
-#endif
-    }
-    catch (...)
-    {
-      // Ignore the error
-    }
-  }
-
-
-  uintmax_t FileStorage::GetCapacity() const
-  {
-    return boost::filesystem::space(root_).capacity;
-  }
-
-  uintmax_t FileStorage::GetAvailableSpace() const
-  {
-    return boost::filesystem::space(root_).available;
-  }
-}
--- a/Core/FileStorage.h	Fri Nov 30 14:30:05 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * This program is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * In addition, as a special exception, the copyright holders of this
- * program give permission to link the code of its release with the
- * OpenSSL project's "OpenSSL" library (or with modified versions of it
- * that use the same license as the "OpenSSL" library), and distribute
- * the linked executables. You must obey the GNU General Public License
- * in all respects for all of the code used other than "OpenSSL". If you
- * modify file(s) with this exception, you may extend this exception to
- * your version of the file(s), but you are not obligated to do so. If
- * you do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source files
- * in the program, then also delete it here.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#pragma once
-
-#include <boost/filesystem.hpp>
-#include <set>
-
-#include "Compression/BufferCompressor.h"
-
-namespace Orthanc
-{
-  class FileStorage : public boost::noncopyable
-  {
-    // TODO REMOVE THIS
-    friend class FilesystemHttpSender;
-    friend class FileStorageAccessor;
-
-  private:
-    std::auto_ptr<BufferCompressor> compressor_;
-
-    boost::filesystem::path root_;
-
-    boost::filesystem::path GetPath(const std::string& uuid) const;
-
-    std::string CreateFileWithoutCompression(const void* content, size_t size);
-
-  public:
-    FileStorage(std::string root);
-
-    void SetBufferCompressor(BufferCompressor* compressor)  // Takes the ownership
-    {
-      compressor_.reset(compressor);
-    }
-
-    bool HasBufferCompressor() const
-    {
-      return compressor_.get() != NULL;
-    }
-
-    std::string Create(const void* content, size_t size);
-
-    std::string Create(const std::vector<uint8_t>& content);
-
-    std::string Create(const std::string& content);
-
-    void ReadFile(std::string& content,
-                  const std::string& uuid) const;
-
-    void ListAllFiles(std::set<std::string>& result) const;
-
-    uintmax_t GetCompressedSize(const std::string& uuid) const;
-
-    void Clear();
-
-    void Remove(const std::string& uuid);
-
-    uintmax_t GetCapacity() const;
-
-    uintmax_t GetAvailableSpace() const;
-
-    std::string GetPath() const
-    {
-      return root_.string();
-    }
-  };
-}
--- a/Core/FileStorage/CompressedFileStorageAccessor.h	Fri Nov 30 14:30:05 2012 +0100
+++ b/Core/FileStorage/CompressedFileStorageAccessor.h	Fri Nov 30 14:34:42 2012 +0100
@@ -33,7 +33,7 @@
 #pragma once
 
 #include "StorageAccessor.h"
-#include "../FileStorage.h"
+#include "FileStorage.h"
 #include "../Compression/ZlibCompressor.h"
 
 namespace Orthanc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Core/FileStorage/FileStorage.cpp	Fri Nov 30 14:34:42 2012 +0100
@@ -0,0 +1,323 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include "FileStorage.h"
+
+// http://stackoverflow.com/questions/1576272/storing-large-number-of-files-in-file-system
+// http://stackoverflow.com/questions/446358/storing-a-large-number-of-images
+
+#include "../OrthancException.h"
+#include "../Toolbox.h"
+#include "../Uuid.h"
+
+#include <boost/filesystem/fstream.hpp>
+#include <glog/logging.h>
+
+static std::string ToString(const boost::filesystem::path& p)
+{
+#if BOOST_HAS_FILESYSTEM_V3 == 1
+  return p.filename().string();
+#else
+  return p.filename();
+#endif
+}
+
+
+namespace Orthanc
+{
+  boost::filesystem::path FileStorage::GetPath(const std::string& uuid) const
+  {
+    namespace fs = boost::filesystem;
+
+    if (!Toolbox::IsUuid(uuid))
+    {
+      throw OrthancException(ErrorCode_ParameterOutOfRange);
+    }
+
+    fs::path path = root_;
+
+    path /= std::string(&uuid[0], &uuid[2]);
+    path /= std::string(&uuid[2], &uuid[4]);
+    path /= uuid;
+
+#if BOOST_HAS_FILESYSTEM_V3 == 1
+    path.make_preferred();
+#endif
+
+    return path;
+  }
+
+  FileStorage::FileStorage(std::string root)
+  {
+    namespace fs = boost::filesystem;
+
+    //root_ = boost::filesystem::absolute(root).string();
+    root_ = root;
+
+    if (fs::exists(root))
+    {
+      if (!fs::is_directory(root))
+      {
+        throw OrthancException("The file storage root directory is a file");
+      }
+    }
+    else
+    {
+      if (!fs::create_directories(root))
+      {
+        throw OrthancException("Unable to create the file storage root directory");
+      }
+    }
+  }
+
+  std::string FileStorage::CreateFileWithoutCompression(const void* content, size_t size)
+  {
+    std::string uuid;
+    boost::filesystem::path path;
+    
+    for (;;)
+    {
+      uuid = Toolbox::GenerateUuid();
+      path = GetPath(uuid);
+
+      if (!boost::filesystem::exists(path))
+      {
+        // OK, this is indeed a new file
+        break;
+      }
+
+      // Extremely improbable case: This Uuid has already been created
+      // in the past. Try again.
+    }
+
+    if (boost::filesystem::exists(path.parent_path()))
+    {
+      if (!boost::filesystem::is_directory(path.parent_path()))
+      {
+        throw OrthancException("The subdirectory to be created is already occupied by a regular file");        
+      }
+    }
+    else
+    {
+      if (!boost::filesystem::create_directories(path.parent_path()))
+      {
+        throw OrthancException("Unable to create a subdirectory in the file storage");        
+      }
+    }
+
+    boost::filesystem::ofstream f;
+    f.open(path, std::ofstream::out | std::ios::binary);
+    if (!f.good())
+    {
+      throw OrthancException("Unable to create a new file in the file storage");
+    }
+
+    if (size != 0)
+    {
+      f.write(static_cast<const char*>(content), size);
+      if (!f.good())
+      {
+        f.close();
+        throw OrthancException("Unable to write to the new file in the file storage");
+      }
+    }
+
+    f.close();
+
+    return uuid;
+  } 
+
+
+  std::string FileStorage::Create(const void* content, size_t size)
+  {
+    if (!HasBufferCompressor() || size == 0)
+    {
+      return CreateFileWithoutCompression(content, size);
+    }
+    else
+    {
+      std::string compressed;
+      compressor_->Compress(compressed, content, size);
+      assert(compressed.size() > 0);
+      return CreateFileWithoutCompression(&compressed[0], compressed.size());
+    }
+  }
+
+
+  std::string FileStorage::Create(const std::vector<uint8_t>& content)
+  {
+    if (content.size() == 0)
+      return Create(NULL, 0);
+    else
+      return Create(&content[0], content.size());
+  }
+
+  std::string FileStorage::Create(const std::string& content)
+  {
+    if (content.size() == 0)
+      return Create(NULL, 0);
+    else
+      return Create(&content[0], content.size());
+  }
+
+  void FileStorage::ReadFile(std::string& content,
+                             const std::string& uuid) const
+  {
+    content.clear();
+
+    if (HasBufferCompressor())
+    {
+      std::string compressed;
+      Toolbox::ReadFile(compressed, ToString(GetPath(uuid)));
+
+      if (compressed.size() != 0)
+      {
+        compressor_->Uncompress(content, compressed);
+      }
+    }
+    else
+    {
+      Toolbox::ReadFile(content, GetPath(uuid).string());
+    }
+  }
+
+
+  uintmax_t FileStorage::GetCompressedSize(const std::string& uuid) const
+  {
+    boost::filesystem::path path = GetPath(uuid);
+    return boost::filesystem::file_size(path);
+  }
+
+
+
+  void FileStorage::ListAllFiles(std::set<std::string>& result) const
+  {
+    namespace fs = boost::filesystem;
+
+    result.clear();
+
+    if (fs::exists(root_) && fs::is_directory(root_))
+    {
+      for (fs::recursive_directory_iterator current(root_), end; current != end ; ++current)
+      {
+        if (fs::is_regular_file(current->status()))
+        {
+          try
+          {
+            fs::path d = current->path();
+            std::string uuid = ToString(d);
+            if (Toolbox::IsUuid(uuid))
+            {
+              fs::path p0 = d.parent_path().parent_path().parent_path();
+              std::string p1 = ToString(d.parent_path().parent_path());
+              std::string p2 = ToString(d.parent_path());
+              if (p1.length() == 2 &&
+                  p2.length() == 2 &&
+                  p1 == uuid.substr(0, 2) &&
+                  p2 == uuid.substr(2, 2) &&
+                  p0 == root_)
+              {
+                result.insert(uuid);
+              }
+            }
+          }
+          catch (fs::filesystem_error)
+          {
+          }
+        }
+      }
+    }
+  }
+
+
+  void FileStorage::Clear()
+  {
+    namespace fs = boost::filesystem;
+    typedef std::set<std::string> List;
+
+    List result;
+    ListAllFiles(result);
+
+    for (List::const_iterator it = result.begin(); it != result.end(); it++)
+    {
+      Remove(*it);
+    }
+  }
+
+
+  void FileStorage::Remove(const std::string& uuid)
+  {
+    LOG(INFO) << "Deleting file " << uuid;
+    namespace fs = boost::filesystem;
+
+    fs::path p = GetPath(uuid);
+
+    try
+    {
+      fs::remove(p);
+    }
+    catch (...)
+    {
+      // Ignore the error
+    }
+
+    // Remove the two parent directories, ignoring the error code if
+    // these directories are not empty
+
+    try
+    {
+#if BOOST_HAS_FILESYSTEM_V3 == 1
+      boost::system::error_code err;
+      fs::remove(p.parent_path(), err);
+      fs::remove(p.parent_path().parent_path(), err);
+#else
+      fs::remove(p.parent_path());
+      fs::remove(p.parent_path().parent_path());
+#endif
+    }
+    catch (...)
+    {
+      // Ignore the error
+    }
+  }
+
+
+  uintmax_t FileStorage::GetCapacity() const
+  {
+    return boost::filesystem::space(root_).capacity;
+  }
+
+  uintmax_t FileStorage::GetAvailableSpace() const
+  {
+    return boost::filesystem::space(root_).available;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Core/FileStorage/FileStorage.h	Fri Nov 30 14:34:42 2012 +0100
@@ -0,0 +1,96 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include <boost/filesystem.hpp>
+#include <set>
+
+#include "../Compression/BufferCompressor.h"
+
+namespace Orthanc
+{
+  class FileStorage : public boost::noncopyable
+  {
+    // TODO REMOVE THIS
+    friend class FilesystemHttpSender;
+    friend class FileStorageAccessor;
+
+  private:
+    std::auto_ptr<BufferCompressor> compressor_;
+
+    boost::filesystem::path root_;
+
+    boost::filesystem::path GetPath(const std::string& uuid) const;
+
+    std::string CreateFileWithoutCompression(const void* content, size_t size);
+
+  public:
+    FileStorage(std::string root);
+
+    void SetBufferCompressor(BufferCompressor* compressor)  // Takes the ownership
+    {
+      compressor_.reset(compressor);
+    }
+
+    bool HasBufferCompressor() const
+    {
+      return compressor_.get() != NULL;
+    }
+
+    std::string Create(const void* content, size_t size);
+
+    std::string Create(const std::vector<uint8_t>& content);
+
+    std::string Create(const std::string& content);
+
+    void ReadFile(std::string& content,
+                  const std::string& uuid) const;
+
+    void ListAllFiles(std::set<std::string>& result) const;
+
+    uintmax_t GetCompressedSize(const std::string& uuid) const;
+
+    void Clear();
+
+    void Remove(const std::string& uuid);
+
+    uintmax_t GetCapacity() const;
+
+    uintmax_t GetAvailableSpace() const;
+
+    std::string GetPath() const
+    {
+      return root_.string();
+    }
+  };
+}
--- a/Core/FileStorage/FileStorageAccessor.h	Fri Nov 30 14:30:05 2012 +0100
+++ b/Core/FileStorage/FileStorageAccessor.h	Fri Nov 30 14:34:42 2012 +0100
@@ -33,7 +33,7 @@
 #pragma once
 
 #include "StorageAccessor.h"
-#include "../FileStorage.h"
+#include "FileStorage.h"
 #include "../HttpServer/FilesystemHttpSender.h"
 
 namespace Orthanc
--- a/Core/HttpServer/FilesystemHttpSender.h	Fri Nov 30 14:30:05 2012 +0100
+++ b/Core/HttpServer/FilesystemHttpSender.h	Fri Nov 30 14:34:42 2012 +0100
@@ -32,7 +32,7 @@
 #pragma once
 
 #include "HttpFileSender.h"
-#include "../FileStorage.h"
+#include "../FileStorage/FileStorage.h"
 
 namespace Orthanc
 {
--- a/OrthancServer/ServerContext.h	Fri Nov 30 14:30:05 2012 +0100
+++ b/OrthancServer/ServerContext.h	Fri Nov 30 14:34:42 2012 +0100
@@ -33,9 +33,9 @@
 #pragma once
 
 #include "ServerIndex.h"
-#include "../Core/FileStorage.h"
+#include "../Core/FileStorage/CompressedFileStorageAccessor.h"
+#include "../Core/FileStorage/FileStorage.h"
 #include "../Core/RestApi/RestApiOutput.h"
-#include "../Core/FileStorage/CompressedFileStorageAccessor.h"
 
 namespace Orthanc
 {
--- a/OrthancServer/ServerToolbox.cpp	Fri Nov 30 14:30:05 2012 +0100
+++ b/OrthancServer/ServerToolbox.cpp	Fri Nov 30 14:34:42 2012 +0100
@@ -34,6 +34,8 @@
 
 #include "../Core/OrthancException.h"
 
+#include <cassert>
+
 namespace Orthanc
 {
   void SimplifyTags(Json::Value& target,
--- a/OrthancServer/ServerToolbox.h	Fri Nov 30 14:30:05 2012 +0100
+++ b/OrthancServer/ServerToolbox.h	Fri Nov 30 14:34:42 2012 +0100
@@ -32,8 +32,6 @@
 
 #pragma once
 
-#include "../Core/FileStorage.h"
-
 #include <json/json.h>
 
 namespace Orthanc
--- a/UnitTests/FileStorage.cpp	Fri Nov 30 14:30:05 2012 +0100
+++ b/UnitTests/FileStorage.cpp	Fri Nov 30 14:34:42 2012 +0100
@@ -3,7 +3,7 @@
 #include <ctype.h>
 #include <glog/logging.h>
 
-#include "../Core/FileStorage.h"
+#include "../Core/FileStorage/FileStorage.h"
 #include "../OrthancServer/ServerIndex.h"
 #include "../Core/Toolbox.h"
 #include "../Core/OrthancException.h"