JLChen
2020-12-10 a8c5f79b0d93adfa7f23601dd0fee30edc14f0d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * @file re_sipevent.h  SIP Event Framework
 *
 * Copyright (C) 2010 Creytiv.com
 */
 
 
/* Message Components */
 
struct sipevent_event {
    struct pl event;
    struct pl params;
    struct pl id;
};
 
enum sipevent_subst {
    SIPEVENT_ACTIVE = 0,
    SIPEVENT_PENDING,
    SIPEVENT_TERMINATED,
};
 
enum sipevent_reason {
    SIPEVENT_DEACTIVATED = 0,
    SIPEVENT_PROBATION,
    SIPEVENT_REJECTED,
    SIPEVENT_TIMEOUT,
    SIPEVENT_GIVEUP,
    SIPEVENT_NORESOURCE,
};
 
struct sipevent_substate {
    enum sipevent_subst state;
    enum sipevent_reason reason;
    struct pl expires;
    struct pl retry_after;
    struct pl params;
};
 
int sipevent_event_decode(struct sipevent_event *se, const struct pl *pl);
int sipevent_substate_decode(struct sipevent_substate *ss,
                 const struct pl *pl);
const char *sipevent_substate_name(enum sipevent_subst state);
const char *sipevent_reason_name(enum sipevent_reason reason);
 
 
/* Listener Socket */
 
struct sipevent_sock;
 
int sipevent_listen(struct sipevent_sock **sockp, struct sip *sip,
            uint32_t htsize_not, uint32_t htsize_sub,
            sip_msg_h *subh, void *arg);
 
 
/* Notifier */
 
struct sipnot;
 
typedef void (sipnot_close_h)(int err, const struct sip_msg *msg, void *arg);
 
int sipevent_accept(struct sipnot **notp, struct sipevent_sock *sock,
            const struct sip_msg *msg, struct sip_dialog *dlg,
            const struct sipevent_event *event,
            uint16_t scode, const char *reason, uint32_t expires_min,
            uint32_t expires_dfl, uint32_t expires_max,
            const char *cuser, const char *ctype,
            sip_auth_h *authh, void *aarg, bool aref,
            sipnot_close_h *closeh, void *arg, const char *fmt, ...);
int sipevent_notify(struct sipnot *sipnot, struct mbuf *mb,
            enum sipevent_subst state, enum sipevent_reason reason,
            uint32_t retry_after);
int sipevent_notifyf(struct sipnot *sipnot, struct mbuf **mbp,
             enum sipevent_subst state, enum sipevent_reason reason,
             uint32_t retry_after, const char *fmt, ...);
 
 
/* Subscriber */
 
struct sipsub;
 
typedef int  (sipsub_fork_h)(struct sipsub **subp, struct sipsub *osub,
                 const struct sip_msg *msg, void *arg);
typedef void (sipsub_notify_h)(struct sip *sip, const struct sip_msg *msg,
                   void *arg);
typedef void (sipsub_close_h)(int err, const struct sip_msg *msg,
                  const struct sipevent_substate *substate,
                  void *arg);
 
int sipevent_subscribe(struct sipsub **subp, struct sipevent_sock *sock,
               const char *uri, const char *from_name,
               const char *from_uri, const char *event, const char *id,
               uint32_t expires, const char *cuser,
               const char *routev[], uint32_t routec,
               sip_auth_h *authh, void *aarg, bool aref,
               sipsub_fork_h *forkh, sipsub_notify_h *notifyh,
               sipsub_close_h *closeh, void *arg,
               const char *fmt, ...);
int sipevent_dsubscribe(struct sipsub **subp, struct sipevent_sock *sock,
            struct sip_dialog *dlg, const char *event,
            const char *id, uint32_t expires, const char *cuser,
            sip_auth_h *authh, void *aarg, bool aref,
            sipsub_notify_h *notifyh, sipsub_close_h *closeh,
            void *arg, const char *fmt, ...);
 
int sipevent_refer(struct sipsub **subp, struct sipevent_sock *sock,
           const char *uri, const char *from_name,
           const char *from_uri, const char *cuser,
           const char *routev[], uint32_t routec,
           sip_auth_h *authh, void *aarg, bool aref,
           sipsub_fork_h *forkh, sipsub_notify_h *notifyh,
           sipsub_close_h *closeh, void *arg,
           const char *fmt, ...);
int sipevent_drefer(struct sipsub **subp, struct sipevent_sock *sock,
            struct sip_dialog *dlg, const char *cuser,
            sip_auth_h *authh, void *aarg, bool aref,
            sipsub_notify_h *notifyh, sipsub_close_h *closeh,
            void *arg, const char *fmt, ...);
 
int sipevent_fork(struct sipsub **subp, struct sipsub *osub,
          const struct sip_msg *msg,
          sip_auth_h *authh, void *aarg, bool aref,
          sipsub_notify_h *notifyh, sipsub_close_h *closeh,
          void *arg);