chxavfileui.cpp

来自「著名的 helix realplayer 基于手机 symbian 系统的 播放」· C++ 代码 · 共 1,125 行 · 第 1/3 页

CPP
1,125
字号
            // file exists; confirm that delete is ok
            TPtrC name = NameFromIndex(idxItem);
	    if(CHXAvMessageDialog::DoQueryL(CHXAvCleanString(R_CONF_OVERWRITE_ITEM_FORMAT, name)()) )
	    {
                // user opts to overwrite target...
                const CHXAvFileStore::Entries& entries = m_spStore->GetEntries();
                const TEntry& entry = entries[idxItem].m_entry;
	        err = m_spStore->MoveItemL(idxItem, pathDest, entry.iName, true /*overwrite*/);
	    }
            else
            {
                // user opted not to overwrite target; prompt for new target name
                err = DoPromptMoveItemHelperL(pathDest, idxItem);
            }
        }
    }

    return err;
}

////////////////////////////////////////////////////////////
// move a file from disk; if successful, delete the name from the
// current list
//
// if successful, 'text items' are updated and 'remove indexes' contains
// indexes of deleted items
//
// pathDest               - absolute or relative to current root
//
// idxItem                - index of item in current folder path
//
TInt CHXAvFileUI::MoveItemHelperL(const TDesC& pathDest, TInt idxItem)
{
    DPRINTF(SYMP_FILE_UI, ("AvFileUI::MoveItemHelperL(): moving item %d to '%s'\n", idxItem, dbg::CharPtr(pathDest)()));
    SUSPEND_REFRESH(m_spStore);

    const CHXAvFileStore::Entries& entries = m_spStore->GetEntries();

    HX_ASSERT(idxItem < entries.Nelements());
    TInt err = KErrGeneral;
    if( idxItem < entries.Nelements())
    {
	HX_ASSERT(m_spStore->PathExistsL(pathDest, KNullDesC));
 
        if(!m_spStore->IsSafeFileNameLengthL(pathDest, idxItem))
        {
            // name can't fit in target path; prompt for safer (smaller) name
            err = DoPromptMoveItemHelperL(pathDest, idxItem);
        }
        else if(m_spStore->NameExistsInTargetPathL(pathDest, idxItem))
	{
            err = DoOverwriteMoveItemHelperL(pathDest, idxItem); 
	}
	else
	{
            const TEntry& entry = entries[idxItem].m_entry;

	    // target doesn't exist; go ahead and move
	    err = m_spStore->MoveItemL(idxItem, pathDest, entry.iName, false /*rename*/);
	}
    }

    HandleDiskFullCase(err);

    return err;
}

////////////////////////////////////////////////////
// prompt user to select a folder via a pop-up 
// folder navigation list
//
// set folder name in working buffer if folder is selected
//
bool CHXAvFileUI::DoGetTargetFolderPathL(TInt resIdPrompt, TInt resIdSelectButton)
{
    m_targetFolderPath.Zero();

    CHXAvPathSelector selector;
    selector.InitL(m_playerUI->GetMediaStoreInfoL(), resIdPrompt, resIdSelectButton);

    bool bSelected = selector.PromptUserSelectPathL();
    if( bSelected )
    {
        m_targetFolderPath.Copy(selector.GetSelectedPath());
    }

    return bSelected;
    
}


////////////////////////////////////////////////////////////
// delete selected item
//
// return KErrCancel if user cancels
//
TInt CHXAvFileUI::DoDeleteItemL(TInt idxItem)
{
    TInt err = KErrCancel;
    SUSPEND_REFRESH(m_spStore);

    const CHXAvFileStore::Entries& entries = m_spStore->GetEntries();
    const TEntry& entry = entries[idxItem].m_entry;

    bool bUserConfirmed = false;
    if( entry.IsDir() )
    {
        bUserConfirmed = CHXAvMessageDialog::DoQueryL(R_CONF_DELETE_FOLDER);
    }
    else
    {
        TPtrC name = NameFromIndex(idxItem);
        bUserConfirmed = CHXAvMessageDialog::DoQueryL(CHXAvCleanString(R_CONF_DELETE_ITEM_FORMAT, name)());
    }
    
    if( bUserConfirmed )
    {
        CHXAvCleanString msg(R_NOW_DELETING_ITEM_FORMAT, NameFromIndex(idxItem));
        //CHXAvCleanString msg(R_NOW_DELETING);
        m_spWaitNote->SetTextL(msg());
        //EnableWaitNoteCancelButtonL(true);
        m_spWaitNote->StartAndKickL();
        
    	err = m_spStore->DeleteItemL(idxItem);
        m_spWaitNote->EndL();
	if(IsNonCancelError(err))
	{
            CHXAvMessageDialog::DoAlertErrorL(CHXAvCleanString(R_ERR_DELETE_FAILED)());
	}
    }

    return err;
}

////////////////////////////////////////////////////////////
// delete multiple items (query just once)
//
// only files (not folder) may be deleted this way
//
// return KErrCancel if user cancels
//
TInt CHXAvFileUI::DoDeleteItemsL(const CArrayFix<TInt>& items)
{
    SUSPEND_REFRESH(m_spStore);
    
    TInt count = items.Count();

    //
    // confirm with user
    //
    bool bUserConfirmed = false;
    if( 1 == count )
    {
        TPtrC name = NameFromIndex(items[0]);
        bUserConfirmed = CHXAvMessageDialog::DoQueryL(CHXAvCleanString(R_CONF_DELETE_ITEM_FORMAT, name)());
    }
    else
    {
        bUserConfirmed = CHXAvMessageDialog::DoQueryL(CHXAvCleanString(R_CONF_DELETE_MULT_ITEMS_FORMAT, count)());
    }

    //
    // do the deed if user said 'ok'
    //
    TInt err = KErrCancel;
    if(bUserConfirmed)
    {
        
        m_spWaitNote->SetTextL(CHXAvCleanString(R_NOW_DELETING_MULT_ITEMS_FORMAT, count)());
        //EnableWaitNoteCancelButtonL(true);
        m_spWaitNote->StartAndKickL();

	for( TInt idx = 0; idx < count; ++idx )
	{
	    TInt idxDeleteItem = items[idx];
	    HX_ASSERT(!m_spStore->GetEntries()[idxDeleteItem].m_entry.IsDir()); // folders can't be in multiple item list!
	    
	    err = m_spStore->DeleteItemL(idxDeleteItem);
	    if(IsNonCancelError(err))
	    {
		// XXXLCM ask to continue/cancel?
		break;
	    }
	}

        m_spWaitNote->EndL();
        if( IsNonCancelError(err) )
        {
            CHXAvMessageDialog::DoAlertErrorL(CHXAvCleanString(R_ERR_DELETE_FAILED)());	   
        }

    }

    return err;
}

////////////////////////////////////////////////////
// show error message if err indicates disk full
void CHXAvFileUI::HandleDiskFullCase(TInt err)
{
    // display error message if copy failed due to low disk space
    if( KErrDiskFull == err || KErrNoMemory == err)
    {
        CHXAvMessageDialog::DoSystemErrorNoteL(err);
    }
}

////////////////////////////////////////////////////
// prompt user for a new name for the currently
// hilighted file or folder
//
TInt CHXAvFileUI::DoRenameL(TInt idxItem, TInt resIdPrompt)
{
    DPRINTF(SYMP_FILE_UI, ("CHXAvFileUI::DoRenameL(): idx = \n", idxItem));

    SUSPEND_REFRESH(m_spStore);

    const CHXAvFileStore::Entries& entries = m_spStore->GetEntries();

    HX_ASSERT(idxItem < entries.Nelements());
    const TEntry& entry = entries[idxItem].m_entry;

    TInt err = KErrGeneral;
    TUint flags = 0;
    if(entry.IsDir())
    {
        flags |= fWantFolder;
    }

    // get new file name...
    QueryTargetNameResult res = QueryTargetNameL(CHXAvCleanString(resIdPrompt)(), 
				m_spStore->GetCurrentPath(), 
				entry.iName, flags); 
    switch (res)
    {
        case qtrUnique:
        case qtrOverwrite:
            // got name...
	    err = m_spStore->MoveItemL(idxItem, m_nameBuf, res == qtrOverwrite, true /*use rename*/);
            break;
        case qtrAbort:
	    // user canceled
	    err = KErrCancel;
            break;
        default:
            err = KErrGeneral;
            break;
    }

    if(IsNonCancelError(err))
    {
        HandleDiskFullCase(err);
        CHXAvMessageDialog::DoAlertErrorL(CHXAvCleanString(R_ERR_RENAME_FAILED)());
    }

    DPRINTF(SYMP_FILE_UI, ("CHXAvFileUI::DoRenameL(): exit\n"));
    return err;
}

////////////////////////////////////////
// query folder name, then do save link
// to that folder
TInt
CHXAvFileUI::DoCreateLinkL(const CHXString& url, const TDesC& defaultName)
{
    TInt err = KErrCancel;
    bool bGotIt = DoGetTargetFolderPathL(R_PROMPT_SAVE_TO, R_AVP_SAVE_BUTTON_TEXT);
    if(bGotIt)
    {
	err = DoCreateLinkL(m_targetFolderPath, url, defaultName);
    }
    return err;
}
////////////////////////////////////////
// create a link file pointing to the given
// URL in the given folder
//
// return KErrCancel if user cancels
//
TInt
CHXAvFileUI::DoCreateLinkL(const TDesC& folder, 
			   const CHXString& url, 
                           const TDesC& defaultName)
{  
    TInt err = KErrGeneral;

    TFileName* pDefaultName = CHXAvFile::AllocFileNameL(defaultName);
    AUTO_PUSH_POP_DEL(pDefaultName);
    if( pDefaultName->Length() == 0 )
    {
        // no default name given...
        CHXAvCleanString lastResortName(R_DEFAULT_NEW_LINK_NAME);
        pDefaultName->Copy(lastResortName());
    }
    pDefaultName->Append(CHXAvUtil::KLinkFileExt);

    // get a unique name within destination folder
    QueryTargetNameResult res = QueryTargetNameL(CHXAvCleanString(R_PROMPT_ENTER_SAVE_NAME)(), 
					folder, *pDefaultName, fSuggestUniqueDefaultName);
    // XXXLCM check for low disk?
    switch (res)
    {
        case qtrUnique:
        case qtrOverwrite:
            // got name...
            {
	        FILE* pFile = m_spStore->OpenFileL(folder, m_nameBuf, "wt");
	        if(pFile)
	        {
	            ::fprintf(pFile, "%s\n", static_cast<const char*>(url));
	            ::fclose(pFile);
                    err = KErrNone;
                    CHXAvMessageDialog::DoAlertConfirmL(CHXAvCleanString(R_INFO_LINK_SAVED)());
	        }
                else
                {
                    err = KErrGeneral;
                }
            }
            break;
        case qtrAbort:
	    // user canceled
	    err = KErrCancel;
            break;
        default:
            err = KErrGeneral;
            break;
    }

    if( IsNonCancelError(err) )
    {
        HandleDiskFullCase(err);
        CHXAvMessageDialog::DoAlertErrorL(CHXAvCleanString(R_ERR_CREATE_LINK_FAILED)());
    }

    return err;
}

void CHXAvFileUI::UserCancelPendingFileOp()
{
    DPRINTF(SYMP_FILE_UI, ("CHXAvFileUI::UserCancelPendingFileOp()\n"));
    m_bIsCancelOpPending = true;
#if defined(ASYNC_COPYMOVE)
    m_spStore->CancelAsyncFileOp();
#endif
}

void CHXAvFileUI::OnFileOpStart(FileStoreOperationObserver::OperationType type, const TDesC& source, const TDesC& target)
{
    //DPRINTF(SYMP_FILE_UI, ("CHXAvFileUI::OnFileOpStart(): op = %d; src = '%s'; dst = '%s'\n", type,  dbg::CharPtr(source)(), dbg::CharPtr(target)()));
    m_bIsCancelOpPending = false;
}

bool CHXAvFileUI::OnFileOpTick(FileStoreOperationObserver::OperationType type, const TDesC& source, const TDesC& target, TInt64 cbCopied)
{
    //DPRINTF(SYMP_FILE_UI, ("CHXAvFileUI::OnFileOpTick(): op = %d; src = '%s'; dst = '%s'; cb = %lu\n", type,  dbg::CharPtr(source)(), dbg::CharPtr(target)(), cbCopied.Low()));
    return !m_bIsCancelOpPending;
}

void CHXAvFileUI::OnFileOpEnd(FileStoreOperationObserver::OperationType type, TInt err, const TDesC& source, const TDesC& target)
{
    //DPRINTF(SYMP_FILE_UI, ("CHXAvFileUI::OnFileOpEnd(): op = %d; err = %d, src = '%s'; dst = '%s'\n", type, err, dbg::CharPtr(source)(), dbg::CharPtr(target)()));
    
    m_bIsCancelOpPending = false;
}









⌨️ 快捷键说明

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