Skip to content

Commit

Permalink
tapi: support send-ussd
Browse files Browse the repository at this point in the history
  • Loading branch information
xujianhang-xiaomi authored and huangcaihua-xm committed Dec 24, 2024
1 parent 4cf0d36 commit 9b6254a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 125 deletions.
145 changes: 35 additions & 110 deletions src/tapi_ss.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,97 +311,6 @@ static void enable_fdn_param_append(DBusMessageIter* iter, void* user_data)
dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &passwd);
}

static void fill_ss_cb_cf_response_info(DBusMessageIter* iter,
tapi_ss_initiate_info* info)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;

dbus_message_iter_recurse(iter, &entry);
dbus_message_iter_get_basic(&entry, &info->append_service);

dbus_message_iter_next(&entry);
dbus_message_iter_recurse(&entry, &value);
dbus_message_iter_get_basic(&value, &info->append_service_value);

dbus_message_iter_next(iter);
}
}

static void fill_ss_initiate_cb_or_cf_service(DBusMessageIter* iter,
tapi_ss_initiate_info* info)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
DBusMessageIter entry, value, dict;

dbus_message_iter_recurse(iter, &entry);
dbus_message_iter_get_basic(&entry, &info->ss_service_operation);

dbus_message_iter_next(&entry);
dbus_message_iter_recurse(&entry, &value);
dbus_message_iter_get_basic(&value, &info->service_operation_requested);

dbus_message_iter_next(&value);
dbus_message_iter_recurse(&value, &dict);

fill_ss_cb_cf_response_info(&dict, info);

dbus_message_iter_next(iter);
}
}

static void fill_ss_initiate_cw_append_service(DBusMessageIter* iter,
tapi_ss_initiate_info* info)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;

dbus_message_iter_recurse(iter, &entry);
dbus_message_iter_get_basic(&entry, &info->append_service);

dbus_message_iter_next(&entry);
dbus_message_iter_recurse(&entry, &value);
dbus_message_iter_get_basic(&value, &info->append_service_value);

dbus_message_iter_next(iter);
}
}

static void fill_ss_initiate_cw_service(DBusMessageIter* iter,
tapi_ss_initiate_info* info)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
DBusMessageIter entry, value;

dbus_message_iter_recurse(iter, &entry);
dbus_message_iter_get_basic(&entry, &info->ss_service_operation);

dbus_message_iter_next(&entry);
dbus_message_iter_recurse(&entry, &value);

fill_ss_initiate_cw_append_service(&value, info);

dbus_message_iter_next(iter);
}
}

static void fill_ss_initiate_cs_service(DBusMessageIter* iter,
tapi_ss_initiate_info* info)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
DBusMessageIter entry, value;

dbus_message_iter_recurse(iter, &entry);
dbus_message_iter_get_basic(&entry, &info->ss_service_operation);

dbus_message_iter_next(&entry);
dbus_message_iter_recurse(&entry, &value);
dbus_message_iter_get_basic(&value, &info->call_setting_status);

dbus_message_iter_next(iter);
}
}

static void method_call_complete(DBusMessage* message, void* user_data)
{
tapi_async_handler* handler = user_data;
Expand Down Expand Up @@ -534,7 +443,8 @@ static void ss_initiate_complete(DBusMessage* message, void* user_data)
tapi_async_handler* handler;
tapi_async_result* ar;
tapi_async_function cb;
DBusMessageIter iter, value, var;
const char* name;
DBusMessageIter iter, var;
DBusError err;

handler = user_data;
Expand Down Expand Up @@ -576,25 +486,35 @@ static void ss_initiate_complete(DBusMessage* message, void* user_data)
goto done;
}

dbus_message_iter_recurse(&iter, &value);
dbus_message_iter_get_basic(&value, &info->ss_service_type);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
tapi_log_error("message iter type is not string in %s", __func__);
ar->status = ERROR;
goto done;
}

dbus_message_iter_next(&value);
dbus_message_iter_recurse(&value, &var);
dbus_message_iter_get_basic(&iter, &name);
dbus_message_iter_next(&iter);

if (dbus_message_iter_get_arg_type(&var) == DBUS_TYPE_VARIANT) {
if (strcmp(info->ss_service_type, "CallBarring") == 0
|| strcmp(info->ss_service_type, "CallForwarding") == 0) {
fill_ss_initiate_cb_or_cf_service(&var, info);
} else if (strcmp(info->ss_service_type, "CallWaiting") == 0) {
fill_ss_initiate_cw_service(&var, info);
} else if (strcmp(info->ss_service_type, "USSD") == 0) {
dbus_message_iter_get_basic(&var, &info->ussd_response);
} else {
fill_ss_initiate_cs_service(&var, info);
}
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
tapi_log_error("message iter type is not variant in %s", __func__);
ar->status = ERROR;
goto done;
}

dbus_message_iter_recurse(&iter, &var);
if (strcmp(name, "USSD")) {
tapi_log_error("reponse is not ussd str in %s", __func__);
ar->status = ERROR;
goto done;
}

if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING) {
tapi_log_error("get ussd str failed in %s", __func__);
ar->status = ERROR;
goto done;
}

dbus_message_iter_get_basic(&var, &info->ussd_response);
ar->data = info;
ar->status = OK;

Expand All @@ -606,7 +526,7 @@ static void ss_initiate_complete(DBusMessage* message, void* user_data)

static void ss_send_ussd_cb(DBusMessage* message, void* user_data)
{
DBusMessageIter iter, value;
DBusMessageIter iter;
tapi_async_handler* handler;
tapi_async_result* ar;
tapi_async_function cb;
Expand Down Expand Up @@ -645,8 +565,13 @@ static void ss_send_ussd_cb(DBusMessage* message, void* user_data)
goto done;
}

dbus_message_iter_recurse(&iter, &value);
dbus_message_iter_get_basic(&value, &response);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
tapi_log_error("message iter type is not string in %s", __func__);
ar->status = ERROR;
goto done;
}

dbus_message_iter_get_basic(&iter, &response);

ar->data = response;
ar->status = OK;
Expand Down
16 changes: 1 addition & 15 deletions tools/telephony_tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -577,21 +577,7 @@ static void ss_event_response(tapi_async_result* result)
break;
case EVENT_INITIATE_SERVICE_DONE:
info = (tapi_ss_initiate_info*)result->data;
if (strcmp(info->ss_service_type, "CallBarring") == 0
|| strcmp(info->ss_service_type, "CallForwarding") == 0) {
syslog(LOG_DEBUG, "service type : %s (%s, %s, %s, %s) \n", info->ss_service_type,
info->ss_service_operation, info->service_operation_requested,
info->append_service, info->append_service_value);
} else if (strcmp(info->ss_service_type, "CallWaiting") == 0) {
syslog(LOG_DEBUG, "service type : %s (%s, %s, %s) \n", info->ss_service_type,
info->ss_service_operation, info->append_service, info->append_service_value);
} else if (strcmp(info->ss_service_type, "USSD") == 0) {
syslog(LOG_DEBUG, "service type : %s (%s) \n",
info->ss_service_type, info->ussd_response);
} else {
syslog(LOG_DEBUG, "service type : %s (%s, %s) \n", info->ss_service_type,
info->ss_service_operation, info->call_setting_status);
}
syslog(LOG_DEBUG, "USSD response: %s", info->ussd_response);
break;
case EVENT_QUERY_FDN_DONE:
syslog(LOG_DEBUG, "fdn enabled or disabled : %d \n", param);
Expand Down

0 comments on commit 9b6254a

Please sign in to comment.