📄 oggfiles.cpp
字号:
#endif
}
void TOggFiles::CreateDb(RFs& session)
{
TBuf<256> buf;
CEikonEnv::Static()->ReadResource(buf, R_OGG_STRING_1);
CEikonEnv::Static()->BusyMsgL(buf);
ClearFiles();
AddDirectory(_L("D:\\Media files\\audio\\"),session);
AddDirectory(_L("C:\\documents\\Media files\\audio\\"),session);
AddDirectory(_L("D:\\Media files\\other\\"),session);
AddDirectory(_L("C:\\documents\\Media files\\other\\"),session);
AddDirectory(_L("D:\\Media files\\document\\"),session);
AddDirectory(_L("C:\\documents\\Media files\\document\\"),session);
#if defined(SERIES60)
AddDirectory(_L("C:\\Oggs\\"),session);
AddDirectory(_L("E:\\Oggs\\"),session);
#endif
#ifdef PLAYLIST_SUPPORT
// Parse playlists
TInt numFiles = iFiles->Count();
TInt err;
for (TInt i = 0 ; i<numFiles ; i++)
{
TOggFile* o = (*iFiles)[i];
if (o->FileType() == TOggFile::EPlayList)
{
// Parse the playlist, ignoring any errors.
TRAP(err, ((TOggPlayList*) o)->ScanPlayListL(session, this));
}
}
#endif
CEikonEnv::Static()->BusyMsgCancel();
}
void TOggFiles::AddDirectory(const TDesC& aDir,RFs& session)
{
if (AddDirectoryStart(aDir,session) ==KErrNone) {
while ( !FileSearchIsProcessDone() ) {
FileSearchStepL();
}
}
AddDirectoryStop();
}
TInt TOggFiles::AddDirectoryStart(const TDesC& aDir,RFs& session)
{
TRACE(COggLog::VA(_L("Scanning directory %S for oggfiles"), &aDir ));
// Check if the drive is available (i.e. memory stick is inserted)
#if defined(UIQ)
if (!EikFileUtils::FolderExists(aDir))
#else
// UIQ_? Have had some problems with FolderExists in the WIN emulator (?)
if (!EikFileUtils::PathExists(aDir))
#endif
{
TRACEF(COggLog::VA(_L("Folder %S doesn't exist"), &aDir ));
return KErrNotFound;
}
if (iPathArray == NULL)
{
iPathArray = new (ELeave) CDesC16ArrayFlat (3);
iDs = CDirScan::NewL(session);
iDirScanFinished = EFalse;
iPlayListScanFinished = EFalse;
iDirScanSession = &session;
iDirScanDir = const_cast < TDesC *> (&aDir);
iNbDirScanned = 0;
iNbFilesFound = 0;
iNbPlayListsFound = 0;
iCurrentIndexInDirectory = 0;
iCurrentDriveIndex = 0;
iDirectory=NULL;
TRAPD(err,iDs->SetScanDataL(aDir,KEntryAttNormal,ESortByName|EAscending,CDirScan::EScanDownTree));
if (err!=KErrNone)
{
TRACEF(COggLog::VA(_L("Unable to setup scan directory %S for oggfiles"), &aDir ));
delete iDs; iDs=0;
return KErrNotFound;
}
}
iPathArray->AppendL(aDir);
return KErrNone;
}
void TOggFiles::AddDirectoryStop()
{
delete iDs; iDs=0;
delete iDirectory; iDirectory = 0;
if (iOggPlayback)
iOggPlayback->ClearComments();
if (iPathArray)
iPathArray->Reset();
delete iPathArray; iPathArray = 0;
}
void TOggFiles::FileSearchStepL()
{
if (iCurrentIndexInDirectory == 0)
{
// Add New directory
if (!NextDirectory())
return;
}
for (; iCurrentIndexInDirectory<iDirectory->Count(); iCurrentIndexInDirectory++)
{
// Add new files
if (AddNextFileL())
break;
}
if (iCurrentIndexInDirectory == iDirectory->Count())
{
// Go to next directory
iCurrentIndexInDirectory = 0;
}
}
TBool TOggFiles::NextDirectory()
{
// Move on to the next directory
delete iDirectory;
iDirectory = NULL;
TRAPD(err,iDs->NextL(iDirectory));
if (err!=KErrNone)
{
TRACEF(COggLog::VA(_L("Unable to scan directory %S for oggfiles"), &iDirScanDir ));
delete iDs; iDs=0;
iDirScanFinished = ETrue;
return EFalse;
}
if (iDirectory==0)
{
// No more files in that drive.
// Any other drive to search in?
iCurrentDriveIndex++;
if (iCurrentDriveIndex < iPathArray->Count() ){
// More drives to search
TRAPD(err,iDs->SetScanDataL((*iPathArray)[iCurrentDriveIndex],
KEntryAttNormal,ESortByName|EAscending,CDirScan::EScanDownTree));
if (err!=KErrNone)
{
TPtrC aBuf((*iPathArray)[iCurrentDriveIndex]);
TRACEF(COggLog::VA(_L("Unable to setup scan directory %S for oggfiles"), &aBuf ));
delete iDs; iDs=0;
iDirScanFinished = ETrue;
}
return EFalse;
}
else
{
// No more directories to search
iDirScanFinished = ETrue;
return EFalse;
}
}
iNbDirScanned++;
return ETrue;
}
TBool TOggFiles::AddNextFileL()
{
TBuf<256> shortname;
TBool fileFound = EFalse;
const TEntry e= (*iDirectory)[iCurrentIndexInDirectory];
iFullname.Copy(iDs->FullPath());
iFullname.Append(e.iName);
TParsePtrC p(iFullname);
if (IsSupportedAudioFile(p))
{
shortname.Copy(e.iName);
shortname.Delete(shortname.Length()-4,4); // get rid of the .ogg extension
iPath.Copy(iDs->AbbreviatedPath());
if (iPath.Length()>1 && iPath[iPath.Length()-1]==L'\\')
iPath.SetLength(iPath.Length()-1); // get rid of trailing back slash
TInt err = iOggPlayback->Info(iFullname, ETrue);
if( err == KErrNone )
{
TOggFile* o = TOggFile::NewL(iNbFilesFound,
iOggPlayback->Title(),
iOggPlayback->Album(),
iOggPlayback->Artist(),
iOggPlayback->Genre(),
iPath,
iFullname,
shortname,
iOggPlayback->TrackNumber());
iFiles->AppendL(o);
iNbFilesFound++;
iCurrentIndexInDirectory++;
fileFound = ETrue;
}
else
{
TRACEF(COggLog::VA(_L("Failed with code %d"), err ));
}
}
#ifdef PLAYLIST_SUPPORT
else if (IsPlayListFile(p))
{
// Add the playlist to the list of playlists.
shortname.Copy(e.iName);
shortname.Delete(shortname.Length()-4,4); // get rid of the .m3u extension
iPath.Copy(iDs->AbbreviatedPath());
if (iPath.Length()>1 && iPath[iPath.Length()-1]==L'\\')
iPath.SetLength(iPath.Length()-1); // get rid of trailing back slash
TOggPlayList* o = TOggPlayList::NewL(iNbPlayListsFound, iPath, iFullname, shortname);
iFiles->AppendL(o);
iNbPlayListsFound++;
iCurrentIndexInDirectory++;
fileFound = ETrue;
}
#endif
return fileFound;
}
TBool TOggFiles::FileSearchIsProcessDone() const
{
return iDirScanFinished;
};
#ifdef PLAYLIST_SUPPORT
void TOggFiles::ScanNextPlayList()
{
TInt numFiles = iFiles->Count();
if (iCurrentIndexInDirectory == numFiles)
{
iPlayListScanFinished = ETrue;
return;
}
for ( ; iCurrentIndexInDirectory<numFiles ; iCurrentIndexInDirectory++)
{
TOggFile* o = (*iFiles)[iCurrentIndexInDirectory];
if (o->FileType() == TOggFile::EPlayList)
{
// Parse the playlist, ignoring any errors.
TRAPD(err, ((TOggPlayList*) o)->ScanPlayListL(*iDirScanSession, this));
iCurrentIndexInDirectory++;
break;
}
}
}
TBool TOggFiles::PlayListScanIsProcessDone() const
{
return iPlayListScanFinished;
}
#endif
void TOggFiles::FileSearchProcessFinished()
{// Not used
};
void TOggFiles::FileSearchDialogDismissedL(TInt /*aButtonId*/)
{// Not used
};
TInt TOggFiles::FileSearchCycleError(TInt aError)
{// Not used
return(aError);
};
#ifdef PLAYLIST_SUPPORT
void TOggFiles::FileSearchGetCurrentStatus(TInt &aNbDir, TInt &aNbFiles, TInt &aNbPlayLists)
{
aNbDir = iNbDirScanned;
aNbFiles = iNbFilesFound;
aNbPlayLists = iNbPlayListsFound;
};
#else
void TOggFiles::FileSearchGetCurrentStatus(TInt &aNbDir, TInt &aNbFiles)
{
aNbDir = iNbDirScanned;
aNbFiles = iNbFilesFound;
};
#endif
TInt TOggFiles::SearchAllDrives(CEikDialog * aDialog, TInt aDialogID,RFs& session)
{
ClearFiles();
TChar driveLetter; TDriveInfo driveInfo;
TInt err=KErrNone;
TInt driveNumber;
for (driveNumber=EDriveA; driveNumber<=EDriveZ; driveNumber++) {
session.Drive(driveInfo,driveNumber);
if (driveInfo.iDriveAtt == (TUint)KDriveAbsent)
continue;
if ( (driveInfo.iType != (TUint) EMediaRom)
&& (driveInfo.iType != (TUint) EMediaNotPresent)
#ifdef __WINS__
// For some reasons, the emulator finds a non-existing drive X, which blows up everything...
&& (driveInfo.iType != EMediaHardDisk)
#endif
){
TRAP(err, session.DriveToChar(driveNumber,driveLetter));
if (err) break;
TBuf <10> driveName;
driveName.Format(_L("%c:\\"), ((TUint) driveLetter));
err = AddDirectoryStart(driveName,session);
if (err) break;
}
}
if ( err == KErrNone) {
TRAP(err, aDialog->ExecuteLD(aDialogID));
}
else {
delete (aDialog);
aDialog = NULL;
}
AddDirectoryStop();
return (err);
}
TInt TOggFiles::SearchSingleDrive(const TDesC& aDir, CEikDialog * aDialog, TInt aDialogID,RFs& session)
{
ClearFiles();
if (!EikFileUtils::PathExists(aDir))
{
TRACEF(COggLog::VA(_L("Folder %S doesn't exist"), &aDir ));
TBuf<256> buf1,buf2;
CEikonEnv::Static()->ReadResource(buf2, R_OGG_ERROR_28);
buf1.Append(aDir);
((COggPlayAppUi*)CEikonEnv::Static()->AppUi())->iOggMsgEnv->OggErrorMsgL(buf2,buf1);
return KErrNotFound;
}
TInt err = AddDirectoryStart(aDir,session);
if ( err == KErrNone) {
TRAP(err, aDialog->ExecuteLD(aDialogID));
}
else {
delete (aDialog);
aDialog = NULL;
}
AddDirectoryStop();
return (err);
}
TBool TOggFiles::CreateDbWithSingleFile(const TDesC& aFile){
TParsePtrC p(aFile);
if (IsSupportedAudioFile(p)) {
ClearFiles();
AddFile(aFile);
if (iFiles->Count()) {
return ETrue;
}
}
return EFalse;
}
void TOggFiles::AddFile(const TDesC& aFile){
//_LIT(KS,"adding File %s to oggfiles");
//OGGLOG.WriteFormat(KS,aFile.Ptr());
TParsePtrC p(aFile);
if (IsSupportedAudioFile(p)) {
iFullname.Copy(aFile);
TBuf<256> shortname;
shortname.Append(p.Name());
iPath.Copy(p.DriveAndPath());
if (iPath.Length()>1 && iPath[iPath.Length()-1]==L'\\'){
iPath.Delete(iPath.Length()-1,1); // get rid of trailing back slash
}
if ( iOggPlayback->Info(aFile, EFalse) == KErrNone) {
TOggFile* o = TOggFile::NewL(
iFiles->Count(),
iOggPlayback->Title(),
iOggPlayback->Album(),
iOggPlayback->Artist(),
iOggPlayback->Genre(),
iPath,
iFullname,
shortname,
iOggPlayback->TrackNumber());
TRAPD(err, iFiles->AppendL(o));
}
}
iOggPlayback->ClearComments();
}
TBool TOggFiles::ReadDb(const TFileName& aFileName, RFs& session)
{
RFile in;
if(in.Open(session, aFileName, EFileRead|EFileStreamText)== KErrNone) {
TFileText tf;
tf.Set(in);
// check file version:
TBuf<KTFileTextBufferMaxSize> line;
TInt err;
iVersion= -1;
if(tf.Read(line)==KErrNone) {
TLex parse(line);
parse.Val(iVersion);
}
#ifdef PLAYLIST_SUPPORT
if ((iVersion!=0) && (iVersion!=1) && (iVersion!=2))
#else
if ((iVersion!=0) && (iVersion!=1))
#endif
{
in.Close();
return EFalse;
}
#ifdef PLAYLIST_SUPPORT
TInt i;
TInt numPlayLists = 0;
RPointerArray<TOggPlayList> playLists;
CleanupClosePushL(playLists);
if (iVersion==2)
{
if(tf.Read(line)==KErrNone)
{
TLex parse(line);
err = parse.Val(numPlayLists);
if (err != KErrNone)
{
in.Close();
return EFalse;
}
}
else
{
in.Close();
return EFalse;
}
for (i = 0 ; i<numPlayLists ; i++)
{
// Read in the line number.
err = tf.Read(line);
if (err != KErrNone)
{
in.Close();
return ETrue;
}
TOggPlayList* o = NULL;
TRAP (err, o = TOggPlayList::NewL(tf));
if (err != KErrNone)
{
in.Close();
return ETrue;
}
o->iAbsoluteIndex = i;
iFiles->AppendL(o);
playLists.Append(o);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -