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)(
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);
struct _SeTransEventHandler
{
+ net_nfc_se_type_e se_type;
net_nfc_client_se_transaction_event se_transaction_event_cb;
gpointer se_transaction_event_data;
};
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 };
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, ¶m);
+ 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, ¶m);
+
+ callback = se_transeventhandler.se_transaction_event_cb;
+ callback(arg_se_type, &aid, ¶m,
+ se_transeventhandler.se_transaction_event_data);
+
+ net_nfc_util_free_data(¶m);
+ net_nfc_util_free_data(&aid);
+ }
+ }
+}
- callback = se_transeventhandler.se_transaction_event_cb;
- callback(&aid, ¶m, 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(¶m);
- 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)
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;
}
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);
}
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;
}
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,
<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>
{
bool busy;
uint8_t type;
+ uint8_t return_type;
uint8_t mode;
}
net_nfc_server_se_setting_t;
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);
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;
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;
}
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;
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,
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,
*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;
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);
}
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;
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);
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__
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__
Name: nfc-manager
Summary: NFC framework manager
-Version: 0.1.4
+Version: 0.1.5
Release: 0
Group: Network & Connectivity/NFC
License: Flora
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,