From cc89bc0a27feffaee41b051c42708dad560413f1 Mon Sep 17 00:00:00 2001 From: Michiel van Baak Date: Fri, 2 Apr 2010 06:43:31 +0000 Subject: Cleanup transmit_* functions Bulk lot of generally trivial changes for cleaning up the transmit stuff. Line state request has been modified for line only responses. (closes issue #16994) Reported by: wedhorn Patches: skinny-clean07.diff uploaded by wedhorn (license 30) Tested by: wedhorn git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@255850 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_skinny.c | 349 ++++++++++++++++++++----------------------------- 1 file changed, 143 insertions(+), 206 deletions(-) (limited to 'channels/chan_skinny.c') diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index a19fdc15f..ab8a321b2 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1385,7 +1385,6 @@ static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, s static int skinny_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int skinny_senddigit_begin(struct ast_channel *ast, char digit); static int skinny_senddigit_end(struct ast_channel *ast, char digit, unsigned int duration); -static int handle_time_date_req_message(struct skinny_req *req, struct skinnysession *s); static void mwi_event_cb(const struct ast_event *event, void *userdata); static int skinny_reload(void); @@ -2500,6 +2499,125 @@ static void transmit_cfwdstate(struct skinny_device *d, struct skinny_line *l) transmit_response(d, req); } +static void transmit_speeddialstatres(struct skinny_device *d, struct skinny_speeddial *sd) +{ + struct skinny_req *req; + + if (!(req = req_alloc(sizeof(struct speed_dial_stat_res_message), SPEED_DIAL_STAT_RES_MESSAGE))) + return; + + req->data.speeddialreq.speedDialNumber = htolel(sd->instance); + ast_copy_string(req->data.speeddial.speedDialDirNumber, sd->exten, sizeof(req->data.speeddial.speedDialDirNumber)); + ast_copy_string(req->data.speeddial.speedDialDisplayName, sd->label, sizeof(req->data.speeddial.speedDialDisplayName)); + + transmit_response(d, req); +} + +static void transmit_linestatres(struct skinny_device *d, struct skinny_line *l) +{ + struct skinny_req *req; + + if (!(req = req_alloc(sizeof(struct line_stat_res_message), LINE_STAT_RES_MESSAGE))) + return; + + req->data.linestat.lineNumber = letohl(l->instance); + memcpy(req->data.linestat.lineDirNumber, l->name, sizeof(req->data.linestat.lineDirNumber)); + memcpy(req->data.linestat.lineDisplayName, l->label, sizeof(req->data.linestat.lineDisplayName)); + transmit_response(d, req); +} + +static void transmit_definetimedate(struct skinny_device *d) +{ + struct skinny_req *req; + struct timeval now = ast_tvnow(); + struct ast_tm cmtime; + + if (!(req = req_alloc(sizeof(struct definetimedate_message), DEFINETIMEDATE_MESSAGE))) + return; + + ast_localtime(&now, &cmtime, NULL); + req->data.definetimedate.year = htolel(cmtime.tm_year+1900); + req->data.definetimedate.month = htolel(cmtime.tm_mon+1); + req->data.definetimedate.dayofweek = htolel(cmtime.tm_wday); + req->data.definetimedate.day = htolel(cmtime.tm_mday); + req->data.definetimedate.hour = htolel(cmtime.tm_hour); + req->data.definetimedate.minute = htolel(cmtime.tm_min); + req->data.definetimedate.seconds = htolel(cmtime.tm_sec); + req->data.definetimedate.milliseconds = htolel(cmtime.tm_usec / 1000); + req->data.definetimedate.timestamp = htolel(now.tv_sec); + transmit_response(d, req); +} + +static void transmit_versionres(struct skinny_device *d) +{ + struct skinny_req *req; + if (!(req = req_alloc(sizeof(struct version_res_message), VERSION_RES_MESSAGE))) + return; + + ast_copy_string(req->data.version.version, d->version_id, sizeof(req->data.version.version)); + transmit_response(d, req); +} + +static void transmit_serverres(struct skinny_device *d) +{ + struct skinny_req *req; + if (!(req = req_alloc(sizeof(struct server_res_message), SERVER_RES_MESSAGE))) + return; + + memcpy(req->data.serverres.server[0].serverName, ourhost, + sizeof(req->data.serverres.server[0].serverName)); + req->data.serverres.serverListenPort[0] = htolel(ourport); + req->data.serverres.serverIpAddr[0] = htolel(d->ourip.s_addr); + transmit_response(d, req); +} + +static void transmit_softkeysetres(struct skinny_device *d) +{ + struct skinny_req *req; + int i; + int x; + int y; + const struct soft_key_definitions *softkeymode = soft_key_default_definitions; + + if (!(req = req_alloc(sizeof(struct soft_key_set_res_message), SOFT_KEY_SET_RES_MESSAGE))) + return; + + req->data.softkeysets.softKeySetOffset = htolel(0); + req->data.softkeysets.softKeySetCount = htolel(11); + req->data.softkeysets.totalSoftKeySetCount = htolel(11); + for (x = 0; x < sizeof(soft_key_default_definitions) / sizeof(struct soft_key_definitions); x++) { + const uint8_t *defaults = softkeymode->defaults; + /* XXX I wanted to get the size of the array dynamically, but that wasn't wanting to work. + This will have to do for now. */ + for (y = 0; y < softkeymode->count; y++) { + for (i = 0; i < (sizeof(soft_key_template_default) / sizeof(struct soft_key_template_definition)); i++) { + if (defaults[y] == i+1) { + req->data.softkeysets.softKeySetDefinition[softkeymode->mode].softKeyTemplateIndex[y] = (i+1); + req->data.softkeysets.softKeySetDefinition[softkeymode->mode].softKeyInfoIndex[y] = htoles(i+301); + if (skinnydebug) + ast_verbose("softKeySetDefinition : softKeyTemplateIndex: %d softKeyInfoIndex: %d\n", i+1, i+301); + } + } + } + softkeymode++; + } + transmit_response(d, req); +} + +static void transmit_softkeytemplateres(struct skinny_device *d) +{ + struct skinny_req *req; + if (!(req = req_alloc(sizeof(struct soft_key_template_res_message), SOFT_KEY_TEMPLATE_RES_MESSAGE))) + return; + + req->data.softkeytemplate.softKeyOffset = htolel(0); + req->data.softkeytemplate.softKeyCount = htolel(sizeof(soft_key_template_default) / sizeof(struct soft_key_template_definition)); + req->data.softkeytemplate.totalSoftKeyCount = htolel(sizeof(soft_key_template_default) / sizeof(struct soft_key_template_definition)); + memcpy(req->data.softkeytemplate.softKeyTemplateDefinition, + soft_key_template_default, + sizeof(soft_key_template_default)); + transmit_response(d, req); +} static int skinny_extensionstate_cb(char *context, char *exten, int state, void *data) @@ -5153,7 +5271,7 @@ static int handle_offhook_message(struct skinny_req *req, struct skinnysession * } /* Not ideal, but let's send updated time at onhook and offhook, as it clears the display */ - handle_time_date_req_message(NULL, d->session); + transmit_definetimedate(d); transmit_ringer_mode(d, SKINNY_RING_OFF); l->hookstate = SKINNY_OFFHOOK; @@ -5288,7 +5406,7 @@ static int handle_onhook_message(struct skinny_req *req, struct skinnysession *s l->name, d->name, sub->callid); } /* Not ideal, but let's send updated time at onhook and offhook, as it clears the display */ - handle_time_date_req_message(NULL, d->session); + transmit_definetimedate(d); } return 1; } @@ -5329,91 +5447,6 @@ static int handle_capabilities_res_message(struct skinny_req *req, struct skinny return 1; } -static int handle_speed_dial_stat_req_message(struct skinny_req *req, struct skinnysession *s) -{ - struct skinny_device *d = s->device; - struct skinny_speeddial *sd; - int instance; - - instance = letohl(req->data.speeddialreq.speedDialNumber); - - sd = find_speeddial_by_instance(d, instance, 0); - - if (!sd) { - return 0; - } - - if (!(req = req_alloc(sizeof(struct speed_dial_stat_res_message), SPEED_DIAL_STAT_RES_MESSAGE))) - return -1; - - req->data.speeddialreq.speedDialNumber = htolel(instance); - ast_copy_string(req->data.speeddial.speedDialDirNumber, sd->exten, sizeof(req->data.speeddial.speedDialDirNumber)); - ast_copy_string(req->data.speeddial.speedDialDisplayName, sd->label, sizeof(req->data.speeddial.speedDialDisplayName)); - - transmit_response(d, req); - return 1; -} - -static int handle_line_state_req_message(struct skinny_req *req, struct skinnysession *s) -{ - struct skinny_device *d = s->device; - struct skinny_line *l; - struct skinny_speeddial *sd = NULL; - int instance; - - instance = letohl(req->data.line.lineNumber); - - AST_LIST_LOCK(&devices); - - l = find_line_by_instance(d, instance); - - if (!l) { - sd = find_speeddial_by_instance(d, instance, 1); - } - - if (!l && !sd) { - return 0; - } - - AST_LIST_UNLOCK(&devices); - - if (!(req = req_alloc(sizeof(struct line_stat_res_message), LINE_STAT_RES_MESSAGE))) - return -1; - - req->data.linestat.lineNumber = letohl(instance); - if (!l) { - memcpy(req->data.linestat.lineDirNumber, sd->label, sizeof(req->data.linestat.lineDirNumber)); - memcpy(req->data.linestat.lineDisplayName, sd->label, sizeof(req->data.linestat.lineDisplayName)); - } else { - memcpy(req->data.linestat.lineDirNumber, l->name, sizeof(req->data.linestat.lineDirNumber)); - memcpy(req->data.linestat.lineDisplayName, l->label, sizeof(req->data.linestat.lineDisplayName)); - } - transmit_response(d, req); - return 1; -} - -static int handle_time_date_req_message(struct skinny_req *req, struct skinnysession *s) -{ - struct timeval now = ast_tvnow(); - struct ast_tm cmtime; - - if (!(req = req_alloc(sizeof(struct definetimedate_message), DEFINETIMEDATE_MESSAGE))) - return -1; - - ast_localtime(&now, &cmtime, NULL); - req->data.definetimedate.year = htolel(cmtime.tm_year+1900); - req->data.definetimedate.month = htolel(cmtime.tm_mon+1); - req->data.definetimedate.dayofweek = htolel(cmtime.tm_wday); - req->data.definetimedate.day = htolel(cmtime.tm_mday); - req->data.definetimedate.hour = htolel(cmtime.tm_hour); - req->data.definetimedate.minute = htolel(cmtime.tm_min); - req->data.definetimedate.seconds = htolel(cmtime.tm_sec); - req->data.definetimedate.milliseconds = htolel(cmtime.tm_usec / 1000); - req->data.definetimedate.timestamp = htolel(now.tv_sec); - transmit_response(s->device, req); - return 1; -} - static int handle_button_template_req_message(struct skinny_req *req, struct skinnysession *s) { struct skinny_device *d = s->device; @@ -5562,40 +5595,6 @@ static int handle_button_template_req_message(struct skinny_req *req, struct ski return 1; } -static int handle_version_req_message(struct skinny_req *req, struct skinnysession *s) -{ - struct skinny_device *d = s->device; - if (!(req = req_alloc(sizeof(struct version_res_message), VERSION_RES_MESSAGE))) - return -1; - - ast_copy_string(req->data.version.version, d->version_id, sizeof(req->data.version.version)); - transmit_response(d, req); - return 1; -} - -static int handle_server_request_message(struct skinny_req *req, struct skinnysession *s) -{ - struct skinny_device *d = s->device; - if (!(req = req_alloc(sizeof(struct server_res_message), SERVER_RES_MESSAGE))) - return -1; - - memcpy(req->data.serverres.server[0].serverName, ourhost, - sizeof(req->data.serverres.server[0].serverName)); - req->data.serverres.serverListenPort[0] = htolel(ourport); - req->data.serverres.serverIpAddr[0] = htolel(d->ourip.s_addr); - transmit_response(d, req); - return 1; -} - -static int handle_alarm_message(struct skinny_req *req, struct skinnysession *s) -{ - /* no response necessary */ - if (skinnydebug) - ast_verb(1, "Received Alarm Message: %s\n", req->data.alarm.displayMessage); - - return 1; -} - static int handle_open_receive_channel_ack_message(struct skinny_req *req, struct skinnysession *s) { struct skinny_device *d = s->device; @@ -5703,41 +5702,6 @@ static int handle_enbloc_call_message(struct skinny_req *req, struct skinnysessi } -static int handle_soft_key_set_req_message(struct skinny_req *req, struct skinnysession *s) -{ - int i; - int x; - int y; - const struct soft_key_definitions *softkeymode = soft_key_default_definitions; - struct skinny_device *d = s->device; - - if (!(req = req_alloc(sizeof(struct soft_key_set_res_message), SOFT_KEY_SET_RES_MESSAGE))) - return -1; - - req->data.softkeysets.softKeySetOffset = htolel(0); - req->data.softkeysets.softKeySetCount = htolel(11); - req->data.softkeysets.totalSoftKeySetCount = htolel(11); - for (x = 0; x < sizeof(soft_key_default_definitions) / sizeof(struct soft_key_definitions); x++) { - const uint8_t *defaults = softkeymode->defaults; - /* XXX I wanted to get the size of the array dynamically, but that wasn't wanting to work. - This will have to do for now. */ - for (y = 0; y < softkeymode->count; y++) { - for (i = 0; i < (sizeof(soft_key_template_default) / sizeof(struct soft_key_template_definition)); i++) { - if (defaults[y] == i+1) { - req->data.softkeysets.softKeySetDefinition[softkeymode->mode].softKeyTemplateIndex[y] = (i+1); - req->data.softkeysets.softKeySetDefinition[softkeymode->mode].softKeyInfoIndex[y] = htoles(i+301); - if (skinnydebug) - ast_verbose("softKeySetDefinition : softKeyTemplateIndex: %d softKeyInfoIndex: %d\n", i+1, i+301); - } - } - } - softkeymode++; - } - transmit_response(d, req); - transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK); - return 1; -} - static int handle_soft_key_event_message(struct skinny_req *req, struct skinnysession *s) { struct skinny_device *d = s->device; @@ -6116,42 +6080,13 @@ static int handle_soft_key_event_message(struct skinny_req *req, struct skinnyse return 1; } -static int handle_unregister_message(struct skinny_req *req, struct skinnysession *s) -{ - return skinny_unregister(req, s); -} - -static int handle_soft_key_template_req_message(struct skinny_req *req, struct skinnysession *s) -{ - if (!(req = req_alloc(sizeof(struct soft_key_template_res_message), SOFT_KEY_TEMPLATE_RES_MESSAGE))) - return -1; - - req->data.softkeytemplate.softKeyOffset = htolel(0); - req->data.softkeytemplate.softKeyCount = htolel(sizeof(soft_key_template_default) / sizeof(struct soft_key_template_definition)); - req->data.softkeytemplate.totalSoftKeyCount = htolel(sizeof(soft_key_template_default) / sizeof(struct soft_key_template_definition)); - memcpy(req->data.softkeytemplate.softKeyTemplateDefinition, - soft_key_template_default, - sizeof(soft_key_template_default)); - transmit_response(s->device, req); - return 1; -} - -static int handle_headset_status_message(struct skinny_req *req, struct skinnysession *s) -{ - /* XXX umm...okay? Why do I care? */ - return 1; -} - -static int handle_register_available_lines_message(struct skinny_req *req, struct skinnysession *s) -{ - /* XXX I have no clue what this is for, but my phone was sending it, so... */ - return 1; -} - static int handle_message(struct skinny_req *req, struct skinnysession *s) { int res = 0; - + struct skinny_speeddial *sd; + struct skinny_line *l; + struct skinny_device *d = s->device; + if ((!s->device) && (letohl(req->e) != REGISTER_MESSAGE && letohl(req->e) != ALARM_MESSAGE)) { ast_log(LOG_WARNING, "Client sent message #%d without first registering.\n", req->e); ast_free(req); @@ -6243,19 +6178,22 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s) case SPEED_DIAL_STAT_REQ_MESSAGE: if (skinnydebug) ast_verb(1, "Received SpeedDialStatRequest\n"); - - res = handle_speed_dial_stat_req_message(req, s); + if ( (sd = find_speeddial_by_instance(s->device, letohl(req->data.speeddialreq.speedDialNumber), 0)) ) { + transmit_speeddialstatres(d, sd); + } break; case LINE_STATE_REQ_MESSAGE: if (skinnydebug) ast_verb(1, "Received LineStatRequest\n"); - res = handle_line_state_req_message(req, s); + if ((l = find_line_by_instance(d, letohl(req->data.line.lineNumber)))) { + transmit_linestatres(d, l); + } break; case TIME_DATE_REQ_MESSAGE: if (skinnydebug) ast_verb(1, "Received Time/Date Request\n"); - res = handle_time_date_req_message(req, s); + transmit_definetimedate(d); break; case BUTTON_TEMPLATE_REQ_MESSAGE: if (skinnydebug) @@ -6266,17 +6204,17 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s) case VERSION_REQ_MESSAGE: if (skinnydebug) ast_verb(1, "Version Request\n"); - - res = handle_version_req_message(req, s); + transmit_versionres(d); break; case SERVER_REQUEST_MESSAGE: if (skinnydebug) ast_verb(1, "Received Server Request\n"); - - res = handle_server_request_message(req, s); + transmit_serverres(d); break; case ALARM_MESSAGE: - res = handle_alarm_message(req, s); + /* no response necessary */ + if (skinnydebug) + ast_verb(1, "Received Alarm Message: %s\n", req->data.alarm.displayMessage); break; case OPEN_RECEIVE_CHANNEL_ACK_MESSAGE: if (skinnydebug) @@ -6287,8 +6225,8 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s) case SOFT_KEY_SET_REQ_MESSAGE: if (skinnydebug) ast_verb(1, "Received SoftKeySetReq\n"); - - res = handle_soft_key_set_req_message(req, s); + transmit_softkeysetres(d); + transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK); break; case SOFT_KEY_EVENT_MESSAGE: res = handle_soft_key_event_message(req, s); @@ -6297,19 +6235,18 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s) if (skinnydebug) ast_verb(1, "Received Unregister Request\n"); - res = handle_unregister_message(req, s); + res = skinny_unregister(req, s); break; case SOFT_KEY_TEMPLATE_REQ_MESSAGE: if (skinnydebug) ast_verb(1, "Received SoftKey Template Request\n"); - - res = handle_soft_key_template_req_message(req, s); + transmit_softkeytemplateres(d); break; case HEADSET_STATUS_MESSAGE: - res = handle_headset_status_message(req, s); + /* XXX umm...okay? Why do I care? */ break; case REGISTER_AVAILABLE_LINES_MESSAGE: - res = handle_register_available_lines_message(req, s); + /* XXX I have no clue what this is for, but my phone was sending it, so... */ break; default: if (skinnydebug) -- cgit v1.2.3