aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/model/GpgData.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2023-12-27 03:20:11 +0000
committersaturneric <[email protected]>2023-12-27 03:20:11 +0000
commit566d5e41a34e08b06a5c84fd4ad9f944b6b31feb (patch)
tree996184047486e1484b3101e68ebc0b43b4ccf11e /src/core/model/GpgData.cpp
parentfix: add test cases and test file basical operations (diff)
downloadGpgFrontend-566d5e41a34e08b06a5c84fd4ad9f944b6b31feb.tar.gz
GpgFrontend-566d5e41a34e08b06a5c84fd4ad9f944b6b31feb.zip
feat: avoid reading entire file to memory
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