Пример #1
0
 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();
 }
Пример #2
0
 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();
 }
Пример #3
0
 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();
 }
Пример #4
0
 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);
 }
Пример #5
0
 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();
 }