1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/************************************************************************
*
* Copyright (C) 2021-2024 IRCAD France
*
* This file is part of Sight.
*
* Sight is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Sight 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Sight. If not, see <https://www.gnu.org/licenses/>.
*
***********************************************************************/
#pragma once
#include <core/com/signal.hpp>
#include <core/jobs/base.hpp>
#include <io/__/service/reader.hpp>
#include <service/notifier.hpp>
namespace sight::module::io::session
{
/**
* @brief Session reader.
*
* @details Service to read a session file and restore recursively, including all fields a data object.
* The session file is indeed a standard "ZIP" archive, while the compression algorithm for files inside
* the session archive is ZSTD. A standard archive reader could open a session file, if it is able to handle
* ZIP archive with ZSTD compression.
*
* The archive can be password protected using AES256 algorithm. Depending of the chosen encryption policy, the files
* can be protected, and thus not be readable from external archive reader, even if no password (encryption=forced) are
* provided.
*
* The compression level is set individually, depending of the type of data to serialize.
*
* @section Signals Signals
* - \b job_created(SPTR(core::jobs::base)): emitted to display a progress bar while the image is written (it should be
* connected to a job_bar).
*
* @section XML XML Configuration
* @code{.xml}
<service type="sight::module::io::session::reader">
<inout key="data" uid="..." />
<dialog extension=".sample" description="Sample Sight session file" policy="always"/>
<password policy="once, encryption=salted"/>
<archive format="default"/>
</service>
@endcode
*
* @subsection In-Out In-Out
* - \b data [sight::data::object]: object to read.
*
* @subsection Configuration Configuration
* - \b dialog(optional):
* \b extension: defines the file extension that will be used for the session file.
* If the extension is not specified, default ".zip" will be used.
* \b description: allows to display a label in front of extension when the file dialog is shown.
* \b policy:
* - \b "never": never show the open dialog (DEFAULT)
* - \b "once": show only once, store the location as long as the service is started
* - \b "always": always show the location dialog
*
* - \b password(optional):
* \b policy: defines if we should protect the session file using a password and when to ask for it. It could be:
* - \b "never": a password will never be asked and the session file will never be encrypted. (DEFAULT)
* - \b "global": a password will be asked only if global password is not set.
* The session file will be encrypted.
* - \b "always": a password will always be asked.
* The session file will be encrypted.
*
* \b encryption: defines if we should use password as is or salt it a bit to make . It could be:
* - \b "password": uses password as is. (DEFAULT)
* - \b "salted": uses password, but salt it. It means that encrypted file could not be open outside Sight.
* - \b "force": force encryption, even without password. Use a pseudo-random hidden password, if
* no password are provided
*
* - \b archive(optional):
* \b format: defines the archive format.
* - \b "filesystem": Reads files from the filesystem.
* - \b "archive": Reads files from an session archive.
* - \b "default": uses the builtin default behavior which is "archive"
*
* @see sight::io::service::reader
* @see sight::io::session::session_reader
*/
class reader final : public sight::io::service::reader,
public sight::service::notifier
{
public:
SIGHT_DECLARE_SERVICE(reader, sight::io::service::reader);
struct signals
{
using job_created_signal_t = sight::core::com::signal<void (sight::core::jobs::base::sptr)>;
using session_path_t = core::com::signal<void (std::filesystem::path)>;
using signal_t = sight::core::com::signals::key_t;
inline static const signal_t SESSION_LOADED = "session_loaded";
inline static const signal_t SESSION_LOADING_FAILED = "session_loading_failed";
};
reader() noexcept;
~reader() noexcept override;
/// Propose to read a session data file
void open_location_dialog() override;
protected:
/// Does nothing
void starting() override;
/// Does nothing
void stopping() override;
/// Parses the configuration
void configuring() override;
/// Read session data from filesystem
void updating() override;
/// Returns managed path type, here service manages only single file
sight::io::service::path_type_t get_path_type() const override
{
return sight::io::service::file;
}
private:
class reader_impl;
std::unique_ptr<reader_impl> m_pimpl;
};
} // namespace sight::module::io::session
|