int onhooktime; \
int msgstate; \
int immediate; \
- int hookstate; \
int nat; \
int directmedia; \
int prune;
.getforward = 0,
.needdestroy = 0,
.prune = 0,
- .hookstate = SKINNY_ONHOOK,
};
static struct skinny_line_options *default_line = &default_line_struct;
char vmexten[AST_MAX_EXTENSION]; \
int type; \
int registered; \
+ int hookstate; \
int lastlineinstance; \
int lastcallreference; \
struct ast_format_cap *confcap; \
.mwiblink = 0,
.dnd = 0,
.prune = 0,
+ .hookstate = SKINNY_ONHOOK,
};
static struct skinny_device_options *default_device = &default_device_struct;
} else if (res == 0) {
ast_debug(1, "Not enough digits (%s) (and no ambiguous match)...\n", d->exten);
memset(d->exten, 0, sizeof(d->exten));
- if (l->hookstate == SKINNY_OFFHOOK) {
+ if (d->hookstate == SKINNY_OFFHOOK) {
transmit_start_tone(d, SKINNY_REORDER, l->instance, sub->callid);
}
if (sub->owner && sub->owner->_state != AST_STATE_UP) {
S_COR(c->caller.id.number.valid, c->caller.id.number.str, "<Unknown Caller>"),
c->context);
memset(d->exten, 0, sizeof(d->exten));
- if (l->hookstate == SKINNY_OFFHOOK) {
+ if (d->hookstate == SKINNY_OFFHOOK) {
transmit_start_tone(d, SKINNY_REORDER, l->instance, sub->callid);
/* hang out for 3 seconds to let congestion play */
ast_safe_sleep(c, 3000);
}
} else { /* no more subs on line so make idle */
ast_verb(4,"Killing only sub %d\n", sub->callid);
- l->hookstate = SKINNY_ONHOOK;
+ d->hookstate = SKINNY_ONHOOK;
transmit_closereceivechannel(d, sub);
transmit_stopmediatransmission(d, sub);
transmit_speaker_mode(d, SKINNY_SPEAKEROFF);
else if (l->dnd)
res = AST_DEVICE_BUSY;
else {
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (l->device->hookstate == SKINNY_ONHOOK) {
res = AST_DEVICE_NOT_INUSE;
} else {
res = AST_DEVICE_INUSE;
ast_verb(1, "Call-id: %d\n", sub->callid);
l->activesub = sub;
- if (l->hookstate == SKINNY_ONHOOK) {
- l->hookstate = SKINNY_OFFHOOK;
+ if (d->hookstate == SKINNY_ONHOOK) {
+ d->hookstate = SKINNY_OFFHOOK;
transmit_speaker_mode(d, SKINNY_SPEAKERON);
}
transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK);
return;
}
- if (l->hookstate == SKINNY_ONHOOK) {
- l->hookstate = SKINNY_OFFHOOK;
+ if (d->hookstate == SKINNY_ONHOOK) {
+ d->hookstate = SKINNY_OFFHOOK;
transmit_speaker_mode(d, SKINNY_SPEAKERON);
transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK);
transmit_activatecallplane(d, l);
transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK);
transmit_ringer_mode(d, SKINNY_RING_INSIDE);
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (d->hookstate == SKINNY_ONHOOK) {
l->activesub = sub;
}
struct skinny_device *d = l->device;
struct ast_channel *c = sub->owner;
- if (l->hookstate == SKINNY_ONHOOK) {
- l->hookstate = SKINNY_OFFHOOK;
+ if (d->hookstate == SKINNY_ONHOOK) {
+ d->hookstate = SKINNY_OFFHOOK;
transmit_speaker_mode(d, SKINNY_SPEAKERON);
transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK);
transmit_activatecallplane(d, l);
transmit_ringer_mode(d, SKINNY_RING_OFF);
transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_ON);
- l->hookstate = SKINNY_OFFHOOK;
+ d->hookstate = SKINNY_OFFHOOK;
if (sub && sub->calldirection == SKINNY_INCOMING) {
setsubstate_connected(sub);
struct skinny_line *l;
struct skinny_subchannel *sub;
struct ast_channel *c;
- struct skinny_line *tmp;
int instance;
/* if any line on a device is offhook, than the device must be offhook,
probably move hookstate from line to device, afterall, it's actually
a device that changes hookstates */
- AST_LIST_TRAVERSE(&d->lines, tmp, list) {
- if (tmp->hookstate == SKINNY_OFFHOOK) {
- ast_verbose(VERBOSE_PREFIX_3 "Got offhook message when device (%s@%s) already offhook\n", tmp->name, d->name);
- return 0;
- }
+ if (d->hookstate == SKINNY_OFFHOOK) {
+ ast_verbose(VERBOSE_PREFIX_3 "Got offhook message when device (%s) already offhook\n", d->name);
+ return 0;
}
instance = letohl(req->data.offhook.instance);
}
transmit_ringer_mode(d, SKINNY_RING_OFF);
- l->hookstate = SKINNY_OFFHOOK;
+ d->hookstate = SKINNY_OFFHOOK;
ast_devstate_changed(AST_DEVICE_INUSE, "Skinny/%s@%s", l->name, d->name);
}
}
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (d->hookstate == SKINNY_ONHOOK) {
/* Something else already put us back on hook */
/* Not ideal, but let's send updated time anyway, as it clears the display */
transmit_definetimedate(d);
sub->cxmode = SKINNY_CX_RECVONLY;
if (onlysub || sub->xferor){ /* is this the only call to this device? */
- l->hookstate = SKINNY_ONHOOK;
+ d->hookstate = SKINNY_ONHOOK;
if (skinnydebug)
ast_debug(1, "Skinny %s@%s-%d went on hook\n", l->name, d->name, reference);
}
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (d->hookstate == SKINNY_ONHOOK) {
transmit_closereceivechannel(d, sub);
transmit_stopmediatransmission(d, sub);
transmit_speaker_mode(d, SKINNY_SPEAKEROFF);
transmit_callstate(d, l->instance, sub->callid, SKINNY_ONHOOK);
transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK);
transmit_activatecallplane(d, l);
- } else if (l->hookstate == SKINNY_OFFHOOK) {
+ } else if (d->hookstate == SKINNY_OFFHOOK) {
transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK);
transmit_activatecallplane(d, l);
} else {
- transmit_callstate(d, l->instance, sub->callid, l->hookstate);
+ transmit_callstate(d, l->instance, sub->callid, d->hookstate); /* wedhorn: this seems wrong!!! */
}
if (l->transfer && sub->xferor && sub->owner->_state >= AST_STATE_RING) {
if(!c) {
ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name);
} else {
- l->hookstate = SKINNY_OFFHOOK;
+ d->hookstate = SKINNY_OFFHOOK;
sub = c->tech_pvt;
l->activesub = sub;
if (skinnydebug)
ast_verb(1, "Received Softkey Event: End Call(%d/%d)\n", instance, callreference);
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (d->hookstate == SKINNY_ONHOOK) {
/* Something else already put us back on hook */
break;
}
sub->cxmode = SKINNY_CX_RECVONLY;
if (onlysub || sub->xferor){ /*Are there other calls to this device */
- l->hookstate = SKINNY_ONHOOK;
+ d->hookstate = SKINNY_ONHOOK;
if (skinnydebug)
ast_debug(1, "Skinny %s@%s-%d went on hook\n", l->name, d->name, callreference);
}
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (d->hookstate == SKINNY_ONHOOK) {
transmit_closereceivechannel(d, sub);
transmit_stopmediatransmission(d, sub);
transmit_speaker_mode(d, SKINNY_SPEAKEROFF);
transmit_callstate(d, l->instance, sub->callid, SKINNY_ONHOOK);
transmit_selectsoftkeys(d, 0, 0, KEYDEF_ONHOOK);
transmit_activatecallplane(d, l);
- } else if (l->hookstate == SKINNY_OFFHOOK) {
+ } else if (d->hookstate == SKINNY_OFFHOOK) {
transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK);
transmit_activatecallplane(d, l);
} else {
- transmit_callstate(d, l->instance, sub->callid, l->hookstate);
+ transmit_callstate(d, l->instance, sub->callid, d->hookstate); /* wedhorn - this seems wrong */
}
ast_devstate_changed(AST_DEVICE_NOT_INUSE, "Skinny/%s@%s", l->name, d->name);
l->name, d->name, sub->callid);
}
}
- if ((l->hookstate == SKINNY_ONHOOK) && (AST_LIST_NEXT(sub, list) && !AST_LIST_NEXT(sub, list)->rtp)) {
+ if ((d->hookstate == SKINNY_ONHOOK) && (AST_LIST_NEXT(sub, list) && !AST_LIST_NEXT(sub, list)->rtp)) {
ast_devstate_changed(AST_DEVICE_NOT_INUSE, "Skinny/%s@%s", l->name, d->name);
}
}
transmit_ringer_mode(d, SKINNY_RING_OFF);
transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_ON);
- if (l->hookstate == SKINNY_ONHOOK) {
+ if (d->hookstate == SKINNY_ONHOOK) {
transmit_speaker_mode(d, SKINNY_SPEAKERON);
- l->hookstate = SKINNY_OFFHOOK;
+ d->hookstate = SKINNY_OFFHOOK;
}
if (sub && sub->calldirection == SKINNY_INCOMING) {
ast_mutex_lock(&d->lock);
d->session = temp->session;
d->session->device = d;
+ d->hookstate = temp->hookstate;
AST_LIST_LOCK(&d->lines);
AST_LIST_TRAVERSE(&d->lines, l, list){
}
ast_mutex_lock(<emp->lock);
l->instance = ltemp->instance;
- l->hookstate = ltemp->hookstate;
if (!AST_LIST_EMPTY(<emp->sub)) {
ast_mutex_lock(&l->lock);
l->sub = ltemp->sub;