18#ifndef C2PA_INTERNAL_HPP
19#define C2PA_INTERNAL_HPP
36 return message !=
nullptr && std::strstr(message,
"ManifestNotFound") !=
nullptr;
46 std::vector<std::string> result;
47 if (mime_types ==
nullptr) {
return result; }
49 result.reserve(count);
50 for(uintptr_t i = 0; i < count; i++) {
51 result.emplace_back(mime_types[i]);
54 c2pa_free_string_array(mime_types, count);
61 case C2paSeekMode::Start:
return std::ios_base::beg;
62 case C2paSeekMode::Current:
return std::ios_base::cur;
63 case C2paSeekMode::End:
return std::ios_base::end;
64 default:
return std::ios_base::beg;
69template<
typename Stream>
71 return s && !s->bad();
75template<
typename Stream>
80 static void seek(std::istream* s, intptr_t offset, std::ios_base::seekdir dir) {
81 s->seekg(offset, dir);
83 static int64_t
tell(std::istream* s) {
84 return static_cast<int64_t
>(s->tellg());
90 static void seek(std::ostream* s, intptr_t offset, std::ios_base::seekdir dir) {
91 s->seekp(offset, dir);
93 static int64_t
tell(std::ostream* s) {
94 return static_cast<int64_t
>(s->tellp());
100 static void seek(std::iostream* s, intptr_t offset, std::ios_base::seekdir dir) {
101 s->seekg(offset, dir);
102 s->seekp(offset, dir);
104 static int64_t
tell(std::iostream* s) {
105 return static_cast<int64_t
>(s->tellp());
110template<
typename Stream>
111intptr_t
stream_seeker(StreamContext* context, intptr_t offset, C2paSeekMode whence) {
112 auto* stream =
reinterpret_cast<Stream*
>(context);
119 if (stream->fail()) {
129 return static_cast<intptr_t
>(pos);
133template<
typename Stream>
134intptr_t
stream_reader(StreamContext* context, uint8_t* buffer, intptr_t size) {
135 if (!context || !buffer) {
144 auto* stream =
reinterpret_cast<Stream*
>(context);
148 stream->read(
reinterpret_cast<char*
>(buffer), size);
149 if (stream->fail()) {
150 if (!stream->eof()) {
157 return static_cast<intptr_t
>(stream->gcount());
161template<
typename Stream,
typename Op>
163 auto* stream =
reinterpret_cast<Stream*
>(context);
167 const intptr_t result = op(stream);
168 if (stream->fail()) {
178template<
typename Stream>
179intptr_t
stream_writer(StreamContext* context,
const uint8_t* buffer, intptr_t size) {
181 s->write(
reinterpret_cast<const char*
>(
buffer),
size);
187template<
typename Stream>
199template<
typename StreamType>
202 auto stream = std::make_unique<StreamType>(
204 std::ios_base::binary
216 auto ext =
path.extension().string();
217 return ext.empty() ?
"" :
ext.substr(1);
C++ wrapper for the C2PA C library.
Exception class for C2pa errors. This class is used to throw exceptions for errors encountered by the...
Definition c2pa.hpp:87
std::vector< std::string > c_mime_types_to_vector(const char *const *mime_types, uintptr_t count)
Converts a C array of C strings to a std::vector of std::string.
Definition c2pa_internal.hpp:45
intptr_t stream_writer(StreamContext *context, const uint8_t *buffer, intptr_t size)
Writer impl.
Definition c2pa_internal.hpp:179
intptr_t stream_op(StreamContext *context, Op op)
Get stream from context, used by writer and flusher.
Definition c2pa_internal.hpp:162
std::string extract_file_extension(const std::filesystem::path &path) noexcept
Extract file extension without the leading dot.
Definition c2pa_internal.hpp:215
bool error_indicates_manifest_not_found(const char *message) noexcept
True if the C2PA error message indicates no JUMBF / manifest in the asset (ManifestNotFound).
Definition c2pa_internal.hpp:35
intptr_t stream_flusher(StreamContext *context)
Flusher impl.
Definition c2pa_internal.hpp:188
constexpr std::ios_base::seekdir whence_to_seekdir(C2paSeekMode whence) noexcept
Maps C2PA seek mode to std::ios seek direction.
Definition c2pa_internal.hpp:59
bool is_stream_usable(Stream *s) noexcept
Check if stream is in valid state for I/O operations.
Definition c2pa_internal.hpp:70
std::vector< unsigned char > to_byte_vector(const unsigned char *data, int64_t size)
Convert C byte array result to C++ vector.
Definition c2pa_internal.hpp:240
intptr_t stream_reader(StreamContext *context, uint8_t *buffer, intptr_t size)
Reader impl.
Definition c2pa_internal.hpp:134
std::string c_string_to_string(T *c_result)
Convert C string result to C++ string with cleanup.
Definition c2pa_internal.hpp:224
intptr_t stream_seeker(StreamContext *context, intptr_t offset, C2paSeekMode whence)
Seeker impl.
Definition c2pa_internal.hpp:111
std::unique_ptr< StreamType > open_file_binary(const std::filesystem::path &path)
Open a binary file stream with error handling.
Definition c2pa_internal.hpp:200
int stream_error_return(StreamError e) noexcept
Set errno from StreamError and return error sentinel.
Definition c2pa.hpp:79
static void seek(std::iostream *s, intptr_t offset, std::ios_base::seekdir dir)
Definition c2pa_internal.hpp:100
static int64_t tell(std::iostream *s)
Definition c2pa_internal.hpp:104
static int64_t tell(std::istream *s)
Definition c2pa_internal.hpp:83
static void seek(std::istream *s, intptr_t offset, std::ios_base::seekdir dir)
Definition c2pa_internal.hpp:80
static void seek(std::ostream *s, intptr_t offset, std::ios_base::seekdir dir)
Definition c2pa_internal.hpp:90
static int64_t tell(std::ostream *s)
Definition c2pa_internal.hpp:93
Traits (templated): how to seek and get position for a given stream type.
Definition c2pa_internal.hpp:76