在darwin中定义了一个全局变量(结构体)sCallbacks,而这个结构体只有一个成员addr(数组),addr的每一个元素代表一个回调指针.
QTSS_Callbacks QTSServer::sCallbacks;
typedef struct {
// Callback function pointer array
QTSS_CallbackProcPtr addr [kLastCallback];
} QTSS_Callbacks, *QTSS_CallbacksPtr;
typedef QTSS_Error (*QTSS_CallbackProcPtr)(...);
enum
{
// Indexes for each callback routine. Addresses of the callback routines get
// placed in an array.
// IMPORTANT: When adding new callbacks, add only to the end of the list and increment the
// kLastCallback value. Inserting or changing the index order will break dynamic modules
// built with another release.
kNewCallback = 0,
kDeleteCallback = 1,
kMillisecondsCallback = 2,
kConvertToUnixTimeCallback = 3,
kAddRoleCallback = 4,
kAddAttributeCallback = 5,
kIDForTagCallback = 6,
kGetAttributePtrByIDCallback = 7,
kGetAttributeByIDCallback = 8,
kSetAttributeByIDCallback = 9,
kWriteCallback = 10,
kWriteVCallback = 11,
kFlushCallback = 12,
kAddServiceCallback = 13,
kIDForServiceCallback = 14,
kDoServiceCallback = 15,
kSendRTSPHeadersCallback = 16,
kAppendRTSPHeadersCallback = 17,
kSendStandardRTSPCallback = 18,
kAddRTPStreamCallback = 19,
kPlayCallback = 20,
kPauseCallback = 21,
kTeardownCallback = 22,
kRequestEventCallback = 23,
kSetIdleTimerCallback = 24,
kOpenFileObjectCallback = 25,
kCloseFileObjectCallback = 26,
kReadCallback = 27,
kSeekCallback = 28,
kAdviseCallback = 29,
kGetNumValuesCallback = 30,
kGetNumAttributesCallback = 31,
kSignalStreamCallback = 32,
kCreateSocketStreamCallback = 33,
kDestroySocketStreamCallback = 34,
kAddStaticAttributeCallback = 35,
kAddInstanceAttributeCallback = 36,
kRemoveInstanceAttributeCallback= 37,
kGetAttrInfoByIndexCallback = 38,
kGetAttrInfoByNameCallback = 39,
kGetAttrInfoByIDCallback = 40,
kGetValueAsStringCallback = 41,
kTypeToTypeStringCallback = 42,
kTypeStringToTypeCallback = 43,
kStringToValueCallback = 44,
kValueToStringCallback = 45,
kRemoveValueCallback = 46,
kRequestGlobalLockCallback = 47,
kIsGlobalLockedCallback = 48,
kUnlockGlobalLock = 49,
kAuthenticateCallback = 50,
kAuthorizeCallback = 51,
kRefreshTimeOutCallback = 52,
kCreateObjectValueCallback = 53,
kCreateObjectTypeCallback = 54,
kLockObjectCallback = 55,
kUnlockObjectCallback = 56,
kSetAttributePtrCallback = 57,
kSetIntervalRoleTimerCallback = 58,
kLockStdLibCallback = 59,
kUnlockStdLibCallback = 60,
kGetRTSPPushSessionsCallback = 61,
kRelayRTPCallback = 62,
kLastCallback = 63
};
1.这个数组什么时候初始化呢?在InitCallbacks函数中对数组的每一个元素初始化
2.这个全局回调数组又是如何与模块关联的呢?
在编写模块的时候,必须要实现一个main函数:比如QTSSReflectorModule_Main。这个函数会被主程序调用,传进来的形参包含了全局回调函数指针。
而在QTSS_Private.cpp中:有全局变量指针:static QTSS_CallbacksPtr sCallbacks = NULL;在_stublibrary_main函数,实现全局变量的赋值 。
在模块中,都是调用QTSS_*的函数,这些函数都是在QTSS_Private.cpp中实现,而最终都是调用主程序中的全局回调函数。
3.全局变量(结构体)sCallbacks中的每一个元素指向的回调函数在哪里实现的呢?
在QTSSCallbacks类中实现:此类中实现了所有的静态回调函数。
4.所有的模块的qtss对象都要调用QTSSCallbacks中的方法,那么是如何区分不同的QTSS_Object?
方法1:在调用该类的函数时,函数中带有QTSS_Object参数, QTSSCallbacks其实什么也没做,函数内部直接调用
QTSS_Object对应的方法(一般方法名称都相同)即可。
方法2 :对于没有传入QTSS_Object参数的函数,通过OSThread临时存储一下变量值的方法来实现调用那个模块。
方法3:调用类的静态函数实现
5.QTSSCallbacks类中都可以调用哪些qtss的方法
主要有三种 : QTSS_Object,QTSS_ObjectType,QTSS_StreamRef