--- chan_sebi.c.1.4	2009-08-25 16:34:25.000000000 +0100
+++ chan_sebi.c	2009-08-25 16:33:11.000000000 +0100
@@ -56,6 +56,7 @@
 #include <asterisk/dsp.h>
 #include <asterisk/app.h>
 #include <asterisk/manager.h>
+#include <asterisk/paths.h>
 
 #define MODEM_CONFIG "sebi.conf"
 #define DEVICE_CONFIG "sebi_devices.conf"
@@ -80,6 +81,7 @@
 	MODEM_STATE_INIT5,
 	MODEM_STATE_INIT6,
 	MODEM_STATE_INIT7,
+	MODEM_STATE_INIT8,
 	MODEM_STATE_INIT_VOICE,
 	MODEM_STATE_INIT_VOICE1,
 	MODEM_STATE_INIT_VOICE2,
@@ -115,7 +117,7 @@
 	char imei[16];					/* imei of modem */
 	char csca[15];					/* CSCA number (sms centre address) */
 	char net_provider[6];			/* Network Provider */
-	char net_name[20];				/* Network friendly name */
+	char net_name[50];				/* Network friendly name */
 	int volume;						/* modem volume */
 	char language[MAX_LANGUAGE];
 	char context[AST_MAX_CONTEXT];			/* the context for incoming calls */
@@ -156,19 +158,18 @@
 static AST_RWLIST_HEAD_STATIC(devices, modem_pvt);
 
 /* CLI stuff */
-static const char show_usage[] =
-"Usage: sebi show devices\n" 
-"       Shows the state of Modem devices.\n";
 
-static int handle_cli_modem_show_devices(int fd, int argc, char **argv);
+static char *handle_cli_modem_show_devices(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 
 static int voice_write(int s, char *buf, int len);
 static int voice_read(int s, char *buf, int len); 
 
 static struct ast_cli_entry modem_cli[] = {
-	{{"sebi", "show", "devices", NULL}, handle_cli_modem_show_devices, "Show Modem devices", show_usage},
+	AST_CLI_DEFINE(handle_cli_modem_show_devices, "Show sebi devices"),
 };
 
+
+
 /* App stuff */
 static char *app_sebistatus = "SebiStatus";
 static char *sebistatus_synopsis = "SebiStatus(Device,Variable)";
@@ -220,7 +221,7 @@
 
 /* CLI Commands implementation */
 
-static int handle_cli_modem_show_devices(int fd, int argc, char **argv)
+static char *handle_cli_modem_show_devices(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
 	struct modem_pvt *pvt;
 	
@@ -228,15 +229,25 @@
 
 #define FORMAT1 "%-15.15s %-17.17s %-15.15s %-15.15s %-9.9s %-5.5s %-5.5s %-3.3s\n"
 
-	if (argc != 3)
-		return RESULT_SHOWUSAGE;
+	switch (cmd) {
+        case CLI_INIT:
+        	e->command = "sebi show devices";
+                e->usage = "Usage: sebi show devices\n"
+                           "       Shows the state of the sebi devices.\n";
+		return NULL;
+	case CLI_GENERATE:
+        	return NULL;
+	}
+
+	if (a->argc != 3)
+		return CLI_SHOWUSAGE;
 
-	ast_cli(fd, FORMAT1, "ID", "IMEI", "Group", "Provider", "Connected", "State", "Voice", "SMS");
+	ast_cli(a->fd, FORMAT1, "ID", "IMEI", "Group", "Provider", "Connected", "State", "Voice", "SMS");
 	AST_RWLIST_RDLOCK(&devices);
 	AST_RWLIST_TRAVERSE(&devices, pvt, entry) {
 		
 		snprintf(group, 5, "%d", pvt->group);
-		ast_cli(fd, FORMAT1, pvt->id, pvt->imei, group, pvt->net_name, pvt->connected ? "Yes" : "No",
+		ast_cli(a->fd, FORMAT1, pvt->id, pvt->imei, group, pvt->net_name, pvt->connected ? "Yes" : "No",
 			(pvt->state == MODEM_STATE_IDLE) ? "Free" : (pvt->state < MODEM_STATE_IDLE) ? "Init" : "Busy",
 			(pvt->has_voice) ? "Yes" : "No", (pvt->has_sms) ? "Yes" : "No");
 	}
@@ -244,7 +255,7 @@
 
 #undef FORMAT1
 
-	return RESULT_SUCCESS;
+	return CLI_SUCCESS;
 }
 
 /*
@@ -643,9 +654,9 @@
 	pvt->fr.mallocd = 0;
 	pvt->fr.delivery.tv_sec = 0;
 	pvt->fr.delivery.tv_usec = 0;
-	pvt->fr.data = pvt->io_buf + AST_FRIENDLY_OFFSET;
+	pvt->fr.data.ptr = pvt->io_buf + AST_FRIENDLY_OFFSET;
 
-	if ((r = read(pvt->io_pipe[0], pvt->fr.data, CHANNEL_FRAME_SIZE)) != CHANNEL_FRAME_SIZE) {
+	if ((r = read(pvt->io_pipe[0], pvt->fr.data.ptr, CHANNEL_FRAME_SIZE)) != CHANNEL_FRAME_SIZE) {
 		if (r == -1) {
 			ast_log(LOG_ERROR, "read error %d\n", errno);
 			return &ast_null_frame;
@@ -697,7 +708,7 @@
 	io_need = 0;
 	if (pvt->io_save_len > 0) {
 		io_need = DEVICE_FRAME_SIZE - pvt->io_save_len;
-		memcpy(pvt->io_save_buf + pvt->io_save_len, frame->data, io_need);
+		memcpy(pvt->io_save_buf + pvt->io_save_len, frame->data.ptr, io_need);
 		r = voice_write(pvt->voice_socket, pvt->io_save_buf, DEVICE_FRAME_SIZE);
 		if ((r = voice_read(pvt->voice_socket, buf, DEVICE_FRAME_SIZE))) {
 			if ((ast->_state == AST_STATE_UP) || (ast->_state == AST_STATE_DIALING))	// Dont queue the audio in the pipe if the call is not up yet. just toss it. 
@@ -706,7 +717,7 @@
 	}
 
 	num_frames = (frame->datalen - io_need) / DEVICE_FRAME_SIZE;
-	pfr = frame->data + io_need;
+	pfr = frame->data.ptr + io_need;
 
 	for (i=0; i<num_frames; i++) {
 		r = voice_write(pvt->voice_socket, pfr, DEVICE_FRAME_SIZE );
@@ -1053,7 +1064,7 @@
 				break;
 			case MODEM_STATE_INIT5:
 				if (strstr(buf, "+CREG: 0,1")) { // Network OK
-					data_write(pvt, "AT+COPS=3,0\r");
+					data_write(pvt, "AT+COPS=3,2\r"); // was 3,0
 					pvt->state++;
 				}else if (strstr(buf, "+CREG: 0,2")) { // Not network - request again ...
 					pvt->state--;
@@ -1087,6 +1098,11 @@
 					}
 				}
 				break;
+			case MODEM_STATE_INIT8: 
+				snprintf(buf, sizeof(buf), "AT+CNUM\r"); // Debug print MSISDN
+				data_write(pvt, buf);
+				pvt->state++;
+				break;
 			case MODEM_STATE_INIT_VOICE: 
 				snprintf(buf, sizeof(buf), "AT+CLVL=%d\r", pvt->volume); // Adjust Volume
 				data_write(pvt, buf);
@@ -1653,6 +1669,7 @@
 {
 	struct ast_config *cfg = NULL;
 	struct ast_config *devices_cfg = NULL;
+	struct ast_flags config_flags = { 0 }; 
 	char *cat = NULL;
 	char *device_cat = NULL;
 	struct ast_variable *var;
@@ -1665,11 +1682,11 @@
 	char *dr;
 	int res, res2, s;
 
-	devices_cfg = ast_config_load(DEVICE_CONFIG);
+	devices_cfg = ast_config_load(DEVICE_CONFIG, config_flags);
 	if (!devices_cfg)
 		return 0;
 
-	cfg = ast_config_load(MODEM_CONFIG);
+	cfg = ast_config_load(MODEM_CONFIG, config_flags);
 	if (!cfg)
 		return 0;
 
@@ -1752,7 +1769,7 @@
 				pvt->monitor_thread = AST_PTHREADT_NULL;
 				pvt->dsp = ast_dsp_new();
 
-				res= data_connect(pvt);  //Conect modem data port
+				res= data_connect(pvt);  //Connect modem data port
 				if (res < 0) {
 					ast_log(LOG_ERROR, "Unable to open data port %s. Not loading device %s.\n", pvt->data_port, pvt->id);
 					break;
@@ -1770,8 +1787,8 @@
 					}
 				}
 
-				ast_dsp_set_features(pvt->dsp, DSP_FEATURE_DTMF_DETECT);
-				ast_dsp_digitmode(pvt->dsp, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
+				ast_dsp_set_features(pvt->dsp, DSP_FEATURE_DIGIT_DETECT);
+//				ast_dsp_digitmode(pvt->dsp, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
 				AST_RWLIST_WRLOCK(&devices);
 				AST_RWLIST_INSERT_HEAD(&devices, pvt, entry);
 				AST_RWLIST_UNLOCK(&devices);

