bool ArchiveFilter::Filtered(const GUID* puidModule, const GUID* puidPlugin, const GUID* puidFormat) { for (unsigned int i = 0; i < m_pStopFilters.count(); i++) { ArchiveFilterEntry* pFE = m_pStopFilters[i]; if ( !pFE->IsEnabled() || !pFE->IsValid() ) continue; bool bFormatFiltered = (pFE->IsAllFormats() || (puidFormat && (pFE->GetFormat()->GetUID() == *puidFormat))); bool bPluginFiltered = bFormatFiltered && (pFE->IsAllPlugins() || (puidPlugin && (pFE->GetPlugin()->GetUID() == *puidPlugin))); bool bModuleFiltered = bPluginFiltered && (pFE->IsAllModules() || (puidModule && (pFE->GetModule()->GetUID() == *puidModule))); if ( bModuleFiltered ) return true; } return false; }
//бля, это пиздец int ArchiveModuleManager::QueryArchives( const TCHAR* lpFileName, const unsigned char* pBuffer, DWORD dwBufferSize, Array<ArchiveFormat*>& result ) { bool bStopped = false; //BADBAD if ( !dwBufferSize ) { result.reset(); return 0; }; ArchiveFilter* pFilter = m_pConfig->GetFilter(); Array<ArchiveFilterEntry*> filters; pFilter->Reset(); pFilter->QueryFilters(lpFileName, filters, bStopped); for (unsigned int i = 0; i < filters.count(); i++) { ArchiveFilterEntry* pFE = filters[i]; ArchiveModule* pModule = pFE->GetModule(); bool bNoPluginsFiltered = true; bool bNoFormatsFiltered = true; if ( !pFilter->Filtered(&pModule->GetUID(), NULL, NULL) ) { if ( pFE->IsAllPlugins() ) { Array<ArchivePlugin*>& plugins = pModule->GetPlugins(); for (unsigned int i = 0; i < plugins.count(); i++) { ArchivePlugin* pPlugin = plugins[i]; if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), NULL) ) { if ( pModule->QueryCapability(AMF_SUPPORT_SINGLE_PLUGIN_QUERY) ) { Array<ArchiveFormat*>& formats = pPlugin->GetFormats(); for (unsigned int j = 0; j < formats.count(); j++) { ArchiveFormat* pFormat = formats[i]; if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), &pFormat->GetUID()) ) { if ( pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), &pFormat->GetUID(), lpFileName, pBuffer, dwBufferSize, result); } else bNoFormatsFiltered = false; } if ( bNoFormatsFiltered && !pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), NULL, lpFileName, pBuffer, dwBufferSize, result); } else bNoPluginsFiltered = false; } if ( bNoPluginsFiltered && !pModule->QueryCapability(AMF_SUPPORT_SINGLE_PLUGIN_QUERY) ) pModule->QueryArchives(NULL, NULL, lpFileName, pBuffer, dwBufferSize, result); } } else { if ( pFE->IsAllFormats() ) { ArchivePlugin* pPlugin = pFE->GetPlugin(); if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), NULL) ) { Array<ArchiveFormat*>& formats = pPlugin->GetFormats(); for (unsigned int i = 0; i < formats.count(); i++) { ArchiveFormat* pFormat = formats[i]; if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), &pFormat->GetUID()) ) { if ( pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), &pFormat->GetUID(), lpFileName, pBuffer, dwBufferSize, result); } else bNoFormatsFiltered = false; } if ( bNoFormatsFiltered && !pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), NULL, lpFileName, pBuffer, dwBufferSize, result); } } else { ArchiveFormat* pFormat = pFE->GetFormat(); ArchivePlugin* pPlugin = pFE->GetPlugin(); if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), &pFormat->GetUID()) ) { if ( pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), &pFormat->GetUID(), lpFileName, pBuffer, dwBufferSize, result); } } } } pFilter->AddStopFilter(filters[i]); } if ( !bStopped && pFilter->UseRemaining() ) { for (unsigned int i = 0; i < m_pModules.count(); i++) { bool bNoPluginsFiltered = true; bool bNoFormatsFiltered = true; ArchiveModule* pModule = m_pModules[i]; if ( !pFilter->Filtered(&pModule->GetUID(), NULL, NULL) ) { Array<ArchivePlugin*>& plugins = pModule->GetPlugins(); for (unsigned int j = 0; j < plugins.count(); j++) { ArchivePlugin* pPlugin = plugins[j]; if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), NULL) ) { Array<ArchiveFormat*>& formats = pPlugin->GetFormats(); for (unsigned int k = 0; k < formats.count(); k++) { ArchiveFormat* pFormat = formats[k]; if ( !pFilter->Filtered(&pModule->GetUID(), &pPlugin->GetUID(), &pFormat->GetUID()) ) { if ( pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), &pFormat->GetUID(), lpFileName, pBuffer, dwBufferSize, result); } else bNoFormatsFiltered = false; } if ( bNoFormatsFiltered && !pPlugin->QueryCapability(APF_SUPPORT_SINGLE_FORMAT_QUERY) ) pModule->QueryArchives(&pPlugin->GetUID(), NULL, lpFileName, pBuffer, dwBufferSize, result); } else bNoPluginsFiltered = false; } if ( bNoPluginsFiltered && !pModule->QueryCapability(AMF_SUPPORT_SINGLE_PLUGIN_QUERY) ) pModule->QueryArchives(NULL, NULL, lpFileName, pBuffer, dwBufferSize, result); } } } return 0; }