* [RFC] STE-driver: Terminating voice call in state DIALING/ALERTING. @ 2010-08-04 14:21 Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-05 16:24 ` Denis Kenzior 0 siblings, 1 reply; 8+ messages in thread From: Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-04 14:21 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 7073 bytes --] From: Sjur Brændeland <sjur.brandeland@stericsson.com> This patch splits the callback hangup into hangup_all and hangup_active. --- Hi Denis, I'm picking up a really old thread here... > Denis Kenzior wrote: >>>> c) If you have an call on hold and initiate a new call, but want to >>>> terminate the newly initiated call (DIALING), then this call cannot >>>> be terminated with CHLD=1X, but you would have to use ATH (or >>>> possible CHUP). >>> >>> Yes, so this is the case that we do need to take care of in the core. >>> Most >>> modems let us get away with sending release_specific up to this point. >> >> For the STE modem, calls in state DIALING and ALERTING will have to be >> terminated with ATH or AT+CHUP, AT+CHLD=1x does not work. This means that >> the current implementation, using release_specific (and thus AT+CHLD=1x) >> will not work. > > Yep, so please critique my earlier suggestion of splitting up hangup > into two methods: hangup_all and hangup_active. Modem drivers will need to > provide one or the other or both. > The core can then use the hangup_active (if available) in those cases where > release_specific might not work. The condition for hangup_active will be that > it does not affect held or waiting calls. For ST-E the hangup_active > implementation will simply be +CHUP. For modems that do not have this > available we will fall back to release_specific and assume that on those > CHLD=1X or equivalent can affect dialing/alerting calls. If I understand you correctly STE driver should implement hangup_active using +CUP. Core should then use hangup_active on calls in state DIALING and ALERTING - Yes, I think this would work. > hangup_all can also be used for cases where we loop release_specific > over all active/dialing/alerting/held/incoming calls. For ST-E the hangup_all > implementation might be +CHUP;CHLD=1n;...;+CHLD=1m where n, m, etc are > ids of the HELD calls. We should not hangup waiting calls to be compliant > with section 6.5.5.1 of 3GPP 22.030: > "Entering END -Releases the subscriber from all calls > (except a possible waiting call)." I guess the stedriver will not implement the hangup_all because the STE modem does not have an AT command for terminating all calls. (I assume you don't want the driver to iterate over calls constructing a command like: "+CHUP;CHLD=1n;...;+CHLD=1m"). I've probably not understood your proposal fully, but I have tried to put together some code based on it. Please have a look and check if you had something like this in mind. However, I think we can solve this even simpler if we just call hangup for any ALERTING/DIALING call.. Regards Sjur diff --git a/drivers/stemodem/voicecall.c b/drivers/stemodem/voicecall.c index a56709a..2ddae05 100644 --- a/drivers/stemodem/voicecall.c +++ b/drivers/stemodem/voicecall.c @@ -260,7 +260,7 @@ static void ste_answer(struct ofono_voicecall *vc, ste_template("ATA", vc, ste_generic_cb, 0, cb, data); } -static void ste_hangup(struct ofono_voicecall *vc, +static void ste_hangup_active(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data) { ste_template("AT+CHUP", vc, ste_generic_cb, 0x3f, cb, data); @@ -569,7 +569,7 @@ static struct ofono_voicecall_driver driver = { .remove = ste_voicecall_remove, .dial = ste_dial, .answer = ste_answer, - .hangup = ste_hangup, + .hangup_active = ste_hangup_active, .hold_all_active = ste_hold_all_active, .release_all_held = ste_release_all_held, .set_udub = ste_set_udub, diff --git a/include/voicecall.h b/include/voicecall.h index 6ceb3d8..2500e5f 100644 --- a/include/voicecall.h +++ b/include/voicecall.h @@ -67,7 +67,11 @@ struct ofono_voicecall_driver { ofono_voicecall_cb_t cb, void *data); void (*answer)(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data); - void (*hangup)(struct ofono_voicecall *vc, + void (*hangup_all)(struct ofono_voicecall *vc, + ofono_voicecall_cb_t cb, void *data); +/* HACK: for temporary backwards compability */ +#define hangup_active hangup + void (*hangup_active)(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data); void (*hold_all_active)(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data); diff --git a/src/voicecall.c b/src/voicecall.c index a30aaa5..a420777 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -264,12 +264,12 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, /* According to various specs, other than 27.007, +CHUP is used * to reject an incoming call */ - if (call->status == CALL_STATUS_INCOMING) { + if (vc->driver->hangup_active && call->status == CALL_STATUS_INCOMING) { if (vc->driver->hangup == NULL) return __ofono_error_not_implemented(msg); vc->pending = dbus_message_ref(msg); - vc->driver->hangup(vc, generic_callback, vc); + vc->driver->hangup_active(vc, generic_callback, vc); return NULL; } @@ -286,12 +286,12 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, num_calls = g_slist_length(vc->call_list); - if (num_calls == 1 && vc->driver->hangup && + if (vc->driver->hangup_active && num_calls == 1 && vc->driver->hangup && (call->status == CALL_STATUS_ACTIVE || call->status == CALL_STATUS_DIALING || call->status == CALL_STATUS_ALERTING)) { vc->pending = dbus_message_ref(msg); - vc->driver->hangup(vc, generic_callback, vc); + vc->driver->hangup_active(vc, generic_callback, vc); return NULL; } @@ -304,6 +304,16 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, return NULL; } + if (vc->driver->hangup_active != NULL && + (call->status == CALL_STATUS_ALERTING || + call->status == CALL_STATUS_DIALING)) { + + vc->pending = dbus_message_ref(msg); + vc->driver->hangup_active(vc, generic_callback, vc); + + return NULL; + } + if (vc->driver->release_specific == NULL) return __ofono_error_not_implemented(msg); @@ -762,7 +772,14 @@ static void voicecalls_release_next(struct ofono_voicecall *vc) vc->release_list = g_slist_remove(vc->release_list, call); - vc->driver->release_specific(vc, call->call->id, + if (vc->driver->hangup_active != NULL && + (call->call->status == CALL_STATUS_ALERTING || + call->call->status == CALL_STATUS_DIALING || + call->call->status == CALL_STATUS_INCOMING)) + + vc->driver->hangup_active(vc, multirelease_callback, vc); + else + vc->driver->release_specific(vc, call->call->id, multirelease_callback, vc); } @@ -1131,9 +1148,12 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, vc->pending = dbus_message_ref(msg); - voicecalls_release_queue(vc, vc->call_list); - voicecalls_release_next(vc); - + if (vc->driver->hangup_all != NULL) + vc->driver->hangup_all(vc, generic_callback, vc); + else { + voicecalls_release_queue(vc, vc->call_list); + voicecalls_release_next(vc); + } return NULL; } -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFC] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-04 14:21 [RFC] STE-driver: Terminating voice call in state DIALING/ALERTING Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-05 16:24 ` Denis Kenzior 2010-08-05 19:04 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 0 siblings, 1 reply; 8+ messages in thread From: Denis Kenzior @ 2010-08-05 16:24 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 8499 bytes --] Hi Sjur, On 08/04/2010 09:21 AM, Sjur Brændeland wrote: > From: Sjur Brændeland <sjur.brandeland@stericsson.com> > > This patch splits the callback hangup into hangup_all and hangup_active. > > --- > Hi Denis, > I'm picking up a really old thread here... Yes a really old thread ;) > >> Denis Kenzior wrote: >>>>> c) If you have an call on hold and initiate a new call, but want to >>>>> terminate the newly initiated call (DIALING), then this call cannot >>>>> be terminated with CHLD=1X, but you would have to use ATH (or >>>>> possible CHUP). >>>> >>>> Yes, so this is the case that we do need to take care of in the core. >>>> Most >>>> modems let us get away with sending release_specific up to this point. >>> >>> For the STE modem, calls in state DIALING and ALERTING will have to be >>> terminated with ATH or AT+CHUP, AT+CHLD=1x does not work. This means that >>> the current implementation, using release_specific (and thus AT+CHLD=1x) >>> will not work. >> >> Yep, so please critique my earlier suggestion of splitting up hangup >> into two methods: hangup_all and hangup_active. Modem drivers will need to >> provide one or the other or both. >> The core can then use the hangup_active (if available) in those cases where >> release_specific might not work. The condition for hangup_active will be that >> it does not affect held or waiting calls. For ST-E the hangup_active >> implementation will simply be +CHUP. For modems that do not have this >> available we will fall back to release_specific and assume that on those >> CHLD=1X or equivalent can affect dialing/alerting calls. > > If I understand you correctly STE driver should implement > hangup_active using +CUP. Core should then use hangup_active on calls > in state DIALING and ALERTING - Yes, I think this would work. > >> hangup_all can also be used for cases where we loop release_specific >> over all active/dialing/alerting/held/incoming calls. For ST-E the hangup_all >> implementation might be +CHUP;CHLD=1n;...;+CHLD=1m where n, m, etc are >> ids of the HELD calls. We should not hangup waiting calls to be compliant >> with section 6.5.5.1 of 3GPP 22.030: >> "Entering END -Releases the subscriber from all calls >> (except a possible waiting call)." > > I guess the stedriver will not implement the hangup_all because the STE > modem does not have an AT command for terminating all calls. (I assume you > don't want the driver to iterate over calls constructing a command like: > "+CHUP;CHLD=1n;...;+CHLD=1m"). > > I've probably not understood your proposal fully, but I have tried to > put together some code based on it. Please have a look and check if > you had something like this in mind. > > However, I think we can solve this even simpler if we just > call hangup for any ALERTING/DIALING call.. This is a real gray area. On some devices this will work, on others it might have un-intentional consequences. At least on the calypso, sending CHUP/ATH will terminate all calls not in the WAITING state. > > Regards > Sjur > > diff --git a/drivers/stemodem/voicecall.c b/drivers/stemodem/voicecall.c > index a56709a..2ddae05 100644 > --- a/drivers/stemodem/voicecall.c > +++ b/drivers/stemodem/voicecall.c > @@ -260,7 +260,7 @@ static void ste_answer(struct ofono_voicecall *vc, > ste_template("ATA", vc, ste_generic_cb, 0, cb, data); > } > > -static void ste_hangup(struct ofono_voicecall *vc, > +static void ste_hangup_active(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data) > { > ste_template("AT+CHUP", vc, ste_generic_cb, 0x3f, cb, data); > @@ -569,7 +569,7 @@ static struct ofono_voicecall_driver driver = { > .remove = ste_voicecall_remove, > .dial = ste_dial, > .answer = ste_answer, > - .hangup = ste_hangup, > + .hangup_active = ste_hangup_active, > .hold_all_active = ste_hold_all_active, > .release_all_held = ste_release_all_held, > .set_udub = ste_set_udub, > diff --git a/include/voicecall.h b/include/voicecall.h > index 6ceb3d8..2500e5f 100644 > --- a/include/voicecall.h > +++ b/include/voicecall.h > @@ -67,7 +67,11 @@ struct ofono_voicecall_driver { > ofono_voicecall_cb_t cb, void *data); > void (*answer)(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data); > - void (*hangup)(struct ofono_voicecall *vc, > + void (*hangup_all)(struct ofono_voicecall *vc, > + ofono_voicecall_cb_t cb, void *data); > +/* HACK: for temporary backwards compability */ > +#define hangup_active hangup > + void (*hangup_active)(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data); > void (*hold_all_active)(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data); > diff --git a/src/voicecall.c b/src/voicecall.c > index a30aaa5..a420777 100644 > --- a/src/voicecall.c > +++ b/src/voicecall.c > @@ -264,12 +264,12 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, > /* According to various specs, other than 27.007, +CHUP is used > * to reject an incoming call > */ > - if (call->status == CALL_STATUS_INCOMING) { > + if (vc->driver->hangup_active && call->status == CALL_STATUS_INCOMING) { You're breaking the logic somewhat here. If the call is INCOMING, we shouldn't skip the rest of the block if hangup_active is not implemented. > if (vc->driver->hangup == NULL) > return __ofono_error_not_implemented(msg); > > vc->pending = dbus_message_ref(msg); > - vc->driver->hangup(vc, generic_callback, vc); > + vc->driver->hangup_active(vc, generic_callback, vc); > > return NULL; > } Here we need to check whether hangup_active or hangup_all are implemented. If both are, then prefer hangup_all. This would make it easier to keep compatibility with current drivers. > @@ -286,12 +286,12 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, > > num_calls = g_slist_length(vc->call_list); > > - if (num_calls == 1 && vc->driver->hangup && > + if (vc->driver->hangup_active && num_calls == 1 && vc->driver->hangup && This should probably be a condition something like: if (num_calls == 1 && (vc->driver->hangup || vc->driver->hangup_active) ... > (call->status == CALL_STATUS_ACTIVE || > call->status == CALL_STATUS_DIALING || > call->status == CALL_STATUS_ALERTING)) { > vc->pending = dbus_message_ref(msg); > - vc->driver->hangup(vc, generic_callback, vc); > + vc->driver->hangup_active(vc, generic_callback, vc); And again prefer hangup_all over hangup_active to keep compatibility with old drivers. > > return NULL; > } > @@ -304,6 +304,16 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, > return NULL; > } > > + if (vc->driver->hangup_active != NULL && > + (call->status == CALL_STATUS_ALERTING || > + call->status == CALL_STATUS_DIALING)) { > + > + vc->pending = dbus_message_ref(msg); > + vc->driver->hangup_active(vc, generic_callback, vc); > + > + return NULL; > + } > + This seems reasonable > if (vc->driver->release_specific == NULL) > return __ofono_error_not_implemented(msg); > > @@ -762,7 +772,14 @@ static void voicecalls_release_next(struct ofono_voicecall *vc) > > vc->release_list = g_slist_remove(vc->release_list, call); > > - vc->driver->release_specific(vc, call->call->id, > + if (vc->driver->hangup_active != NULL && > + (call->call->status == CALL_STATUS_ALERTING || > + call->call->status == CALL_STATUS_DIALING || > + call->call->status == CALL_STATUS_INCOMING)) This reminds me that we should treat INCOMING calls in HangupAll specially. It should not be handled here. HangupAll should also skip waiting calls. > + > + vc->driver->hangup_active(vc, multirelease_callback, vc); > + else > + vc->driver->release_specific(vc, call->call->id, > multirelease_callback, vc); > } > > @@ -1131,9 +1148,12 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, > > vc->pending = dbus_message_ref(msg); > > - voicecalls_release_queue(vc, vc->call_list); > - voicecalls_release_next(vc); > - > + if (vc->driver->hangup_all != NULL) > + vc->driver->hangup_all(vc, generic_callback, vc); > + else { > + voicecalls_release_queue(vc, vc->call_list); > + voicecalls_release_next(vc); > + } This looks reasonable. > return NULL; > } > Regards, -Denis ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-05 16:24 ` Denis Kenzior @ 2010-08-05 19:04 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-05 19:19 ` Denis Kenzior 0 siblings, 1 reply; 8+ messages in thread From: Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-05 19:04 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 3910 bytes --] Hi Denis, Denis Kenzior wrote: >> I'm picking up a really old thread here... >Yes a really old thread ;) Better late than never, right? :-) ... >> However, I think we can solve this even simpler if we just >> call hangup for any ALERTING/DIALING call.. >This is a real gray area. On some devices this will work, on others it >might have un-intentional consequences. At least on the calypso, >sending CHUP/ATH will terminate all calls not in the WAITING state. Ok, so we should go forward with this proposal then. I'll try to send a new RFC within the next couple of days. My initial intention here was not to submit patches on src/voicecall.c, but to make sure I understood your proposal properly. Let me know how you think we should go forward with this, as this impacts all drivers/*/voicecall.c >> - if (call->status == CALL_STATUS_INCOMING) { >> + if (vc->driver->hangup_active && call->status == CALL_STATUS_INCOMING) { > >You're breaking the logic somewhat here. If the call is INCOMING, we >shouldn't skip the rest of the block if hangup_active is not implemented. > >> if (vc->driver->hangup == NULL) >> return __ofono_error_not_implemented(msg); >> >> vc->pending = dbus_message_ref(msg); >> - vc->driver->hangup(vc, generic_callback, vc); >> + vc->driver->hangup_active(vc, generic_callback, vc); >> >> return NULL; >> } > >Here we need to check whether hangup_active or hangup_all are >implemented. If both are, then prefer hangup_all. This would make it >easier to keep compatibility with current drivers. Did you have something like this in mind then: if (call->status == CALL_STATUS_INCOMING) { vc->pending = dbus_message_ref(msg); if (vc->driver->hangup_all) vc->driver->hangup_all(vc, generic_callback, vc); else if (vc->driver->hangup_active) vc->driver->hangup_active(vc, generic_callback, vc); else return __ofono_error_not_implemented(msg); return NULL; } Should we do not_implemented here or did you intend the drivers to be allowed to not implement hangup_active nor hangup_all, and fall through to release_specific? > >> @@ -286,12 +286,12 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, >> >> num_calls = g_slist_length(vc->call_list); >> >> - if (num_calls == 1 && vc->driver->hangup && >> + if (vc->driver->hangup_active && num_calls == 1 && vc->driver->hangup && > >This should probably be a condition something like: > >if (num_calls == 1 && (vc->driver->hangup || vc->driver->hangup_active) >... > >> (call->status == CALL_STATUS_ACTIVE || >> call->status == CALL_STATUS_DIALING || >> call->status == CALL_STATUS_ALERTING)) { >> vc->pending = dbus_message_ref(msg); >> - vc->driver->hangup(vc, generic_callback, vc); >> + vc->driver->hangup_active(vc, generic_callback, vc); > >And again prefer hangup_all over hangup_active to keep compatibility >with old drivers. Something like this then: if (num_calls == 1 && (vc->driver->hangup_all || vc->driver->hangup_active) && (call->status == CALL_STATUS_ACTIVE || call->status == CALL_STATUS_DIALING || call->status == CALL_STATUS_ALERTING)) { vc->pending = dbus_message_ref(msg); if (vc->driver->hangup_all) vc->driver->hangup_all(vc, generic_callback, vc); else if (vc->driver->hangup_active) vc->driver->hangup_active(vc, generic_callback, vc); else return __ofono_error_not_implemented(msg); >This reminds me that we should treat INCOMING calls in HangupAll >specially. It should not be handled here. What did you have in mind? >HangupAll should also skip waiting calls. voicecalls_release_queue and voicecalls_release_next are used for multiparty_hangup as well, I assume you want the same behaviour for multi-party so that we can do these changes in voicecalls_release_queue, right? Regards Sjur ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-05 19:04 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-05 19:19 ` Denis Kenzior 2010-08-06 12:59 ` [RFCv2] " Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 0 siblings, 1 reply; 8+ messages in thread From: Denis Kenzior @ 2010-08-05 19:19 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 5386 bytes --] Hi Sjur, On 08/05/2010 02:04 PM, Sjur Brændeland wrote: > Hi Denis, > > Denis Kenzior wrote: >>> I'm picking up a really old thread here... >> Yes a really old thread ;) > Better late than never, right? :-) > > ... Definitely :) I'm very glad you brought this back up. >>> However, I think we can solve this even simpler if we just >>> call hangup for any ALERTING/DIALING call.. >> This is a real gray area. On some devices this will work, on others it >> might have un-intentional consequences. At least on the calypso, >> sending CHUP/ATH will terminate all calls not in the WAITING state. > > Ok, so we should go forward with this proposal then. > I'll try to send a new RFC within the next couple of days. > > My initial intention here was not to submit patches > on src/voicecall.c, but to make sure I understood your proposal properly. > Let me know how you think we should go forward with this, as this > impacts all drivers/*/voicecall.c > Yes, I think this definitely makes sense. There might be some other modems we don't cover properly (some don't allow HELD calls to be terminated using CHLD=1X), but we cross that bridge when we come to it. >>> - if (call->status == CALL_STATUS_INCOMING) { >>> + if (vc->driver->hangup_active && call->status == CALL_STATUS_INCOMING) { >> >> You're breaking the logic somewhat here. If the call is INCOMING, we >> shouldn't skip the rest of the block if hangup_active is not implemented. >> >>> if (vc->driver->hangup == NULL) >>> return __ofono_error_not_implemented(msg); >>> >>> vc->pending = dbus_message_ref(msg); >>> - vc->driver->hangup(vc, generic_callback, vc); >>> + vc->driver->hangup_active(vc, generic_callback, vc); >>> >>> return NULL; >>> } >> >> Here we need to check whether hangup_active or hangup_all are >> implemented. If both are, then prefer hangup_all. This would make it >> easier to keep compatibility with current drivers. > > Did you have something like this in mind then: > > if (call->status == CALL_STATUS_INCOMING) { > vc->pending = dbus_message_ref(msg); > if (vc->driver->hangup_all) > vc->driver->hangup_all(vc, generic_callback, vc); > else if (vc->driver->hangup_active) > vc->driver->hangup_active(vc, generic_callback, vc); > else > return __ofono_error_not_implemented(msg); > > return NULL; > } > > Should we do not_implemented here or did you intend the drivers to be allowed > to not implement hangup_active nor hangup_all, and fall through to > release_specific? I think doing not_implemented here is a good idea. However, you should not take the ref of the message if you're returning not_implemented. Something like this would be better: if (call->status == CALL_STATUS_INCOMING) { if (vc->driver->hangup_all == NULL && vc->driver->hangup_active == NULL) return __ofono_error_not_implemented(msg); vc->pending = dbus_message_ref(msg); if (vc->driver->hangup_all) .... else .... return NULL; } > >> >>> @@ -286,12 +286,12 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, >>> >>> num_calls = g_slist_length(vc->call_list); >>> >>> - if (num_calls == 1 && vc->driver->hangup && >>> + if (vc->driver->hangup_active && num_calls == 1 && vc->driver->hangup && >> >> This should probably be a condition something like: >> >> if (num_calls == 1 && (vc->driver->hangup || vc->driver->hangup_active) >> ... >> >>> (call->status == CALL_STATUS_ACTIVE || >>> call->status == CALL_STATUS_DIALING || >>> call->status == CALL_STATUS_ALERTING)) { >>> vc->pending = dbus_message_ref(msg); >>> - vc->driver->hangup(vc, generic_callback, vc); >>> + vc->driver->hangup_active(vc, generic_callback, vc); >> >> And again prefer hangup_all over hangup_active to keep compatibility >> with old drivers. > > > Something like this then: > if (num_calls == 1 && (vc->driver->hangup_all || vc->driver->hangup_active) && > (call->status == CALL_STATUS_ACTIVE || > call->status == CALL_STATUS_DIALING || > call->status == CALL_STATUS_ALERTING)) { > vc->pending = dbus_message_ref(msg); > if (vc->driver->hangup_all) > vc->driver->hangup_all(vc, generic_callback, vc); > else if (vc->driver->hangup_active) > vc->driver->hangup_active(vc, generic_callback, vc); > else > return __ofono_error_not_implemented(msg); > Yep, but see the comment about dbus_message_ref above. >> This reminds me that we should treat INCOMING calls in HangupAll >> specially. It should not be handled here. > > What did you have in mind? I'm thinking of simply checking if there is an INCOMING call. If so, it is assumed to be a single call and using hangup_all / hangup_active is sufficient. This would also be more consistent with voicecall_hangup implementation above. > >> HangupAll should also skip waiting calls. > > voicecalls_release_queue and voicecalls_release_next are used for > multiparty_hangup as well, I assume you want the same behaviour for multi-party > so that we can do these changes in voicecalls_release_queue, right? Correct, however multiparty calls cannot be in the WAITING state. Essentially we can just skip these by not queuing them on the release list. > > Regards > Sjur Regards, -Denis ^ permalink raw reply [flat|nested] 8+ messages in thread
* [RFCv2] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-05 19:19 ` Denis Kenzior @ 2010-08-06 12:59 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-06 19:01 ` Denis Kenzior 0 siblings, 1 reply; 8+ messages in thread From: Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-06 12:59 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 8946 bytes --] From: Sjur Brændeland <sjur.brandeland@stericsson.com> This patch fixes problem with terminating calls in state DIALING/ALERTING for STE-modem. The main change is that voicecall-callback function hangup is split into the functions hangup_all and hangup_active. CHANGES: include/voicecall.h: o hangup is replaced with hangup_active and hangup_all. o As a tmp hack to provide backwards portability the previous hangup is defined to hangup_all drivers/atmodem/voicecall.c: o hangup_all uses ATH o hangup_active uses CHUP drivers/stemodem/voicecall.c: o hangup_active uses CHUP while hangup_all is not implemented. src/voicecall.c: o In cases where hangup previously was used, hangup_all is used if implemented otherwise hangup_active is used. o Call in state DIALING/ALERTING is released with hangup_active if implemented. o manager_hangup_all will no longer release calls in state waiting. o manager_hangup_all will simply call hangup_all if implemented. o manager_hangup_all will release calls in state ALERTING/DIALING/INCOMING using hangup_active otherwise release_specific. --- drivers/atmodem/voicecall.c | 14 ++++++-- drivers/stemodem/voicecall.c | 4 +- include/voicecall.h | 6 +++- src/voicecall.c | 76 +++++++++++++++++++++++++++++++++-------- 4 files changed, 79 insertions(+), 21 deletions(-) diff --git a/drivers/atmodem/voicecall.c b/drivers/atmodem/voicecall.c index fce9144..80ce897 100644 --- a/drivers/atmodem/voicecall.c +++ b/drivers/atmodem/voicecall.c @@ -406,10 +406,17 @@ static void at_answer(struct ofono_voicecall *vc, at_template("ATA", vc, generic_cb, 0, cb, data); } -static void at_hangup(struct ofono_voicecall *vc, +static void at_hangup_all(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data) { - /* Hangup all calls */ + /* Hangup all calls, except waiting */ + at_template("ATH", vc, generic_cb, 0x3f, cb, data); +} + +static void at_hangup_active(struct ofono_voicecall *vc, + ofono_voicecall_cb_t cb, void *data) +{ + /* Hangup currently active call */ at_template("AT+CHUP", vc, generic_cb, 0x3f, cb, data); } @@ -874,7 +881,8 @@ static struct ofono_voicecall_driver driver = { .remove = at_voicecall_remove, .dial = at_dial, .answer = at_answer, - .hangup = at_hangup, + .hangup_active = at_hangup_active, + .hangup_all = at_hangup_all, .hold_all_active = at_hold_all_active, .release_all_held = at_release_all_held, .set_udub = at_set_udub, diff --git a/drivers/stemodem/voicecall.c b/drivers/stemodem/voicecall.c index a56709a..2ddae05 100644 --- a/drivers/stemodem/voicecall.c +++ b/drivers/stemodem/voicecall.c @@ -260,7 +260,7 @@ static void ste_answer(struct ofono_voicecall *vc, ste_template("ATA", vc, ste_generic_cb, 0, cb, data); } -static void ste_hangup(struct ofono_voicecall *vc, +static void ste_hangup_active(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data) { ste_template("AT+CHUP", vc, ste_generic_cb, 0x3f, cb, data); @@ -569,7 +569,7 @@ static struct ofono_voicecall_driver driver = { .remove = ste_voicecall_remove, .dial = ste_dial, .answer = ste_answer, - .hangup = ste_hangup, + .hangup_active = ste_hangup_active, .hold_all_active = ste_hold_all_active, .release_all_held = ste_release_all_held, .set_udub = ste_set_udub, diff --git a/include/voicecall.h b/include/voicecall.h index 6ceb3d8..d43954c 100644 --- a/include/voicecall.h +++ b/include/voicecall.h @@ -67,7 +67,11 @@ struct ofono_voicecall_driver { ofono_voicecall_cb_t cb, void *data); void (*answer)(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data); - void (*hangup)(struct ofono_voicecall *vc, +/* HACK: for temporary backwards compatibility */ +#define hangup_all hangup + void (*hangup_all)(struct ofono_voicecall *vc, + ofono_voicecall_cb_t cb, void *data); + void (*hangup_active)(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data); void (*hold_all_active)(struct ofono_voicecall *vc, ofono_voicecall_cb_t cb, void *data); diff --git a/src/voicecall.c b/src/voicecall.c index a30aaa5..6ba6bb7 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -261,15 +261,18 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, if (vc->pending) return __ofono_error_busy(msg); - /* According to various specs, other than 27.007, +CHUP is used - * to reject an incoming call - */ if (call->status == CALL_STATUS_INCOMING) { - if (vc->driver->hangup == NULL) + + if (vc->driver->hangup_all == NULL && + vc->driver->hangup_active == NULL) return __ofono_error_not_implemented(msg); vc->pending = dbus_message_ref(msg); - vc->driver->hangup(vc, generic_callback, vc); + + if (vc->driver->hangup_all) + vc->driver->hangup_all(vc, generic_callback, vc); + else + vc->driver->hangup_active(vc, generic_callback, vc); return NULL; } @@ -286,12 +289,19 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, num_calls = g_slist_length(vc->call_list); - if (num_calls == 1 && vc->driver->hangup && + if (num_calls == 1 && + (vc->driver->hangup_all != NULL || + vc->driver->hangup_active != NULL) && (call->status == CALL_STATUS_ACTIVE || call->status == CALL_STATUS_DIALING || call->status == CALL_STATUS_ALERTING)) { + vc->pending = dbus_message_ref(msg); - vc->driver->hangup(vc, generic_callback, vc); + + if (vc->driver->hangup_all) + vc->driver->hangup_all(vc, generic_callback, vc); + else + vc->driver->hangup_active(vc, generic_callback, vc); return NULL; } @@ -304,6 +314,15 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, return NULL; } + if (vc->driver->hangup_active != NULL && + (call->status == CALL_STATUS_ALERTING || + call->status == CALL_STATUS_DIALING)) { + vc->pending = dbus_message_ref(msg); + vc->driver->hangup_active(vc, generic_callback, vc); + + return NULL; + } + if (vc->driver->release_specific == NULL) return __ofono_error_not_implemented(msg); @@ -743,12 +762,18 @@ static void emit_multiparty_call_list_changed(struct ofono_voicecall *vc) static void voicecalls_release_queue(struct ofono_voicecall *vc, GSList *calls) { GSList *l; + struct voicecall *call; g_slist_free(vc->release_list); vc->release_list = NULL; - for (l = calls; l; l = l->next) - vc->release_list = g_slist_prepend(vc->release_list, l->data); + for (l = calls; l; l = l->next) { + call = l->data; + + if (call->call->status != CALL_STATUS_WAITING) + vc->release_list = + g_slist_prepend(vc->release_list, call); + } } static void voicecalls_release_next(struct ofono_voicecall *vc) @@ -762,7 +787,14 @@ static void voicecalls_release_next(struct ofono_voicecall *vc) vc->release_list = g_slist_remove(vc->release_list, call); - vc->driver->release_specific(vc, call->call->id, + if (vc->driver->hangup_active != NULL && + (call->call->status == CALL_STATUS_ALERTING || + call->call->status == CALL_STATUS_DIALING || + call->call->status == CALL_STATUS_INCOMING)) + + vc->driver->hangup_active(vc, multirelease_callback, vc); + else + vc->driver->release_specific(vc, call->call->id, multirelease_callback, vc); } @@ -1119,7 +1151,9 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, if (vc->pending) return __ofono_error_busy(msg); - if (!vc->driver->release_specific) + if (vc->driver->hangup_all == NULL && + (vc->driver->release_specific == NULL || + vc->driver->hangup_active == NULL)) return __ofono_error_not_implemented(msg); if (vc->call_list == NULL) { @@ -1131,9 +1165,17 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, vc->pending = dbus_message_ref(msg); - voicecalls_release_queue(vc, vc->call_list); - voicecalls_release_next(vc); + if (vc->driver->hangup_all != NULL) + vc->driver->hangup_all(vc, generic_callback, vc); + /* In case of INCOMING call, assume we only have this one call */ + else if (voicecalls_have_incoming(vc) && + vc->driver->hangup_active != NULL) + vc->driver->hangup_active(vc, generic_callback, vc); + else { + voicecalls_release_queue(vc, vc->call_list); + voicecalls_release_next(vc); + } return NULL; } @@ -1370,8 +1412,12 @@ static DBusMessage *multiparty_hangup(DBusConnection *conn, /* Fall back to the old-fashioned way */ vc->flags |= VOICECALLS_FLAG_MULTI_RELEASE; - voicecalls_release_queue(vc, vc->multiparty_list); - voicecalls_release_next(vc); + if (vc->driver->hangup_all != NULL) + vc->driver->hangup_all(vc, generic_callback, vc); + else { + voicecalls_release_queue(vc, vc->call_list); + voicecalls_release_next(vc); + } out: return NULL; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFCv2] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-06 12:59 ` [RFCv2] " Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-06 19:01 ` Denis Kenzior 2010-08-06 21:30 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 0 siblings, 1 reply; 8+ messages in thread From: Denis Kenzior @ 2010-08-06 19:01 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 10629 bytes --] Hi Sjur, On 08/06/2010 07:59 AM, Sjur Brændeland wrote: > From: Sjur Brændeland <sjur.brandeland@stericsson.com> > > This patch fixes problem with terminating calls in state DIALING/ALERTING > for STE-modem. The main change is that voicecall-callback function > hangup is split into the functions hangup_all and hangup_active. > > CHANGES: > include/voicecall.h: > o hangup is replaced with hangup_active and hangup_all. > o As a tmp hack to provide backwards portability > the previous hangup is defined to hangup_all > > drivers/atmodem/voicecall.c: > o hangup_all uses ATH > o hangup_active uses CHUP > > drivers/stemodem/voicecall.c: > o hangup_active uses CHUP while hangup_all is not implemented. > > src/voicecall.c: > o In cases where hangup previously was used, hangup_all is used if implemented > otherwise hangup_active is used. > o Call in state DIALING/ALERTING is released with hangup_active if implemented. > o manager_hangup_all will no longer release calls in state waiting. > o manager_hangup_all will simply call hangup_all if implemented. > o manager_hangup_all will release calls in state ALERTING/DIALING/INCOMING > using hangup_active otherwise release_specific. > --- > drivers/atmodem/voicecall.c | 14 ++++++-- > drivers/stemodem/voicecall.c | 4 +- > include/voicecall.h | 6 +++- > src/voicecall.c | 76 +++++++++++++++++++++++++++++++++-------- > 4 files changed, 79 insertions(+), 21 deletions(-) > > diff --git a/drivers/atmodem/voicecall.c b/drivers/atmodem/voicecall.c > index fce9144..80ce897 100644 > --- a/drivers/atmodem/voicecall.c > +++ b/drivers/atmodem/voicecall.c > @@ -406,10 +406,17 @@ static void at_answer(struct ofono_voicecall *vc, > at_template("ATA", vc, generic_cb, 0, cb, data); > } > > -static void at_hangup(struct ofono_voicecall *vc, > +static void at_hangup_all(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data) > { > - /* Hangup all calls */ > + /* Hangup all calls, except waiting */ > + at_template("ATH", vc, generic_cb, 0x3f, cb, data); > +} > + > +static void at_hangup_active(struct ofono_voicecall *vc, > + ofono_voicecall_cb_t cb, void *data) > +{ > + /* Hangup currently active call */ It might be safer to only implement hangup_active in the generic driver. However, since this driver is only for testing anyway, the change is fine. > at_template("AT+CHUP", vc, generic_cb, 0x3f, cb, data); > } > > @@ -874,7 +881,8 @@ static struct ofono_voicecall_driver driver = { > .remove = at_voicecall_remove, > .dial = at_dial, > .answer = at_answer, > - .hangup = at_hangup, > + .hangup_active = at_hangup_active, > + .hangup_all = at_hangup_all, > .hold_all_active = at_hold_all_active, > .release_all_held = at_release_all_held, > .set_udub = at_set_udub, > diff --git a/drivers/stemodem/voicecall.c b/drivers/stemodem/voicecall.c > index a56709a..2ddae05 100644 > --- a/drivers/stemodem/voicecall.c > +++ b/drivers/stemodem/voicecall.c > @@ -260,7 +260,7 @@ static void ste_answer(struct ofono_voicecall *vc, > ste_template("ATA", vc, ste_generic_cb, 0, cb, data); > } > > -static void ste_hangup(struct ofono_voicecall *vc, > +static void ste_hangup_active(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data) > { > ste_template("AT+CHUP", vc, ste_generic_cb, 0x3f, cb, data); > @@ -569,7 +569,7 @@ static struct ofono_voicecall_driver driver = { > .remove = ste_voicecall_remove, > .dial = ste_dial, > .answer = ste_answer, > - .hangup = ste_hangup, > + .hangup_active = ste_hangup_active, > .hold_all_active = ste_hold_all_active, > .release_all_held = ste_release_all_held, > .set_udub = ste_set_udub, > diff --git a/include/voicecall.h b/include/voicecall.h > index 6ceb3d8..d43954c 100644 > --- a/include/voicecall.h > +++ b/include/voicecall.h > @@ -67,7 +67,11 @@ struct ofono_voicecall_driver { > ofono_voicecall_cb_t cb, void *data); > void (*answer)(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data); > - void (*hangup)(struct ofono_voicecall *vc, > +/* HACK: for temporary backwards compatibility */ > +#define hangup_all hangup > + void (*hangup_all)(struct ofono_voicecall *vc, > + ofono_voicecall_cb_t cb, void *data); > + void (*hangup_active)(struct ofono_voicecall *vc, We'll need to figure out how to migrate to the new driver API a bit more sanely. > ofono_voicecall_cb_t cb, void *data); > void (*hold_all_active)(struct ofono_voicecall *vc, > ofono_voicecall_cb_t cb, void *data); > diff --git a/src/voicecall.c b/src/voicecall.c > index a30aaa5..6ba6bb7 100644 > --- a/src/voicecall.c > +++ b/src/voicecall.c > @@ -261,15 +261,18 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, > if (vc->pending) > return __ofono_error_busy(msg); > > - /* According to various specs, other than 27.007, +CHUP is used > - * to reject an incoming call > - */ > if (call->status == CALL_STATUS_INCOMING) { > - if (vc->driver->hangup == NULL) > + > + if (vc->driver->hangup_all == NULL && > + vc->driver->hangup_active == NULL) > return __ofono_error_not_implemented(msg); > > vc->pending = dbus_message_ref(msg); > - vc->driver->hangup(vc, generic_callback, vc); > + > + if (vc->driver->hangup_all) > + vc->driver->hangup_all(vc, generic_callback, vc); > + else > + vc->driver->hangup_active(vc, generic_callback, vc); Looks good. > > return NULL; > } > @@ -286,12 +289,19 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, > > num_calls = g_slist_length(vc->call_list); > > - if (num_calls == 1 && vc->driver->hangup && > + if (num_calls == 1 && > + (vc->driver->hangup_all != NULL || > + vc->driver->hangup_active != NULL) && > (call->status == CALL_STATUS_ACTIVE || > call->status == CALL_STATUS_DIALING || > call->status == CALL_STATUS_ALERTING)) { This if statement is getting a little out of hand, but I can take care of style issues later. > + Don't need the empty line here. > vc->pending = dbus_message_ref(msg); > - vc->driver->hangup(vc, generic_callback, vc); > + > + if (vc->driver->hangup_all) > + vc->driver->hangup_all(vc, generic_callback, vc); > + else > + vc->driver->hangup_active(vc, generic_callback, vc); Looks good. > > return NULL; > } > @@ -304,6 +314,15 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn, > return NULL; > } > > + if (vc->driver->hangup_active != NULL && > + (call->status == CALL_STATUS_ALERTING || > + call->status == CALL_STATUS_DIALING)) { > + vc->pending = dbus_message_ref(msg); > + vc->driver->hangup_active(vc, generic_callback, vc); > + > + return NULL; > + } > + Looks good. > if (vc->driver->release_specific == NULL) > return __ofono_error_not_implemented(msg); > > @@ -743,12 +762,18 @@ static void emit_multiparty_call_list_changed(struct ofono_voicecall *vc) > static void voicecalls_release_queue(struct ofono_voicecall *vc, GSList *calls) > { > GSList *l; > + struct voicecall *call; > > g_slist_free(vc->release_list); > vc->release_list = NULL; > > - for (l = calls; l; l = l->next) > - vc->release_list = g_slist_prepend(vc->release_list, l->data); > + for (l = calls; l; l = l->next) { > + call = l->data; > + > + if (call->call->status != CALL_STATUS_WAITING) > + vc->release_list = > + g_slist_prepend(vc->release_list, call); > + } Actually I prefer this to be done in manager_hangup_all. This function is used by the multiparty release path which can never include waiting calls. > } > > static void voicecalls_release_next(struct ofono_voicecall *vc) > @@ -762,7 +787,14 @@ static void voicecalls_release_next(struct ofono_voicecall *vc) > > vc->release_list = g_slist_remove(vc->release_list, call); > > - vc->driver->release_specific(vc, call->call->id, > + if (vc->driver->hangup_active != NULL && > + (call->call->status == CALL_STATUS_ALERTING || > + call->call->status == CALL_STATUS_DIALING || > + call->call->status == CALL_STATUS_INCOMING)) > + > + vc->driver->hangup_active(vc, multirelease_callback, vc); > + else > + vc->driver->release_specific(vc, call->call->id, > multirelease_callback, vc); Looks good. > } > > @@ -1119,7 +1151,9 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, > if (vc->pending) > return __ofono_error_busy(msg); > > - if (!vc->driver->release_specific) > + if (vc->driver->hangup_all == NULL && > + (vc->driver->release_specific == NULL || > + vc->driver->hangup_active == NULL)) > return __ofono_error_not_implemented(msg); Looks good. > > if (vc->call_list == NULL) { > @@ -1131,9 +1165,17 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, > > vc->pending = dbus_message_ref(msg); > > - voicecalls_release_queue(vc, vc->call_list); > - voicecalls_release_next(vc); > + if (vc->driver->hangup_all != NULL) > + vc->driver->hangup_all(vc, generic_callback, vc); > > + /* In case of INCOMING call, assume we only have this one call */ > + else if (voicecalls_have_incoming(vc) && > + vc->driver->hangup_active != NULL) > + vc->driver->hangup_active(vc, generic_callback, vc); Now that I think about it, the else if clause is not needed. You take care of incoming calls with hangup_active in voicecalls_release_next. Right? > + else { > + voicecalls_release_queue(vc, vc->call_list); > + voicecalls_release_next(vc); > + } > return NULL; > } > > @@ -1370,8 +1412,12 @@ static DBusMessage *multiparty_hangup(DBusConnection *conn, > > /* Fall back to the old-fashioned way */ > vc->flags |= VOICECALLS_FLAG_MULTI_RELEASE; > - voicecalls_release_queue(vc, vc->multiparty_list); > - voicecalls_release_next(vc); > + if (vc->driver->hangup_all != NULL) > + vc->driver->hangup_all(vc, generic_callback, vc); > + else { > + voicecalls_release_queue(vc, vc->call_list); > + voicecalls_release_next(vc); > + } This doesn't look right. If we get to this part then we either have waiting + active, waiting + held, waiting + active + held or active + held. Calling hangup_all would be all right for the first two cases, but not the other two. For multiparty we need to fall back to release_specific. The original code was fine. > > out: > return NULL; Regards, -Denis ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFCv2] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-06 19:01 ` Denis Kenzior @ 2010-08-06 21:30 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-07 0:22 ` Denis Kenzior 0 siblings, 1 reply; 8+ messages in thread From: Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-06 21:30 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 3808 bytes --] Hi Denis. ... >> +static void at_hangup_active(struct ofono_voicecall *vc, >> + ofono_voicecall_cb_t cb, void *data) >> +{ >> + /* Hangup currently active call */ > > It might be safer to only implement hangup_active in the generic driver. > However, since this driver is only for testing anyway, the change is fine. Ok, I might change that then. ... >> +/* HACK: for temporary backwards compatibility */ >> +#define hangup_all hangup >> + void (*hangup_all)(struct ofono_voicecall *vc, >> + ofono_voicecall_cb_t cb, void *data); >> + void (*hangup_active)(struct ofono_voicecall *vc, > > We'll need to figure out how to migrate to the new driver API a bit more > sanely. Should we s/hangup/hangup_active in all drivers and skip this hack then? Or did you have something else in mind? .... > static void voicecalls_release_queue(struct ofono_voicecall *vc, GSList *calls) >> { >> GSList *l; >> + struct voicecall *call; >> >> g_slist_free(vc->release_list); >> vc->release_list = NULL; >> >> - for (l = calls; l; l = l->next) >> - vc->release_list = g_slist_prepend(vc->release_list, l->data); >> + for (l = calls; l; l = l->next) { >> + call = l->data; >> + >> + if (call->call->status != CALL_STATUS_WAITING) >> + vc->release_list = >> + g_slist_prepend(vc->release_list, call); >> + } > > Actually I prefer this to be done in manager_hangup_all. This function > is used by the multiparty release path which can never include waiting > calls. OK, I'll look into that. ... >> @@ -1131,9 +1165,17 @@ static DBusMessage *manager_hangup_all(DBusConnection *conn, >> >> vc->pending = dbus_message_ref(msg); >> >> - voicecalls_release_queue(vc, vc->call_list); >> - voicecalls_release_next(vc); >> + if (vc->driver->hangup_all != NULL) >> + vc->driver->hangup_all(vc, generic_callback, vc); >> >> + /* In case of INCOMING call, assume we only have this one call */ >> + else if (voicecalls_have_incoming(vc) && >> + vc->driver->hangup_active != NULL) >> + vc->driver->hangup_active(vc, generic_callback, vc); > > Now that I think about it, the else if clause is not needed. You take > care of incoming calls with hangup_active in voicecalls_release_next. > Right? Yes, agree. ... >> @@ -1370,8 +1412,12 @@ static DBusMessage *multiparty_hangup(DBusConnection *conn, >> >> /* Fall back to the old-fashioned way */ >> vc->flags |= VOICECALLS_FLAG_MULTI_RELEASE; >> - voicecalls_release_queue(vc, vc->multiparty_list); >> - voicecalls_release_next(vc); >> + if (vc->driver->hangup_all != NULL) >> + vc->driver->hangup_all(vc, generic_callback, vc); >> + else { >> + voicecalls_release_queue(vc, vc->call_list); >> + voicecalls_release_next(vc); >> + } > > This doesn't look right. If we get to this part then we either have > waiting + active, waiting + held, waiting + active + held or active + > held. Calling hangup_all would be all right for the first two cases, > but not the other two. > > For multiparty we need to fall back to release_specific. The original > code was fine. OK, I'll revert this. How do we proceede with this change. I am very happy if you carry on from here, or would you like me to to submit a patch-set with these changes, including s/hangup/hangup_active in drivers/*/voicecall.c? Regards Sjur ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFCv2] STE-driver: Terminating voice call in state DIALING/ALERTING. 2010-08-06 21:30 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= @ 2010-08-07 0:22 ` Denis Kenzior 0 siblings, 0 replies; 8+ messages in thread From: Denis Kenzior @ 2010-08-07 0:22 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 959 bytes --] Hi Sjur, >>> +/* HACK: for temporary backwards compatibility */ >>> +#define hangup_all hangup >>> + void (*hangup_all)(struct ofono_voicecall *vc, >>> + ofono_voicecall_cb_t cb, void *data); >>> + void (*hangup_active)(struct ofono_voicecall *vc, >> >> We'll need to figure out how to migrate to the new driver API a bit more >> sanely. > > Should we s/hangup/hangup_active in all drivers and skip this hack then? > Or did you have something else in mind? That sounds good. Break this up into two patches, one renaming hangup to hangup_active and the second one introducing hangup_all. > > How do we proceede with this change. I am very happy if you carry on from here, > or would you like me to to submit a patch-set with these changes, > including s/hangup/hangup_active in drivers/*/voicecall.c? Go ahead and re-submit the fixed up patch set and I will take care of the rest. Regards, -Denis ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2010-08-07 0:22 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-08-04 14:21 [RFC] STE-driver: Terminating voice call in state DIALING/ALERTING Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-05 16:24 ` Denis Kenzior 2010-08-05 19:04 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-05 19:19 ` Denis Kenzior 2010-08-06 12:59 ` [RFCv2] " Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-06 19:01 ` Denis Kenzior 2010-08-06 21:30 ` Sjur =?unknown-8bit?q?Br=C3=A6ndeland?= 2010-08-07 0:22 ` Denis Kenzior
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.