protected void log(boolean error, String msg) { android.text.format.Time time = new android.text.format.Time(); time.setToNow(); Log.i(TAG, "log: " + msg); log.append(COLOR_TIME, time.format("%H:%M:%S\t")) .append(error ? COLOR_ERROR : COLOR_LOG, msg) .append("\n"); }
private void handle(Message msg) { Log.e(TAG, "Message= " + Integer.toString(msg.what)); switch (msg.what) { case MSG_EXCEPTION: if (state == STATE_STOPPED) return; Throwable thr = (Throwable) msg.obj; log(true, getString(R.string.exception) + " " + thr.getMessage()); Log.e(TAG, "Exception " + thr.getMessage() + " " + Log.getStackTraceString(thr)); stopProcess(); state = STATE_STOPPED; break; case MSG_ERROR: if (state == STATE_STOPPED) return; if (process == null) return; // don't kill it again... if (msg.obj != null) { String line = (String) msg.obj; log(true, line); // just dump it and ignore it if (line.startsWith("dnsmasq: DHCPACK")) { String[] vals = line.split(" +"); if (vals.length > 3) { ClientData cd = new ClientData(vals[3], vals[2], vals.length > 4 ? vals[4] : null); clientAdded(cd); } } } else { // no message, means process died log(true, getString(R.string.unexpected)); stopProcess(); if ((state == STATE_STARTING)) { String err = log.toString(); if (isRootError(err)) { app.failed(BarnacleApp.ERROR_ROOT); } else if (isSupplicantError(err)) { app.failed(BarnacleApp.ERROR_SUPPLICANT); } else { app.failed(BarnacleApp.ERROR_OTHER); } } else { app.failed(BarnacleApp.ERROR_OTHER); } state = STATE_STOPPED; } break; case MSG_OUTPUT: if (state == STATE_STOPPED) return; if (process == null) return; // cut the gibberish String line = (String) msg.obj; if (line == null) { // ignore it, wait for MSG_ERROR(null) break; } if (line.startsWith("DHCP: ACK")) { // DHCP: ACK <MAC> <IP> [<HOSTNAME>] String[] vals = line.split(" +"); ClientData cd = new ClientData(vals[2], vals[3], vals.length > 4 ? vals[4] : null); clientAdded(cd); } else if (line.startsWith("WIFI: OK")) { // WIFI: OK <IFNAME> <MAC> String[] parts = line.split(" +"); if_lan = parts[2]; if_mac = Util.MACAddress.parse(parts[3]); if (state == STATE_STARTING) { connectToNat(); state = STATE_RUNNING; log(false, getString(R.string.running)); clients.clear(); stats.init(Util.fetchTrafficData(if_lan)); // app.foundIfLan(if_lan); // this will allow 3G <-> 4G with simple restart app.processStarted(); mHandler.sendEmptyMessage(MSG_ASSOC); } } else { log(false, line); } break; case MSG_START: if (state != STATE_STOPPED) return; log.clear(); log(false, getString(R.string.starting)); if (!app.prepareBinaries()) { log(true, getString(R.string.unpackerr)); state = STATE_STOPPED; break; } state = STATE_STARTING; // FALL THROUGH! case MSG_NETSCHANGE: int wifiState = wifiManager.getWifiState(); Log.e( TAG, String.format( "NETSCHANGE: %d %d %s", wifiState, state, process == null ? "null" : "proc")); if (wifiState == WifiManager.WIFI_STATE_DISABLED) { Log.v(TAG, "Wifi State Disabled"); // wifi is good (or lost), we can start now... if (app.prefs.getBoolean("wan_start", false) && checkUplink() == false) { // Insert to fix checkupLink Toast.makeText( getApplicationContext(), "Umts interfaced is not connected!", Toast.LENGTH_LONG) .show(); log(true, "HSPA interface is disabled. Stopping...."); state = STATE_STOPPED; break; } else if ((state == STATE_STARTING) && (process == null) && checkUplink()) { log(false, getString(R.string.dataready)); if (app.prefs.getBoolean("wan_start", false) && !app.findIfWan()) { // se la wan รจ down non vado in findIfWan log(true, getString(R.string.wanerr)); state = STATE_STOPPED; break; } if (!app.prepareIni()) { log(true, getString(R.string.inierr)); state = STATE_STOPPED; break; } log(false, getString(R.string.iniok)); if (!startProcess()) { Log.e(TAG, "startProcess()=False"); log(true, getString(R.string.starterr)); state = STATE_STOPPED; break; } } // if not checkUpLink then we simply wait... } else { Log.v(TAG, "Wifi State is not Disabled"); if (state == STATE_RUNNING) { // this is super bad, will have to restart! app.updateToast(getString(R.string.conflictwifi), true); log(true, getString(R.string.conflictwifi)); log(false, getString(R.string.restarting)); stopProcess(); // this tears down wifi wifiManager.setWifiEnabled(false); // this will send MSG_NETSCHANGE // we should wait until wifi is disabled... state = STATE_STARTING; } else if (state == STATE_STARTING) { if ((wifiState == WifiManager.WIFI_STATE_ENABLED) || (wifiState == WifiManager.WIFI_STATE_ENABLING)) { app.updateToast(getString(R.string.disablewifi), false); wifiManager.setWifiEnabled(false); log(false, getString(R.string.waitwifi)); } } } break; case MSG_STOP: if ((state == STATE_STOPPED) && (process == null)) return; stopProcess(); log(false, getString(R.string.stopped)); state = STATE_STOPPED; break; case MSG_ASSOC: if (state != STATE_RUNNING) return; if (tellProcess("WLAN")) { app.updateToast(getString(R.string.beaconing), true); } if (clients.isEmpty() && app.prefs.getBoolean("lan_autoassoc", false)) { mHandler.removeMessages(MSG_ASSOC); // rebeacon, in 5 seconds mHandler.sendEmptyMessageDelayed(MSG_ASSOC, 5000); } break; case MSG_FILTER: if (state != STATE_RUNNING) return; if (tellNat((String) msg.obj)) { app.updateToast(getString(R.string.filterupdated), false); } break; case MSG_STATS: mHandler.removeMessages(MSG_STATS); if (state != STATE_RUNNING || if_lan.length() == 0) return; stats.update(Util.fetchTrafficData(if_lan)); break; } app.updateStatus(); if (state == STATE_STOPPED) app.processStopped(); }