|
Incoming msg |
|
Timeout evt |
|
Msg to send |
|
User module |
|
Timer module |
|
Transport module |
|
TRANSAC.
2 |
|
TRANSAC.
1 |
|
事务处理的上下文 |
void osip_setcb_rcvinvite (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcvack (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_rcvbye (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_rcvcancel (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcvinfo (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_rcvoptions (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcvregister(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcvprack (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_rcvunkrequest(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_sndinvite (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_sndack (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_sndbye (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_sndcancel (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_sndinfo (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_sndoptions (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_sndregister(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_sndprack (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));void osip_setcb_sndunkrequest(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcv1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcv2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcv3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcv4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcv5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcv6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_snd1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_snd2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_snd3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_snd4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_snd5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_snd6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*));
void osip_setcb_rcvresp_retransmission(osip_t *cf,void (*cb)(transaction_t*));
void osip_setcb_sndreq_retransmission (osip_t *cf,void (*cb)(transaction_t*));
void osip_setcb_sndresp_retransmission(osip_t *cf,void (*cb)(transaction_t*));
void osip_setcb_rcvreq_retransmission (osip_t *cf,void (*cb)(transaction_t*));
void osip_setcb_killtransaction (osip_t *cf,void (*cb)(transaction_t*));void osip_setcb_endoftransaction (osip_t *cf,void (*cb)(transaction_t*));
void osip_setcb_connection_refused(osip_t *cf,void (*cb)(transaction_t*));
void osip_setcb_network_error (osip_t *cf,void (*cb)(transaction_t*));
/* FOR INCOMING TRANSACTION */
#define EVT_IS_RCV_INVITE(event) (event->type==RCV_REQINVITE)#define EVT_IS_RCV_ACK(event) (event->type==RCV_REQACK)#define EVT_IS_RCV_REQUEST(event) (event->type==RCV_REQUEST)#define EVT_IS_RCV_STATUS_1XX(event) (event->type==RCV_STATUS_1XX)#define EVT_IS_RCV_STATUS_23456XX(event) (event->type==RCV_STATUS_23456XX)/* FOR OUTGOING TRANSACTION */
#define EVT_IS_SND_INVITE(event) (event->type==SND_REQINVITE)#define EVT_IS_SND_ACK(event) (event->type==SND_REQACK)#define EVT_IS_SND_REQUEST(event) (event->type==SND_REQUEST)#define EVT_IS_SND_STATUS_1XX(event) (event->type==SND_STATUS_1XX)#define EVT_IS_SND_STATUS_23456XX(event) (event->type==SND_STATUS_23456XX)#define EVT_IS_INCOMINGMSG(event) (event->type>=RCV_REQINVITE \ &&event->type<=RCV_STATUS_23456XX)#define EVT_IS_INCOMINGREQ(event) (EVT_IS_RCV_INVITE(event) \ ||EVT_IS_RCV_ACK(event) \ ||EVT_IS_RCV_REQUEST(event))#define EVT_IS_INCOMINGRESP(event) (EVT_IS_RCV_STATUS_1XX(event) \ ||EVT_IS_RCV_STATUS_23456XX(event))#define EVT_IS_OUTGOINGMSG(event) (event->type>=SND_REQINVITE \ &&event->type<=SND_STATUS_23456XX)#define EVT_IS_OUTGOINGREQ(event) (EVT_IS_SND_INVITE(event) \ ||EVT_IS_SND_ACK(event) \ ||EVT_IS_SND_REQUEST(event))#define EVT_IS_OUTGOINGRESP(event) (EVT_IS_SND_STATUS_1XX(event) \ ||EVT_IS_SND_STATUS_23456XX(event))#define EVT_IS_MSG(event) (event->type>=RCV_REQINVITE \ &&event->type<=SND_STATUS_23456XX)#define EVT_IS_KILL_TRANSACTION(event) (event->type==KILL_TRANSACTION)
#define EVT_IS_UNKNOWN_EVT(event) (event->type==UNKNOWN_EVT)
|
User Layer |
|
Transaction contexts |
|
1 |
|
N |
|
FIFO 1 |
|
FIFO N |
osip_t *osip;
if (-1==osip_global_init())
return -1; /* mutex is not initialized properly */osip_init(&osip);
osip_init_proxy(osip,url_of_proxy);
osip_setcb_rcvresp_retransmission(cf,&cb_rcvresp_retransmission);
osip_setcb_sndreq_retransmission(cf,&cb_sndreq_retransmission);
osip_setcb_sndresp_retransmission(cf,&cb_sndresp_retransmission);
osip_setcb_rcvreq_retransmission(cf,&cb_rcvreq_retransmission);
osip_setcb_killtransaction(cf,&cb_killtransaction);osip_setcb_endoftransaction(cf,&cb_endoftransaction);
osip_setcb_connection_refused(cf,&cb_connection_refused);osip_setcb_network_error(cf,&cb_network_error);
osip_setcb_rcv1xx(cf,&cb_rcv1xx);osip_setcb_rcv2xx(cf,&cb_rcv2xx);
osip_setcb_rcv3xx(cf,&cb_rcv3xx);
osip_setcb_rcv4xx(cf,&cb_rcv4xx);
osip_setcb_rcv5xx(cf,&cb_rcv5xx);
osip_setcb_rcv6xx(cf,&cb_rcv6xx);
osip_setcb_sndinvite (cf,&cb_sndinvite); osip_setcb_sndack (cf,&cb_sndack); osip_setcb_sndbye (cf,&cb_sndbye);osip_setcb_sndcancel (cf,&cb_sndcancel);
osip_setcb_sndinfo (cf,&cb_sndinfo);osip_setcb_sndoptions (cf,&cb_sndoptions);
osip_setcb_sndregister(cf,&cb_sndregister);
osip_setcb_sndprack (cf,&cb_sndprack);osip_setcb_sndunkrequest(cf,&cb_sndunkrequest);
osip_setcb_snd1xx(cf,&cb_snd1xx);
osip_setcb_snd2xx(cf,&cb_snd2xx);
osip_setcb_snd3xx(cf,&cb_snd3xx);
osip_setcb_snd4xx(cf,&cb_snd4xx);
osip_setcb_snd5xx(cf,&cb_snd5xx);
osip_setcb_snd6xx(cf,&cb_snd6xx);
osip_setcb_rcvinvite (cf,&cb_rcvinvite);
osip_setcb_rcvack (cf,&cb_rcvack); osip_setcb_rcvbye (cf,&cb_rcvbye);osip_setcb_rcvcancel (cf,&cb_rcvcancel);
osip_setcb_rcvinfo (cf,&cb_rcvinfo);osip_setcb_rcvoptions (cf,&cb_rcvoptions);
osip_setcb_rcvregister(cf,&cb_rcvregister);
osip_setcb_rcvprack (cf,&cb_rcvprack);osip_setcb_rcvunkrequest(cf,&cb_rcvunkrequest);
int
create_session(osip_t *osip)
{ sip_t *invite;transaction_t *transaction;
/* You must create your own SIP message. */
msg_init (&invite);
your_own_method_to_setup_messages(invite);
/* When it is the first invite, allocate *//* and start a new transaction (prepare the
/* context and start a thread.) */trn_init(&transaction,
osip, invite->to, invite->from, invite->callid, invite->cseq);/* The thread is now waiting on its FIFO */
/* The following method allocate an event */
/* and send it to the transaction. */osip_sendmsg(transaction,invite);
}
int
osip_sendmsg(transaction_t *transaction,sip_t *msg)
{ sipevent_t *sipevent; sipevent = osip_new_outgoing_sipmessage(msg); sipevent->transactionid = transaction->transactionid;/* depending on your application model, you can choose */
/* either to consume the event are add it in the fifo */
/* and delay the operations */
#ifdef OSIP_MT
fifo_add(transaction->transactionff,sipevent);#else
transaction_execute(transaction,sipevent);#endif
return 0;}
编辑 webmaster