Add smdi support for asterisk (see doc/smdi.txt for config info) (#5945)
[asterisk/asterisk.git] / include / asterisk / smdi.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * SMDI support for Asterisk.
5  * 
6  * Copyright (C) 2005, Digium, Inc.
7  *
8  * Matthew A. Nicholson <mnicholson@digium.com>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License.
12  */
13
14 /*! 
15  * \file
16  * \brief SMDI support for Asterisk.
17  * \author Matthew A. Nicholson <mnicholson@digium.com>
18  */
19
20
21 /* C is simply a ego booster for those who want to do objects the hard way. */
22
23
24 #ifndef AST_SMDI_H
25 #define AST_SMDI_H
26
27 #include "asterisk/config.h"
28 #include "asterisk/module.h"
29 #include "asterisk/astobj.h"
30 #include <termios.h>
31 #include <time.h>
32
33 #define SMDI_MESG_DESK_NUM_LEN 3
34 #define SMDI_MESG_DESK_TERM_LEN 4
35 #define SMDI_MWI_FAIL_CAUSE_LEN 3
36 #define SMDI_MAX_STATION_NUM_LEN 10
37 #define SMDI_MAX_FILENAME_LEN 256
38
39 /*!
40  * \brief An SMDI message waiting indicator message.
41  *
42  * The ast_smdi_mwi_message structure contains the parsed out parts of an smdi
43  * message.  Each ast_smdi_interface structure has a message queue consisting
44  * ast_smdi_mwi_message structures. 
45  */
46 struct ast_smdi_mwi_message {
47         ASTOBJ_COMPONENTS(struct ast_smdi_mwi_message);
48         char fwd_st[SMDI_MAX_STATION_NUM_LEN + 1];              /* forwarding station number */
49         char cause[SMDI_MWI_FAIL_CAUSE_LEN + 1];                /* the type of failure */
50         struct timeval timestamp;                               /* a timestamp for the message */
51 };
52
53 /*!
54  * \brief An SMDI message desk message.
55  *
56  * The ast_smdi_md_message structure contains the parsed out parts of an smdi
57  * message.  Each ast_smdi_interface structure has a message queue consisting
58  * ast_smdi_md_message structures. 
59  */
60 struct ast_smdi_md_message {
61         ASTOBJ_COMPONENTS(struct ast_smdi_md_message);
62         char mesg_desk_num[SMDI_MESG_DESK_NUM_LEN + 1];         /* message desk number */
63         char mesg_desk_term[SMDI_MESG_DESK_TERM_LEN + 1];       /* message desk terminal */
64         char fwd_st[SMDI_MAX_STATION_NUM_LEN + 1];              /* forwarding station number */
65         char calling_st[SMDI_MAX_STATION_NUM_LEN + 1];          /* calling station number */
66         char type;                                              /* the type of the call */
67         struct timeval timestamp;                               /* a timestamp for the message */
68 };
69
70 /*! \brief SMDI message desk message queue. */
71 struct ast_smdi_md_queue {
72         ASTOBJ_CONTAINER_COMPONENTS(struct ast_smdi_md_message);
73 };
74
75 /*! \brief SMDI message waiting indicator message queue. */
76 struct ast_smdi_mwi_queue {
77         ASTOBJ_CONTAINER_COMPONENTS(struct ast_smdi_mwi_message);
78 };
79
80 /*! 
81  * \brief SMDI interface structure.
82  *
83  * The ast_smdi_interface structure holds information on a serial port that
84  * should be monitored for SMDI activity.  The structure contains a message
85  * queue of messages that have been recieved on the interface.
86  */
87 struct ast_smdi_interface {
88         ASTOBJ_COMPONENTS_FULL(struct ast_smdi_interface, SMDI_MAX_FILENAME_LEN, 1);
89         struct ast_smdi_md_queue md_q;
90         struct ast_smdi_mwi_queue mwi_q;
91         FILE *file;
92         int fd;
93         pthread_t thread;
94         struct termios mode;
95         int msdstrip;
96         long msg_expiry;
97 };
98
99
100 /* MD message queue functions */
101 extern struct ast_smdi_md_message *ast_smdi_md_message_pop(struct ast_smdi_interface *iface);
102 extern struct ast_smdi_md_message *ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout);
103 extern void ast_smdi_md_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_md_message *msg);
104
105 /* MWI message queue functions */
106 extern struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface *iface);
107 extern struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait(struct ast_smdi_interface *iface, int timeout);
108 extern void ast_smdi_mwi_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_mwi_message *msg);
109
110 extern struct ast_smdi_interface *ast_smdi_interface_find(const char *iface_name);
111
112 /* MWI functions */
113 extern int ast_smdi_mwi_set(struct ast_smdi_interface *iface, const char *mailbox);
114 extern int ast_smdi_mwi_unset(struct ast_smdi_interface *iface, const char *mailbox);
115
116 extern void ast_smdi_md_message_destroy(struct ast_smdi_md_message *msg);
117 extern void ast_smdi_mwi_message_destroy(struct ast_smdi_mwi_message *msg);
118
119 extern void ast_smdi_interface_destroy(struct ast_smdi_interface *iface);
120 #endif