@@ -130,6 +130,7 @@ namespace Exiv2 {
130130 { " Minolta" , minoltaId, newIfdMn, newIfdMn2 },
131131 { " NIKON" , ifdIdNotSet, newNikonMn, 0 }, // mnGroup_ is not used
132132 { " OLYMPUS" , ifdIdNotSet, newOlympusMn, 0 }, // mnGroup_ is not used
133+ { " OM Digital" , olympus2Id, newOMSystemMn, newOMSystemMn2 },
133134 { " Panasonic" , panasonicId, newPanasonicMn, newPanasonicMn2 },
134135 { " PENTAX" , ifdIdNotSet, newPentaxMn, 0 }, // mnGroup_ is not used
135136 { " RICOH" , ifdIdNotSet, newPentaxMn, 0 }, // mnGroup_ is not used
@@ -330,6 +331,60 @@ namespace Exiv2 {
330331 return sizeOfSignature ();
331332 } // Olympus2MnHeader::write
332333
334+ const byte OMSystemMnHeader::signature_[] = {
335+ ' O' , ' M' , ' ' , ' S' , ' Y' , ' S' , ' T' , ' E' , ' M' , 0x00 , 0x00 , 0x00 , ' I' , ' I' , 0x04 , 0x00
336+ };
337+
338+ uint32_t OMSystemMnHeader::sizeOfSignature ()
339+ {
340+ return sizeof (signature_);
341+ }
342+
343+ OMSystemMnHeader::OMSystemMnHeader ()
344+ {
345+ read (signature_, sizeOfSignature (), invalidByteOrder);
346+ }
347+
348+ OMSystemMnHeader::~OMSystemMnHeader ()
349+ {
350+ }
351+
352+ uint32_t OMSystemMnHeader::size () const
353+ {
354+ return header_.size_ ;
355+ }
356+
357+ uint32_t OMSystemMnHeader::ifdOffset () const
358+ {
359+ return sizeOfSignature ();
360+ }
361+
362+ uint32_t OMSystemMnHeader::baseOffset (uint32_t mnOffset) const
363+ {
364+ return mnOffset;
365+ }
366+
367+ bool OMSystemMnHeader::read (const byte* pData,
368+ uint32_t size,
369+ ByteOrder /* byteOrder*/ )
370+ {
371+ if (!pData || size < sizeOfSignature ()) return false ;
372+ header_.alloc (sizeOfSignature ());
373+ std::memcpy (header_.pData_ , pData, header_.size_ );
374+ if ( static_cast <uint32_t >(header_.size_ ) < sizeOfSignature ()
375+ || 0 != memcmp (header_.pData_ , signature_, sizeOfSignature () - 2 )) {
376+ return false ;
377+ }
378+ return true ;
379+ } // OMSystemMnHeader::read
380+
381+ uint32_t OMSystemMnHeader::write (IoWrapper& ioWrapper,
382+ ByteOrder /* byteOrder*/ ) const
383+ {
384+ ioWrapper.write (signature_, sizeOfSignature ());
385+ return sizeOfSignature ();
386+ } // OMSystemMnHeader::write
387+
333388 const byte FujiMnHeader::signature_[] = {
334389 ' F' , ' U' , ' J' , ' I' , ' F' , ' I' , ' L' , ' M' , 0x0c , 0x00 , 0x00 , 0x00
335390 };
@@ -900,6 +955,25 @@ namespace Exiv2 {
900955 return new TiffIfdMakernote (tag, group, mnGroup, new Olympus2MnHeader);
901956 }
902957
958+ TiffComponent* newOMSystemMn (uint16_t tag,
959+ IfdId group,
960+ IfdId mnGroup,
961+ const byte* /* pData*/ ,
962+ uint32_t size,
963+ ByteOrder /* byteOrder*/ )
964+ {
965+ // Require at least the header and an IFD with 1 entry
966+ if (size < OMSystemMnHeader::sizeOfSignature () + 18 ) return 0 ;
967+ return newOMSystemMn2 (tag, group, mnGroup);
968+ }
969+
970+ TiffComponent* newOMSystemMn2 (uint16_t tag,
971+ IfdId group,
972+ IfdId mnGroup)
973+ {
974+ return new TiffIfdMakernote (tag, group, mnGroup, new OMSystemMnHeader);
975+ }
976+
903977 TiffComponent* newFujiMn (uint16_t tag,
904978 IfdId group,
905979 IfdId mnGroup,
0 commit comments