void ProcessFile(const Formats::Archived::File& file) const { Logger(file); if (const Binary::Container::Ptr subData = file.GetData()) { const String subPath = file.GetName(); const ZXTune::DataLocation::Ptr subLocation = CreateNestedLocation(BaseLocation, subData, SubPlugin, subPath); const std::auto_ptr<Module::DetectCallback> nestedProgressCallback = Logger.CreateNestedCallback(); Module::Detect(subLocation, *nestedProgressCallback); } Logger.Next(); }
DataLocation::Ptr Open(const Parameters::Accessor& /*params*/, DataLocation::Ptr location, const Analysis::Path& inPath) const override { const String& pathComp = inPath.GetIterator()->Get(); std::size_t offset = 0; if (RawPath.GetIndex(pathComp, offset)) { const Binary::Container::Ptr inData = location->GetData(); const Binary::Container::Ptr subData = inData->GetSubcontainer(offset, inData->Size() - offset); return CreateNestedLocation(location, subData, Description->Id(), pathComp); } return DataLocation::Ptr(); }
virtual DataLocation::Ptr Open(const Parameters::Accessor& /*commonParams*/, DataLocation::Ptr location, const Analysis::Path& inPath) const { const Binary::Container::Ptr rawData = location->GetData(); if (const Formats::Archived::Container::Ptr archive = Decoder->Decode(*rawData)) { if (const Formats::Archived::File::Ptr fileToOpen = FindFile(*archive, inPath)) { if (const Binary::Container::Ptr subData = fileToOpen->GetData()) { return CreateNestedLocation(location, subData, Description->Id(), fileToOpen->GetName()); } } } return DataLocation::Ptr(); }
Analysis::Result::Ptr DetectModulesInArchive(const Parameters::Accessor& params, Plugin::Ptr plugin, const Formats::Packed::Decoder& decoder, DataLocation::Ptr inputData, const Module::DetectCallback& callback) { const Binary::Container::Ptr rawData = inputData->GetData(); if (Formats::Packed::Container::Ptr subData = decoder.Decode(*rawData)) { const Module::CustomProgressDetectCallbackAdapter noProgressCallback(callback); const String subPlugin = plugin->Id(); const String subPath = EncodeArchivePluginToPath(subPlugin); const DataLocation::Ptr subLocation = CreateNestedLocation(inputData, subData, subPlugin, subPath); Module::Detect(params, subLocation, noProgressCallback); return Analysis::CreateMatchedResult(subData->PackedSize()); } const Binary::Format::Ptr format = decoder.GetFormat(); return Analysis::CreateUnmatchedResult(format, rawData); }
DataLocation::Ptr OpenDataFromArchive(Plugin::Ptr plugin, const Formats::Packed::Decoder& decoder, DataLocation::Ptr inputData, const Analysis::Path& pathToOpen) { const String pathComponent = pathToOpen.GetIterator()->Get(); if (!IsArchivePluginPathComponent(pathComponent)) { return DataLocation::Ptr(); } const String pluginId = DecodeArchivePluginFromPathComponent(pathComponent); if (pluginId != plugin->Id()) { return DataLocation::Ptr(); } const Binary::Container::Ptr rawData = inputData->GetData(); if (Formats::Packed::Container::Ptr subData = decoder.Decode(*rawData)) { return CreateNestedLocation(inputData, subData, pluginId, pathComponent); } return DataLocation::Ptr(); }