⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m3directory.cpp

📁 symbian uiq 例子代码,功能包括文件断点续传、编辑通讯录、后台短信回复等
💻 CPP
字号:
/*
 * Copyright (c) 2007,苏州丰达
 * All rights reserved.
 * 版权所有(C)2007-2008 苏州丰达 
 * 公司地址:中国,江苏省苏州市 
 * 网址:http://www.
 *
 * 文件名称:M3Directory.cpp
 * 摘 要:
 *
 * 产品版本:彩视 1.0
 *
 * 作 者:xxxx
 * 创建日期:xxxxx
 * 负责人:xxxxx
 *
 * 修改者:司治国
 * 修改日期:2008.1.17
 *
 * 编译器或环境等描述:uiqsdk2.1
 * 适用于VC2003+symbian 7.x的环境开发。
 *
 **/
#include "M3Directory.h"
#include "M3ScanObject.h"

_LIT(KPath, "%S%S");
_LIT(KPathMask, "%S%S\\");

/*
 *	默认构造
 */
M3Directory::M3Directory() : iHasDrive(EFalse), iNumSelected(0), iZip(NULL)
{
}

M3Directory::~M3Directory()
{
    DelTemporary();
	if (iTxtArray)
	{
		iTxtArray->Reset();
		delete iTxtArray;
		iTxtArray = NULL;
	}
	if (iParse)
	{
		delete iParse;
		iParse = NULL;
	}
	if (iFmgr)
	{
		delete iFmgr;
		iFmgr = NULL;
	}
	if (iSelected)
	{
		iSelected->Reset();
		delete iSelected;
		iSelected = NULL;
	}
	if (iTemporary)
	{
		iTemporary->Reset();
		delete iTemporary;
		iTemporary = NULL;
	}
    if (iZip)
    {
        delete iZip;
    }
	if (iFs)
	{
		iFs->Close();
		delete iFs;
		iFs = NULL;
	}
}

void M3Directory::GetList(CDesCArray *aTxtArray)
{
    aTxtArray->Reset();
    iTxtArray->Reset();
    if (!iHasDrive)
    {
        GetDriveList(aTxtArray);
    }
    else if (InZipFile())
    {
        GetZipList(aTxtArray);
    }
    else
    {
        GetDirList(aTxtArray);
    }
}

/*
 *	得到盘符列表
 *  @param aTxtArray
 */
void M3Directory::GetDriveList(CDesCArray *aTxtArray)
{
    TDriveList aList;
    iFs->DriveList(aList);
    for (TInt i = 0; i < KMaxDrives; i++)
    {
        if (aList[i])
        {
            TChar aDrive;
            iFs->DriveToChar(i, aDrive);
            TBuf<KMaxDirSize> item;
            item.Format(_L("2 \t%c:"), aDrive);
            aTxtArray->AppendL(item);
            item.Format(_L("%c"), aDrive);
            iTxtArray->AppendL(item);
        }
    }
}

/*
 *	得到目录列表
 */
void M3Directory::GetDirList(CDesCArray *txtArray)
{
    TPtrC aName = iParse->DriveAndPath();
    CDir *aFileList;
    txtArray->AppendL(_L("2\t.."));
    iTxtArray->AppendL(_L(".."));
    if (iFs->GetDir(aName, KEntryAttMaskSupported, EDirsFirst | ESortByName, aFileList) != KErrNone)
    {
        return ;
    }
    for (TInt i = 0; i < aFileList->Count(); i++)
    {
        TEntry aEntry = (*aFileList)[i];
        TBuf<KMaxDirSize> item;
        if (aEntry.IsDir())
        {
            item.Format(_L("2\t[%S]"), &aEntry.iName);
        }
        else
        {
            item.Format(_L("1\t%S"), &aEntry.iName);
        }
        if (IsSelected(i + 1))
        {
            TBuf<KMaxDirSize> item_tmp;
            item_tmp.Copy(item);
            item.Format(_L("* %S"), &item_tmp);
        }
        txtArray->AppendL(item);
        item.Format(_L("%S"), &(*aFileList)[i].iName);
        iTxtArray->AppendL(item);
    }
	delete aFileList;
	aFileList = NULL;
}

TInt M3Directory::EnterItem(TInt idx)
{
    DelTemporary();
    TPtrC itemtxt = (*iTxtArray)[idx];
    if (!iHasDrive)
    {
        TBuf<KMaxDirSize> dir;
        dir.Format(_L("%c:\\"), itemtxt[0]);
        iParse->Set(dir, NULL, NULL);
        iHasDrive = ETrue;
    }
    else if (idx == 0)
    {
        UpDir();
    }
    else if (IsDir(itemtxt))
    {
        iParse->AddDir(itemtxt);
    }
    else if (InZipFile())
    {
        TPtrC tmp = _L("$$tmp$$");
        MkDir(tmp);
        iParse->AddDir(tmp);
        CopyZip(itemtxt, GetPath());
        StartDocument(idx);
        iTemporary->AppendL(GetPath());
        iParse->PopDir();
        return 0;
    }
    else
    {
        TParse parse;
        parse.Set(itemtxt, NULL, NULL);
        TBuf<4> ext = parse.Ext();
        ext.LowerCase();
        if (!ext.Compare(_L(".zip")))
        {
            OpenZip(itemtxt);
        }
        else
        {
            StartDocument(idx);
            return 0;
        }
    }
    return 1;
}

TInt M3Directory::StartDocument(TInt idx)
{
    TBuf<KMaxDirSize> file;
    file.Format(KPath, &GetPath(), &GetFile(idx));
    if (file.Length() > KMaxDirSize)
    {
        return 0;
    }
    RApaLsSession rSession;
    TThreadId iThread;
    rSession.Connect();
    rSession.StartDocument(file, iThread);
    rSession.Close();
    return 0;
}

void M3Directory::UpDir()
{
    if (InZipFile())
    {
        iParse->Set(GetPath(), NULL, NULL);
        CloseZip();
    }
    else if (iParse->IsRoot())
    {
        iHasDrive = EFalse;
    }
    else
    {
        iParse->PopDir();
    }
}
TPtrC M3Directory::GetPath()
{
    return iParse->DriveAndPath();
}
TPtrC M3Directory::GetFile(TInt idx)
{
    return (*iTxtArray)[idx];
}
TParse * M3Directory::GetParse()
{
    return iParse;
}

TInt M3Directory::FindPath(TPtrC path)
{
    TInt i;
    TPtrC aPath = iParse->DriveAndPath();
    TBuf<KMaxDirSize> dir;
    for (i = 1; i < iTxtArray->Count(); i++)
    {
        TPtrC itemTxt = (*iTxtArray)[i];
        dir.Format(KPathMask, &aPath, &itemTxt);
        if (!dir.Compare(path))
        {
            return i;
        }
    }
    return 0;
}

TBool M3Directory::SetPath(TPtrC path)
{
    iParse->Set(path, NULL, NULL);
    iHasDrive = iParse->DrivePresent();
    return iHasDrive;
}

TBool M3Directory::HasDrive()
{
    return iHasDrive;
}

TBool M3Directory::InZipFile()
{
    return iZip != NULL;
}
TBool M3Directory::IsDir(TPtrC file)
{
    TPtrC aPath = iParse->DriveAndPath();
    TBuf<KMaxDirSize> dir;
    dir.Format(KPath, &aPath, &file);
    TEntry fileEntry;
    iFs->Entry(dir, fileEntry);
    if (fileEntry.IsDir())
    {
        return ETrue;
    }
    return EFalse;
}
TBool M3Directory::IsSelected(TInt idx)
{
    if (iSelected->Count() <= idx)
    {
        return EFalse;
    }
    return (*iSelected)[idx];
}

TInt M3Directory::SelectedCount()
{
    return iNumSelected;
}

void M3Directory::ClearSelection()
{
    iSelected->Reset();
    iNumSelected = 0;
}

TInt M3Directory::DeleteFile(TInt idx, TBool rec/* =EFalse */)
{
    TPtrC src = (*iTxtArray)[idx];
    TBuf<KMaxDirSize> dir;
    dir.Format(_L("%S\\"), &src);
    iFs->SetSessionPath(GetPath());
    if (!IsDir(src))
    {
        iFmgr->Delete(src);
    }
    else
    {
        if (rec)
        {
            M3DfsDelete fo(iFs);
            FileDfs(&fo, dir);
        }
        else if (iFs->RmDir(dir) != KErrNone)
        {
            return 1;
        }
    }
    return 0;
}

TInt M3Directory::MkDir(TPtrC newDir)
{
    TPtrC path = GetPath();
    TBuf<KMaxDirSize> dir;
    dir.Format(KPathMask, &path, &newDir);
    iFs->MkDir(dir);
    return 0;
}

void M3Directory::FileDfs(M3ScanObject *fo, TPtrC path)
{
    if (!fo->EnterDirectory(path))
    {
        return;
    }
    CDir *aFileList;
    if (iFs->GetDir(path, KEntryAttMaskSupported, EDirsFirst | ESortByName, aFileList) != KErrNone)
    {
        return;
    }
    for (TInt i = 0; i < aFileList->Count(); i++)
    {
        TEntry aEntry = (*aFileList)[i];
        if (aEntry.IsDir())
        {
            fo->FileAction(path, aEntry.iName);
        }
        else
        {
            TBuf<KMaxDirSize> newPath;
            newPath.Format(KPathMask, &path, &aEntry.iName);
        }
    }
    fo->LeaveAction(path);
}
void M3Directory::OpenZip(TPtrC zip)
{
    TBuf<KMaxDirSize> fullname;
    fullname.Format(KPath, &GetPath(), &zip);
    iZip = new CZipFile(*iFs, fullname);
    iZip->OpenL();
}
void M3Directory::CloseZip()
{
    iZip->Close();
    delete iZip;
    iZip = NULL;
}

void M3Directory::CopyZip(TPtrC src, TPtrC trg)
{
    CZipFileMember *entry = iZip->MemberL(src);
    CleanupStack::PushL(entry);
    RZipFileMemberReaderStream *iStream;
    User::LeaveIfError(iZip->GetInputStreamL(entry, iStream));
    CleanupStack::PushL(iStream);
    TFileName name;
    name.Append(trg);
    name.Append(src);
    TInt err = iFs->MkDirAll(name);
    if (err != KErrNone && err != KErrAlreadyExists)
    {
        User::Leave(err);
    }
    RFile out;
    User::LeaveIfError(out.Replace(*iFs, name, EFileShareAny | EFileWrite));
    CleanupClosePushL(out);
    //out.Create(*iFs,src,EFileWrite);
    TUint32 size = entry->UncompressedSize();
    HBufC8 *data = HBufC8::NewLC(size);
    TPtr8 p = data->Des();//Obtain a modifiable descriptor
    iStream->Read(p, size);
    User::LeaveIfError(out.Write(p));
    /*
    while(iStream->Read(chr,512)==KErrNone)
        out.Write(chr);
    out.Write(chr);
    out.Flush();
    out.Close();
    //iStream->Close();
    */
    CleanupStack::PopAndDestroy(4);//?
}
TInt M3Directory::GetFileSizeL(TPtrC fname)
{
    RFile tmpFile;
    TInt aSize = 0;
	if (iFs)
	{
        User::LeaveIfError(tmpFile.Open(*iFs, fname, EFileRead | EFileStream));
	}
    CleanupClosePushL(tmpFile);
    tmpFile.Seek(ESeekEnd, aSize);
    CleanupStack::PopAndDestroy();
    return aSize;
}
void M3Directory::GetZipList(CDesCArray *txtArray)
{
    txtArray->AppendL(_L("8\t.."));
    iTxtArray->AppendL(_L(".."));
    TBuf<KMaxDirSize> item;
    CZipFileMemberIterator *entries = iZip->GetMembersL();
    CleanupStack::PushL(entries);
    CZipFileMember *entry;
    TInt i = 1;
    while (entry = entries->NextL())
    {
        CleanupStack::PushL(entry);
        const TFileName *name = entry->Name();
        item.Format(_L("7\t%S"), name);
        if (IsSelected(i++))
        {
            TBuf<KMaxDirSize> item_tmp;
            item_tmp.Copy(item);
            item.Format(_L("* %S"), &item_tmp);
        }
        txtArray->AppendL(item);
        item.Format(_L("%S"), name);
        iTxtArray->AppendL(item);
        CleanupStack::PopAndDestroy();//entry
    }
    CleanupStack::PopAndDestroy();//entries
}

void M3Directory::DelTemporary()
{
    for (TInt i = 0; i < iTemporary->Count(); i++)
    {
        M3DfsDelete fo(iFs);
        FileDfs(&fo, (*iTemporary)[i]);
    }
    iTemporary->Reset();
}

/*
 *	二步构造
 */
M3Directory* M3Directory::newL()
{
	M3Directory* m3dir = new(ELeave) M3Directory();
	CleanupStack::PushL(m3dir);
	m3dir->ConstructL();
	CleanupStack::Pop(); // self;
	return m3dir;
}

void M3Directory::ConstructL()
{
	//声明文件会话指针
	iFs = new (ELeave) RFs();
	//会话连接
	iFs->Connect();
	iParse = new (ELeave) TParse();
	iTxtArray = new (ELeave) CDesCArrayFlat(16);
	iFmgr = CFileMan::NewL(*iFs);
	iSelected = new CArrayFixFlat<TInt>(16);
	iTemporary = new (ELeave) CDesCArrayFlat(2);
}

⌨️ 快捷键说明

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