int ArchivePanel::MakeDirectory(const TCHAR* lpDirectory) { OnStartOperation(OPERATION_ADD, nullptr); int nResult = RESULT_ERROR; ArchiveItemArray items; ArchiveItem *item = items.add(); item->lpFileName = lpDirectory; item->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; nResult = m_pArchive->AddFiles(items, _T(""), nullptr); if ( nResult == RESULT_ERROR ) { string strCommand; if ( GetCommand(COMMAND_ADD, strCommand) ) { string strTempPath; TCHAR* lpTempPath = strTempPath.GetBuffer(260); #ifdef UNICODE FSF.MkTemp(lpTempPath, 260, _T("NADT")); #else FSF.MkTemp(lpTempPath, _T("NADT")); #endif strTempPath.ReleaseBuffer(); string strFullTempPath = strTempPath; AddEndSlash(strFullTempPath); strFullTempPath += lpDirectory; apiCreateDirectoryEx(strFullTempPath); ExecuteStruct ES(items); ES.lpCurrentDiskPath = strTempPath; ES.lpCommand = strCommand; nResult = m_pArchive->ExecuteAsOperation(OPERATION_ADD, ExecuteCommand, &ES); } } return nResult; }
int ArchiveModule::Delete( HANDLE hArchive, const ArchiveItemArray& items ) { DeleteStruct DS; DS.hArchive = hArchive; DS.pItems = items.data(); DS.uItemsNumber = items.count(); if ( m_pfnModuleEntry (FID_DELETE, (void*)&DS) == NAERROR_SUCCESS ) return DS.nResult; return RESULT_ERROR; }
int ArchiveModule::Test( HANDLE hArchive, const ArchiveItemArray& items ) { TestStruct TS; TS.hArchive = hArchive; TS.pItems = items.data(); TS.uItemsNumber = items.count(); if ( m_pfnModuleEntry(FID_TEST, (void*)&TS) == NAERROR_SUCCESS ) return TS.nResult; return RESULT_ERROR; }
int ArchiveModule::Extract( HANDLE hArchive, const ArchiveItemArray& items, const TCHAR* lpDestDiskPath, const TCHAR* lpPathInArchive ) { ExtractStruct ES; ES.hArchive = hArchive; ES.pItems = items.data(); ES.uItemsNumber = items.count(); ES.lpDestPath = lpDestDiskPath; ES.lpCurrentPath = lpPathInArchive; if ( m_pfnModuleEntry (FID_EXTRACT, (void*)&ES) == NAERROR_SUCCESS ) return ES.nResult; return RESULT_ERROR; }
int ArchiveModule::AddFiles( HANDLE hArchive, const ArchiveItemArray& items, const TCHAR* lpSourceDiskPath, const TCHAR* lpPathInArchive, const TCHAR* lpConfig ) { AddStruct AS; AS.hArchive = hArchive; AS.lpSourcePath = lpSourceDiskPath; AS.lpCurrentPath = lpPathInArchive; AS.pItems = items.data(); AS.uItemsNumber = items.count(); AS.pConfig = lpConfig; if ( m_pfnModuleEntry (FID_ADD, (void*)&AS) == NAERROR_SUCCESS ) return AS.nResult; return RESULT_ERROR; }
unsigned __int64 GetArchiveItemsToProcessFromNode(ArchiveTreeNode* node, ArchiveItemArray& items) { unsigned __int64 uTotalSize = 0; if ( !node->IsDummy() ) { const ArchiveItem* item = node->GetOriginalItem(); uTotalSize = item->nFileSize; items.add(*item); } for (ArchiveTreeNodesIterator itr = node->children.begin(); itr != node->children.end(); ++itr) uTotalSize += GetArchiveItemsToProcessFromNode(itr->second, items); return uTotalSize; }
void ArchivePanel::GetPanelItemsToProcess( const PluginPanelItem* pPanelItems, int nItemsNumber, ArchiveItemArray &items ) { FarPanelInfo info; m_OS.uTotalFiles = 0; m_OS.uTotalSize = 0; ScanStruct ss; ss.pOS = &m_OS; ss.lpSourcePath = info.GetCurrentDirectory(); ss.items = &items; for (int i = 0; i < nItemsNumber; i++) { ArchiveItem* pItem = items.add(); FindDataToArchiveItem(&pPanelItems[i].FindData, pItem); if ( (pItem->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ) { string strFullName = info.GetCurrentDirectory(); AddEndSlash(strFullName); strFullName += pItem->lpFileName; FSF.FarRecursiveSearch (strFullName, _T("*.*"), (FRSUSERFUNC)ScanDirectory, FRS_RECUR, &ss); } else { m_OS.uTotalFiles++; m_OS.uTotalSize += pItem->nFileSize; } } }
void ArchivePanel::GetArchiveItemsToProcess( const PluginPanelItem *pPanelItems, int nItemsNumber, ArchiveItemArray &items ) { m_OS.uTotalFiles = 0; m_OS.uTotalSize = 0; for (int i = 0; i < nItemsNumber; i++) { const FAR_FIND_DATA *data = &pPanelItems[i].FindData; ArchiveTreeNode* node = (ArchiveTreeNode*)pPanelItems[i].UserData; //ад и кромешный пиздец. отдаем обратно модулю то, что он сам и навыделял. т.е. хоть эти ArchiveItem и новые, данные в них //старые. т.е. удалять их нельзя ни при каких обстоятельствах! m_OS.uTotalSize += GetArchiveItemsToProcessFromNode(node, items); } m_OS.uTotalFiles = items.count(); }
int ArchivePanel::pProcessHostFile( const PluginPanelItem *PanelItem, int ItemsNumber, int OpMode ) { int nMenuItem = -1; if ( (nMenuItem = mnuChooseOperation()) == -1 ) return FALSE; int nCommand = -1; switch ( nMenuItem ) { case MENU_OPERATION_TEST: nCommand = COMMAND_TEST; break; case MENU_OPERATION_ADD_ARCHIVE_COMMENT: nCommand = COMMAND_ARCHIVE_COMMENT; break; case MENU_OPERATION_ADD_FILE_COMMENT: nCommand = COMMAND_FILE_COMMENT; break; case MENU_OPERATION_CONVERT_TO_SFX: nCommand = COMMAND_CONVERT_TO_SFX; break; case MENU_OPERATION_RECOVER: nCommand = COMMAND_RECOVER; break; case MENU_OPERATION_ADD_RECOVERY_RECORD: nCommand = COMMAND_ADD_RECOVERY_RECORD; break; case MENU_OPERATION_LOCK: nCommand = COMMAND_LOCK; break; }; if ( nCommand == -1 ) return FALSE; string strCommand; bool bCommandEnabled = GetCommand(nCommand, strCommand); bool bInternalTest = (nCommand == COMMAND_TEST) && m_pArchive->QueryCapability(AFF_SUPPORT_INTERNAL_TEST); if ( bCommandEnabled || bInternalTest ) { ArchiveItemArray items; if ( OptionIsOn(OpMode, OPM_TOPLEVEL) ) { ArchiveTreeNode* root = m_pArchive->GetRoot(); m_OS.uTotalSize = GetArchiveItemsToProcessFromNode(root, items); m_OS.uTotalFiles = items.count(); } else GetArchiveItemsToProcess(PanelItem, ItemsNumber, items); int nOperationResult = RESULT_ERROR; if ( bInternalTest ) nOperationResult = Test(items); if ( bCommandEnabled && (nOperationResult == RESULT_ERROR) ) { ExecuteStruct ES(items); ES.lpCommand = strCommand; nOperationResult = m_pArchive->ExecuteAsOperation(bInternalTest?OPERATION_TEST:OPERATION_OTHER, ExecuteCommand, &ES); } return nOperationResult == RESULT_SUCCESS; } return FALSE; }
int ArchivePanel::pPutFiles( const PluginPanelItem *PanelItem, int ItemsNumber, int Move, #ifdef UNICODE const wchar_t* SrcPath, #endif int OpMode ) { bool bResult = false; FarPanelInfo info; ArchiveItemArray items; m_bPasswordSet = false; if ( m_pArchive == NULL ) { CreateArchiveParams params; if ( dlgModifyCreateArchive( this, ¶ms ) ) { m_bPasswordSet = true; m_strPassword = params.strPassword; int nSelectedCount = info.GetSelectedItemsCount(); bool bSeparately = params.bSeparateArchives && (nSelectedCount > 1); int nCount = (bSeparately)?nSelectedCount:1; string strArchiveName; for (int el = 0; el < nCount; el++) { if ( bSeparately ) { PluginPanelItem Item; info.GetSelectedItem(el, &Item); items.reset(); //??? GetPanelItemsToProcess(&Item, 1, items); #ifdef UNICODE strArchiveName = FSF.PointToName(Item.FindData.lpwszFileName); #else strArchiveName = FSF.PointToName(Item.FindData.cFileName); #endif if ( (Item.FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY ) CutTo(strArchiveName, _T('.'), true); info.FreePanelItem(&Item); } else { strArchiveName = params.strFileName; PluginPanelItem* pItems = new PluginPanelItem[nSelectedCount]; for (int i = 0; i < nSelectedCount; i++) info.GetSelectedItem(i, &pItems[i]); GetPanelItemsToProcess(pItems, nSelectedCount, items); for (int i = 0; i < nSelectedCount; i++) info.FreePanelItem(&pItems[i]); delete pItems; } if ( !params.bExactName ) { strArchiveName += _T("."); strArchiveName += params.pFormat->GetDefaultExtention(); } string strFullArchiveName = info.GetCurrentDirectory(); AddEndSlash(strFullArchiveName); strFullArchiveName += strArchiveName; //Archive* pArchive = pManager->OpenCreateArchive(params.pFormat, strFullArchiveName, this, Callback, true); //BADBAD, надо убедиться, что отсюда сразу в ClosePlugin попадаем m_pArchive = pManager->OpenCreateArchive(params.pFormat, strFullArchiveName, this, Callback, true); if ( m_pArchive ) bResult = AddFiles(items, info.GetCurrentDirectory(), params.strConfig); } } } else { GetPanelItemsToProcess(PanelItem, ItemsNumber, items); #ifdef UNICODE bResult = AddFiles(items, SrcPath ? SrcPath : info.GetCurrentDirectory(), nullptr); #else bResult = AddFiles(items, info.GetCurrentDirectory(), nullptr); #endif } return bResult; }