/***************************************************************************** * * 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 __NODEBASE_H #define __NODEBASE_H #define MAXDATA (MAXPATH*sizeof(tchar_t)) //---------------------------------------------------------------- // data types #define TYPE_BOOLEAN 1 // bool_t #define TYPE_INT 2 // int #define TYPE_FRACTION 3 // cc_fraction #define TYPE_STRING 4 // null terminated tchar_t[] #define TYPE_RECT 5 // rect #define TYPE_POINT 6 // point #define TYPE_RGB 7 // rgbval_t #define TYPE_FOURCC 8 // fourcc_t #define TYPE_FILEPOS 9 // filepos_t #define TYPE_NODE 10 // node* (format1: node class) #define TYPE_META 11 // metanotify #define TYPE_PACKET 12 // flow packet pin #define TYPE_TICK 13 // tick_t #define TYPE_NODENOTIFY 14 // nodenotify (private) #define TYPE_PTR 15 // void* #define TYPE_BINARY 16 // binary data (format1: size) #define TYPE_NOTIFY 17 // notify #define TYPE_INT8 18 // int8_t #define TYPE_INT16 19 // int16_t #define TYPE_INT32 20 // int32_t #define TYPE_INT64 21 // int64_t #define TYPE_FUNC 22 // nodefunc #define TYPE_NODE_REF 23 // node* #define TYPE_BOOL_BIT 24 // bool_t #define TYPE_PIN 25 // pin #define TYPE_EVENT 26 // void #define TYPE_EXPR 27 #define TYPE_POINT16 28 // cc_point16 #define TYPE_RECT16 29 // int16_t[4] #define TYPE_ARRAY 30 #define TYPE_EXPRSTRING 31 #define TYPE_EXPRPARAM 32 #define TYPE_DATETIME 33 // datetime_t #define TYPE_DBNO 34 // db_no #define TYPE_GUID 35 // cc_guid #define TYPE_FIX16 36 // int #define TYPE_LUA_REF 37 // int #define TYPE_NOTIFYEX 38 #define TYPE_ENUM 39 // dataenum #define TYPE_ENUM_MULTI_SET 40 // multi_enum_set #define TYPE_SIZE 41 // size_t #define MAX_PARAMTYPE 42 #define TYPE_MASK 0x3F #define PERCENT_ONE 1024 #define FIX16_SHIFT 16 #define FIX16_UNIT (1<= ExtensionStart && Id < ExtensionStart+ExtensionSize); } typedef struct dataenum { size_t ValueSize; array Name; // tchar_t array Value; // any type } dataenum; typedef struct multi_enum_set { void *Element; size_t ElementSize; int Value; } multi_enum_set; //--------------------------------------------------------------- // node #define NODE_CLASS FOURCC('N','O','D','E') // strings #define NODE_NAME 0 #define NODE_CONTENTTYPE 1 #define NODE_EXTS 2 #define NODE_PROBE 3 #define NODE_PROTOCOL 4 #define NODE_ID 5 // events for singleton objects #define NODE_SINGLETON_INSTALL 6 #define NODE_SINGLETON_UNINSTALL 7 #define NODE_SINGLETON_STARTUP 8 // after the module's classes registered and singleton objects are created #define NODE_SINGLETON_CONFIGURED 9 // after configuration loaded for CFLAG_CONFIG objects #define NODE_SINGLETON_SHUTDOWN 10 // before the module's singleton objects are deleted // events for any class #define NODE_DELETING 11 // can be used as notify #define NODE_SETTINGS_CHANGED 12 // can be used as notify // settings #define NODE_GAP 13 #define NODE_SELECT_ALL 14 //TODO: remove #define NODE_SELECT_NONE 15 //TODO: remove // for debug/dump (array) #define NODE_CHILDREN 13 // default param #define NODE_DEFAULT_DATA 14 //TODO: fix collision with NODE_SELECT_ALL typedef err_t (*nodefunc)(void* This); typedef err_t (*nodeupdatefunc)(void* This,dataid Id); typedef bool_t (*nodeenumfilter)(void* This,dataid Id,const void* Value,size_t Size); typedef const void anynode; typedef void* thisnode; typedef struct nodecontext nodecontext; typedef struct node { fourcc_t FourCC; // help figure out memory leak uint32_t Magic; const void* VMT; nodedata* Data; size_t RefCount; } node; typedef struct node_vmt { nodecontext* Context; fourcc_t ClassId; void (*Enum)(thisnode,array* List); err_t (*Get)(thisnode,dataid Id,void* Data,size_t Size); err_t (*Set)(thisnode,dataid Id,const void* Data,size_t Size); err_t (*UnSet)(thisnode,dataid Id,const void* Data,size_t Size); uintptr_t (*Meta)(thisnode,dataid Id,datameta Meta); dataid (*FindParam)(thisnode,const tchar_t* Token); void* (*SetData)(thisnode,dataid Id, datatype Type,const void* Data); } node_vmt; #define Node_Enum(p,a) VMT_FUNC(p,node_vmt)->Enum(p,a) #define Node_Get(p,a,b,c) VMT_FUNC(p,node_vmt)->Get(p,a,b,c) #define Node_GET(p,a,b) VMT_FUNC(p,node_vmt)->Get(p,a,b,sizeof(*(b))) #define Node_Set(p,a,b,c) VMT_FUNC(p,node_vmt)->Set(p,a,b,c) #define Node_SET(p,a,b) VMT_FUNC(p,node_vmt)->Set(p,a,b,sizeof(*(b))) #define Node_Trigger(p,a) VMT_FUNC(p,node_vmt)->Set(p,a,NULL,0) #define Node_UnSet(p,a,b,c) VMT_FUNC(p,node_vmt)->UnSet(p,a,b,c) #define Node_Meta(p,a,b) VMT_FUNC(p,node_vmt)->Meta(p,a,b) #define Node_FindParam(p,a) VMT_FUNC(p,node_vmt)->FindParam(p,a) #define Node_SetData(p,i,t,d) VMT_FUNC(p,node_vmt)->SetData(p,i,t,d) //----------------------------------------------------------------- typedef struct pin { node* Node; dataid Id; } pin; typedef pin nodeevt; typedef err_t (*notifyproc)(void* This, nodeevt* Evt); typedef void (*metafunc)(void* Referer, fourcc_t Meta, int32_t Stream, const tchar_t* Value); typedef struct metanotify { metafunc Func; void* Referer; int Stream; } metanotify; typedef err_t (*notifyfunc)(void* This,intptr_t Param,intptr_t Param2); typedef void (*freefunc)(void* This,void *Ptr); typedef struct notify { notifyfunc Func; void* This; } notify; typedef struct notifyex { notifyfunc Func; void* This; freefunc Free; void* FreeCookie; } notifyex; typedef struct nodeexpr nodeexpr; //--------------------------------------------------------------- // node priority classes #define PRI_MINIMUM 1 #define PRI_DEFAULT 1000 #define PRI_MAXIMUM 10000 //--------------------------------------------------------------- // functions managing node meta information #define NODEMODULE_CLASS FOURCC('N','M','O','D') #define NODEMODULE_PATH 0x80 typedef struct nodeclass nodeclass; typedef struct nodemodule nodemodule; struct nodemodule { node Base; nodemodule* Next; void* Module; void* Db; void* Func; uint8_t* Min; uint8_t* Max; datetime_t Stamp; array ClassRefs; void *LockRefs; uint8_t Found; uint8_t Config; uint8_t Changed; }; struct nodecontext { nodemodule Base; void* NodeLock; const void* NodeCache; array NodeSingleton; array NodeClass; // ordered by id const cc_memheap* NodeHeap; const cc_memheap* NodeConstHeap; bool_t (*LoadModule)(nodecontext*,nodemodule*); void (*FreeModule)(nodecontext*,nodemodule*); #if defined(CONFIG_MULTITHREAD) uintptr_t ThreadId; void* PostNotifyParam; bool_t (*PostNotify)(nodecontext*,node*,dataid); // returns if the message has been queued #endif const tchar_t* (*ExternalStr)(nodecontext*,fourcc_t,int); //TODO: runtime datatype meta information handling... void (*ExprRelease)(nodeexpr*); size_t (*ExprSize)(nodeexpr*); void (*ExprDup)(node* Node, nodeexpr*, array* Dup); #if defined(CONFIG_CORELUA) void *LuaCookie; void (*LuaRelease)(void* Cookie, int* Ref); void (*LuaAddRef)(void* Cookie, int* Ref); #endif void (*ReportError)(nodecontext*, node* Node, fourcc_t MsgClass, int MsgNo, va_list Args); #if defined(TARGET_PALMOS) fourcc_t ProjFourCC; #endif int Build; int Revision; array Collect; bool_t InCollect; fourcc_t DynamicClass; #if defined(TARGET_SYMBIAN) void *FsSession; #endif uint16_t AppId; }; #define NODECONTEXT_CLASS FOURCC('N','C','T','X') #define NODECONTEXT_PROJECT_NAME 0x100 #define NODECONTEXT_PROJECT_VENDOR 0x101 #define NODECONTEXT_PROJECT_VERSION 0x102 #define NODECONTEXT_PROJECT_FOURCC 0x103 #define NODECONTEXT_PROJECT_HELP 0x104 #define NODECONTEXT_PROJECT_BUILD 0x105 #define NODECONTEXT_PROJECT_MIME 0x106 #define NODECONTEXT_PROJECT_APPID 0x107 #define NODECONTEXT_PROJECT_PATH 0x108 // notify #define NODECONTEXT_CRASH 0x201 NODE_DLL void NodeContext_Init(nodecontext*,const nodemeta* Custom, const cc_memheap* Heap, const cc_memheap* ConstHeap); NODE_DLL void NodeContext_Done(nodecontext*); NODE_DLL bool_t NodeContext_Cleanup(nodecontext* p,bool_t Force); NODE_DLL dataflags NodeContext_FindDataType(const tchar_t* Type, const tchar_t* Format); NODE_DLL size_t NodeTypeSize(datatype); // TODO: use nodecontext* when switching to runtime datatype meta information handling... NODE_DLL const tchar_t *NodeContext_TypeName(datatype Type); NODE_DLL const tchar_t *NodeContext_UnitName(datatype Unit); NODE_DLL void NodeRegisterClassEx(nodemodule*,const nodemeta*); NODE_DLL fourcc_t NodeEnumClass(anynode*,array* List, fourcc_t Class); // List=NULL just returns the first class NODE_DLL fourcc_t NodeEnumClassStr(anynode*,array* ListId, fourcc_t ClassId, int Id, const tchar_t* Str); NODE_DLL void NodeEnumSingletons(anynode*,array* List); NODE_DLL void NodeSingletonEvent(anynode*, dataid Cmd, nodemodule* Module); // Module = NULL for all modules typedef int (*nodeenumclassfilterrated)(void* Cookie, const nodeclass* Class); NODE_DLL fourcc_t NodeEnumClassFilterRated(anynode*,array* List, fourcc_t Class, nodeenumclassfilterrated Func, void* Cookie); NODE_DLL bool_t NodeIsClass(anynode*,fourcc_t Class, fourcc_t PartOfClass); NODE_DLL const tchar_t* NodeStr2(anynode*,fourcc_t ClassId,int No); NODE_DLL const tchar_t* NodeStrEx(anynode*,fourcc_t ClassId,int No); NODE_DLL node* NodeCreate(anynode*,fourcc_t Class); NODE_DLL node* NodeSingleton(anynode*,fourcc_t Class); NODE_DLL const tchar_t* NodeClass_Str(anynode* AnyNode, const nodeclass*, int No); NODE_DLL uintptr_t NodeClass_Meta(const nodeclass*,dataid Id,datameta Meta); NODE_DLL int NodeClass_Priority(const nodeclass*); NODE_DLL fourcc_t NodeClass_Parent(const nodeclass*); NODE_DLL const nodeclass* NodeContext_FindClass(anynode*, fourcc_t Class); NODE_DLL const nodeclass* NodeContext_FindClassEx(anynode*, fourcc_t Class, nodemodule* Prefered); // functions for existing nodes NODE_DLL void NodeDelete(node*); //TODO: use Node_Release() instead (but Node_Release doesn't support NULL) NODE_DLL void Node_AddRef(thisnode This); NODE_DLL void Node_Release(thisnode This); NODE_DLL int NodeClassFlags(node*); NODE_DLL void NodeClassSetPriority(node*,int Priority); NODE_DLL nodemodule* NodeModule(node*); NODE_DLL nodemodule* NodeClassModule(anynode*,fourcc_t Class); NODE_DLL bool_t NodeFindDef(node*,const tchar_t* Token,datadef* Out); NODE_DLL bool_t NodeDataDef(node* p, dataid Id, datadef* Out); NODE_DLL void NodeEnumDef(node*,array* Out); NODE_DLL void NodeParamName(node* p, dataid Id, tchar_t* Name, size_t NameLen); NODE_DLL const tchar_t* NodeParamStr(const node* p,int No); NODE_DLL void NodeReportError(anynode*, node* Node,fourcc_t MsgClass,int MsgNo,...); NODE_DLL err_t Node_Constructor(anynode*,node* Node,size_t Size, fourcc_t ClassId); NODE_DLL void Node_Destructor(node* Node); NODE_DLL bool_t Node_Notify(node* Node, dataid Id); /// returns wether there were some receivers #if defined(CONFIG_MULTITHREAD) NODE_DLL bool_t Node_PostNotify(node* Node, dataid Id); // supports threading #else #define Node_PostNotify(x,y) Node_Notify(x,y) #endif NODE_DLL void Node_AddNotify(node*, dataid Id, notifyproc Func, void* Refered); NODE_DLL void Node_AddNotify_Update(node*, dataid Id, notifyproc Func, void* Refered); NODE_DLL void Node_RemoveNotify(node*, dataid Id, notifyproc Func, void* Refered); NODE_DLL size_t Node_MaxDataSize(node*, dataid Id, dataflags Flags, int QueryType); NODE_DLL bool_t Node_EqData(node*, dataid Id, dataflags Flags, const void* a, const void* b); NODE_DLL size_t Node_DataSize(node*, dataid Id, datatype Type, const void* Data, int QueryType); NODE_DLL void Node_RemoveData(node*, dataid Id, datatype Type); NODE_DLL void* Node_AddData(node*, dataid Id, datatype Type, const void* Data); NODE_DLL void* Node_GetData(const node*, dataid Id, datatype Type); NODE_DLL err_t Node_ReadData(node* p, dataid Id, datatype Type, void* Data, size_t Size); /// fills with 0 if the dynamic data doesn't exist NODE_DLL const tchar_t* Node_GetDataStr(const node*, dataid Id); NODE_DLL datetime_t Node_GetDataDatetime(const node*, dataid Id); // functions which should be exported in node DLLs DLLEXPORT err_t DLLRegister(nodemodule*); DLLEXPORT void DLLUnRegister(nodemodule*); DLLEXPORT void DLLTest(void); DLLEXPORT void DLLTest2(void); NODE_DLL bool_t Node_IsPartOf(const void*, fourcc_t PartOfClass); NODE_DLL err_t Node_Toggle(void* Node,dataid Id); NODE_DLL void Node_Copy(node* Dst,node* Src,array* Dup); typedef struct nodedup { node* Orig; node* Dup; } nodedup; void NodeDup_Replace(array* Dup, node** Ptr); #ifdef CONFIG_DEBUGCHECKS #define VMT_FUNC(p,class_vmt) (assert((const void*)(p)!=NULL),(class_vmt*)((node*)(p))->VMT) #else #define VMT_FUNC(p,class_vmt) ((class_vmt*)((node*)(p))->VMT) #endif #define Node_Context(p) (VMT_FUNC(p,node_vmt)->Context) #define Node_ClassId(p) (VMT_FUNC(p,node_vmt)->ClassId) NODE_DLL const void* Node_InheritedVMT(node* p,fourcc_t ClassId); #define INHERITED(p,class_vmt,classid) ((const class_vmt*)Node_InheritedVMT((node*)(p),classid)) void* NodeHeap_Alloc(anynode*, size_t Size); void NodeHeap_Free(anynode*, void* Ptr, size_t Size); typedef int (*memcollect)(void* Cookie, int Level); // collect levels #define COLLECT_UNUSED 0 #define COLLECT_SOFT 100 #define COLLECT_HARD 200 #define COLLECT_FOUND -1 // return value when memory was collected on that level NODE_DLL bool_t NodeHibernate(anynode*); //TODO: rename NODE_DLL void Mem_AddCollector(anynode*, memcollect Func, void* Cookie); NODE_DLL void Mem_RemoveCollector(anynode*, memcollect Func, void* Cookie); #endif