void GifImage::readMetadata() { #ifdef DEBUG std::cerr << "Exiv2::GifImage::readMetadata: Reading GIF file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isGifType(*io_, true)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "GIF"); } clearMetadata(); byte buf[4]; if (io_->read(buf, sizeof(buf)) == sizeof(buf)) { pixelWidth_ = getShort(buf, littleEndian); pixelHeight_ = getShort(buf + 2, littleEndian); } } // GifImage::readMetadata
void XmpSidecar::readMetadata() { #ifdef DEBUG std::cerr << "Reading XMP file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isXmpType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "XMP"); } // Read the XMP packet from the IO stream std::string xmpPacket; const long len = 64 * 1024; byte buf[len]; long l; while ((l = io_->read(buf, len)) > 0) { xmpPacket.append(reinterpret_cast<char*>(buf), l); } if (io_->error()) throw Error(14); clearMetadata(); xmpPacket_ = xmpPacket; if (xmpPacket_.size() > 0 && XmpParser::decode(xmpData_, xmpPacket_)) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Failed to decode XMP metadata.\n"; #endif } copyXmpToIptc(xmpData_, iptcData_); copyXmpToExif(xmpData_, exifData_); } // XmpSidecar::readMetadata
void XmpSidecar::writeMetadata() { if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); if (writeXmpFromPacket() == false) { copyExifToXmp(exifData_, xmpData_); copyIptcToXmp(iptcData_, xmpData_); if (XmpParser::encode(xmpPacket_, xmpData_, XmpParser::omitPacketWrapper|XmpParser::useCompactFormat) > 1) { #ifndef SUPPRESS_WARNINGS EXV_ERROR << "Failed to encode XMP metadata.\n"; #endif } } if (xmpPacket_.size() > 0) { if (xmpPacket_.substr(0, 5) != "<?xml") { xmpPacket_ = xmlHeader + xmpPacket_; } BasicIo::AutoPtr tempIo(io_->temporary()); // may throw assert(tempIo.get() != 0); // Write XMP packet if ( tempIo->write(reinterpret_cast<const byte*>(xmpPacket_.data()), static_cast<long>(xmpPacket_.size())) != static_cast<long>(xmpPacket_.size())) throw Error(21); if (tempIo->error()) throw Error(21); io_->close(); io_->transfer(*tempIo); // may throw } } // XmpSidecar::writeMetadata
void RafImage::readMetadata() { #ifdef DEBUG std::cerr << "Reading RAF file " << io_->path() << "\n"; #endif if (io_->open() != 0) throw Error(9, io_->path(), strError()); IoCloser closer(*io_); // Ensure that this is the correct image type if (!isRafType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "RAF"); } byte const* pData = io_->mmap(); long size = io_->size(); if (size < 88 + 4) throw Error(14); // includes the test for -1 uint32_t const start = getULong(pData + 84, bigEndian) + 12; if (static_cast<uint32_t>(size) < start) throw Error(14); clearMetadata(); ByteOrder bo = TiffParser::decode(exifData_, iptcData_, xmpData_, pData + start, size - start); exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(pData + 84, bigEndian); exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(pData + 88, bigEndian); setByteOrder(bo); } // RafImage::readMetadata
void CrwImage::readMetadata() { #ifdef DEBUG std::cerr << "Reading CRW file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isThisType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(33); } clearMetadata(); // Read the image into a memory buffer long imageSize = io_->size(); DataBuf image(imageSize); io_->read(image.pData_, imageSize); if (io_->error() || io_->eof()) throw Error(14); // Parse the image RawMetadata::AutoPtr parseTree(new CiffHeader); parseTree->read(image.pData_, image.size_, 0, invalidByteOrder); #ifdef DEBUG parseTree->print(std::cerr, invalidByteOrder); #endif parseTree->extract(*this, invalidByteOrder); } // CrwImage::readMetadata
TiffImage::TiffImage(BasicIo::AutoPtr io, bool create) : Image(mdExif | mdComment), io_(io) { if (create) { IoCloser closer(*io_); io_->open(); } } // TiffImage::TiffImage
MrwImage::MrwImage(BasicIo::AutoPtr io, bool create) : Image(mdExif | mdIptc), io_(io) { if (create) { IoCloser closer(*io_); io_->open(); } } // MrwImage::MrwImage
int goodLeft(Cell maze[][16],int mx,int my,int dir) { switch (dir) { case EAST: return (openNorth(maze,mx,my) && closer(&maze[mx][my],&maze[mx][my + 1])); break; case SOUTH: return (openEast(maze,mx,my) && closer(&maze[mx][my],&maze[mx + 1][my])); break; case WEST: return (openSouth(maze,mx,my) && closer(&maze[mx][my],&maze[mx][my - 1])); break; case NORTH: return (openWest(maze,mx,my) && closer(&maze[mx][my],&maze[mx - 1][my])); break; default: return 0; } }
static int _getifaddrs(int domain, char* buffer, size_t len, struct ifaddrs** previous) { int socket = ::socket(domain, SOCK_DGRAM, 0); if (socket < 0) return -1; FileDescriptorCloser closer(socket); // Get interfaces configuration ifconf config; config.ifc_buf = buffer; config.ifc_len = len; if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0) return -1; ifreq* interfaces = (ifreq*)buffer; ifreq* end = (ifreq*)(buffer + config.ifc_len); while (interfaces < end) { struct ifaddrs* current = new(std::nothrow) ifaddrs(); if (current == NULL) { errno = B_NO_MEMORY; return -1; } // Chain this interface with the next one current->ifa_next = *previous; *previous = current; current->ifa_name = strdup(interfaces[0].ifr_name); current->ifa_addr = copy_address(interfaces[0].ifr_addr); current->ifa_netmask = NULL; current->ifa_dstaddr = NULL; current->ifa_data = NULL; ifreq request; strlcpy(request.ifr_name, interfaces[0].ifr_name, IF_NAMESIZE); if (ioctl(socket, SIOCGIFFLAGS, &request, sizeof(struct ifreq)) == 0) current->ifa_flags = request.ifr_flags; if (ioctl(socket, SIOCGIFNETMASK, &request, sizeof(struct ifreq)) == 0) { current->ifa_netmask = copy_address(request.ifr_mask); } if (ioctl(socket, SIOCGIFDSTADDR, &request, sizeof(struct ifreq)) == 0) { current->ifa_dstaddr = copy_address(request.ifr_dstaddr); } // Move on to next interface interfaces = (ifreq*)((uint8_t*)interfaces + _SIZEOF_ADDR_IFREQ(interfaces[0])); } return 0; }
XmpSidecar::XmpSidecar(BasicIo::AutoPtr io, bool create) : Image(ImageType::xmp, mdXmp, io) { if (create) { if (io_->open() == 0) { IoCloser closer(*io_); io_->write(reinterpret_cast<const byte*>(xmlHeader), xmlHdrCnt); } } } // XmpSidecar::XmpSidecar
I find_toplevel(char const c, I i, I const e) { for(;;) { if(i == e) return e; else if(*i == c) return i; else if(char const cl = closer(*i)) i = find_toplevel(cl, i+1, e)+1; else ++i; } }
int CrwImage::initImage(const byte initData[], long dataSize) { if (io_->open() != 0) { return 4; } IoCloser closer(*io_); if (io_->write(initData, dataSize) != dataSize) { return 4; } return 0; } // CrwImage::initImage
int ImageFactory::getType(BasicIo& io) { if (io.open() != 0) return ImageType::none; IoCloser closer(io); for (unsigned int i = 0; registry_[i].imageType_ != ImageType::none; ++i) { if (registry_[i].isThisType_(io, false)) { return registry_[i].imageType_; } } return ImageType::none; } // ImageFactory::getType
status_t BNetworkRoster::GetNextInterface(uint32* cookie, BNetworkInterface& interface) const { // TODO: think about caching the interfaces! if (cookie == NULL) return B_BAD_VALUE; // get a list of all interfaces int socket = ::socket(AF_INET, SOCK_DGRAM, 0); if (socket < 0) return errno; FileDescriptorCloser closer(socket); ifconf config; config.ifc_len = sizeof(config.ifc_value); if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0) return errno; size_t count = (size_t)config.ifc_value; if (count == 0) return B_BAD_VALUE; char* buffer = (char*)malloc(count * sizeof(struct ifreq)); if (buffer == NULL) return B_NO_MEMORY; MemoryDeleter deleter(buffer); config.ifc_len = count * sizeof(struct ifreq); config.ifc_buf = buffer; if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0) return errno; ifreq* interfaces = (ifreq*)buffer; ifreq* end = (ifreq*)(buffer + config.ifc_len); for (uint32 i = 0; interfaces < end; i++) { interface.SetTo(interfaces[0].ifr_name); if (i == *cookie) { (*cookie)++; return B_OK; } interfaces = (ifreq*)((uint8*)interfaces + _SIZEOF_ADDR_IFREQ(interfaces[0])); } return B_BAD_VALUE; }
ON_2dPoint BBNode::getClosestPointEstimate(const ON_3dPoint &pt, ON_Interval &u, ON_Interval &v) { if (isLeaf()) { double uvs[5][2] = {{m_u.Min(), m_v.Min()}, {m_u.Max(), m_v.Min()}, {m_u.Max(), m_v.Max()}, {m_u.Min(), m_v.Max()}, {m_u.Mid(), m_v.Mid()} }; /* include the estimate */ ON_3dPoint corners[5]; const ON_Surface *surf = m_face->SurfaceOf(); u = m_u; v = m_v; /* ??? pass these in from SurfaceTree::surfaceBBox() to avoid * this recalculation? */ if (!surf->EvPoint(uvs[0][0], uvs[0][1], corners[0]) || !surf->EvPoint(uvs[1][0], uvs[1][1], corners[1]) || !surf->EvPoint(uvs[2][0], uvs[2][1], corners[2]) || !surf->EvPoint(uvs[3][0], uvs[3][1], corners[3])) { throw new std::exception(); /* FIXME */ } corners[4] = BBNode::m_estimate; /* find the point on the surface closest to pt */ size_t mini = 0; double mindist = pt.DistanceTo(corners[mini]); double tmpdist; for (size_t i = 1; i < 5; i++) { tmpdist = pt.DistanceTo(corners[i]); TRACE("\t" << mindist << " < " << tmpdist); if (tmpdist < mindist) { mini = i; mindist = tmpdist; } } TRACE("Closest: " << mindist << "; " << PT2(uvs[mini])); return ON_2dPoint(uvs[mini][0], uvs[mini][1]); } else { if (m_children.size() > 0) { BBNode *closestNode = m_children[0]; for (size_t i = 1; i < m_children.size(); i++) { closestNode = closer(pt, closestNode, m_children[i]); TRACE("\t" << PT(closestNode->m_estimate)); } return closestNode->getClosestPointEstimate(pt, u, v); } throw new std::exception(); } }
void MrwImage::readMetadata() { #ifdef DEBUG std::cerr << "Reading MRW file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isMrwType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "MRW"); } clearMetadata(); // Find the TTW block and read it into a buffer uint32_t const len = 8; byte tmp[len]; io_->read(tmp, len); uint32_t pos = len; uint32_t const end = getULong(tmp + 4, bigEndian); pos += len; if (pos > end) throw Error(14); io_->read(tmp, len); if (io_->error() || io_->eof()) throw Error(14); while (memcmp(tmp + 1, "TTW", 3) != 0) { uint32_t const siz = getULong(tmp + 4, bigEndian); pos += siz; if (pos > end) throw Error(14); io_->seek(siz, BasicIo::cur); if (io_->error() || io_->eof()) throw Error(14); pos += len; if (pos > end) throw Error(14); io_->read(tmp, len); if (io_->error() || io_->eof()) throw Error(14); } DataBuf buf(getULong(tmp + 4, bigEndian)); io_->read(buf.pData_, buf.size_); if (io_->error() || io_->eof()) throw Error(14); ByteOrder bo = TiffParser::decode(exifData_, iptcData_, xmpData_, buf.pData_, buf.size_); setByteOrder(bo); } // MrwImage::readMetadata
void JpegBase::writeMetadata() { if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); BasicIo::AutoPtr tempIo(io_->temporary()); // may throw assert (tempIo.get() != 0); doWriteMetadata(*tempIo); // may throw io_->close(); io_->transfer(*tempIo); // may throw } // JpegBase::writeMetadata
void Socket::Close() { BB_DEBUG_LOG("socket close:%d", GetId()); auto& closer = GetCloseHandler(); if (closer) closer(); if (is_open()) { boost::system::error_code ec; this->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); if (ec && ec != boost::system::errc::not_connected) { BB_ERROR_LOG("shutdown socket error:%s", ec.message().c_str()); } else { this->close(); } } }
void PgfImage::writeMetadata() { if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); BasicIo::AutoPtr tempIo(new MemIo); assert (tempIo.get() != 0); doWriteMetadata(*tempIo); // may throw io_->close(); io_->transfer(*tempIo); // may throw } // PgfImage::writeMetadata
void XmpSidecar::writeMetadata() { if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); if (writeXmpFromPacket() == false) { copyExifToXmp(exifData_, xmpData_); copyIptcToXmp(iptcData_, xmpData_); // #1112 - restore dates if they lost their TZ info for ( Exiv2::Dictionary_i it = dates_.begin() ; it != dates_.end() ; it++) { std::string sKey = it->first; Exiv2::XmpKey key(sKey); if ( xmpData_.findKey(key) != xmpData_.end() ) { std::string value_orig(it->second); std::string value_now(xmpData_[sKey].value().toString()); // std::cout << key << " -> " << value_now << " => " << value_orig << std::endl; if ( value_orig.find(value_now.substr(0,10)) != std::string::npos ) { xmpData_[sKey] = value_orig ; } } } if (XmpParser::encode(xmpPacket_, xmpData_, XmpParser::omitPacketWrapper|XmpParser::useCompactFormat) > 1) { #ifndef SUPPRESS_WARNINGS EXV_ERROR << "Failed to encode XMP metadata.\n"; #endif } } if (xmpPacket_.size() > 0) { if (xmpPacket_.substr(0, 5) != "<?xml") { xmpPacket_ = xmlHeader + xmpPacket_ + xmlFooter; } BasicIo::AutoPtr tempIo(io_->temporary()); // may throw assert(tempIo.get() != 0); // Write XMP packet if ( tempIo->write(reinterpret_cast<const byte*>(xmpPacket_.data()), static_cast<long>(xmpPacket_.size())) != static_cast<long>(xmpPacket_.size())) throw Error(21); if (tempIo->error()) throw Error(21); io_->close(); io_->transfer(*tempIo); // may throw } } // XmpSidecar::writeMetadata
void PgfImage::readMetadata() { #ifdef DEBUG std::cerr << "Exiv2::PgfImage::readMetadata: Reading PGF file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isPgfType(*io_, true)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "PGF"); } clearMetadata(); readPgfMagicNumber(*io_); uint32_t headerSize = readPgfHeaderSize(*io_); readPgfHeaderStructure(*io_, &pixelWidth_, &pixelHeight_); // And now, the most interresting, the user data byte array where metadata are stored as small image. long size = 8 + headerSize - io_->tell(); #ifdef DEBUG std::cout << "Exiv2::PgfImage::readMetadata: Found Image data (" << size << " bytes)\n"; #endif if (size < 0) throw Error(20); if (size == 0) return; DataBuf imgData(size); std::memset(imgData.pData_, 0x0, imgData.size_); long bufRead = io_->read(imgData.pData_, imgData.size_); if (io_->error()) throw Error(14); if (bufRead != imgData.size_) throw Error(20); Image::AutoPtr image = Exiv2::ImageFactory::open(imgData.pData_, imgData.size_); image->readMetadata(); exifData() = image->exifData(); iptcData() = image->iptcData(); xmpData() = image->xmpData(); } // PgfImage::readMetadata
size_t BNetworkRoster::CountInterfaces() const { int socket = ::socket(AF_INET, SOCK_DGRAM, 0); if (socket < 0) return 0; FileDescriptorCloser closer(socket); ifconf config; config.ifc_len = sizeof(config.ifc_value); if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) != 0) return 0; return (size_t)config.ifc_value; }
void TgaImage::readMetadata() { #ifdef DEBUG std::cerr << "Exiv2::TgaImage::readMetadata: Reading TARGA file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isTgaType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "TGA"); } clearMetadata(); /* The TARGA header goes as follows -- all numbers are in little-endian byte order: offset length name description ====== ======= ======================= =========== 0 1 byte ID length length of image ID (0 to 255) 1 1 byte color map type 0 = no color map; 1 = color map included 2 1 byte image type 0 = no image; 1 = uncompressed color-mapped; 2 = uncompressed true-color; 3 = uncompressed black-and-white; 9 = RLE-encoded color mapped; 10 = RLE-encoded true-color; 11 = RLE-encoded black-and-white 3 5 bytes color map specification 8 2 bytes x-origin of image 10 2 bytes y-origin of image 12 2 bytes image width 14 2 bytes image height 16 1 byte pixel depth 17 1 byte image descriptor */ byte buf[18]; if (io_->read(buf, sizeof(buf)) == sizeof(buf)) { pixelWidth_ = getShort(buf + 12, littleEndian); pixelHeight_ = getShort(buf + 14, littleEndian); } } // TgaImage::readMetadata
void BmpImage::readMetadata() { #ifdef DEBUG std::cerr << "Exiv2::BmpImage::readMetadata: Reading Windows bitmap file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isBmpType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "BMP"); } clearMetadata(); /* The Windows bitmap header goes as follows -- all numbers are in little-endian byte order: offset length name description ====== ======= ===================== ======= 0 2 bytes signature always 'BM' 2 4 bytes bitmap size 6 4 bytes reserved 10 4 bytes bitmap offset 14 4 bytes header size 18 4 bytes bitmap width 22 4 bytes bitmap height 26 2 bytes plane count 28 2 bytes depth 30 4 bytes compression 0 = none; 1 = RLE, 8 bits/pixel; 2 = RLE, 4 bits/pixel; 3 = bitfield; 4 = JPEG; 5 = PNG 34 4 bytes image size size of the raw bitmap data, in bytes 38 4 bytes horizontal resolution (in pixels per meter) 42 4 bytes vertical resolution (in pixels per meter) 46 4 bytes color count 50 4 bytes important colors number of "important" colors */ byte buf[54]; if (io_->read(buf, sizeof(buf)) == sizeof(buf)) { pixelWidth_ = getLong(buf + 18, littleEndian); pixelHeight_ = getLong(buf + 22, littleEndian); } } // BmpImage::readMetadata
Image::AutoPtr ImageFactory::open(BasicIo::AutoPtr io) { Image::AutoPtr image; IoCloser closer(*io); if (io->open() != 0) return image; Registry::const_iterator b = registry_->begin(); Registry::const_iterator e = registry_->end(); for (Registry::const_iterator i = b; i != e; ++i) { if (i->second.isThisType(*io, false)) { image = i->second.newInstance(io, false); break; } } return image; } // ImageFactory::open
Image::Type ImageFactory::getType(BasicIo& io) { IoCloser closer(io); if (io.open() != 0) return Image::none; Image::Type type = Image::none; Registry::const_iterator b = registry_->begin(); Registry::const_iterator e = registry_->end(); for (Registry::const_iterator i = b; i != e; ++i) { if (i->second.isThisType(io, false)) { type = i->first; break; } } return type; } // ImageFactory::getType
status_t BNetworkRoster::AddInterface(const char* name) { int socket = ::socket(AF_INET, SOCK_DGRAM, 0); if (socket < 0) return errno; FileDescriptorCloser closer(socket); ifaliasreq request; memset(&request, 0, sizeof(ifaliasreq)); strlcpy(request.ifra_name, name, IF_NAMESIZE); if (ioctl(socket, SIOCAIFADDR, &request, sizeof(request)) != 0) return errno; return B_OK; }
status_t BNetworkRoster::RemoveInterface(const char* name) { int socket = ::socket(AF_INET, SOCK_DGRAM, 0); if (socket < 0) return errno; FileDescriptorCloser closer(socket); ifreq request; strlcpy(request.ifr_name, name, IF_NAMESIZE); request.ifr_addr.sa_family = AF_UNSPEC; if (ioctl(socket, SIOCDIFADDR, &request, sizeof(request)) != 0) return errno; return B_OK; }
void XmpSidecar::readMetadata() { #ifdef DEBUG std::cerr << "Reading XMP file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isXmpType(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "XMP"); } // Read the XMP packet from the IO stream std::string xmpPacket; const long len = 64 * 1024; byte buf[len]; long l; while ((l = io_->read(buf, len)) > 0) { xmpPacket.append(reinterpret_cast<char*>(buf), l); } if (io_->error()) throw Error(14); clearMetadata(); xmpPacket_ = xmpPacket; if (xmpPacket_.size() > 0 && XmpParser::decode(xmpData_, xmpPacket_)) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Failed to decode XMP metadata.\n"; #endif } // #1112 - store dates to deal with loss of TZ information during conversions for (Exiv2::XmpData::const_iterator it = xmpData_.begin(); it != xmpData_.end(); ++it) { std::string key(it->key()); if ( key.find("Date") != std::string::npos ) { std::string value(it->value().toString()); dates_[key] = value; } } copyXmpToIptc(xmpData_, iptcData_); copyXmpToExif(xmpData_, exifData_); } // XmpSidecar::readMetadata
void Cr2Image::readMetadata() { #ifdef DEBUG std::cerr << "Reading CR2 file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isCr2Type(*io_, false)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "CR2"); } clearMetadata(); TiffParser::decode(this, io_->mmap(), io_->size(), TiffCreator::create, Cr2Decoder::findDecoder); } // Cr2Image::readMetadata