aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/model/GpgData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/model/GpgData.cpp')
-rw-r--r--src/core/model/GpgData.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/core/model/GpgData.cpp b/src/core/model/GpgData.cpp
index 19f45e22..6a6105eb 100644
--- a/src/core/model/GpgData.cpp
+++ b/src/core/model/GpgData.cpp
@@ -28,6 +28,8 @@
#include "core/model/GpgData.h"
+#include <unistd.h>
+
#include "core/typedef/GpgTypedef.h"
namespace GpgFrontend {
@@ -63,6 +65,35 @@ GpgData::GpgData(const void* buffer, size_t size, bool copy) {
data_ref_ = std::unique_ptr<struct gpgme_data, DataRefDeleter>(data);
}
+GpgData::GpgData(int fd) : fd_(fd) {
+ gpgme_data_t data;
+
+ auto err = gpgme_data_new_from_fd(&data, fd);
+ assert(gpgme_err_code(err) == GPG_ERR_NO_ERROR);
+
+ data_ref_ = std::unique_ptr<struct gpgme_data, DataRefDeleter>(data);
+}
+
+GpgData::GpgData(const std::filesystem::path& path, bool read) {
+ gpgme_data_t data;
+
+ fp_ = fopen(path.string().c_str(), read ? "rb" : "wb");
+ auto err = gpgme_data_new_from_stream(&data, fp_);
+ assert(gpgme_err_code(err) == GPG_ERR_NO_ERROR);
+
+ data_ref_ = std::unique_ptr<struct gpgme_data, DataRefDeleter>(data);
+}
+
+GpgData::~GpgData() {
+ if (fp_ != nullptr) {
+ fclose(fp_);
+ }
+
+ if (fd_ >= 0) {
+ close(fd_);
+ }
+}
+
auto GpgData::Read2Buffer() -> ByteArrayPtr {
gpgme_off_t ret = gpgme_data_seek(*this, 0, SEEK_SET);
ByteArrayPtr out_buffer = std::make_unique<std::string>();
@@ -110,5 +141,4 @@ auto GpgData::Read2GFBuffer() -> GFBuffer {
}
GpgData::operator gpgme_data_t() { return data_ref_.get(); }
-
} // namespace GpgFrontend \ No newline at end of file