summaryrefslogtreecommitdiff
path: root/src/rexmpp_jingle.h
blob: cd23efb495bd1fff5e0c7c2938b744f7a2693375 (plain)
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/**
   @file rexmpp_jingle.h
   @brief Jingle routines
   @author defanor <defanor@uberspace.net>
   @date 2021
   @copyright MIT license.

*/


#ifndef REXMPP_JINGLE_H
#define REXMPP_JINGLE_H

#include "config.h"

#ifdef ENABLE_CALLS
#include <glib.h>
#include <agent.h>
#include <gnutls/gnutls.h>
#include <srtp2/srtp.h>
#define DTLS_SRTP_BUF_SIZE 0x4000
#endif

#include "rexmpp.h"

/** @brief Processes incoming Jingle IQs. */
int rexmpp_jingle_iq (rexmpp_t *s, xmlNodePtr elem);

/** @brief Destroys Jingle sessions. */
void rexmpp_jingle_stop (rexmpp_t *s);

/** @brief Accepts a file, given a sid and a path to save it to. */
rexmpp_err_t
rexmpp_jingle_accept_file_by_id (rexmpp_t *s,
                                 const char *sid,
                                 const char *path);

/** @brief Sends a file to a given full JID. */
rexmpp_err_t
rexmpp_jingle_send_file (rexmpp_t *s,
                         const char *jid,
                         char *path);

/** @brief Terminates a Jingle session. */
rexmpp_err_t
rexmpp_jingle_session_terminate (rexmpp_t *s,
                                 const char *sid,
                                 xmlNodePtr reason_node,
                                 const char *reason_text);

typedef struct rexmpp_jingle_component rexmpp_jingle_component_t;
typedef struct rexmpp_jingle_session rexmpp_jingle_session_t;
typedef struct rexmpp_jingle_ctx rexmpp_jingle_ctx_t;

enum rexmpp_jingle_session_type {
  REXMPP_JINGLE_SESSION_FILE,
  REXMPP_JINGLE_SESSION_MEDIA
};

#ifdef ENABLE_CALLS
/* A structure used for callbacks, to pass rexmpp_t,
   rexmpp_jingle_session_t, and the component ID. */
struct rexmpp_jingle_component {
  rexmpp_t *s;
  rexmpp_jingle_session_t *session;
  int component_id;
  gnutls_session_t dtls_session;
  char dtls_buf[DTLS_SRTP_BUF_SIZE];
  enum tls_st dtls_state;
  size_t dtls_buf_len;
  srtp_t srtp_in;
  srtp_t srtp_out;
  uint16_t udp_port_in;
  uint16_t udp_port_out;
  int udp_socket;
};
#endif

struct rexmpp_jingle_session {
  char *jid;
  char *sid;
  xmlNodePtr initiate;
  xmlNodePtr accept;
  rexmpp_jingle_session_t *next;
  /* Sessions are commonly passed to callbacks by external libraries,
     so it's convenient to have the corresponding rexmpp_t accessible
     through those. */
  rexmpp_t *s;
  int initiator;
  enum rexmpp_jingle_session_type type;

  /* IBB file transfers */
  FILE *ibb_fh;
  char *ibb_sid;
  uint16_t ibb_seq;

  /* ICE-UDP + DTLS-SRTP A/V calls */
#ifdef ENABLE_CALLS
  char *stun_host;
  uint16_t stun_port;
  char *turn_host;
  uint16_t turn_port;
  char *turn_username;
  char *turn_password;
  /* two component structures for callbacks: for SRTP and SRTCP */
  rexmpp_jingle_component_t component[2];
  int rtcp_mux;
  NiceAgent *ice_agent;
  int ice_stream_id;
#endif
};

struct rexmpp_jingle_ctx {
#ifdef ENABLE_CALLS
  GMainLoop* gloop;
  gnutls_certificate_credentials_t dtls_cred;
#endif
  rexmpp_jingle_session_t *sessions;
};


int rexmpp_jingle_init (rexmpp_t *s);
rexmpp_err_t rexmpp_jingle_run (rexmpp_t *s, fd_set *read_fds, fd_set *write_fds);
struct timeval * rexmpp_jingle_timeout (rexmpp_t *s,
                                        struct timeval *max_tv,
                                        struct timeval *tv);
int rexmpp_jingle_fds(rexmpp_t *s, fd_set *read_fds, fd_set *write_fds);

rexmpp_err_t
rexmpp_jingle_call (rexmpp_t *s,
                    const char *jid,
                    uint16_t rtp_port_in,
                    uint16_t rtp_port_out);
rexmpp_err_t
rexmpp_jingle_call_accept (rexmpp_t *s,
                           const char *sid,
                           uint16_t rtp_port_in,
                           uint16_t rtp_port_out);

#endif