mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Add force dial keys to skinny.
Adds a dial softkey when the device is in DAFD. The softkey is greyed (unusable) until a possible dialplan match is entered. Code includes updating transmit_selectsoftkeys to allow the use of a button mask. Also add option to use # or * as a dial now button. Original patch by snuffy cleaned up by myself. Review: https://reviewboard.asterisk.org/r/2277/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@380057 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -202,6 +202,7 @@ static int keep_alive = 120; | ||||
| static int auth_timeout = DEFAULT_AUTH_TIMEOUT; | ||||
| static int auth_limit = DEFAULT_AUTH_LIMIT; | ||||
| static int unauth_sessions = 0; | ||||
| static char immed_dialchar = '\0'; | ||||
| static char vmexten[AST_MAX_EXTENSION];      /* Voicemail pilot number */ | ||||
| static char used_context[AST_MAX_EXTENSION]; /* placeholder to check if context are already used in regcontext */ | ||||
| static char regcontext[AST_MAX_CONTEXT];     /* Context for auto-extension */ | ||||
| @@ -718,6 +719,31 @@ struct bksp_req_message { | ||||
| #define SOFTKEY_GPICKUP 0x12 | ||||
| #define SOFTKEY_DND 0x13 | ||||
| #define SOFTKEY_IDIVERT 0x14 | ||||
| #define SOFTKEY_FORCEDIAL 0x15 | ||||
|  | ||||
| #define KEYMASK_ALL            0xFFFFFFFF | ||||
| #define KEYMASK_NONE           (1 << 0) | ||||
| #define KEYMASK_REDIAL         (1 << 1) | ||||
| #define KEYMASK_NEWCALL        (1 << 2) | ||||
| #define KEYMASK_HOLD           (1 << 3) | ||||
| #define KEYMASK_TRNSFER        (1 << 4) | ||||
| #define KEYMASK_CFWDALL        (1 << 5) | ||||
| #define KEYMASK_CFWDBUSY       (1 << 6) | ||||
| #define KEYMASK_CFWDNOANSWER   (1 << 7) | ||||
| #define KEYMASK_BKSPC          (1 << 8) | ||||
| #define KEYMASK_ENDCALL        (1 << 9) | ||||
| #define KEYMASK_RESUME         (1 << 10) | ||||
| #define KEYMASK_ANSWER         (1 << 11) | ||||
| #define KEYMASK_INFO           (1 << 12) | ||||
| #define KEYMASK_CONFRN         (1 << 13) | ||||
| #define KEYMASK_PARK           (1 << 14) | ||||
| #define KEYMASK_JOIN           (1 << 15) | ||||
| #define KEYMASK_MEETME         (1 << 16) | ||||
| #define KEYMASK_PICKUP         (1 << 17) | ||||
| #define KEYMASK_GPICKUP        (1 << 18) | ||||
| #define KEYMASK_DND            (1 << 29) | ||||
| #define KEYMASK_IDIVERT        (1 << 20) | ||||
| #define KEYMASK_FORCEDIAL      (1 << 21) | ||||
|  | ||||
| static struct soft_key_template_definition soft_key_template_default[] = { | ||||
| 	{ "\200\001", SOFTKEY_REDIAL }, | ||||
| @@ -740,6 +766,7 @@ static struct soft_key_template_definition soft_key_template_default[] = { | ||||
| 	{ "\200\022", SOFTKEY_GPICKUP }, | ||||
| 	{ "\200\077", SOFTKEY_DND }, | ||||
| 	{ "\200\120", SOFTKEY_IDIVERT }, | ||||
| 	{ "Dial", SOFTKEY_FORCEDIAL}, | ||||
| }; | ||||
|  | ||||
| /* Localized message "codes" (in octal) | ||||
| @@ -934,6 +961,7 @@ static const uint8_t soft_key_default_connwithtrans[] = { | ||||
| static const uint8_t soft_key_default_dadfd[] = { | ||||
| 	SOFTKEY_BKSPC, | ||||
| 	SOFTKEY_ENDCALL, | ||||
| 	SOFTKEY_FORCEDIAL, | ||||
| }; | ||||
|  | ||||
| static const uint8_t soft_key_default_connwithconf[] = { | ||||
| @@ -2468,20 +2496,44 @@ static void transmit_stop_tone(struct skinny_device *d, int instance, int refere | ||||
| 	transmit_response(d, req); | ||||
| } | ||||
|  | ||||
| static void transmit_selectsoftkeys(struct skinny_device *d, int instance, int callid, int softkey) | ||||
| static int keyset_translatebitmask(int keyset, int intmask) | ||||
| { | ||||
| 	int extmask = 0; | ||||
| 	int x, y; | ||||
| 	const struct soft_key_definitions *softkeymode = soft_key_default_definitions; | ||||
|  | ||||
| 	for(x = 0; x < ARRAY_LEN(soft_key_default_definitions); x++) { | ||||
| 		if (softkeymode[x].mode == keyset) { | ||||
| 			const uint8_t *defaults = softkeymode[x].defaults; | ||||
|  | ||||
| 			for (y = 0; y < softkeymode[x].count; y++) { | ||||
| 				if (intmask & (1 << (defaults[y]))) { | ||||
| 					extmask |= (1 << ((y))); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return extmask; | ||||
| } | ||||
|  | ||||
| static void transmit_selectsoftkeys(struct skinny_device *d, int instance, int callid, int softkey, int mask) | ||||
| { | ||||
| 	struct skinny_req *req; | ||||
| 	int newmask; | ||||
|  | ||||
| 	if (!(req = req_alloc(sizeof(struct select_soft_keys_message), SELECT_SOFT_KEYS_MESSAGE))) | ||||
| 		return; | ||||
|  | ||||
| 	newmask = keyset_translatebitmask(softkey, mask); | ||||
| 	req->data.selectsoftkey.instance = htolel(instance); | ||||
| 	req->data.selectsoftkey.reference = htolel(callid); | ||||
| 	req->data.selectsoftkey.softKeySetIndex = htolel(softkey); | ||||
| 	req->data.selectsoftkey.validKeyMask = htolel(0xFFFFFFFF); | ||||
| 	req->data.selectsoftkey.validKeyMask = htolel(newmask); | ||||
|  | ||||
| 	SKINNY_DEBUG(DEBUG_PACKET, 3, "Transmitting SELECT_SOFT_KEYS_MESSAGE to %s, inst %d, callid %d, softkey %d, mask 0xFFFFFFFF\n", | ||||
| 		d->name, instance, callid, softkey); | ||||
| 	SKINNY_DEBUG(DEBUG_PACKET, 3, "Transmitting SELECT_SOFT_KEYS_MESSAGE to %s, inst %d, callid %d, softkey %d, mask 0x%08x\n", | ||||
| 		d->name, instance, callid, softkey, newmask); | ||||
| 	transmit_response(d, req); | ||||
| } | ||||
|  | ||||
| @@ -2864,6 +2916,7 @@ static void transmit_softkeysetres(struct skinny_device *d) | ||||
| 	int i; | ||||
| 	int x; | ||||
| 	int y; | ||||
| 	int keydefcount; | ||||
| 	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))) | ||||
| @@ -2871,10 +2924,11 @@ static void transmit_softkeysetres(struct skinny_device *d) | ||||
|  | ||||
| 	SKINNY_DEBUG(DEBUG_TEMPLATE, 3, "Creating Softkey Template\n"); | ||||
|  | ||||
| 	keydefcount = ARRAY_LEN(soft_key_default_definitions); | ||||
| 	req->data.softkeysets.softKeySetOffset = htolel(0); | ||||
| 	req->data.softkeysets.softKeySetCount = htolel(13); | ||||
| 	req->data.softkeysets.totalSoftKeySetCount = htolel(13); | ||||
| 	for (x = 0; x < sizeof(soft_key_default_definitions) / sizeof(struct soft_key_definitions); x++) { | ||||
| 	req->data.softkeysets.softKeySetCount = htolel(keydefcount); | ||||
| 	req->data.softkeysets.totalSoftKeySetCount = htolel(keydefcount); | ||||
| 	for (x = 0; x < keydefcount; 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. */ | ||||
| @@ -2899,6 +2953,7 @@ static void transmit_softkeysetres(struct skinny_device *d) | ||||
| 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; | ||||
|  | ||||
| @@ -3070,11 +3125,11 @@ static int skinny_extensionstate_cb(char *context, char *exten, struct ast_state | ||||
| 		case AST_EXTENSION_INUSE: | ||||
| 			if (subline->sub && (subline->sub->substate == SKINNY_CONNECTED)) { /* Device has a real call */ | ||||
| 				transmit_callstate(d, l->instance, subline->callid, SKINNY_CONNECTED); | ||||
| 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_CONNECTED); | ||||
| 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_CONNECTED, KEYMASK_ALL); | ||||
| 				transmit_displaypromptstatus(d, "Connected", 0, l->instance, subline->callid); | ||||
| 			} else { /* Some other device has active call */ | ||||
| 				transmit_callstate(d, l->instance, subline->callid, SKINNY_CALLREMOTEMULTILINE); | ||||
| 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE); | ||||
| 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE, KEYMASK_ALL); | ||||
| 				transmit_displaypromptstatus(d, "In Use", 0, l->instance, subline->callid); | ||||
| 			} | ||||
| 			transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_ON); | ||||
| @@ -3083,14 +3138,14 @@ static int skinny_extensionstate_cb(char *context, char *exten, struct ast_state | ||||
| 			break; | ||||
| 		case AST_EXTENSION_ONHOLD: | ||||
| 			transmit_callstate(d, l->instance, subline->callid, SKINNY_HOLD); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLAHOLD); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLAHOLD, KEYMASK_ALL); | ||||
| 			transmit_displaypromptstatus(d, "Hold", 0, l->instance, subline->callid); | ||||
| 			transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK); | ||||
| 			transmit_activatecallplane(d, l); | ||||
| 			break; | ||||
| 		case AST_EXTENSION_NOT_INUSE: | ||||
| 			transmit_callstate(d, l->instance, subline->callid, SKINNY_ONHOOK); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_ONHOOK); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_ONHOOK, KEYMASK_ALL); | ||||
| 			transmit_clearpromptmessage(d, l->instance, subline->callid); | ||||
| 			transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_OFF); | ||||
| 			transmit_activatecallplane(d, l); | ||||
| @@ -4327,7 +4382,7 @@ static void skinny_dialer(struct skinny_subchannel *sub, int timedout) | ||||
| 	struct skinny_device *d = l->device; | ||||
|  | ||||
| 	if (timedout || !ast_matchmore_extension(c, ast_channel_context(c), sub->exten, 1, l->cid_num)) { | ||||
| 		SKINNY_DEBUG(DEBUG_SUB, 3, "Sub %d - Force dialing '%s'\n", sub->callid, sub->exten); | ||||
| 		SKINNY_DEBUG(DEBUG_SUB, 3, "Sub %d - Force dialing '%s' because of %s\n", sub->callid, sub->exten, (timedout ? "timeout" : "exactmatch")); | ||||
| 		if (ast_exists_extension(c, ast_channel_context(c), sub->exten, 1, l->cid_num)) { | ||||
| 			if (sub->substate == SUBSTATE_OFFHOOK) { | ||||
| 				dialandactivatesub(sub, sub->exten); | ||||
| @@ -4342,6 +4397,7 @@ static void skinny_dialer(struct skinny_subchannel *sub, int timedout) | ||||
| 	} else { | ||||
| 		SKINNY_DEBUG(DEBUG_SUB, 3, "Sub %d - Wait for more digits\n", sub->callid); | ||||
| 		if (ast_exists_extension(c, ast_channel_context(c), sub->exten, 1, l->cid_num)) { | ||||
| 			transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_DADFD, KEYMASK_ALL); | ||||
| 			sub->dialer_sched = skinny_sched_add(matchdigittimeout, skinny_dialer_cb, sub); | ||||
| 		} else { | ||||
| 			sub->dialer_sched = skinny_sched_add(gendigittimeout, skinny_dialer_cb, sub); | ||||
| @@ -5075,7 +5131,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 			if (subline->callid) { | ||||
| 				transmit_stop_tone(d, l->instance, sub->callid); | ||||
| 				transmit_callstate(d, l->instance, subline->callid, SKINNY_CALLREMOTEMULTILINE); | ||||
| 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE); | ||||
| 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE, KEYMASK_ALL); | ||||
| 				transmit_displaypromptstatus(d, "In Use", 0, l->instance, subline->callid); | ||||
| 			} | ||||
|  | ||||
| @@ -5090,7 +5146,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 		case SUBSTATE_CONNECTED: | ||||
| 			transmit_activatecallplane(d, l); | ||||
| 			transmit_stop_tone(d, l->instance, sub->callid); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_CONNECTED); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_CONNECTED, KEYMASK_ALL); | ||||
| 			transmit_callstate(d, l->instance, subline->callid, SKINNY_CONNECTED); | ||||
| 			if (!sub->rtp) { | ||||
| 				start_rtp(sub); | ||||
| @@ -5117,7 +5173,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 			transmit_stopmediatransmission(d, sub); | ||||
|  | ||||
| 			transmit_callstate(d, l->instance, subline->callid, SKINNY_CALLREMOTEMULTILINE); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE); | ||||
| 			transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE, KEYMASK_ALL); | ||||
| 			transmit_displaypromptstatus(d, "In Use", 0, l->instance, subline->callid); | ||||
|  | ||||
| 			sub->substate = SUBSTATE_HOLD; | ||||
| @@ -5156,7 +5212,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 		transmit_activatecallplane(d, l); | ||||
| 		transmit_clear_display_message(d, l->instance, sub->callid); | ||||
| 		transmit_start_tone(d, SKINNY_DIALTONE, l->instance, sub->callid); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK, KEYMASK_ALL); | ||||
| 		transmit_displaypromptstatus(d, "Enter number", 0, l->instance, sub->callid); | ||||
|  | ||||
| 		sub->substate = SUBSTATE_OFFHOOK; | ||||
| @@ -5214,7 +5270,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 			transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK); | ||||
| 			transmit_stop_tone(d, l->instance, sub->callid); | ||||
| 			transmit_clear_display_message(d, l->instance, sub->callid); | ||||
| 			transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGOUT); | ||||
| 			transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGOUT, KEYMASK_ALL); | ||||
| 			transmit_displaypromptstatus(d, "Dialing", 0, l->instance, sub->callid); | ||||
| 		} | ||||
|  | ||||
| @@ -5261,7 +5317,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 		break; | ||||
| 	case SUBSTATE_RINGIN: | ||||
| 		transmit_callstate(d, l->instance, sub->callid, SKINNY_RINGIN); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGIN); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGIN, KEYMASK_ALL); | ||||
| 		transmit_displaypromptstatus(d, "Ring-In", 0, l->instance, sub->callid); | ||||
| 		send_callinfo(sub); | ||||
| 		transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK); | ||||
| @@ -5281,7 +5337,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 	case SUBSTATE_CALLWAIT: | ||||
| 		transmit_callstate(d, l->instance, sub->callid, SKINNY_RINGIN); | ||||
| 		transmit_callstate(d, l->instance, sub->callid, SKINNY_CALLWAIT); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGIN); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGIN, KEYMASK_ALL); | ||||
| 		transmit_displaypromptstatus(d, "Callwaiting", 0, l->instance, sub->callid); | ||||
| 		send_callinfo(sub); | ||||
| 		transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK); | ||||
| @@ -5305,7 +5361,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
| 		send_callinfo(sub); | ||||
| 		transmit_callstate(d, l->instance, sub->callid, SKINNY_CONNECTED); | ||||
| 		transmit_displaypromptstatus(d, "Connected", 0, l->instance, sub->callid); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_CONNECTED); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_CONNECTED, KEYMASK_ALL); | ||||
| 		if (!sub->rtp) { | ||||
| 			start_rtp(sub); | ||||
| 		} | ||||
| @@ -5384,7 +5440,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) | ||||
|  | ||||
| 		transmit_callstate(d, l->instance, sub->callid, SKINNY_HOLD); | ||||
| 		transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_WINK); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_ONHOLD); | ||||
| 		transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_ONHOLD, KEYMASK_ALL); | ||||
| 		sub->substate = SUBSTATE_HOLD; | ||||
| 		break; | ||||
| 	default: | ||||
| @@ -5598,7 +5654,7 @@ static int handle_callforward_button(struct skinny_subchannel *sub, int cfwdtype | ||||
| 		transmit_speaker_mode(d, SKINNY_SPEAKEROFF); | ||||
| 		transmit_clearpromptmessage(d, l->instance, sub->callid); | ||||
| 		transmit_callstate(d, l->instance, sub->callid, SKINNY_ONHOOK); | ||||
| 		transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK); | ||||
| 		transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK, KEYMASK_ALL); | ||||
| 		transmit_activatecallplane(d, l); | ||||
| 		transmit_displaynotify(d, "CFwd disabled", 10); | ||||
| 		if (sub->owner && ast_channel_state(sub->owner) != AST_STATE_UP) { | ||||
| @@ -5664,19 +5720,19 @@ static int handle_keypad_button_message(struct skinny_req *req, struct skinnyses | ||||
| 	} | ||||
|  | ||||
| 	if ((sub->owner && ast_channel_state(sub->owner) <  AST_STATE_UP)) { | ||||
| 		if (sub->dialer_sched &&	!skinny_sched_del(sub->dialer_sched, sub)) { | ||||
| 		if (sub->dialer_sched && !skinny_sched_del(sub->dialer_sched, sub)) { | ||||
| 			SKINNY_DEBUG(DEBUG_SUB, 3, "Sub %d - Got a digit and not timed out, so try dialing\n", sub->callid); | ||||
| 			sub->dialer_sched = 0; | ||||
| 			len = strlen(sub->exten); | ||||
| 			if (len == 0) { | ||||
| 				transmit_stop_tone(d, l->instance, sub->callid); | ||||
| 				transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_DADFD); | ||||
| 				transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_DADFD, KEYMASK_ALL&~KEYMASK_FORCEDIAL); | ||||
| 			} | ||||
| 			if (len < sizeof(sub->exten) - 1) { | ||||
| 			if (len < sizeof(sub->exten) - 1 && dgt != immed_dialchar) { | ||||
| 				sub->exten[len] = dgt; | ||||
| 				sub->exten[len + 1] = '\0'; | ||||
| 			} | ||||
| 			if (len == sizeof(sub->exten) - 1) { | ||||
| 			if (len == sizeof(sub->exten) - 1 || dgt == immed_dialchar) { | ||||
| 				skinny_dialer(sub, 1); | ||||
| 			} else { | ||||
| 				skinny_dialer(sub, 0); | ||||
| @@ -6555,7 +6611,7 @@ static int handle_soft_key_event_message(struct skinny_req *req, struct skinnyse | ||||
| 				sub->exten[len-1] = '\0'; | ||||
| 				if (len == 1) { | ||||
| 					transmit_start_tone(d, SKINNY_DIALTONE, l->instance, sub->callid); | ||||
| 					transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK); | ||||
| 					transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK, KEYMASK_ALL); | ||||
| 				} | ||||
| 				transmit_backspace(d, l->instance, sub->callid); | ||||
| 			} | ||||
| @@ -6701,6 +6757,12 @@ static int handle_soft_key_event_message(struct skinny_req *req, struct skinnyse | ||||
| 			setsubstate(sub, SUBSTATE_CONNECTED); | ||||
| 			ast_channel_unref(c); | ||||
| 		} | ||||
| 		break; | ||||
| 	case SOFTKEY_FORCEDIAL: | ||||
| 		SKINNY_DEBUG(DEBUG_PACKET, 3, "Received SOFTKEY_FORCEDIAL from %s, inst %d, callref %d\n", | ||||
| 			d->name, instance, callreference); | ||||
| 		skinny_dialer(sub, 1); | ||||
|  | ||||
| 		break; | ||||
| 	default: | ||||
| 		SKINNY_DEBUG(DEBUG_PACKET, 3, "Received SOFTKEY_UNKNOWN(%d) from %s, inst %d, callref %d\n", | ||||
| @@ -6814,7 +6876,7 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s) | ||||
| 	case SOFT_KEY_SET_REQ_MESSAGE: | ||||
| 		SKINNY_DEBUG(DEBUG_PACKET, 3, "Received SOFT_KEY_SET_REQ_MESSAGE from %s\n", d->name); | ||||
| 		transmit_softkeysetres(d); | ||||
| 		transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK); | ||||
| 		transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK, KEYMASK_ALL); | ||||
| 		break; | ||||
| 	case SOFT_KEY_EVENT_MESSAGE: | ||||
| 		/* SKINNY_PACKETDEBUG handled in handle_soft_key_event_message */ | ||||
| @@ -7219,6 +7281,16 @@ static void config_parse_variables(int type, void *item, struct ast_variable *vp | ||||
| 				continue; | ||||
| 			} else if (!strcasecmp(v->name, "vmexten")) { | ||||
| 				ast_copy_string(vmexten, v->value, sizeof(vmexten)); | ||||
| 				continue; | ||||
| 			} else if (!strcasecmp(v->name, "immeddialkey")) { | ||||
| 				if (!strcmp(v->value,"#")) { | ||||
| 					immed_dialchar = '#'; | ||||
| 				} else if (!strcmp(v->value,"*")) { | ||||
| 					immed_dialchar = '*'; | ||||
| 				} else { | ||||
| 					ast_log(LOG_WARNING, "Invalid immeddialkey '%s' at line %d, only # or * accepted. Immeddial key disabled\n", v->value, v->lineno); | ||||
| 				} | ||||
|  | ||||
| 				continue; | ||||
| 			} else if (!strcasecmp(v->name, "dateformat")) { | ||||
| 				memcpy(date_format, v->value, sizeof(date_format)); | ||||
|   | ||||
| @@ -38,6 +38,14 @@ keepalive=120 | ||||
| 			; for framing options | ||||
| ;disallow= | ||||
|  | ||||
| ; The imeddialkey option allows for a key to be used to immediately dial the already | ||||
| ; entered number. This is useful where the dialplan includes variable length pattern | ||||
| ; matching. Valid options are '#' and '*'. On devices with soft buttons, a button will | ||||
| ; be available to immediately dial when a pattern than can be dialed has been entered. | ||||
| ; Default is unset, that is no immediated dial key (softbutton still exists). | ||||
| ; | ||||
| ;immeddialkey='#' | ||||
|  | ||||
| ; See https://wiki.asterisk.org/wiki/display/AST/IP+Quality+of+Service for a description of these parameters. | ||||
| ;tos=cs3		; Sets TOS for signaling packets. | ||||
| ;tos_audio=ef		; Sets TOS for RTP audio packets. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user