darwin之回调

来源:互联网 发布:php 断点续传 编辑:程序博客网 时间:2024/05/16 20:28


在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