fileman.cpp

来自「手机文件浏览器 Here are the sources to SMan v1.」· C++ 代码 · 共 433 行 · 第 1/2 页

CPP
433
字号
						progressText->SetTextL(dataBuffer);
						progressText->InsertDeleteCharsL(progressText->TextLength(), fileList->At(currentFile), TCursorSelection(0, 0));
						progressText->InsertDeleteCharsL(progressText->TextLength(), _L(" -> "), TCursorSelection(0, 0));
						progressText->InsertDeleteCharsL(progressText->TextLength(), targetPath, TCursorSelection(0, 0));
						dataBuffer = dataBuffer->ReAllocL(dataBuffer->Length() + 5);
						delete dataBuffer;
						TBuf<5> temp;
						temp.Copy(_L(""));
						temp.Append(CEditableText::ELineBreak);
						temp.Append(CEditableText::ELineBreak);
						progressText->InsertDeleteCharsL(progressText->TextLength(), temp, TCursorSelection(0, 0));
						dataBuffer = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_SAMELOCATION);
						progressText->InsertDeleteCharsL(progressText->TextLength(), *dataBuffer, TCursorSelection(0, 0));
						delete dataBuffer;
						displayPromptDialog(EFalse);
					}
					if (userRet == EEikBidAbort)
						break;
				}
			}
		}
	}
	static_cast<CSMan2AppUi*>(CEikonEnv::Static()->EikAppUi())->iFileView->clipBoard->Reset();
	static_cast<CSMan2AppUi*>(CEikonEnv::Static()->EikAppUi())->iFileView->fillListBox(originalPath);
	if (progressDialog)
		delete progressDialog; // close the dialog
	User::Heap().Compress();
}

void CSManFileMan::displayPromptDialog(TBool showOverwrite)
{
	updateErrorMsg(progressText);
	TPtrC text = progressText->Text()->Read(0, progressText->TextLength());
	CFileManLogDialog *askUser = new (ELeave) CFileManLogDialog();
	askUser->progressValue = progressBar->CurrentValue();
	askUser->text.Set(text);
	askUser->showOverwrite = showOverwrite;
	// Fading flag set and unset to reduce screen flicker
	progressDialog->DrawableWindow()->SetNonFading(ETrue);
	userRet = askUser->ExecuteLD(R_DIALOG_FILEMANPROGRESS_WAIT);
	progressDialog->DrawableWindow()->SetNonFading(EFalse);
	progressDialog->DrawNow();
}

void CSManFileMan::updateText(CEikGlobalTextEditor *textEdit)
{
	HBufC *opDesc;
	TFileName srcFile, trgFile;
	
	switch (fileMan->CurrentAction())
	{
		case CFileMan::ECopy: 
			opDesc = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_COPYING);
			break;
		case CFileMan::EDelete:
			opDesc = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_DELETING);
			break;
		case CFileMan::ERmDir:
			opDesc = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_DELETING);
			break;
		case CFileMan::EMove: 
			opDesc = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_MOVING);
			break;
		case CFileMan::ERename: 
			if (currentOperation != isPaste)
				opDesc = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_RENAMING);
			else
				opDesc = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_DELETING);
			break;
		default: 
			opDesc = HBufC::NewL(2);
			opDesc->Des().Copy(_L(""));
			break;
	}
	textEdit->SetTextL(opDesc);
	delete opDesc;
	fileMan->GetCurrentSource(srcFile);
	
	textEdit->InsertDeleteCharsL(textEdit->TextLength(), srcFile, TCursorSelection(0, 0));
	if ((fileMan->CurrentAction() == CFileMan::ECopy) || (fileMan->CurrentAction() == CFileMan::EMove) || (fileMan->CurrentAction() == CFileMan::ERename))
	{
		fileMan->GetCurrentTarget(trgFile);
		textEdit->InsertDeleteCharsL(textEdit->TextLength(), _L(" -> "), TCursorSelection(0, 0));
		textEdit->InsertDeleteCharsL(textEdit->TextLength(), trgFile, TCursorSelection(0, 0));
	}
	textEdit->SetCursorPosL(textEdit->TextLength(), 0);
}

void CSManFileMan::updateErrorMsg(CEikGlobalTextEditor *textEdit)
{
	TInt err = fileMan->GetLastError();
	if (err == KErrNone)
		return;
		
	TFileManError error = fileMan->GetMoreInfoAboutError();
	
	HBufC *errorMsg = NULL;
	if (error == EInitializationFailed)
		errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_INITFAILURE);
	else if (error == EScanNextDirectoryFailed)
		errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRSCANSUBFOLDER);
	else if (error == ESrcOpenFailed)
		errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERROPENSOURCE);
	else if ((error == ETrgOpenFailed) || (err == KErrAlreadyExists))
		errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_CANTWRITETARGET);
	else if (error == ENoExtraInformation)
	{
		// Not sure if ALL of these will ever appear. I've included them only because
		// the constant name seems reasonable....
		if (err == KErrPathNotFound)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRPATHNOTFOUND);
		else if (err == KErrWrite)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRWRITE);
		else if (err == KErrDiskFull)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRDISKFULL);
		else if (err == KErrAccessDenied)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRACCESSDENIED);
		else if (err == KErrNotReady)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRDEVNOTREADY);
		else if (err == KErrLocked)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRFILELOCK);
		else if (err == KErrDisMounted)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRDEVDISMOUNT);
		else if (err == KErrDirFull)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRDIRFULL);
		else if (err == KErrInUse)
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRSOURCELOCK);
		else
		{
			TBuf<10> genErr;
			genErr.Format(_L("%d"), err);
			errorMsg = CEikonEnv::Static()->AllocReadResourceL(R_TBUF_FILEMAN_ERRGENERAL);
			errorMsg->Des().Append(genErr);
		}
	}
	TBuf<5> newLine;
	newLine.Append(CEditableText::ELineBreak);
	newLine.Append(CEditableText::ELineBreak);
	textEdit->InsertDeleteCharsL(textEdit->TextLength(), newLine, TCursorSelection(0, 0));
	textEdit->InsertDeleteCharsL(textEdit->TextLength(), *errorMsg, TCursorSelection(0, 0));
	delete errorMsg;
}

MFileManObserver::TControl CSManFileMan::NotifyFileManStarted()
{
	progressBar->SetAndDraw(0);
	updateText(progressText);
	progressText->DrawNow();
	currentBytes = 0;
	totalBytes = fileMan->CurrentEntry().iSize;
	return MFileManObserver::EContinue;
}

MFileManObserver::TControl CSManFileMan::NotifyFileManOperation()
{
	currentBytes += fileMan->BytesTransferredByCopyStep();
	if (totalBytes > 0)
		progressBar->SetAndDraw(TInt((TReal(currentBytes) / TReal(totalBytes)) * 100));
	return MFileManObserver::EContinue;
}

MFileManObserver::TControl CSManFileMan::NotifyFileManEnded()
{
	MFileManObserver::TControl retVal;
	
	retVal = MFileManObserver::EContinue;
	TInt err = fileMan->GetLastError();
	if (err != KErrNone)
	{
		if (userRet == EEikBidSkipAll)
			return MFileManObserver::ECancel;

		//TFileManError error = fileMan->GetMoreInfoAboutError();
		//updateErrorMsg(progressText, err, error);
		
		// Must be careful with this dialog. We can get stuck in an endless loop:
		// 1. error occurs. user choses to overwrite all
		// 2. the overwrite operation fails
		// 3. since overwrite all is set, it will try to overwrite again
		// 4. but overwrite fails. loop back to #3.
		// So we have to check the flags carefully. If overwrite fails while overwrite
		// all is set, we prompt the user again
//		if ((userRet != EEikBidOverwriteAll) && (fileMan->GetLastError() == KErrAlreadyExists))
		if ((userRet != EEikBidOverwriteAll) || ((userRet == EEikBidOverwriteAll) && (prevOverwriteStatus != KErrNone)))
		{
			if (currentOperation == isPaste)
				displayPromptDialog(ETrue);
			else
				displayPromptDialog(EFalse);
		}
		
		if ((userRet == EEikBidOverwrite) || (userRet == EEikBidOverwriteAll))
		{
			// delete the target
			TFileName trgFile;
			fileMan->GetCurrentTarget(trgFile);
			if (fileMan->CurrentEntry().IsDir())
			{
				trgFile.Append(_L("\\"));
				CFileMan *tempFM;
				tempFM = CFileMan::NewL(fileServer);
				prevOverwriteStatus = tempFM->RmDir(trgFile);
				delete tempFM;
			}
			else
				prevOverwriteStatus = EikFileUtils::DeleteFile(trgFile);
			retVal = MFileManObserver::ERetry;
		}
		else if (userRet == EEikBidSkip)
			retVal = MFileManObserver::ECancel;
		else if (userRet == EEikBidAbort)
			retVal = MFileManObserver::EAbort;
	}
	progressBar->SetAndDraw(100);
	return retVal;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?