Hi Frédéric,

On 04/20/2011 06:34 AM, Frédéric Danis wrote:
> ---
>  src/emulator.c |   74 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 73 insertions(+), 1 deletions(-)
> 
> diff --git a/src/emulator.c b/src/emulator.c
> index 9b4647b..cffda21 100644
> --- a/src/emulator.c
> +++ b/src/emulator.c
> @@ -51,6 +51,7 @@ struct ofono_emulator {
>       int r_features;
>       int events_mode;
>       gboolean events_ind;
> +     unsigned char cme_error_ind;

Please name this cmee_mode;

>       GSList *indicators;
>       guint callsetup_source;
>       gboolean clip;
> @@ -569,6 +570,52 @@ fail:
>       };
>  }
>  
> +static void cmee_cb(GAtServer *server, GAtServerRequestType type,
> +                     GAtResult *result, gpointer user_data)
> +{
> +     struct ofono_emulator *em = user_data;
> +     GAtResultIter iter;
> +     int val;
> +     char buf[16];
> +
> +     switch (type) {
> +     case G_AT_SERVER_REQUEST_TYPE_SET:
> +             g_at_result_iter_init(&iter, result);
> +             g_at_result_iter_next(&iter, "");
> +
> +             if (g_at_result_iter_next_number(&iter, &val) == FALSE)
> +                     goto fail;
> +
> +             if (val < 0 && val > 1)
> +                     goto fail;
> +
> +             em->cme_error_ind = val;
> +
> +             sprintf(buf, "+CMEE: %d", em->cme_error_ind);
> +             g_at_server_send_info(em->server, buf, TRUE);

The CMEE set command should not result in the current mode being
printed, right?

> +             g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
> +             break;
> +
> +     case G_AT_SERVER_REQUEST_TYPE_QUERY:
> +             sprintf(buf, "+CMEE: %d", em->cme_error_ind);
> +             g_at_server_send_info(em->server, buf, TRUE);
> +             g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
> +             break;
> +
> +     case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
> +             /* HFP only support 0 and 1 */
> +             sprintf(buf, "+CMEE: (0,1)");
> +             g_at_server_send_info(em->server, buf, TRUE);
> +             g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
> +             break;
> +
> +     default:
> +fail:
> +             g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
> +             break;
> +     }
> +}
> +
>  static void emulator_add_indicator(struct ofono_emulator *em, const char* 
> name,
>                                       int min, int max, int dflt)
>  {
> @@ -656,6 +703,7 @@ void ofono_emulator_register(struct ofono_emulator *em, 
> int fd)
>               g_at_server_register(em->server, "+CMER", cmer_cb, em, NULL);
>               g_at_server_register(em->server, "+CLIP", clip_cb, em, NULL);
>               g_at_server_register(em->server, "+CCWA", ccwa_cb, em, NULL);
> +             g_at_server_register(em->server, "+CMEE", cmee_cb, em, NULL);
>       }
>  
>       __ofono_atom_register(em->atom, emulator_unregister);
> @@ -699,6 +747,7 @@ struct ofono_emulator *ofono_emulator_create(struct 
> ofono_modem *modem,
>       /* TODO: Check real local features */
>       em->l_features = 32;
>       em->events_mode = 3;    /* default mode is forwarding events */
> +     em->cme_error_ind = 0;  /* CME ERROR disabled by default */
>  
>       em->atom = __ofono_modem_add_atom_offline(modem, atom_t,
>                                                       emulator_remove, em);
> @@ -727,7 +776,23 @@ void ofono_emulator_send_final(struct ofono_emulator *em,
>               break;
>  
>       case OFONO_ERROR_TYPE_CME:
> -             sprintf(buf, "+CME ERROR: %d", final->error);
> +             /* default string */
> +             sprintf(buf, "ERROR");

What exactly is this for?  The default case goes to failure label anyway

> +
> +             switch (em->cme_error_ind) {
> +             case 1:
> +                     sprintf(buf, "+CME ERROR: %d", final->error);
> +                     break;
> +
> +             case 2:
> +                     sprintf(buf, "+CME ERROR: %s",
> +                                             telephony_error_to_str(final));
> +                     break;
> +
> +             default:
> +                     goto failure;
> +             }
> +
>               g_at_server_send_ext_final(em->server, buf);
>               break;
>  
> @@ -738,6 +803,13 @@ void ofono_emulator_send_final(struct ofono_emulator *em,
>       case OFONO_ERROR_TYPE_CEER:
>       case OFONO_ERROR_TYPE_SIM:
>       case OFONO_ERROR_TYPE_FAILURE:
> +failure:
> +             if (final->error == 30) {
> +                     g_at_server_send_final(em->server,
> +                                     G_AT_SERVER_RESULT_NO_CARRIER);
> +                     break;
> +             }

What is this magic trying to do?  If you really want to send a NO
CARRIER, then I suggest using the g_at_server_send_final directly from
the callback.  Unless you want to do this for voicecalls...?  If so,
then inventing a new ofono error type might be better.  Drop this change
for now.

> +
>               g_at_server_send_final(em->server, G_AT_SERVER_RESULT_ERROR);
>               break;
>       };

Regards,
-Denis
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to