2df2930bb5331d3805bf5f4b00384271eb1e52d7
[sip-router] / modules_k / presence / utils_func.c
1 /*
2  * $Id$
3  *
4  * presence module - presence server implementation
5  *
6  * Copyright (C) 2006 Voice Sistem S.R.L.
7  *
8  * This file is part of openser, a free SIP server.
9  *
10  * openser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * openser is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  *
24  * History:
25  * --------
26  *  2006-08-15  initial version (anca)
27  */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <ctype.h>
33 #include "../../mem/mem.h"
34 #include "../../dprint.h"
35 #include "../../ut.h"
36 #include "../../data_lump_rpl.h"
37 #include "utils_func.h"
38 #include "event_list.h"
39 #include "presence.h"
40
41
42 static const char base64digits[] =
43 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
44
45 #define BAD     -1
46 static const char base64val[] = {
47 BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
48 BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
49 BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
50 52, 53, 54, 55,  56, 57, 58, 59,  60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
51 BAD,  0,  1,  2,   3,  4,  5,  6,   7,  8,  9, 10,  11, 12, 13, 14,
52 15, 16, 17, 18,  19, 20, 21, 22,  23, 24, 25,BAD, BAD,BAD,BAD,BAD,
53 BAD, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 36,  37, 38, 39, 40,
54 41, 42, 43, 44,  45, 46, 47, 48,  49, 50, 51,BAD, BAD,BAD,BAD,BAD
55 };
56 #define DECODE64(c)  (isascii(c) ? base64val[c] : BAD)
57
58 void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
59 {
60         for (; inlen >= 3; inlen -= 3)
61         {
62                 *out++ = base64digits[in[0] >> 2];
63                 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
64                 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
65                 *out++ = base64digits[in[2] & 0x3f];
66                 in += 3;
67         }
68
69         if (inlen > 0)
70         {
71                 unsigned char fragment;
72
73                 *out++ = base64digits[in[0] >> 2];
74                 fragment = (in[0] << 4) & 0x30;
75
76                 if (inlen > 1)
77                         fragment |= in[1] >> 4;
78
79                 *out++ = base64digits[fragment];
80                 *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
81                 *out++ = '=';
82         }
83                 *out = '\0';
84                 
85 }
86
87 int a_to_i (char *s,int len)
88 {
89         int n = 0, i= 0;
90         
91         while( i<len  )         
92                 n=n*10+( s[i++] -'0');
93         
94         return n;
95 }
96
97 int send_error_reply(struct sip_msg* msg, int reply_code, str reply_str)
98 {
99         if(reply_code== 481)
100         {
101                 str hdr_append;
102                 char buffer[256];
103                 int i;
104                 pres_ev_t* ev= EvList->events;
105
106                 hdr_append.s = buffer;
107                 hdr_append.s[0]='\0';
108                 hdr_append.len = sprintf(hdr_append.s, "Allow-Events: ");
109                 if(hdr_append.len < 0)
110                 {
111                         LM_ERR("unsuccessful sprintf\n");
112                         return -1;
113                 }
114
115                 for(i= 0; i< EvList->ev_count; i++)
116                 {
117                         if(i> 0)
118                         {
119                                 memcpy(hdr_append.s+ hdr_append.len, ", ", 2);
120                                 hdr_append.len+= 2;
121                         }       
122                         memcpy(hdr_append.s+ hdr_append.len, ev->name.s, ev->name.len );
123                         hdr_append.len+= ev->name.len ;
124                         ev= ev->next;
125                 }
126                 memcpy(hdr_append.s+ hdr_append.len, CRLF, CRLF_LEN);
127                 hdr_append.len+=  CRLF_LEN;
128                 hdr_append.s[hdr_append.len]= '\0';
129                 
130                 if (add_lump_rpl( msg, hdr_append.s, hdr_append.len, LUMP_RPL_HDR)==0 )
131                 {
132                         LM_ERR("unable to add lump_rl\n");
133                         return -1;
134                 }
135         }
136
137         if (slb.reply(msg, reply_code, &reply_str) == -1)
138         {
139                 LM_ERR("sending %d %.*s reply\n", reply_code, reply_str.len, reply_str.s);
140                 return -1;
141         }
142         return 0;
143
144 }
145