Refactor: Move code to avoid forward declaration

This commit is contained in:
Denis Kenzior 2009-10-28 14:23:51 -05:00
parent 466d70797f
commit efd4f4b361
1 changed files with 170 additions and 171 deletions

View File

@ -74,7 +74,6 @@ static const char *default_en_list_no_sim[] = { "119", "118", "999", "110",
"08", "000", NULL };
static void generic_callback(const struct ofono_error *error, void *data);
static void dial_callback(const struct ofono_error *error, void *data);
static void multirelease_callback(const struct ofono_error *err, void *data);
static void multiparty_create_callback(const struct ofono_error *error,
void *data);
@ -672,6 +671,72 @@ static gboolean voicecalls_have_waiting(struct ofono_voicecall *vc)
return FALSE;
}
static gboolean real_emit_call_list_changed(void *data)
{
struct ofono_voicecall *vc = data;
DBusConnection *conn = ofono_dbus_get_connection();
const char *path = __ofono_atom_get_path(vc->atom);
char **objpath_list;
voicecalls_path_list(vc, vc->call_list, &objpath_list);
ofono_dbus_signal_array_property_changed(conn, path,
VOICECALL_MANAGER_INTERFACE,
"Calls",
DBUS_TYPE_OBJECT_PATH,
&objpath_list);
g_strfreev(objpath_list);
vc->emit_calls_source = 0;
return FALSE;
}
static void emit_call_list_changed(struct ofono_voicecall *vc)
{
#ifdef DELAY_EMIT
if (vc->emit_calls_source == 0)
vc->emit_calls_source =
g_timeout_add(0, real_emit_call_list_changed, vc);
#else
real_emit_call_list_changed(vc);
#endif
}
static gboolean real_emit_multiparty_call_list_changed(void *data)
{
struct ofono_voicecall *vc = data;
DBusConnection *conn = ofono_dbus_get_connection();
const char *path = __ofono_atom_get_path(vc->atom);
char **objpath_list;
voicecalls_path_list(vc, vc->multiparty_list, &objpath_list);
ofono_dbus_signal_array_property_changed(conn, path,
VOICECALL_MANAGER_INTERFACE, "MultipartyCalls",
DBUS_TYPE_OBJECT_PATH,
&objpath_list);
g_strfreev(objpath_list);
vc->emit_multi_source = 0;
return FALSE;
}
static void emit_multiparty_call_list_changed(struct ofono_voicecall *vc)
{
#ifdef DELAY_EMIT
if (vc->emit_multi_source == 0)
vc->emit_multi_source = g_timeout_add(0,
real_emit_multiparty_call_list_changed, vc);
}
#else
real_emit_multiparty_call_list_changed(vc);
#endif
}
static void voicecalls_release_queue(struct ofono_voicecall *vc, GSList *calls)
{
GSList *l;
@ -766,6 +831,110 @@ static ofono_bool_t clir_string_to_clir(const char *clirstr,
return FALSE;
}
static struct ofono_call *synthesize_outgoing_call(struct ofono_voicecall *vc,
DBusMessage *msg)
{
struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
const char *number;
struct ofono_call *call;
call = g_try_new0(struct ofono_call, 1);
if (!call)
return call;
call->id = __ofono_modem_alloc_callid(modem);
if (call->id == 0) {
ofono_error("Failed to alloc callid, too many calls");
g_free(call);
return NULL;
}
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &number,
DBUS_TYPE_INVALID) == FALSE)
number = "";
else
string_to_phone_number(number, &call->phone_number);
call->direction = CALL_DIRECTION_MOBILE_ORIGINATED;
call->status = CALL_STATUS_DIALING;
call->clip_validity = CLIP_VALIDITY_VALID;
return call;
}
static void dial_callback(const struct ofono_error *error, void *data)
{
struct ofono_voicecall *vc = data;
DBusMessage *reply;
GSList *l;
struct ofono_call *call;
const char *path;
gboolean need_to_emit = FALSE;
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
ofono_debug("Dial callback returned error: %s",
telephony_error_to_str(error));
reply = __ofono_error_failed(vc->pending);
__ofono_dbus_pending_reply(&vc->pending, reply);
return;
}
/* Two things can happen, the call notification arrived before dial
* callback or dial callback was first. Handle here */
for (l = vc->call_list; l; l = l->next) {
struct voicecall *v = l->data;
if (v->call->status == CALL_STATUS_DIALING ||
v->call->status == CALL_STATUS_ALERTING ||
v->call->status == CALL_STATUS_ACTIVE)
break;
}
if (!l) {
struct voicecall *v;
call = synthesize_outgoing_call(vc, vc->pending);
if (!call) {
__ofono_dbus_pending_reply(&vc->pending,
__ofono_error_failed(vc->pending));
return;
}
v = voicecall_create(vc, call);
if (!v) {
__ofono_dbus_pending_reply(&vc->pending,
__ofono_error_failed(vc->pending));
return;
}
v->detect_time = time(NULL);
ofono_debug("Registering new call: %d", call->id);
voicecall_dbus_register(v);
vc->call_list = g_slist_insert_sorted(vc->call_list, v,
call_compare);
need_to_emit = TRUE;
} else {
struct voicecall *v = l->data;
call = v->call;
}
reply = dbus_message_new_method_return(vc->pending);
path = voicecall_build_path(vc, call);
dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
__ofono_dbus_pending_reply(&vc->pending, reply);
if (need_to_emit)
emit_call_list_changed(vc);
}
static DBusMessage *manager_dial(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@ -1159,72 +1328,6 @@ static GDBusSignalTable manager_signals[] = {
{ }
};
static gboolean real_emit_call_list_changed(void *data)
{
struct ofono_voicecall *vc = data;
DBusConnection *conn = ofono_dbus_get_connection();
const char *path = __ofono_atom_get_path(vc->atom);
char **objpath_list;
voicecalls_path_list(vc, vc->call_list, &objpath_list);
ofono_dbus_signal_array_property_changed(conn, path,
VOICECALL_MANAGER_INTERFACE,
"Calls",
DBUS_TYPE_OBJECT_PATH,
&objpath_list);
g_strfreev(objpath_list);
vc->emit_calls_source = 0;
return FALSE;
}
static void emit_call_list_changed(struct ofono_voicecall *vc)
{
#ifdef DELAY_EMIT
if (vc->emit_calls_source == 0)
vc->emit_calls_source =
g_timeout_add(0, real_emit_call_list_changed, vc);
#else
real_emit_call_list_changed(vc);
#endif
}
static gboolean real_emit_multiparty_call_list_changed(void *data)
{
struct ofono_voicecall *vc = data;
DBusConnection *conn = ofono_dbus_get_connection();
const char *path = __ofono_atom_get_path(vc->atom);
char **objpath_list;
voicecalls_path_list(vc, vc->multiparty_list, &objpath_list);
ofono_dbus_signal_array_property_changed(conn, path,
VOICECALL_MANAGER_INTERFACE, "MultipartyCalls",
DBUS_TYPE_OBJECT_PATH,
&objpath_list);
g_strfreev(objpath_list);
vc->emit_multi_source = 0;
return FALSE;
}
static void emit_multiparty_call_list_changed(struct ofono_voicecall *vc)
{
#ifdef DELAY_EMIT
if (vc->emit_multi_source == 0)
vc->emit_multi_source = g_timeout_add(0,
real_emit_multiparty_call_list_changed, vc);
}
#else
real_emit_multiparty_call_list_changed(vc);
#endif
}
void ofono_voicecall_disconnected(struct ofono_voicecall *vc, int id,
enum ofono_disconnect_reason reason,
const struct ofono_error *error)
@ -1390,110 +1493,6 @@ static void multirelease_callback(const struct ofono_error *error, void *data)
__ofono_dbus_pending_reply(&vc->pending, reply);
}
static struct ofono_call *synthesize_outgoing_call(struct ofono_voicecall *vc,
DBusMessage *msg)
{
struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
const char *number;
struct ofono_call *call;
call = g_try_new0(struct ofono_call, 1);
if (!call)
return call;
call->id = __ofono_modem_alloc_callid(modem);
if (call->id == 0) {
ofono_error("Failed to alloc callid, too many calls");
g_free(call);
return NULL;
}
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &number,
DBUS_TYPE_INVALID) == FALSE)
number = "";
else
string_to_phone_number(number, &call->phone_number);
call->direction = CALL_DIRECTION_MOBILE_ORIGINATED;
call->status = CALL_STATUS_DIALING;
call->clip_validity = CLIP_VALIDITY_VALID;
return call;
}
static void dial_callback(const struct ofono_error *error, void *data)
{
struct ofono_voicecall *vc = data;
DBusMessage *reply;
GSList *l;
struct ofono_call *call;
const char *path;
gboolean need_to_emit = FALSE;
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
ofono_debug("Dial callback returned error: %s",
telephony_error_to_str(error));
reply = __ofono_error_failed(vc->pending);
__ofono_dbus_pending_reply(&vc->pending, reply);
return;
}
/* Two things can happen, the call notification arrived before dial
* callback or dial callback was first. Handle here */
for (l = vc->call_list; l; l = l->next) {
struct voicecall *v = l->data;
if (v->call->status == CALL_STATUS_DIALING ||
v->call->status == CALL_STATUS_ALERTING ||
v->call->status == CALL_STATUS_ACTIVE)
break;
}
if (!l) {
struct voicecall *v;
call = synthesize_outgoing_call(vc, vc->pending);
if (!call) {
__ofono_dbus_pending_reply(&vc->pending,
__ofono_error_failed(vc->pending));
return;
}
v = voicecall_create(vc, call);
if (!v) {
__ofono_dbus_pending_reply(&vc->pending,
__ofono_error_failed(vc->pending));
return;
}
v->detect_time = time(NULL);
ofono_debug("Registering new call: %d", call->id);
voicecall_dbus_register(v);
vc->call_list = g_slist_insert_sorted(vc->call_list, v,
call_compare);
need_to_emit = TRUE;
} else {
struct voicecall *v = l->data;
call = v->call;
}
reply = dbus_message_new_method_return(vc->pending);
path = voicecall_build_path(vc, call);
dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
__ofono_dbus_pending_reply(&vc->pending, reply);
if (need_to_emit)
emit_call_list_changed(vc);
}
static void multiparty_callback_common(struct ofono_voicecall *vc,
DBusMessage *reply)
{