Hi Lucas,

On 11/26/2010 06:44 PM, Lucas De Marchi wrote:
> ---
>  plugins/phonesim.c |  140 
> ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 136 insertions(+), 4 deletions(-)
> 
> diff --git a/plugins/phonesim.c b/plugins/phonesim.c
> index d2faf42..be2f931 100644
> --- a/plugins/phonesim.c
> +++ b/plugins/phonesim.c
> @@ -46,6 +46,7 @@
>  #include <ofono/call-settings.h>
>  #include <ofono/call-volume.h>
>  #include <ofono/cbs.h>
> +#include <ofono/ctm.h>
>  #include <ofono/devinfo.h>
>  #include <ofono/message-waiting.h>
>  #include <ofono/netreg.h>
> @@ -64,6 +65,7 @@
>  #include <drivers/atmodem/atutil.h>
>  
>  static const char *none_prefix[] = { NULL };
> +static const char *ptty_prefix[] = { "+PTTY:", NULL };
>  static int next_iface = 0;
>  
>  struct phonesim_data {
> @@ -190,12 +192,137 @@ static void phonesim_context_remove(struct 
> ofono_gprs_context *gc)
>       g_free(gcd);
>  }
>  
> +static void phonesim_ctm_support_cb(gboolean ok, GAtResult *result,
> +                                     gpointer user_data)
> +{
> +     struct ofono_ctm *ctm = user_data;
> +
> +     if (!ok)
> +             return;

You might want to remove the atom here as well so it doesn't take up space.

> +
> +     ofono_ctm_register(ctm);
> +}
> +
> +static int phonesim_ctm_probe(struct ofono_ctm *ctm,
> +                             unsigned int vendor, void *data)
> +{
> +     GAtChat *chat = data;
> +
> +     ofono_ctm_set_data(ctm, chat);

You actually need to clone the chat here, see the other drivers for
details.  This is used to remove all pending commands from the chat when
the atom is removed.

> +
> +     g_at_chat_send(chat, "AT+PTTY=?", ptty_prefix, phonesim_ctm_support_cb,
> +                     ctm, NULL);
> +
> +     return 0;
> +}
> +
> +static void phonesim_ctm_remove(struct ofono_ctm *ctm)
> +{
> +     DBG("");
> +

You also need to unref the chat here

> +     ofono_ctm_set_data(ctm, NULL);
> +}
> +
> +static void ctm_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> +     struct cb_data *cbd = user_data;
> +     struct ofono_error error;
> +     GAtResultIter iter;
> +     ofono_ctm_query_cb_t cb = cbd->cb;
> +     int value;
> +
> +     decode_at_error(&error, g_at_result_final_response(result));
> +
> +     if (!ok) {
> +             cb(&error, -1, cbd->data);
> +             return;
> +     }
> +
> +     g_at_result_iter_init(&iter, result);
> +
> +     if (g_at_result_iter_next(&iter, "+PTTY:") == FALSE)
> +             goto error;
> +
> +     if (g_at_result_iter_next_number(&iter, &value) == FALSE)
> +             goto error;
> +
> +     cb(&error, value, cbd->data);
> +
> +     return;
> +
> +error:
> +
> +     CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
> +}
> +
> +static void phonesim_ctm_query(struct ofono_ctm *ctm,
> +                             ofono_ctm_query_cb_t cb, void *data)
> +{
> +     GAtChat *chat = ofono_ctm_get_data(ctm);
> +     struct cb_data *cbd = cb_data_new(cb, data);
> +
> +     DBG("");
> +
> +     if (!cbd)
> +             goto error;
> +
> +     if (g_at_chat_send(chat, "AT+PTTY?", ptty_prefix,
> +                             ctm_query_cb, cbd, g_free) > 0)
> +             return;
> +
> +error:
> +     g_free(cbd);
> +
> +     CALLBACK_WITH_FAILURE(cb, 0, data);
> +}
> +
> +static void ctm_set_cb(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> +     struct cb_data *cbd = user_data;
> +     ofono_ctm_set_cb_t cb = cbd->cb;
> +     struct ofono_error error;
> +
> +     decode_at_error(&error, g_at_result_final_response(result));
> +     cb(&error, cbd->data);
> +}
> +
> +static void phonesim_ctm_set(struct ofono_ctm *ctm, ofono_bool_t enable,
> +                             ofono_ctm_set_cb_t cb, void *data)
> +{
> +     GAtChat *chat = ofono_ctm_get_data(ctm);
> +     struct cb_data *cbd = cb_data_new(cb, data);
> +     char buf[20];
> +
> +     DBG("");
> +
> +     if (!cbd)
> +             goto error;
> +
> +     snprintf(buf, sizeof(buf), "AT+PTTY=%d", enable);
> +
> +     if (g_at_chat_send(chat, buf, none_prefix,
> +                             ctm_set_cb, cbd, g_free) > 0)
> +             return;
> +
> +error:
> +     CALLBACK_WITH_FAILURE(cb, data);
> +     g_free(cbd);
> +}
> +
>  static struct ofono_gprs_context_driver context_driver = {
> +     .name                   = "phonesim",
> +     .probe                  = phonesim_context_probe,
> +     .remove                 = phonesim_context_remove,
> +     .activate_primary       = phonesim_activate_primary,
> +     .deactivate_primary     = phonesim_deactivate_primary,
> +};
> +
> +static struct ofono_ctm_driver ctm_driver = {
>       .name                   = "phonesim",
> -     .probe                  = phonesim_context_probe,
> -     .remove                 = phonesim_context_remove,
> -     .activate_primary       = phonesim_activate_primary,
> -     .deactivate_primary     = phonesim_deactivate_primary,
> +     .probe                  = phonesim_ctm_probe,
> +     .remove                 = phonesim_ctm_remove,
> +     .query_tty              = phonesim_ctm_query,
> +     .set_tty                = phonesim_ctm_set,
>  };
>  
>  static int phonesim_probe(struct ofono_modem *modem)
> @@ -465,6 +592,7 @@ static void phonesim_post_sim(struct ofono_modem *modem)
>  
>       DBG("%p", modem);
>  
> +     ofono_ctm_create(modem, 0, "phonesim", data->chat);
>       ofono_phonebook_create(modem, 0, "atmodem", data->chat);
>  
>       if (!data->calypso)
> @@ -630,6 +758,8 @@ static int phonesim_init(void)
>  
>       ofono_gprs_context_driver_register(&context_driver);
>  
> +     ofono_ctm_driver_register(&ctm_driver);
> +
>       parse_config(CONFIGDIR "/phonesim.conf");
>  
>       return 0;
> @@ -648,6 +778,8 @@ static void phonesim_exit(void)
>       g_slist_free(modem_list);
>       modem_list = NULL;
>  
> +     ofono_ctm_driver_unregister(&ctm_driver);
> +
>       ofono_gprs_context_driver_unregister(&context_driver);
>  
>       ofono_modem_driver_unregister(&phonesim_driver);

Otherwise looks good.  Can you also send a patch marking this task as done?

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

Reply via email to