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 + -
显示快捷键?