Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
UNRELEASED
* Add support for g_error_free to prevent memory leaks of GErrors.
* Explicitly check for minimum v0.10 of gexiv2 system library.
* Explicitly check for minimum v0.16 of gexiv2 system library.
* Add support for gexiv2_shutdown(), to be called from main thread.
* Update minimum supported Rust version (MSRV) to 1.92 due to dependency reqs.

Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ bitflags = { version = "1.3", optional = true}

[build-dependencies]
pkg-config = "0.3"
cc = "1.0"

[dev-dependencies]
tempfile = "3.3"
Expand Down
16 changes: 13 additions & 3 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,16 @@

//! Confirm gexiv2 library exists on the system.

extern crate cc;

fn main() {
let mut cfg = cc::Build::new();
let system_library = pkg_config::Config::new()
.atleast_version("0.10")
.probe("gexiv2")
.atleast_version("0.16")
.probe("gexiv2-0.16")
.unwrap_or_else(|e| {
eprintln!(
"\nThe gexiv2 library was not found by pkg-config/pkgconf on your system.\n\n\
"\nThe gexiv2 library (at least version 0.16) was not found by pkg-config/pkgconf on your system.\n\n\
Consult the README.md file for suggestions on how to acquire it."
);
panic!("{}", e);
Expand Down Expand Up @@ -50,5 +53,12 @@ fn main() {
if (major, minor) >= (milestone_major, milestone_minor) {
println!("cargo:rustc-cfg={}", flag);
}
};
cfg.file("src/glue.cpp");

for path in system_library.include_paths {
cfg.include(path);
}

cfg.compile("gexiv2_sys_glue");
}
10 changes: 4 additions & 6 deletions examples/preview_properties.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@ extern crate libc;
use std::ffi;
use std::ptr;


static FILE_PATH: &str = "/YOUR/FILE/PATH/GOES/HERE.jpg";


fn get_file_metadata(path: &str) -> *mut gexiv2::GExiv2Metadata {
let mut err: *mut gexiv2::GError = ptr::null_mut();
let c_str_path = ffi::CString::new(path.as_bytes()).unwrap();
Expand All @@ -26,7 +24,6 @@ fn get_file_metadata(path: &str) -> *mut gexiv2::GExiv2Metadata {
}
}


fn main() {
unsafe {
let meta = get_file_metadata(FILE_PATH);
Expand All @@ -39,9 +36,10 @@ fn main() {
let mut cur_offset = 0;
while !(*all_preview_props.offset(cur_offset)).is_null() {
let preview_prop = *all_preview_props.offset(cur_offset);
let mime_type = ffi::CStr::from_ptr(
gexiv2::gexiv2_preview_properties_get_mime_type(preview_prop)
).to_str();
let mime_type = ffi::CStr::from_ptr(gexiv2::gexiv2_preview_properties_get_mime_type(
preview_prop,
))
.to_str();
println!("{:?}", mime_type);
cur_offset += 1;
}
Expand Down
8 changes: 6 additions & 2 deletions examples/raw_tag_access.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,22 @@ mod example {
extern crate libc;

use std::ffi;
use std::ptr;
use std::slice;
use std::str;

use gexiv2_sys::GError;

pub fn example() {
unsafe {
let metadata = crate::open_buf::make_new_metadata();
let mut err: *mut GError = ptr::null_mut();

let tag = ffi::CString::new("Exif.Image.ImageDescription").unwrap();
let tag_value = ffi::CString::new("Raw Tag Access Example").unwrap();
gexiv2::gexiv2_metadata_set_tag_string(metadata, tag.as_ptr(), tag_value.as_ptr());
gexiv2::gexiv2_metadata_set_tag_string(metadata, tag.as_ptr(), tag_value.as_ptr(), &mut err);

let raw_tag_struct = gexiv2::gexiv2_metadata_get_tag_raw(metadata, tag.as_ptr());
let raw_tag_struct = gexiv2::gexiv2_metadata_get_tag_raw(metadata, tag.as_ptr(), &mut err);

let mut raw_tag_buffer_size: usize = 0;
let raw_tag_buffer =
Expand Down
12 changes: 8 additions & 4 deletions examples/xmp_packet_access.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,27 @@ mod example {
extern crate gexiv2_sys as gexiv2;
extern crate libc;

use std::ffi;
use std::{ffi, ptr};

use gexiv2_sys::GError;

pub fn example() {
unsafe {
let metadata = crate::open_buf::make_new_metadata();
let mut err: *mut GError = ptr::null_mut();

let tag = ffi::CString::new("Xmp.dc.title").unwrap();
let tag_value = ffi::CString::new("Example").unwrap();
gexiv2::gexiv2_metadata_set_tag_string(metadata, tag.as_ptr(), tag_value.as_ptr());
gexiv2::gexiv2_metadata_set_tag_string(metadata, tag.as_ptr(), tag_value.as_ptr(), &mut err);

gexiv2::gexiv2_metadata_generate_xmp_packet(
metadata,
(gexiv2::GExiv2XmpFormatFlags::OMIT_PACKET_WRAPPER
| gexiv2::GExiv2XmpFormatFlags::OMIT_ALL_FORMATTING).bits(),
| gexiv2::GExiv2XmpFormatFlags::OMIT_ALL_FORMATTING)
.bits(),
1,
);
let packet = gexiv2::gexiv2_metadata_get_xmp_packet(metadata);
let packet = gexiv2::gexiv2_metadata_get_xmp_packet(metadata, &mut err);
println!("{}", ffi::CStr::from_ptr(packet).to_str().unwrap());

gexiv2::gexiv2_metadata_free(metadata);
Expand Down
22 changes: 22 additions & 0 deletions src/glue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include <gexiv2/gexiv2.h>
#include <glib-object.h>

extern "C" {

#ifndef gexiv2_metadata_free
void gexiv2_metadata_free (GExiv2Metadata *self) {
g_return_if_fail(GEXIV2_IS_METADATA(self));

g_object_unref(self);
}
#endif

#ifndef gexiv2_preview_image_free
void gexiv2_preview_image_free(GExiv2PreviewImage *self) {
g_return_if_fail(GEXIV2_IS_PREVIEW_IMAGE(self));

g_object_unref(self);
}
#endif

}
Loading