static gboolean fire_ar_cb_async_and_free(gpointer data) { UPnPMappingAddRemove *ar = data; if (ar) { if (ar->cb) ar->cb(ar->success, ar->cb_data); g_free(ar); } return FALSE; }
static void do_port_mapping_cb(gboolean has_control_mapping, gpointer data) { UPnPMappingAddRemove *ar = data; if (has_control_mapping) { gchar action_name[25]; gchar *action_params; if(ar->add) { const gchar *internal_ip; /* get the internal IP */ if(!(internal_ip = purple_upnp_get_internal_ip())) { purple_debug_error("upnp", "purple_upnp_set_port_mapping(): couldn't get local ip\n"); /* UGLY */ if (ar->cb) ar->cb(FALSE, ar->cb_data); g_free(ar); return; } strncpy(action_name, "AddPortMapping", sizeof(action_name)); action_params = g_strdup_printf( ADD_PORT_MAPPING_PARAMS, ar->portmap, ar->protocol, ar->portmap, internal_ip); } else { strncpy(action_name, "DeletePortMapping", sizeof(action_name)); action_params = g_strdup_printf( DELETE_PORT_MAPPING_PARAMS, ar->portmap, ar->protocol); } ar->gfud = purple_upnp_generate_action_message_and_send(action_name, action_params, done_port_mapping_cb, ar); g_free(action_params); return; } if (ar->cb) ar->cb(FALSE, ar->cb_data); g_free(ar); }
static void done_port_mapping_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *httpResponse, gsize len, const gchar *error_message) { UPnPMappingAddRemove *ar = user_data; gboolean success = TRUE; /* determine if port mapping was a success */ if ((error_message != NULL) || (httpResponse == NULL) || (g_strstr_len(httpResponse, len, HTTP_OK) == NULL)) { purple_debug_error("upnp", "purple_upnp_set_port_mapping(): Failed HTTP_OK\n%s\n", httpResponse ? httpResponse : "(null)"); success = FALSE; } else purple_debug_info("upnp", "Successfully completed port mapping operation\n"); if (ar->cb) ar->cb(success, ar->cb_data); g_free(ar); }