23 #include "mrwcontainer.h"
27 using namespace Debug;
37 m_container(_container),
40 Trace(DEBUG2) <<
"> DataBlock start == " << start <<
"\n";
41 if (m_container->
fetchData (m_name, m_start, 4) != 4) {
43 Trace(WARNING) <<
" Error reading block name " << start <<
"\n";
46 if (!m_container->
readInt32 (m_container->file(), m_length)) {
48 Trace(WARNING) <<
" Error reading block length " << start <<
"\n";
52 <<
", length " << m_length
53 <<
" at " << m_start <<
"\n";
54 Trace(DEBUG2) <<
"< DataBlock\n";
62 mc->file()->
seek (m_start + DataBlockHeaderLength + off, SEEK_SET);
63 mc->readInt8 (mc->file(), ret);
71 mc->file()->
seek (m_start + DataBlockHeaderLength + off, SEEK_SET);
72 mc->readUInt8 (mc->file(), ret);
80 mc->file()->
seek (m_start + DataBlockHeaderLength + off, SEEK_SET);
85 std::string DataBlock::string_val(off_t off)
90 s = mc->
fetchData(buf, m_start + DataBlockHeaderLength + off, 8);
101 MRWContainer::MRWContainer(IO::Stream *_file, off_t offset)
102 : IFDFileContainer(_file, offset)
121 if ((p[0] == 0x00) && (p[1] ==
'M') &&
122 (p[2] ==
'R') && (p[3] ==
'M')) {
124 Trace(DEBUG1) <<
"Identified MRW file\n";
129 Trace(DEBUG1) <<
"Unidentified MRW file\n";
139 Trace(DEBUG1) <<
"> MRWContainer::locateDirsPreHook()\n";
140 m_endian = ENDIAN_BIG;
144 if (mrm->name() !=
"MRM") {
145 Trace(WARNING) <<
"MRW file begins not with MRM block, "
146 "but with unrecognized DataBlock :: name == "
147 << mrm->name() <<
"\n";
154 position = mrm->offset() + MRW::DataBlockHeaderLength;
155 while (position < pixelDataOffset()) {
157 Trace(DEBUG1) <<
"Loaded DataBlock :: name == " << ref->name() <<
"\n";
158 if(!ref || !ref->loaded()) {
161 if (ref->name() ==
"PRD") {
163 Trace(WARNING) <<
"File contains duplicate DataBlock :: name == "
164 << ref->name() <<
"\n";
168 else if (ref->name() ==
"TTW") {
170 Trace(WARNING) <<
"File contains duplicate DataBlock :: name == "
171 << ref->name() <<
"\n";
175 else if (ref->name() ==
"WBG") {
177 Trace(WARNING) <<
"File contains duplicate DataBlock :: name == "
178 << ref->name() <<
"\n";
182 else if (ref->name() ==
"RIF") {
184 Trace(WARNING) <<
"File contains duplicate DataBlock :: name == "
185 << ref->name() <<
"\n";
189 else if (ref->name() !=
"PAD") {
190 Trace(WARNING) <<
"File contains unrecognized DataBlock :: name == "
191 << ref->name() <<
"\n";
193 position = ref->offset() + MRW::DataBlockHeaderLength + ref->length();
198 Trace(WARNING) <<
"File does NOT contain expected DataBlock :: name == PRD\n";
202 Trace(WARNING) <<
"File does NOT contain expected DataBlock :: name == TTW\n";
206 Trace(WARNING) <<
"File does NOT contain expected DataBlock :: name == WBG\n";
210 Trace(WARNING) <<
"File does NOT contain expected DataBlock :: name == RIF\n";
215 if (fetchData (version, prd->offset()+MRW::DataBlockHeaderLength+MRW::PRD_VERSION, 8) != 8) {
217 Debug::Trace(DEBUG1) <<
" Error reading version string\n";
220 m_version = std::string (version);
221 Trace(DEBUG1) <<
" MRW file version == " << m_version <<
"\n";
226 m_offset = ttw->offset() + MRW::DataBlockHeaderLength;
227 if((version[2] !=
'7') || (version[3] !=
'3')) {
228 setExifOffsetCorrection(m_offset);
229 Trace(DEBUG1) <<
"setting correction to " << m_offset <<
"\n";
231 m_file->seek (m_offset, SEEK_SET);
232 Trace(DEBUG1) <<
"< MRWContainer\n";