00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "asterisk.h"
00027
00028 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 263541 $")
00029
00030 #include <stdlib.h>
00031 #include <stdio.h>
00032 #include <string.h>
00033 #include <sys/types.h>
00034
00035 #include "asterisk/module.h"
00036 #include "asterisk/channel.h"
00037 #include "asterisk/pbx.h"
00038 #include "asterisk/logger.h"
00039 #include "asterisk/utils.h"
00040 #include "asterisk/app.h"
00041 #include "asterisk/options.h"
00042 #include "asterisk/callerid.h"
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 static int connectedline_read(struct ast_channel *chan, const char *cmd, char *data,
00081 char *buf, size_t len)
00082 {
00083
00084 *buf = 0;
00085
00086 if (!chan)
00087 return -1;
00088
00089 ast_channel_lock(chan);
00090
00091 if (!strncasecmp("all", data, 3)) {
00092 snprintf(buf, len, "\"%s\" <%s>",
00093 S_OR(chan->connected.id.name, ""),
00094 S_OR(chan->connected.id.number, ""));
00095 } else if (!strncasecmp("name", data, 4)) {
00096 if (chan->connected.id.name) {
00097 ast_copy_string(buf, chan->connected.id.name, len);
00098 }
00099 } else if (!strncasecmp("num", data, 3)) {
00100 if (chan->connected.id.number) {
00101 ast_copy_string(buf, chan->connected.id.number, len);
00102 }
00103 } else if (!strncasecmp("tag", data, 3)) {
00104 if (chan->connected.id.tag) {
00105 ast_copy_string(buf, chan->connected.id.tag, len);
00106 }
00107 } else if (!strncasecmp("ton", data, 3)) {
00108 snprintf(buf, len, "%d", chan->connected.id.number_type);
00109 } else if (!strncasecmp("pres", data, 4)) {
00110 ast_copy_string(buf, ast_named_caller_presentation(chan->connected.id.number_presentation), len);
00111 } else if (!strncasecmp("source", data, 6)) {
00112 ast_copy_string(buf, ast_connected_line_source_name(chan->connected.source), len);
00113 } else if (!strncasecmp("subaddr", data, 7)) {
00114
00115 if (!strncasecmp(data + 7 ,"-valid", 6)) {
00116 snprintf(buf, len, "%d", chan->connected.id.subaddress.valid);
00117 } else if (!strncasecmp(data + 7 ,"-type", 5)) {
00118 snprintf(buf, len, "%d", chan->connected.id.subaddress.type);
00119 } else if (!strncasecmp(data + 7 ,"-odd", 4)) {
00120 snprintf(buf, len, "%d", chan->connected.id.subaddress.odd_even_indicator);
00121 } else {
00122 if (chan->connected.id.subaddress.str) {
00123 ast_copy_string(buf, chan->connected.id.subaddress.str, len);
00124 }
00125 }
00126 } else {
00127 ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
00128 }
00129
00130 ast_channel_unlock(chan);
00131
00132 return 0;
00133 }
00134
00135 static int connectedline_write(struct ast_channel *chan, const char *cmd, char *data,
00136 const char *value)
00137 {
00138 struct ast_party_connected_line connected;
00139 char *val;
00140 char *option;
00141 void (*set_it)(struct ast_channel *chan, const struct ast_party_connected_line *connected);
00142
00143 if (!value || !chan) {
00144 return -1;
00145 }
00146
00147
00148 option = strchr(data, ',');
00149 if (option) {
00150 option = ast_skip_blanks(option + 1);
00151 switch (*option) {
00152 case 'i':
00153 set_it = ast_channel_set_connected_line;
00154 break;
00155
00156 default:
00157 ast_log(LOG_ERROR, "Unknown connectedline option '%s'.\n", option);
00158 return 0;
00159 }
00160 }
00161 else {
00162 set_it = ast_channel_update_connected_line;
00163 }
00164
00165 ast_channel_lock(chan);
00166 ast_party_connected_line_set_init(&connected, &chan->connected);
00167 ast_channel_unlock(chan);
00168
00169 value = ast_skip_blanks(value);
00170
00171 if (!strncasecmp("all", data, 3)) {
00172 char name[256];
00173 char num[256];
00174
00175 ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
00176 connected.id.name = name;
00177 connected.id.number = num;
00178 set_it(chan, &connected);
00179 } else if (!strncasecmp("name", data, 4)) {
00180 connected.id.name = ast_strdupa(value);
00181 ast_trim_blanks(connected.id.name);
00182 set_it(chan, &connected);
00183 } else if (!strncasecmp("num", data, 3)) {
00184 connected.id.number = ast_strdupa(value);
00185 ast_trim_blanks(connected.id.number);
00186 set_it(chan, &connected);
00187 } else if (!strncasecmp("tag", data, 3)) {
00188 connected.id.tag = ast_strdupa(value);
00189 ast_trim_blanks(connected.id.tag);
00190 set_it(chan, &connected);
00191 } else if (!strncasecmp("ton", data, 3)) {
00192 val = ast_strdupa(value);
00193 ast_trim_blanks(val);
00194
00195 if (('0' <= val[0]) && (val[0] <= '9')) {
00196 connected.id.number_type = atoi(val);
00197 set_it(chan, &connected);
00198 } else {
00199 ast_log(LOG_ERROR, "Unknown connectedline type of number '%s', value unchanged\n", val);
00200 }
00201 } else if (!strncasecmp("pres", data, 4)) {
00202 int pres;
00203
00204 val = ast_strdupa(value);
00205 ast_trim_blanks(val);
00206
00207 if (('0' <= val[0]) && (val[0] <= '9')) {
00208 pres = atoi(val);
00209 } else {
00210 pres = ast_parse_caller_presentation(val);
00211 }
00212
00213 if (pres < 0) {
00214 ast_log(LOG_ERROR, "Unknown connectedline number presentation '%s', value unchanged\n", val);
00215 } else {
00216 connected.id.number_presentation = pres;
00217 set_it(chan, &connected);
00218 }
00219 } else if (!strncasecmp("source", data, 6)) {
00220 int source;
00221
00222 val = ast_strdupa(value);
00223 ast_trim_blanks(val);
00224
00225 if (('0' <= val[0]) && (val[0] <= '9')) {
00226 source = atoi(val);
00227 } else {
00228 source = ast_connected_line_source_parse(val);
00229 }
00230
00231 if (source < 0) {
00232 ast_log(LOG_ERROR, "Unknown connectedline source '%s', value unchanged\n", val);
00233 } else {
00234 connected.source = source;
00235 set_it(chan, &connected);
00236 }
00237 } else if (!strncasecmp("subaddr", data, 7)) {
00238
00239 if (!strncasecmp(data + 7 ,"-valid", 6)) {
00240 connected.id.subaddress.valid = atoi(value) ? 1 : 0;
00241 } else if (!strncasecmp(data + 7 ,"-type", 5)) {
00242 connected.id.subaddress.type = atoi(value) ? 2 : 0;
00243 } else if (!strncasecmp(data + 7 ,"-odd", 4)) {
00244 connected.id.subaddress.odd_even_indicator = atoi(value) ? 1 : 0;
00245 } else {
00246 connected.id.subaddress.str = ast_strdupa(value);
00247 ast_trim_blanks(connected.id.subaddress.str);
00248 }
00249 set_it(chan, &connected);
00250 } else {
00251 ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
00252 }
00253
00254 return 0;
00255 }
00256
00257 static struct ast_custom_function connectedline_function = {
00258 .name = "CONNECTEDLINE",
00259 .read = connectedline_read,
00260 .write = connectedline_write,
00261 };
00262
00263 static int unload_module(void)
00264 {
00265 return ast_custom_function_unregister(&connectedline_function);
00266 }
00267
00268 static int load_module(void)
00269 {
00270 return ast_custom_function_register(&connectedline_function)
00271 ? AST_MODULE_LOAD_DECLINE
00272 : AST_MODULE_LOAD_SUCCESS;
00273 }
00274
00275 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Connected Line dialplan function");