00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00026 #include <gtk/gtk.h>
00027 #include <glib.h>
00028 #include <string.h>
00029
00030 #include "connectionMgrLog.h"
00031 #include "scanThread.h"
00032 #include "connectScan.h"
00033 #include "background.h"
00034 #include "erbusy.h"
00035
00036 static void connect_scan_ctxt_destory_results(scanContext_t* ctxt);
00037 static void connect_scan_ctxt_empty_results(scanContext_t* ctxt);
00038
00039 static gboolean connect_scan_start(gpointer data);
00040 static void connect_scan_done (scanContext_t* ctxt);
00041
00042 static void wireless_scan_start(scanContext_t* ctxt);
00043
00044
00045 static void on_scan_status_changed (GObject *object,
00046 GParamSpec *arg,
00047 gpointer data);
00048
00049 scanContext_t* connect_scan_ctxt_new(void)
00050 {
00051 scanContext_t* ctxt;
00052 GtkWidget* scanStatus;
00053
00054 ctxt = g_new0(scanContext_t, 1);
00055 g_assert(ctxt != NULL);
00056
00057
00058 ctxt->scanParms = g_new0(scan_thread_parms, 1);
00059 g_assert(ctxt->scanParms != NULL);
00060
00061 scanStatus = gtk_label_new("scan-idle");
00062 g_signal_connect(scanStatus, "notify",
00063 G_CALLBACK(on_scan_status_changed), ctxt);
00064 ctxt->scanParms->scanStatus = scanStatus;
00065
00066
00067 connect_scan_ctxt_set_mode(ctxt, undefScanMode_e);
00068 connect_scan_ctxt_set_network_type(ctxt, connection_undefined_t);
00069 connect_scan_ctxt_set_done_callbacks(ctxt, NULL, NULL);
00070
00071 connect_scan_ctxt_set_ssidlist(ctxt, "");
00072 connect_scan_ctxt_set_max_networks(ctxt, MAX_PROFILES_PER_PAGE);
00073
00074
00075
00076 return ctxt;
00077 }
00078
00079 void connect_scan_ctxt_set_mode(scanContext_t* ctxt, scanMode_t mode)
00080 {
00081 if (ctxt && (mode >= 0) && (mode < undefScanMode_e))
00082 {
00083 ctxt->mode = mode;
00084 }
00085 }
00086
00087 void connect_scan_ctxt_set_network_type(scanContext_t* ctxt,
00088 connection_t networkType)
00089 {
00090 if (ctxt && (networkType >= 0) && (networkType < connection_undefined_t))
00091 {
00092 ctxt->networkType = networkType;
00093 }
00094 }
00095
00096 void connect_scan_ctxt_set_done_callbacks(scanContext_t* ctxt,
00097 scan_done_t* scan_done,
00098 scan_done_after_t* scan_done_after)
00099 {
00100 if (ctxt)
00101 {
00102 ctxt->scan_done = scan_done;
00103 ctxt->scan_done_after = scan_done_after;
00104 }
00105 }
00106
00107 void connect_scan_ctxt_set_ssidlist(scanContext_t* ctxt, gchar* ssidList)
00108 {
00109 if (ctxt && ctxt->scanParms && ssidList)
00110 {
00111 if (ctxt->scanParms->ssid)
00112 {
00113 g_free(ctxt->scanParms->ssid);
00114 }
00115 ctxt->scanParms->ssid = g_strdup(ssidList);
00116 }
00117 }
00118
00119 void connect_scan_ctxt_set_max_networks(scanContext_t* ctxt,
00120 int maxNetworks)
00121 {
00122 network_spec_t *networks, *pNetwork;
00123 int i;
00124
00125 if (ctxt && ctxt->scanParms && (maxNetworks > 0))
00126 {
00127
00128 connect_scan_ctxt_destory_results(ctxt);
00129
00130
00131 networks = g_new0(network_spec_t, maxNetworks);
00132 g_assert(networks != NULL);
00133 for (i = 0; i < maxNetworks; i++)
00134 {
00135 pNetwork = &networks[i];
00136 pNetwork->encryption = encr_none_t;
00137 }
00138 ctxt->scanParms->networks = networks;
00139 ctxt->scanParms->networks_num = maxNetworks;
00140 }
00141 }
00142
00143 void connect_scan_ctxt_destory(scanContext_t* ctxt)
00144 {
00145 if (ctxt)
00146 {
00147 if (ctxt->scanParms)
00148 {
00149
00150
00151
00152
00153
00154
00155
00156 if (ctxt->scanParms->ssid)
00157 {
00158 g_free(ctxt->scanParms->ssid);
00159 }
00160 }
00161
00162 connect_scan_ctxt_destory_results(ctxt);
00163
00164 g_free(ctxt->scanParms);
00165 g_free(ctxt);
00166 }
00167 }
00168
00169 static void connect_scan_ctxt_destory_results(scanContext_t* ctxt)
00170 {
00171 network_spec_t* networks, *pNetwork;
00172 int i, n;
00173
00174 if (ctxt && ctxt->scanParms)
00175 {
00176 if (ctxt->scanParms->networks)
00177 {
00178 networks = ctxt->scanParms->networks;
00179 n = ctxt->scanParms->networks_num;
00180
00181 for (i = 0; i < n; i++)
00182 {
00183 pNetwork = &networks[i];
00184 if (pNetwork->ssid)
00185 {
00186 g_free(pNetwork->ssid);
00187 }
00188 }
00189 g_free(ctxt->scanParms->networks);
00190 ctxt->scanParms->networks = NULL;
00191 ctxt->scanParms->networks_num = 0;
00192 ctxt->scanParms->networks_found = 0;
00193 }
00194 }
00195 }
00196
00197 static void connect_scan_ctxt_empty_results(scanContext_t* ctxt)
00198 {
00199 network_spec_t* networks, *pNetwork;
00200 int i, n;
00201
00202 if (ctxt && ctxt->scanParms)
00203 {
00204 if (ctxt->scanParms->networks)
00205 {
00206 networks = ctxt->scanParms->networks;
00207 n = ctxt->scanParms->networks_num;
00208
00209 for (i = 0; i < n; i++)
00210 {
00211 pNetwork = &networks[i];
00212 if (pNetwork->ssid)
00213 {
00214 g_free(pNetwork->ssid);
00215 pNetwork->ssid = NULL;
00216 }
00217 pNetwork->encryption = encr_none_t;
00218 pNetwork->quality = 0;
00219 }
00220
00221 ctxt->scanParms->networks_found = 0;
00222 }
00223 }
00224 }
00225
00226 void connect_scan(scanContext_t* ctxt, gboolean delay)
00227 {
00228 scanMode_t mode;
00229 connection_t type;
00230
00231 CN_LOGPRINTF("entry");
00232
00233 g_return_if_fail(ctxt != NULL);
00234
00235 mode = ctxt->mode;
00236 type = ctxt->networkType;
00237 if ((mode < 0) || (mode >= undefScanMode_e)
00238 || (type < 0) || (type >= connection_undefined_t))
00239 {
00240 CN_ERRORPRINTF("Invalid arguments: mode[%d] type[%d]", mode, type);
00241 return;
00242 }
00243
00244 if (ctxt->scanNetworks)
00245 {
00246 CN_WARNPRINTF("Please wait while scanning");
00247 return;
00248 }
00249
00250 if (delay)
00251 {
00252 if (ctxt->scanTimeoutId > 0)
00253 {
00254 CN_LOGPRINTF("remove the old timeout function for scaning");
00255 g_source_remove(ctxt->scanTimeoutId);
00256 ctxt->scanTimeoutId = 0;
00257 }
00258
00259
00260 if (ctxt->networkType == wireless_t)
00261 {
00262 ctxt->scanTimeoutId = g_timeout_add(200,
00263 connect_scan_start,
00264 (gpointer)ctxt);
00265 }
00266 else
00267 {
00268 ctxt->scanTimeoutId = g_timeout_add(5000,
00269 connect_scan_start,
00270 (gpointer)ctxt);
00271 }
00272 }
00273 else
00274 {
00275 connect_scan_start((gpointer)ctxt);
00276 }
00277 }
00278
00279 static gboolean connect_scan_start(gpointer data)
00280 {
00281 CN_LOGPRINTF("entry");
00282
00283 scanContext_t* ctxt;
00284
00285 ctxt = (scanContext_t*)data;
00286 g_return_val_if_fail(ctxt != NULL, FALSE);
00287
00288 if (ctxt->mode != backgroundScan_e)
00289 {
00290
00291 erbusy_blink();
00292 }
00293
00294
00295 ctxt->scanNetworks = TRUE;
00296
00297 if (ctxt->networkType == wireless_t)
00298 {
00299
00300 wireless_scan_start(ctxt);
00301 }
00302 else
00303 {
00304
00305 if (ctxt->scan_done)
00306 {
00307 ctxt->scan_done(ctxt->networkType, NULL, 0);
00308 }
00309
00310
00311 connect_scan_done(ctxt);
00312 }
00313
00314 ctxt->scanTimeoutId = 0;
00315
00316
00317 return FALSE;
00318 }
00319
00320 static void connect_scan_done (scanContext_t* ctxt)
00321 {
00322 CN_LOGPRINTF("entry");
00323
00324 g_return_if_fail(ctxt != NULL);
00325
00326 if (ctxt->scanNetworks)
00327 {
00328
00329 ctxt->scanNetworks = FALSE;
00330
00331 if (ctxt->scan_done_after)
00332 {
00333 ctxt->scan_done_after();
00334 }
00335
00336 if (ctxt->mode != backgroundScan_e)
00337 {
00338 erbusy_off();
00339 }
00340 }
00341 }
00342
00343 gboolean connect_scan_freeze_ui(scanContext_t* ctxt)
00344 {
00345 g_return_val_if_fail(ctxt != NULL, FALSE);
00346
00347 CN_LOGPRINTF("return freeze = %d", ctxt->scanAborting);
00348 return ctxt->scanAborting;
00349 }
00350
00351 static gboolean delay_connect_scan_abort(gpointer data)
00352 {
00353 scanContext_t* ctxt;
00354 gboolean ret = TRUE;
00355
00356 ctxt = (scanContext_t*)data;
00357 g_return_val_if_fail(ctxt != NULL, FALSE);
00358
00359
00360 if (!scanThread_stopped())
00361 {
00362 CN_LOGPRINTF("call me later...");
00363 }
00364 else
00365 {
00366 ctxt->scanAborting = FALSE;
00367
00368
00369 ctxt->scanNetworks = FALSE;
00370
00371 ret = FALSE;
00372 }
00373
00374 return ret;
00375 }
00376
00377 void connect_scan_abort(scanContext_t* ctxt)
00378 {
00379 CN_LOGPRINTF("entry");
00380
00381 g_return_if_fail(ctxt != NULL);
00382
00383 if (ctxt->scanNetworks)
00384 {
00385 CN_WARNPRINTF("Abort scanning...");
00386
00387 if (ctxt->mode != backgroundScan_e)
00388 {
00389 erbusy_blink();
00390 }
00391
00392 if (ctxt->networkType == wireless_t)
00393 {
00394
00395 scanThread_stop();
00396
00397
00398 ctxt->scanAborting = TRUE;
00399 g_timeout_add(200, delay_connect_scan_abort, (gpointer)ctxt);
00400 }
00401 else
00402 {
00403
00404 ctxt->scanNetworks = FALSE;
00405 }
00406
00407 if (ctxt->mode != backgroundScan_e)
00408 {
00409 erbusy_off();
00410 }
00411 }
00412 }
00413
00414 static void wireless_scan_start(scanContext_t* ctxt)
00415 {
00416 gboolean ok;
00417
00418 CN_LOGPRINTF("entry");
00419
00420 g_return_if_fail(ctxt != NULL);
00421
00422
00423 connect_scan_ctxt_empty_results(ctxt);
00424
00425 CN_LOGPRINTF("Scanning for ssid[%s]",
00426 ctxt->scanParms ? ctxt->scanParms->ssid : "");
00427
00428
00429 ok = scanThread_start(ctxt->scanParms);
00430 if (ok && (ctxt->mode != backgroundScan_e))
00431 {
00432 erbusy_blink();
00433 }
00434 }
00435
00436
00437 static void on_scan_status_changed(GObject *object,
00438 GParamSpec *arg,
00439 gpointer data)
00440 {
00441 CN_LOGPRINTF("entry");
00442
00443 scanContext_t* ctxt = (scanContext_t*)data;
00444 g_return_if_fail(ctxt != NULL);
00445
00446 const char *name = arg->name;
00447 g_return_if_fail(strcmp(name,"label") == 0);
00448
00449 const gchar* scanStatus = gtk_label_get_text(GTK_LABEL(object));
00450 CN_LOGPRINTF("scanStatus [%s]", scanStatus);
00451
00452 if (strcmp(scanStatus, "scan-done-ok") == 0)
00453 {
00454 if (ctxt->mode != backgroundScan_e)
00455 {
00456 erbusy_off();
00457 }
00458
00459 gtk_label_set_text(GTK_LABEL(ctxt->scanParms->scanStatus)
00460 ,"scan-idle");
00461
00462 if (ctxt->scan_done)
00463 {
00464 ctxt->scan_done(wireless_t,
00465 ctxt->scanParms->networks,
00466 ctxt->scanParms->networks_found);
00467 }
00468
00469 connect_scan_done(ctxt);
00470 }
00471 }
00472