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
|
//! `PacketPile`s, deserialized sequences of OpenPGP messages.
//!
//!
//! Wraps [`sequoia-openpgp::PacketPile`].
//!
//! [`sequoia-openpgp::PacketPile`]: ../../sequoia_openpgp/struct.PacketPile.html
use std::slice;
use std::io::{Read, Write};
use libc::{uint8_t, c_char, size_t};
extern crate sequoia_openpgp as openpgp;
use self::openpgp::{
parse::Parse,
serialize::Serialize,
};
use ::error::Status;
/// A `PacketPile` holds a deserialized sequence of OpenPGP messages.
///
/// Wraps [`sequoia-openpgp::PacketPile`].
///
/// [`sequoia-openpgp::PacketPile`]: ../../sequoia_openpgp/struct.PacketPile.html
#[::ffi_wrapper_type(prefix = "pgp_",
derive = "Clone, Debug, PartialEq")]
pub struct PacketPile(openpgp::PacketPile);
/// Deserializes the OpenPGP message stored in a `std::io::Read`
/// object.
///
/// Although this method is easier to use to parse an OpenPGP
/// message than a `PacketParser` or a `PacketPileParser`, this
/// interface buffers the whole message in memory. Thus, the
/// caller must be certain that the *deserialized* message is not
/// too large.
///
/// Note: this interface *does* buffer the contents of packets.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_from_reader(errp: Option<&mut *mut failure::Error>,
reader: *mut Box<Read>)
-> *mut openpgp::PacketPile {
ffi_make_fry_from_errp!(errp);
let reader = ffi_param_ref_mut!(reader);
ffi_try_box!(openpgp::PacketPile::from_reader(reader))
}
/// Deserializes the OpenPGP message stored in the file named by
/// `filename`.
///
/// See `pgp_packet_pile_from_reader` for more details and caveats.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_from_file(errp: Option<&mut *mut failure::Error>,
filename: *const c_char)
-> *mut openpgp::PacketPile {
ffi_make_fry_from_errp!(errp);
let filename = ffi_param_cstr!(filename).to_string_lossy().into_owned();
ffi_try_box!(openpgp::PacketPile::from_file(&filename))
}
/// Deserializes the OpenPGP message stored in the provided buffer.
///
/// See `pgp_packet_pile_from_reader` for more details and caveats.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_from_bytes(errp: Option<&mut *mut failure::Error>,
b: *const uint8_t, len: size_t)
-> *mut openpgp::PacketPile {
ffi_make_fry_from_errp!(errp);
assert!(!b.is_null());
let buf = unsafe {
slice::from_raw_parts(b, len as usize)
};
ffi_try_box!(openpgp::PacketPile::from_bytes(buf))
}
/// Serializes the packet pile.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_serialize(errp: Option<&mut *mut failure::Error>,
packet_pile: *const openpgp::PacketPile,
writer: *mut Box<Write>)
-> Status {
ffi_make_fry_from_errp!(errp);
let packet_pile = ffi_param_ref!(packet_pile);
let writer = ffi_param_ref_mut!(writer);
ffi_try_status!(packet_pile.serialize(writer))
}
|