Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
		}
	}
}
Example #8
0
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(); 
}
Example #9
0
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;
}
Example #10
0
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, 
				&params
				) )
		{
			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;
}