21 #include <sys/types.h>
30 #include "ifdfilecontainer.h"
34 using namespace Debug;
40 IFDFileContainer::IFDFileContainer(
IO::Stream *_file, off_t offset)
43 m_exif_offset_correction(0),
62 if ((p[0] == 0x49) && (p[1] == 0x49)
63 && (p[2] == 0x2a) && (p[3] == 0x00)) {
66 else if ((p[0] == 0x4d) && (p[1] == 0x4d)
67 && (p[2] == 0x00) && (p[3] == 0x2a)) {
76 if (m_dirs.size() == 0) {
78 bool ret = _locateDirs();
86 std::vector<IFDDir::Ref> &
89 if (m_dirs.size() == 0) {
100 return IFDDir::Ref((
IFDDir*)NULL);
106 return IFDDir::Ref((
IFDDir*)NULL);
110 if (dir > (
int)m_dirs.size()) {
112 return IFDDir::Ref((
IFDDir*)NULL);
114 m_current_dir = m_dirs[dir];
115 m_current_dir->load();
116 return m_current_dir;
124 Trace(DEBUG1) <<
"getDirectoryDataSize()" <<
"\n";
125 off_t offset = m_current_dir->offset();
127 Trace(DEBUG1) <<
"offset = " << offset
128 <<
" m_numTags = " << m_current_dir->numTags() <<
"\n";
129 off_t begin = offset + 2 + (m_current_dir->numTags()*12);
131 Trace(DEBUG1) <<
"begin = " << begin <<
"\n";
137 Trace(DEBUG1) <<
"nextIFD = " << nextIFD <<
"\n";
141 return nextIFD - begin;
151 IFDFileContainer::_locateDirs(
void)
156 Trace(DEBUG1) <<
"_locateDirs()\n";
157 if (m_endian == ENDIAN_NULL) {
162 if (m_endian == ENDIAN_NULL) {
174 Trace(DEBUG1) <<
"push offset =0x" << offset <<
"\n";
178 IFDDir::Ref dir(
new IFDDir(
m_offset + offset,*
this));
179 m_dirs.push_back(dir);
183 offset = dir->nextIFD();
185 }
while(offset != 0);
187 Trace(DEBUG1) <<
"# dir found = " << m_dirs.size() <<
"\n";
188 return (m_dirs.size() != 0);
int countDirectories(void)
virtual ~IFDFileContainer()
IFDDir::Ref setDirectory(int dir)
virtual bool locateDirsPreHook()
virtual int seek(off_t offset, int whence)=0
virtual int read(void *buf, size_t count)=0
std::vector< IFDDir::Ref > & directories()
bool readInt32(IO::Stream *f, int32_t &v)
base virtual class for IO
virtual EndianType isMagicHeader(const char *p, int len)
size_t getDirectoryDataSize()