From 5accb5e33aff13063efced92cbb7e90eaf1aab51 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sat, 30 Jul 2022 04:31:56 +0000 Subject: [PATCH] Impl Clone for ExifKey --- exif/exif.h | 1 + exif/src/exif.cpp | 13 +++++++++++++ src/exif.rs | 12 ++++++++++++ 3 files changed, 26 insertions(+) diff --git a/exif/exif.h b/exif/exif.h index d8ce9f9..080214f 100644 --- a/exif/exif.h +++ b/exif/exif.h @@ -35,6 +35,7 @@ EXIF_API int exif_image_write_metadata(ExifImage* image); EXIF_API void free_exif_image(ExifImage* img); EXIF_API ExifKey* exif_create_key_by_key(const char* key); EXIF_API ExifKey* exif_create_key_by_id(uint16_t id, const char* group_name); +EXIF_API ExifKey* exif_create_key_by_another(ExifKey* key); EXIF_API char* exif_get_key_key(ExifKey* key); EXIF_API char* exif_get_key_family_name(ExifKey* key); EXIF_API char* exif_get_key_group_name(ExifKey* key); diff --git a/exif/src/exif.cpp b/exif/src/exif.cpp index 932d95c..fa97c38 100644 --- a/exif/src/exif.cpp +++ b/exif/src/exif.cpp @@ -95,6 +95,19 @@ end: return nullptr; } +ExifKey* exif_create_key_by_another(ExifKey* key) { + if (!key) return nullptr; + ExifKey* k = new ExifKey; + if (!k) return nullptr; + Exiv2::ExifKey* ek = new Exiv2::ExifKey(*(key->key)); + if (!ek) { + delete k; + return nullptr; + } + k->key = ek; + return k; +} + char* exif_get_key_key(ExifKey* key) { if (!key || !key->key) return nullptr; auto s = key->key->key(); diff --git a/src/exif.rs b/src/exif.rs index 2c68bce..665c680 100644 --- a/src/exif.rs +++ b/src/exif.rs @@ -130,6 +130,16 @@ impl Drop for ExifKey { } } +impl Clone for ExifKey { + fn clone(&self) -> Self { + let key = unsafe { _exif::exif_create_key_by_another(self.key) }; + if key.is_null() { + panic!("Out of memory."); + } + Self { key } + } +} + impl ToRawHandle<_exif::ExifKey> for ExifKey { unsafe fn to_raw_handle(&self) -> *mut _exif::ExifKey { self.key @@ -782,6 +792,8 @@ fn test_exif_key() { assert!(k2.is_ok()); let k2 = k2.unwrap(); assert_eq!(Some(String::from("Exif.Image.XPTitle")), k2.key()); + let k3 = k2.clone(); + assert_eq!(Some(String::from("Exif.Image.XPTitle")), k3.key()); } #[test]