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

📄 filedb_palmos.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
字号:
/*****************************************************************************
 *
 * This program is free software ; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 * $Id: filedb_palmos.c 332 2005-11-06 14:31:57Z picard $
 *
 * The Core Pocket Media Player
 * Copyright (c) 2004-2005 Gabor Kovacs
 *
 ****************************************************************************/

#include "../common.h"

#if defined(TARGET_PALMOS)

#include "pace.h"

typedef struct filedb
{
	stream Stream;

	tchar_t URL[MAXPATH];
	FileHand File;
	int Length;
	int Pos;
	bool_t Silent;
	bool_t Create;

	DmSearchStateType SearchState;
	LocalID CurrentDB; 
	const tchar_t* Exts;
	bool_t ExtFilter;

} filedb;

static int Get(filedb* p, int No, void* Data, int Size)
{
	int Result = ERR_INVALID_PARAM;
	switch (No)
	{
	case STREAM_URL: GETSTRING(p->URL); break;
	case STREAM_SILENT: GETVALUE(p->Silent,bool_t); break;
	case STREAM_LENGTH: GETVALUECOND(p->Length,int,p->Length>=0); break;
	case STREAM_CREATE: GETVALUE(p->Create,bool_t); break;
	}
	return Result;
}

static int Read(filedb* p,void* Data,int Size)
{
	Err Error;
	Int32 Readed = FileRead(p->File,Data,1,Size,&Error);

	if (Readed > 0)
		p->Pos += Readed;
	else
	if (Error != fileErrEOF)
		Readed = -1;

	return Readed;
}

static int ReadBlock(filedb* p,block* Block,int Ofs,int Size)
{
	Err Error;
	Int32 Readed;

	if (IsHeapStorage(Block))
		Readed = FileDmRead(p->File,(void*)Block->Ptr,Ofs,1,Size,&Error);
	else
		Readed = FileRead(p->File,(void*)(Block->Ptr+Ofs),1,Size,&Error);

	if (Readed > 0)
		p->Pos += Readed;
	else
	if (Error != fileErrEOF)
		Readed = -1;

	return Readed;
}

static int Seek(filedb* p,int Pos,int SeekMode)
{
	FileOriginEnum Origin;
	Err Error;

	switch (SeekMode)
	{
	default:
	case SEEK_SET: Origin = fileOriginBeginning; break;
	case SEEK_CUR: Origin = fileOriginCurrent; break;
	case SEEK_END: Origin = fileOriginEnd; break;
	}

	Error = FileSeek(p->File,Pos,Origin);

	if (Error == errNone || Error == fileErrEOF)
	{
		p->Pos = FileTell(p->File,NULL,NULL);
		return p->Pos;
	}

	return -1;
}

static int Open(filedb* p, const tchar_t* URL, bool_t ReOpen)
{
	if (p->File)
	{
		FileClose(p->File);
		p->File = NULL;
	}
	
	p->Length = -1;
	if (!ReOpen)
		p->URL[0] = 0;
#ifdef MULTITHREAD
	else
		ThreadSleep(GetTimeFreq()/5);
#endif

	if (URL && URL[0])
	{
		p->File = FileOpen(0,GetMime(URL,NULL,0,NULL), 0, 0, fileModeReadOnly | fileModeAnyTypeCreator, NULL);
		if (!p->File)
		{
			if (!ReOpen && !p->Silent)
				ShowError(0,ERR_ID,ERR_FILE_NOT_FOUND,URL);
			return ERR_FILE_NOT_FOUND;
		}

		tcscpy_s(p->URL,TSIZEOF(p->URL),URL);

		if (ReOpen)
			FileSeek(p->File,p->Pos,fileOriginBeginning);
		else
		{
			p->Length = -1;
			if (FileSeek(p->File,0,fileOriginEnd) == errNone)
				p->Length = FileTell(p->File,NULL,NULL);
			FileSeek(p->File,0,fileOriginBeginning);
		}

		p->Pos = FileTell(p->File,NULL,NULL);
	}
	return ERR_NONE;
}

bool_t DBFrom(uint16_t Card,uint32_t DB,tchar_t* URL,int URLLen)
{
	char Name[48];
	UInt16 Attr = 0;

	DmDatabaseInfo(Card,DB,Name,&Attr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
	if (Attr & dmHdrAttrStream)
	{
		stprintf_s(URL,URLLen,T("mem://%s"),Name);
		return 1;
	}
	return 0;
}

static int EnumDir(filedb* p,const tchar_t* URL,const tchar_t* Exts,bool_t ExtFilter,streamdir* Item)
{
	Boolean New = 0;
	UInt16 card; 

	if (URL)
	{
		p->CurrentDB = 0;
		p->Exts = Exts;
		p->ExtFilter = ExtFilter;
		New = 1;
	}

	Item->FileName[0] = 0;
	Item->DisplayName[0] = 0;

	while (DmGetNextDatabaseByTypeCreator(New, &p->SearchState, 0, 0, 0, &card, &p->CurrentDB)==errNone)
	{
		char Name[48];
		UInt16 Attr = 0;
		UInt32 Date = (UInt32)-1;
		UInt32 Size = 0;

		DmDatabaseInfo(card,p->CurrentDB,Name,&Attr,NULL,NULL,&Date,NULL,NULL,NULL,NULL,NULL,NULL);

		if (Attr & dmHdrAttrStream)
		{
			Item->Type = CheckExts(Name,p->Exts);
			if (Item->Type || !p->ExtFilter)
			{
				DmDatabaseSize(card,p->CurrentDB,NULL,NULL,&Size);

				tcscpy_s(Item->FileName,TSIZEOF(Item->FileName),Name);
				Item->Date = Date;
				Item->Size = Size;
				return ERR_NONE;
			}
		}

		New = 0;
	}

	return ERR_END_OF_FILE;
}


static int Set(filedb* p, int No, const void* Data, int Size)
{
	int Result = ERR_INVALID_PARAM;
	switch (No)
	{
	case STREAM_SILENT: SETVALUE(p->Silent,bool_t,ERR_NONE); break;
	case STREAM_CREATE: SETVALUE(p->Create,bool_t,ERR_NONE); break;
	case STREAM_URL: Result = Open(p,(const tchar_t*)Data,0); break;
	}
	return Result;
}

static int Create(filedb* p)
{
	p->Stream.Get = (nodeget)Get;
	p->Stream.Set = (nodeset)Set;
	p->Stream.Read = (streamread)Read;
	p->Stream.ReadBlock = (streamreadblock)ReadBlock;
	p->Stream.Seek = (streamseek)Seek;
	p->Stream.EnumDir = (streamenumdir)EnumDir;
	return ERR_NONE;
}

static void Delete(filedb* p)
{
	Open(p,NULL,0);
}

static const nodedef FileDb =
{
	sizeof(filedb),
	FILEDB_ID,
	STREAM_CLASS,
	PRI_MINIMUM,		
	(nodecreate)Create,
	(nodedelete)Delete,
};

void FileDb_Init()
{
	NodeRegisterClass(&FileDb);
}

void FileDb_Done()
{
	NodeUnRegisterClass(FILEDB_ID);
}

#endif

⌨️ 快捷键说明

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