Issue 7231 - Utility to convert libtonezone indications to indications.conf format
[asterisk/asterisk.git] / contrib / utils / zones2indications.c
1 /*
2  * zones2indications: print libtonozone data as Asterisk indications.conf
3  * 
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
17  *
18  * Author: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
19  */
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <tonezone.h>
24 #include <unistd.h>
25
26 #define PROGRAM "zones2indication"
27
28 void print_tone_zone_sound(struct tone_zone *zone_data, const char* name, 
29     int toneid) {
30   int i;
31   for (i=0; i<ZT_TONE_MAX; i++) {
32     if (zone_data->tones[i].toneid == toneid){
33       printf("%s = %s\n", name, zone_data->tones[i].data);
34       break;
35     }
36   }
37 }
38
39 void print_indications(struct tone_zone *zone_data) {
40   int i;
41   
42   printf (
43     "[%s]\n"
44     "; Source: libtonezone.\n"
45     "description = %s\n"
46     "\n",
47     zone_data->country, zone_data->description
48   );
49   
50   printf(  
51     "ringcadence = "
52   );
53   for(i=0; ; i++) {
54     if (zone_data->ringcadence[i] == 0)
55       break;
56     if (i != 0)
57       putchar(',');
58     printf("%d",zone_data->ringcadence[i]);
59   }
60   putchar('\n');
61   
62   print_tone_zone_sound(zone_data, "dial",        ZT_TONE_DIALTONE);
63   print_tone_zone_sound(zone_data, "busy",        ZT_TONE_BUSY);
64   print_tone_zone_sound(zone_data, "ring",        ZT_TONE_RINGTONE);
65   print_tone_zone_sound(zone_data, "congestion",  ZT_TONE_CONGESTION);
66   print_tone_zone_sound(zone_data, "callwaiting", ZT_TONE_CALLWAIT);
67   print_tone_zone_sound(zone_data, "dialrecall",  ZT_TONE_DIALRECALL);
68   print_tone_zone_sound(zone_data, "record",      ZT_TONE_RECORDTONE);
69   print_tone_zone_sound(zone_data, "info",        ZT_TONE_INFO);
70   print_tone_zone_sound(zone_data, "stutter",     ZT_TONE_STUTTER);
71   printf("\n\n");
72 }
73
74 int print_zone_by_id(int zone_num) {
75   struct tone_zone *zone_data = tone_zone_find_by_num(zone_num);
76
77   if (zone_data == NULL)
78     return 1;
79
80   print_indications(zone_data);
81
82   return 0;
83 }
84
85 int print_zone_by_country(char* country) {
86   struct tone_zone *zone_data = tone_zone_find(country);
87
88   if (zone_data == NULL)
89     return 1;
90
91   print_indications(zone_data);
92
93   return 0;
94 }
95
96 int print_all() {
97   int i;
98   /* loop over all possible zones */
99   for (i=0; ; i++) {
100     if (print_zone_by_id(i))
101       break;
102   }
103   return 0;
104 }
105
106 void usage() {
107   fprintf(stderr,
108       PROGRAM ": print libtonozone data as Asterisk indications.conf\n"
109       "\n"
110       "Usage:\n"
111       "  " PROGRAM " -a         Print all countries\n"
112       "  " PROGRAM " -c <code>  Select country by two-letter country code\n"
113       "  " PROGRAM " -n <num>   Select country by its internal libtonezone number\n"
114       "  " PROGRAM " -h         Print this text.\n"
115   );
116 }
117
118 int main(int argc, char* argv[]){
119   int country_code = -1;
120   int opt_print_all = 0;
121   int opt;
122   char* endptr = NULL;
123   
124   while((opt = getopt(argc, argv, "ac:hn:")) != -1) {
125     switch(opt) {
126       case 'a':
127         return print_all();
128       case 'c':
129         return print_zone_by_country(optarg);
130       case 'h':
131         usage();
132         return 0;
133       case 'n':
134         printf("number is %s.\n", optarg);
135         country_code = strtol(optarg, &endptr, 10);
136         return print_zone_by_id(country_code);
137         /* FIXME: what if this is not a number?
138         if (endptr != NULL) {
139           fprintf(stderr, "Error: Invalid country code %s, %d.\n",optarg, country_code);
140           usage();
141           exit(1);
142         }
143         */
144         break;
145     }
146   }
147   
148   /* If we got here, the user selected no option */
149   usage();
150   return 2;
151 }