/***************************************************************************** * * Copyright (c) 2008-2010, CoreCodec, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of CoreCodec, Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/ #ifndef __STREAM_H #define __STREAM_H #include "corec/node/node.h" #define FTYPE_DIR 'D' #define FTYPE_UNDEFINED 'u' #define MEDIA_CLASS FOURCC('F','M','T','M') // anything with file extension #define STREAM_CLASS FOURCC('S','T','R','M') #define STREAM_URL 0x91 // tchar_t* #define STREAM_LENGTH 0x92 // filepos_t #define STREAM_FLAGS 0x93 // int #define STREAM_CONTENTTYPE 0x95 // tchar_t* #define STREAM_META 0x96 // metanotify #define STREAM_PRAGMA_SEND 0x97 // tchar_t* #define STREAM_PRAGMA_GET 0x98 // tchar_t* #define STREAM_ENUM_BASE 0x9A // tchar_t* #define STREAM_PLAYING 0x9B // bool_t #define STREAM_TIME 0xA0 // tick_t #define STREAM_SCOUTING 0xAA // bool_t #define STREAM_NO_PAUSE 0xAB // TODO: find a better solution... #define STREAM_KIND 0xAD // fourcc_t #define STREAM_ISTTY 0xAF // bool_t #define STREAM_FULL_URL 0x99 // tchar_t* #define STREAM_TIMEOUT 0x94 // systick_t #define STREAM_NATIVE_HANDLER 0x8F // void* #define STREAM_DATE 0x8C // datetime_t #define STREAM_USERNAME 0x88 // tchar_t* #define STREAM_PASSWORD 0x89 // tchar_t* #define STREAM_PROXY_USERNAME 0xC0 // tchar_t* #define STREAM_PROXY_PASSWORD 0xC1 // tchar_t* #define STREAM_CACHE_CLASS 0xB4 // fourcc_t #define STREAM_CACHING 0xB6 // bool_t #define STREAM_KIND_LOCAL 0 #define STREAM_KIND_NETWORK 1 #define STREAM_KIND_LIVE_FEED 2 #define SFLAG_RDONLY 0x1 #define SFLAG_WRONLY 0x2 #define SFLAG_CREATE 0x4 #define SFLAG_SILENT 0x8 #define SFLAG_BUFFERED 0x10 // used only by StreamOpen helper function #define SFLAG_REOPEN 0x20 // private inside stream #define SFLAG_NO_PRAGMA 0x40 #define SFLAG_NO_PROXY 0x80 #define SFLAG_NO_DELAY 0x100 #define SFLAG_NO_RETRY 0x200 #define SFLAG_HIDDEN 0x400 #define SFLAG_NO_CACHING 0x800 #define SFLAG_NON_BLOCKING 0x1000 // used only by StreamOpen helper function #define SFLAG_CREATE_BLOCKING 0x2000 #define SFLAG_FORCE_CACHING 0x4000 #define SFLAG_LONGTERM_CACHING 0x8000 #define SFLAG_RECONNECT 0x10000 #define MAX_NETWORK_PACKET 2048 #ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif #ifndef EOF #define EOF (-1) #endif #define DIR_TIMEOUT 2 // 2 s typedef struct stream { node Base; tchar_t URL[MAXPATH]; } stream; typedef struct memstream { stream Base; filepos_t VirtualOffset; const uint8_t* Ptr; size_t Pos; size_t Size; } memstream; #define STDIN_ID FOURCC('S','T','D','I') #define STDOUT_ID FOURCC('S','T','D','O') #define STDERR_ID FOURCC('S','T','D','E') typedef struct streamdir { tchar_t FileName[MAXPATH]; tchar_t DisplayName[MAXPATH]; filepos_t Size; int Type; // from Exts, FTYPE_DIR for directory datetime_t ModifiedDate; } streamdir; typedef struct streamselect streamselect; struct streamselect { err_t (*Func)(streamselect*); #ifdef TARGET_PALMOS int LibRef; #endif int Max; void* Rd; void* Wr; void* Er; tick_t Timeout; // TODO: change to systick_t stream* Selected[64]; }; typedef struct stream_vmt { node_vmt Base; err_t (*Open)(thisnode,const tchar_t* URL, int Flags); stream* (*Duplicate)(thisnode,int Flags); err_t (*Read)(thisnode,void* Data,size_t Size,size_t* Readed); err_t (*ReadOneOrMore)(thisnode,void* Data,size_t Size,size_t* Readed); err_t (*ReadBlock)(thisnode,block* Block,size_t Ofs,size_t Size,size_t* Readed); err_t (*Write)(thisnode,const void* Data,size_t Size,size_t* Written); filepos_t (*Seek)(thisnode,filepos_t Pos,int SeekMode); err_t (*OpenDir)(thisnode,const tchar_t* URL, int Flags); err_t (*EnumDir)(thisnode,const tchar_t* Exts,bool_t ExtFilter,streamdir* Item); err_t (*Blocking)(thisnode,bool_t Blocking); err_t (*Wait)(thisnode,bool_t Read, streamselect* Select); err_t (*Skip)(thisnode,intptr_t* Skip); err_t (*Flush)(thisnode); err_t (*ResetReadTimeout)(thisnode,int Secs); } stream_vmt; #define Stream_Open(p,a,b) VMT_FUNC(p,stream_vmt)->Open(p,a,b) #define Stream_Duplicate(p,a) VMT_FUNC(p,stream_vmt)->Duplicate(p,a) #define Stream_Read(p,a,b,c) VMT_FUNC(p,stream_vmt)->Read(p,a,b,c) #define Stream_ReadOneOrMore(p,a,b,c) VMT_FUNC(p,stream_vmt)->ReadOneOrMore(p,a,b,c) #define Stream_ReadBlock(p,a,b,c,d) VMT_FUNC(p,stream_vmt)->ReadBlock(p,a,b,c,d) #define Stream_Write(p,a,b,c) VMT_FUNC(p,stream_vmt)->Write(p,a,b,c) #define Stream_Seek(p,a,b) VMT_FUNC(p,stream_vmt)->Seek(p,a,b) #define Stream_OpenDir(p,a,b) VMT_FUNC(p,stream_vmt)->OpenDir(p,a,b) #define Stream_EnumDir(p,a,b,c) VMT_FUNC(p,stream_vmt)->EnumDir(p,a,b,c) #define Stream_Blocking(p,a) VMT_FUNC(p,stream_vmt)->Blocking(p,a) #define Stream_Wait(p,a,b) VMT_FUNC(p,stream_vmt)->Wait(p,a,b) #define Stream_Skip(p,a) VMT_FUNC(p,stream_vmt)->Skip(p,a) #define Stream_Flush(p) VMT_FUNC(p,stream_vmt)->Flush(p) #define Stream_ResetReadTimeout(p,a) VMT_FUNC(p,stream_vmt)->ResetReadTimeout(p,a) //-------------------------------------------------------------------------- #define STREAMPROCESS_CLASS FOURCC('S','T','R','P') #define STREAMPROCESS_INPUT 0xB0 #define STREAMPROCESS_DATAFEED 0xB1 //--------------------------------------------------------------------------- #define MEMSTREAM_CLASS FOURCC('M','E','M','S') #define MEMSTREAM_DATA 0x100 #define MEMSTREAM_PTR 0x101 #define MEMSTREAM_OFFSET 0x102 //--------------------------------------------------------------------------- #define BUFSTREAM_CLASS FOURCC('B','U','F','S') #define BUFSTREAM_STREAM 0x100 //--------------------------------------------------------------------------- #define RESOURCEDATA_ID FOURCC('R','E','S','F') #define RESOURCEDATA_SIZE 0x100 #define RESOURCEDATA_PTR 0x101 //--------------------------------------------------------------------------- FILE_DLL stream* GetStream(anynode*, const tchar_t* URL, int Flags); FILE_DLL stream* StreamOpen(anynode*, const tchar_t* URL, int Flags); FILE_DLL void StreamClose(stream*); FILE_DLL bool_t StreamGenExts(anynode*,array* Exts, fourcc_t ClassFilter, const tchar_t* TypeFilter); FILE_DLL char StreamExtType(anynode*, fourcc_t ClassFilter, const tchar_t *Ext); FILE_DLL int StreamProtocolPriority(anynode*, const tchar_t* URL); #endif