GSMA api was added 28/11828/2
authorSangSoo Lee <constant.lee@samsung.com>
Wed, 6 Nov 2013 01:33:02 +0000 (10:33 +0900)
committerJi-hoon Jung <jh8801.jung@samsung.com>
Wed, 6 Nov 2013 04:57:17 +0000 (13:57 +0900)
Change-Id: I48ea6b3795a176129c134275c3c7d314affb6245
Signed-off-by: Jihoon Jung <jh8801.jung@samsung.com>
client/include/net_nfc_client_se.h
client/net_nfc_client_se.c
common/include/net_nfc_typedef.h
common/net_nfc.xml
daemon/net_nfc_server_se.c
daemon/net_nfc_server_util.c
daemon/net_nfc_server_util.h
daemon/net_nfc_server_vconf.h
packaging/nfc-manager.spec
tests/net_nfc_test_se.c

index ebd3a1de0c03034d5ee2a94f55a6c3136e18208c..d1285afe18d7397de09c550104730327af2f3f2e 100644 (file)
@@ -45,7 +45,10 @@ typedef void (*net_nfc_se_send_apdu_cb)(net_nfc_error_e result, data_s *data,
 
 typedef void (*net_nfc_client_se_event)(net_nfc_message_e event, void *user_data);
 
-typedef void (*net_nfc_client_se_transaction_event)(data_s *aid, data_s *param,
+typedef void (*net_nfc_client_se_transaction_event)(
+               net_nfc_se_type_e se_type,
+               data_s *aid,
+               data_s *param,
                void *user_data);
 
 typedef void (*net_nfc_client_se_ese_detected_event)(
@@ -112,7 +115,9 @@ void net_nfc_client_se_set_ese_detection_cb(
 void net_nfc_client_se_unset_ese_detection_cb(void);
 
 void net_nfc_client_se_set_transaction_event_cb(
-               net_nfc_client_se_transaction_event callback, void *user_data);
+               net_nfc_se_type_e se_type,
+               net_nfc_client_se_transaction_event callback,
+               void *user_data);
 
 void net_nfc_client_se_unset_transaction_event_cb(void);
 
index 8f92281a29fb506703e5581cd0fdca65b1e8632b..7a679dd32dffe79f9a2d41dea7fb4a143944e18c 100644 (file)
@@ -45,6 +45,7 @@ typedef struct _SeTransEventHandler SeTransEventHandler;
 
 struct _SeTransEventHandler
 {
+       net_nfc_se_type_e se_type;
        net_nfc_client_se_transaction_event se_transaction_event_cb;
        gpointer se_transaction_event_data;
 };
@@ -98,7 +99,11 @@ static void se_type_changed(GObject *source_object, gint arg_se_type)
 
 
 static void se_transaction_event(GObject *source_object,
-               gint arg_se_type, GVariant *arg_aid, GVariant *arg_param)
+               gint arg_se_type,
+               GVariant *arg_aid,
+               GVariant *arg_param,
+               gint fg_dispatch,
+               gint focus_app_pid)
 {
        data_s aid = { NULL, 0 };
        data_s param = { NULL, 0 };
@@ -108,16 +113,37 @@ static void se_transaction_event(GObject *source_object,
 
        RET_IF(NULL == se_transeventhandler.se_transaction_event_cb);
 
-       net_nfc_util_gdbus_variant_to_data_s(arg_aid, &aid);
-       net_nfc_util_gdbus_variant_to_data_s(arg_param, &param);
+       if (se_transeventhandler.se_type == arg_se_type)
+       {
+               pid_t mypid = getpid();
+               if(fg_dispatch == false ||
+                               (fg_dispatch == true && focus_app_pid == (getpgid(mypid))))
+               {
+                       net_nfc_util_gdbus_variant_to_data_s(arg_aid, &aid);
+                       net_nfc_util_gdbus_variant_to_data_s(arg_param, &param);
+
+                       callback = se_transeventhandler.se_transaction_event_cb;
+                       callback(arg_se_type, &aid, &param,
+                                       se_transeventhandler.se_transaction_event_data);
+
+                       net_nfc_util_free_data(&param);
+                       net_nfc_util_free_data(&aid);
+               }
+       }
+}
 
-       callback = se_transeventhandler.se_transaction_event_cb;
-       callback(&aid, &param, se_transeventhandler.se_transaction_event_data);
+static void se_card_emulation_mode_changed(GObject *source_object,
+               gint arg_se_type)
+{
+       net_nfc_client_se_event callback;
+       NFC_DBG(">>> SIGNAL arrived");
 
-       net_nfc_util_free_data(&param);
-       net_nfc_util_free_data(&aid);
-}
+       RET_IF(NULL == se_eventhandler.se_event_cb);
 
+       callback = se_eventhandler.se_event_cb;
+       callback((net_nfc_message_e)NET_NFC_MESSAGE_SE_CARD_EMULATION_CHANGED,
+                       se_eventhandler.se_event_data);
+}
 
 static void set_secure_element(GObject *source_object,
                GAsyncResult *res, gpointer user_data)
@@ -798,8 +824,11 @@ API void net_nfc_client_se_unset_ese_detection_cb(void)
 
 
 API void net_nfc_client_se_set_transaction_event_cb(
-               net_nfc_client_se_transaction_event callback, void *user_data)
+               net_nfc_se_type_e se_type,
+               net_nfc_client_se_transaction_event callback,
+               void *user_data)
 {
+       se_transeventhandler.se_type = se_type;
        se_transeventhandler.se_transaction_event_cb = callback;
        se_transeventhandler.se_transaction_event_data = user_data;
 }
@@ -807,7 +836,7 @@ API void net_nfc_client_se_set_transaction_event_cb(
 
 API void net_nfc_client_se_unset_transaction_event_cb(void)
 {
-       net_nfc_client_se_set_transaction_event_cb(NULL, NULL);
+       net_nfc_client_se_set_transaction_event_cb(NET_NFC_SE_TYPE_NONE, NULL, NULL);
 }
 
 
@@ -853,9 +882,13 @@ net_nfc_error_e net_nfc_client_se_init(void)
 
        g_signal_connect(se_proxy, "se-type-changed", G_CALLBACK(se_type_changed), NULL);
        g_signal_connect(se_proxy, "ese-detected", G_CALLBACK(se_ese_detected), NULL);
+
        g_signal_connect(se_proxy, "transaction-event",
                        G_CALLBACK(se_transaction_event), NULL);
 
+       g_signal_connect(se_proxy, "card-emulation-mode-changed",
+                       G_CALLBACK(se_card_emulation_mode_changed), NULL);
+
        return NET_NFC_OK;
 }
 
index a2a1c6c690bfa3c54dcfe63b32ba86ab71847185..1032360c020893474747f443ae587213a5e81a61 100644 (file)
@@ -188,15 +188,15 @@ typedef enum
        NET_NFC_MESSAGE_SE_FIELD_ON, /**< Type: Notify Event, indicates external reader field is on*/
        NET_NFC_MESSAGE_SE_FIELD_OFF, /**< Type: Notify Event, indicates external reader field is off*/
        NET_NFC_MESSAGE_SE_TYPE_CHANGED, /**< Type: Notify Event, indicates secure element type is changed*/
-
+       NET_NFC_MESSAGE_SE_CARD_EMULATION_CHANGED, /**< Type: Notify Event, indicates card emulation mode is changed*/
        NET_NFC_MESSAGE_CONNECTION_HANDOVER, /**< Type: Response Event. <br> The result of connection handover. If it has been completed successfully, this event will include the information of alternative carrier. */
 
        NET_NFC_MESSAGE_SET_SE,
        NET_NFC_MESSAGE_GET_SE,
        NET_NFC_MESSAGE_OPEN_INTERNAL_SE,
        NET_NFC_MESSAGE_CLOSE_INTERNAL_SE,
-       NET_NFC_MESSAGE_SEND_APDU_SE,
-       /*30*/  NET_NFC_MESSAGE_GET_ATR_SE,
+       /*30*/  NET_NFC_MESSAGE_SEND_APDU_SE,
+       NET_NFC_MESSAGE_GET_ATR_SE,
        NET_NFC_GET_SERVER_STATE,
 
        NET_NFC_MESSAGE_SIM_TEST,
index ca6f1ab971b3f7bcf268fea942aa8f19b7350ee6..bd2d85124d78bc39374cde7f985117df67708fac 100644 (file)
       <arg type="a(y)" name="response" direction="out" />
     </method>
 
+    <!--
+      EnableCardEmulation
+    -->
+    <method name="ChangeCardEmulationMode">
+      <arg type="i" name="mode" direction="in" />
+      <arg type="a(y)" name="privilege" direction="in" />
+      <arg type="i" name="result" direction="out" />
+    </method>
+
     <!--
       EseDetected
     -->
        <arg type="i" name="se_type" />
     </signal>
 
+    <!--
+      CardEmulationModeChanged
+    -->
+    <signal name="CardEmulationModeChanged">
+       <arg type="i" name="mode" />
+    </signal>
+
     <!--
       TransactionEvent
     -->
        <arg type="i" name="se_type" />
        <arg type="a(y)" name="aid" />
        <arg type="a(y)" name="param" />
+       <arg type="i" name="fg_dispatch" />
+               <arg type="i" name="focus_pgid" />
     </signal>
   </interface>
 
index 1dbf4e55fa8a2e1acb9634a317f285946ba3164a..3cf3918cb04a65ead9a1f4bd0cd7ddeda8aa3bf9 100644 (file)
@@ -40,6 +40,7 @@ typedef struct _nfc_se_setting_t
 {
        bool busy;
        uint8_t type;
+       uint8_t return_type;
        uint8_t mode;
 }
 net_nfc_server_se_setting_t;
@@ -106,6 +107,15 @@ struct _SeDataApdu
        GVariant *data;
 };
 
+typedef struct _ChangeCardEmulMode ChangeCardEmulMode;
+
+struct _ChangeCardEmulMode
+{
+       NetNfcGDbusSecureElement *object;
+       GDBusMethodInvocation *invocation;
+       gint mode;
+};
+
 static void se_close_secure_element_thread_func(gpointer user_data);
 
 static void se_get_atr_thread_func(gpointer user_data);
@@ -155,6 +165,11 @@ uint8_t net_nfc_server_se_get_se_type()
        return gdbus_se_setting.type;
 }
 
+uint8_t net_nfc_server_se_get_return_se_mode()
+{
+       return gdbus_se_setting.return_type;
+}
+
 uint8_t net_nfc_server_se_get_se_mode()
 {
        return gdbus_se_setting.mode;
@@ -162,6 +177,7 @@ uint8_t net_nfc_server_se_get_se_mode()
 
 static void net_nfc_server_se_set_se_type(uint8_t type)
 {
+       gdbus_se_setting.return_type = gdbus_se_setting.type;
        gdbus_se_setting.type = type;
 }
 
@@ -1186,6 +1202,100 @@ static gboolean se_handle_get(
        return result;
 }
 
+static void _se_change_card_emulation_mode_thread_func(gpointer user_data)
+{
+       ChangeCardEmulMode *data = (ChangeCardEmulMode *)user_data;
+       net_nfc_error_e result = NET_NFC_OK;
+       uint8_t current_mode, return_mode;
+       bool isChanged = false;
+
+       g_assert(data != NULL);
+       g_assert(data->object != NULL);
+       g_assert(data->invocation != NULL);
+
+       current_mode = net_nfc_server_se_get_se_mode();
+
+       if(data->mode == SECURE_ELEMENT_ACTIVE_STATE && current_mode == SECURE_ELEMENT_TYPE_INVALID)
+       {
+               return_mode = net_nfc_server_se_get_return_se_mode();
+               result = net_nfc_server_se_change_se(return_mode);
+               isChanged = true;
+       }
+       else if(data->mode == SECURE_ELEMENT_INACTIVE_STATE && current_mode != SECURE_ELEMENT_TYPE_INVALID)
+       {
+               result = net_nfc_server_se_disable_card_emulation();
+               isChanged = true;
+       }
+
+       net_nfc_gdbus_secure_element_complete_change_card_emulation_mode(data->object,
+                       data->invocation, result);
+
+       if(isChanged)
+       {
+               net_nfc_gdbus_secure_element_emit_card_emulation_mode_changed(data->object, data->mode);
+       }
+
+       g_object_unref(data->invocation);
+       g_object_unref(data->object);
+
+       g_free(data);
+}
+
+
+static gboolean se_handle_change_card_emulation_mode(
+               NetNfcGDbusSecureElement *object,
+               GDBusMethodInvocation *invocation,
+               gint arg_mode,
+               GVariant *smack_privilege)
+{
+       SeSetCardEmul *data;
+       gboolean result;
+
+       NFC_DBG(">>> REQUEST from [%s]",
+                       g_dbus_method_invocation_get_sender(invocation));
+
+       /* check privilege and update client context */
+       if (net_nfc_server_gdbus_check_privilege(invocation,
+                               smack_privilege,
+                               "nfc-manager",
+                               "w") == false) {
+               NFC_ERR("permission denied, and finished request");
+
+               return FALSE;
+       }
+
+       data = g_try_new0(ChangeCardEmulMode, 1);
+       if (data == NULL)
+       {
+               NFC_ERR("Memory allocation failed");
+               g_dbus_method_invocation_return_dbus_error(invocation,
+                               "org.tizen.NetNfcService.AllocationError",
+                               "Can not allocate memory");
+
+               return FALSE;
+       }
+
+       data->object = g_object_ref(object);
+       data->invocation = g_object_ref(invocation);
+       data->mode = arg_mode;
+
+       result = net_nfc_server_controller_async_queue_push(
+                       _se_change_card_emulation_mode_thread_func, data);
+       if (result == FALSE)
+       {
+               g_dbus_method_invocation_return_dbus_error(invocation,
+                               "org.tizen.NetNfcService.Se.ThreadError",
+                               "can not push to controller thread");
+
+               g_object_unref(data->object);
+               g_object_unref(data->invocation);
+
+               g_free(data);
+       }
+
+       return result;
+}
+
 gboolean net_nfc_server_se_init(GDBusConnection *connection)
 {
        GError *error = NULL;
@@ -1234,6 +1344,11 @@ gboolean net_nfc_server_se_init(GDBusConnection *connection)
                        G_CALLBACK(se_handle_send_apdu),
                        NULL);
 
+       g_signal_connect(se_skeleton,
+                       "handle-change-card-emulation-mode",
+                       G_CALLBACK(se_handle_change_card_emulation_mode),
+                       NULL);
+
        result = g_dbus_interface_skeleton_export(
                        G_DBUS_INTERFACE_SKELETON(se_skeleton),
                        connection,
@@ -1308,14 +1423,36 @@ static void se_detected_thread_func(gpointer user_data)
 static void se_transcation_thread_func(gpointer user_data)
 {
        ServerSeData *detail = (ServerSeData *)user_data;
+       bool fg_dispatch;
+       pid_t focus_app_pid;
 
        g_assert(user_data != NULL);
 
        if (detail->event == NET_NFC_MESSAGE_SE_START_TRANSACTION)
        {
+               GVariant *aid = NULL;
+               GVariant *param = NULL;
+               uint8_t se_type;
+
                NFC_DBG("launch se app");
 
+               aid = net_nfc_util_gdbus_data_to_variant(&(detail->aid));
+               param = net_nfc_util_gdbus_data_to_variant(&(detail->param));
+               se_type = net_nfc_server_se_get_se_type();
+               focus_app_pid = net_nfc_app_util_get_focus_app_pid();
+               fg_dispatch = net_nfc_app_util_check_launch_state();
+
+               /* TODO : check access control */
+               net_nfc_gdbus_secure_element_emit_transaction_event (
+                               se_skeleton,
+                               se_type,
+                               aid,
+                               param,
+                               fg_dispatch,
+                               focus_app_pid);
+
                net_nfc_app_util_launch_se_transaction_app(
+                               se_type,
                                detail->aid.buffer,
                                detail->aid.length,
                                detail->param.buffer,
index f40f96f8e0968fabab43825595f2af90b155fd12..f597928df8f8cf71ec9c1147edddd0a95fa2d35a 100644 (file)
@@ -787,7 +787,8 @@ void _string_to_binary(const char *input, uint8_t *output, uint32_t *length)
        *length = current / 2;
 }
 
-int net_nfc_app_util_launch_se_transaction_app(uint8_t *aid, uint32_t aid_len, uint8_t *param, uint32_t param_len)
+int net_nfc_app_util_launch_se_transaction_app(net_nfc_secure_element_type_e se_type,
+               uint8_t *aid, uint32_t aid_len, uint8_t *param, uint32_t param_len)
 {
        bundle *bd = NULL;
 
@@ -803,7 +804,21 @@ int net_nfc_app_util_launch_se_transaction_app(uint8_t *aid, uint32_t aid_len, u
                char aid_string[1024] = { 0, };
 
                _binary_to_string(aid, aid_len, temp_string, sizeof(temp_string));
-               snprintf(aid_string, sizeof(aid_string), "nfc://secure/aid/%s", temp_string);
+
+               switch(se_type)
+               {
+               case SECURE_ELEMENT_TYPE_UICC:
+                       snprintf(aid_string, sizeof(aid_string), "nfc://secure/SIM1/aid/%s", temp_string);
+                       break;
+
+               case SECURE_ELEMENT_TYPE_ESE:
+                       snprintf(aid_string, sizeof(aid_string), "nfc://secure/eSE/aid/%s", temp_string);
+                       break;
+               default:
+                       snprintf(aid_string, sizeof(aid_string), "nfc://secure/aid/%s", temp_string);
+                       break;
+               }
+
                NFC_DBG("aid_string : %s", aid_string);
                appsvc_set_uri(bd, aid_string);
        }
@@ -892,7 +907,7 @@ int net_nfc_app_util_decode_base64(const char *buffer, uint32_t buf_len, uint8_t
        return ret;
 }
 
-static pid_t _net_nfc_app_util_get_focus_app_pid()
+pid_t net_nfc_app_util_get_focus_app_pid()
 {
        Ecore_X_Window focus;
        pid_t pid;
@@ -912,7 +927,7 @@ bool net_nfc_app_util_check_launch_state()
        net_nfc_launch_popup_state_e popup_state;
        bool result = false;
 
-       focus_app_pid = _net_nfc_app_util_get_focus_app_pid();
+       focus_app_pid = net_nfc_app_util_get_focus_app_pid();
 
        popup_state = net_nfc_server_gdbus_get_client_popup_state(focus_app_pid);
 
index 1b216e60dd0723ac02a081e2f2df6bfccb6e04bd..3823c6c7fccf1252c63927dc20d0448a14c57f19 100644 (file)
@@ -36,9 +36,11 @@ net_nfc_error_e net_nfc_app_util_process_ndef(data_s *data);
 void net_nfc_app_util_aul_launch_app(char* package_name, bundle* kb);
 void net_nfc_app_util_clean_storage(char* src_path);
 int net_nfc_app_util_appsvc_launch(const char *operation, const char *uri, const char *mime, const char *data);
-int net_nfc_app_util_launch_se_transaction_app(uint8_t *aid, uint32_t aid_len, uint8_t *param, uint32_t param_len);
+int net_nfc_app_util_launch_se_transaction_app(net_nfc_secure_element_type_e se_type,
+               uint8_t *aid, uint32_t aid_len, uint8_t *param, uint32_t param_len);
 int net_nfc_app_util_encode_base64(uint8_t *buffer, uint32_t buf_len, char *result, uint32_t max_result);
 int net_nfc_app_util_decode_base64(const char *buffer, uint32_t buf_len, uint8_t *result, uint32_t *res_len);
 bool net_nfc_app_util_check_launch_state();
+pid_t net_nfc_app_util_get_focus_app_pid();
 
 #endif //__NET_NFC_SERVER_UTIL_H__
index 22e8d4b67922b21edfed7499bbb81d0ac33568be..b7e25ee32bc35014bfd3121811b5df9cb732b8cd 100644 (file)
@@ -20,4 +20,4 @@ void net_nfc_server_vconf_init(void);
 
 void net_nfc_server_vconf_deinit(void);
 
-#endif //__NET_NFC_SERVER_VCONF_H__
\ No newline at end of file
+#endif //__NET_NFC_SERVER_VCONF_H__
index e8bc7fe7fce1a8839840c5ba67e4ee7a5d12eee2..c6898cf15c2e128c228e3474fb697eb073d38557 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       nfc-manager
 Summary:    NFC framework manager
-Version:       0.1.4
+Version:       0.1.5
 Release:    0
 Group:      Network & Connectivity/NFC
 License:    Flora
index 55d93c5b403cfb440fd6b072a9e5c8dabbb08080..a63a2f9067a24ee0346e061068f191e9338338b9 100644 (file)
@@ -269,7 +269,8 @@ void net_nfc_test_se_unset_ese_detection_cb(gpointer data, gpointer user_data)
 
 void net_nfc_test_se_set_transaction_event_cb(gpointer data, gpointer user_data)
 {
-       net_nfc_client_se_set_transaction_event_cb(se_set_transaction_cb, user_data);
+       net_nfc_client_se_set_transaction_event_cb(NET_NFC_SE_TYPE_UICC, se_set_transaction_cb,
+                               user_data);
 }
 
 void net_nfc_test_se_unset_transaction_event_cb(gpointer data,