Add constructor that takes generic std::istream objects (#11)
This commit is contained in:
34
TinyEXIF.cpp
34
TinyEXIF.cpp
@@ -43,6 +43,7 @@
|
||||
#include <cfloat>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
namespace {
|
||||
@@ -338,6 +339,9 @@ EXIFInfo::EXIFInfo() : Fields(FIELD_NA) {
|
||||
EXIFInfo::EXIFInfo(EXIFStream& stream) {
|
||||
parseFrom(stream);
|
||||
}
|
||||
EXIFInfo::EXIFInfo(std::istream& stream) {
|
||||
parseFrom(stream);
|
||||
}
|
||||
EXIFInfo::EXIFInfo(const uint8_t* data, unsigned length) {
|
||||
parseFrom(data, length);
|
||||
}
|
||||
@@ -848,6 +852,36 @@ int EXIFInfo::parseFrom(EXIFStream& stream) {
|
||||
return app1s();
|
||||
}
|
||||
|
||||
|
||||
int EXIFInfo::parseFrom(std::istream& stream) {
|
||||
class EXIFStdStream : public EXIFStream {
|
||||
public:
|
||||
EXIFStdStream(std::istream& stream)
|
||||
: stream(stream) {
|
||||
// Would be nice to assert here that the stream was opened in binary mode, but
|
||||
// apparently that's not possible: https://stackoverflow.com/a/224259/19254
|
||||
}
|
||||
bool IsValid() const override {
|
||||
return !!stream;
|
||||
}
|
||||
const uint8_t* GetBuffer(unsigned desiredLength) override {
|
||||
buffer.resize(desiredLength);
|
||||
if (!stream.read(reinterpret_cast<char*>(buffer.data()), desiredLength))
|
||||
return NULL;
|
||||
return buffer.data();
|
||||
}
|
||||
bool SkipBuffer(unsigned desiredLength) override {
|
||||
return (bool)stream.seekg(desiredLength, std::ios::cur);
|
||||
}
|
||||
private:
|
||||
std::istream& stream;
|
||||
std::vector<uint8_t> buffer;
|
||||
};
|
||||
EXIFStdStream streamWrapper(stream);
|
||||
return parseFrom(streamWrapper);
|
||||
}
|
||||
|
||||
|
||||
int EXIFInfo::parseFrom(const uint8_t* buf, unsigned len) {
|
||||
class EXIFStreamBuffer : public EXIFStream {
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user