| 
                         2.下面是比较关键的ejabberd中函数调用的分析:
   
 
 
- ?????????????run_fold(Hook,?Host,?Val,?Args)?->??
  
  - ??????????????????case?ets:lookup(hooks,?{Hook,?Host})?of??
  
  - ?????????????????????????[{_,?Ls}]?->run_fold1(Ls,?Hook,?Args);??
  
  - ?????????????????????????[]?->Val??
  
  - ??????????????????end.??
  
  - e="code"?class="plain">PresenceEl?=?ejabberd_hooks:run_fold(??
  
  - c2s_update_presence,??
  
  - Server,??
  
  - NewEl,??
  
  - [User,?Server])??
  
  
 在系统的ets库(内存中的一个数据库)中存有一个名为hooks的表,通过ets:lookup(hooks,{Hook,Host}) 可以找到一个 {_,Ls}的元组 (找不到就直接返回预定义的Val了),然后调用run_fold1(Ls,Hook,Val,Args). 
Ls变量实际上是一个包含多个要具体调用的函数定义的列表,列表里面的元组分为两类:[{_Seq,Node,Moudle,Function} | Ls2]? [{_Seq,Module,Function} | Ls2],  
run_fold1/4 的作用就是使用Args参数依次调用这个Ls列表里的方法.  
run_fold1/4 最终会返回调用的结果出来.  
所以从最终结果来看 ejabberd_hooks:run_fold/4? 方法就是去表hooks查找并调用所需的函数返回调用结果.   
 
 
- PresenceEl?=?ejabberd_hooks:run_fold(??
  
  - ???????????????????????c2s_update_presence,??
  
  - ???????????????????????Server,??
  
  - ???????????????????????NewEl,??
  
  - ???????????????????????[User,?Server])??
  
  
 针对上面的代码就是: 
??????? 使用{c2s_update_presence,Server}作为key 在表hooks 中查找 要调用的方法列表,并使用[User,Server] 作为参数进行调用.
   
   
这个key具体找到什么样的方法呢? 我们可以在源码中查找下:  
 
 
- root@ubuntu:??grep?*.erl?-e?c2s_update_presence??
  
  
 
  查找结果中可以看到 
 mod_vcard_xupdate.erl?????????????? ejabberd_hooks:add(c2s_update_presence,Host  
   
我们在mod_vcard_xupdate.erl中找到这段代码:  
 
 
- start(Host,?_Opts)?->??
  
  - ????mnesia:create_table(vcard_xupdate,??
  
  - ????????????????????????[{disc_copies,?[node()]},??
  
  - ?????????????????????????{attributes,?record_info(fields,?vcard_xupdate)}]),??
  
  - ????ejabberd_hooks:add(c2s_update_presence,??
  
  - ????????????????MODULE,?update_presence,?100),??
  
  - ????ejabberd_hooks:add(vcard_set,?vcard_set,??
  
  - ????ok.??
  
  
  update_presence就所我们所要找的方法了.
        
            
        	
                        (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |