@ -1,9 +1,11 @@ 
			
		
	
		
			
				
					# include  <algorithm>  
			
		
	
		
			
				
					# include  <set>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "wifiManager.hpp"  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/**
  
			
		
	
		
			
				
					 *  We  are  using  a  NetworkManager  DBUS  API  :  https : //developer.gnome.org/NetworkManager/1.26/spec.html
   
			
		
	
		
			
				
					 *  */   
			
		
	
		
			
				
					 
  
			
		
	
		
			
				
					QString  nm_path                 =  " /org/freedesktop/NetworkManager " ;  
			
		
	
		
			
				
					QString  nm_settings_path        =  " /org/freedesktop/NetworkManager/Settings " ;  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -18,6 +20,9 @@ QString connection_iface       = "org.freedesktop.NetworkManager.Connection.Acti 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					QString  nm_service              =  " org.freedesktop.NetworkManager " ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					const  int  state_connected  =  100 ;  
			
		
	
		
			
				
					const  int  state_need_auth  =  60 ;  
			
		
	
		
			
				
					const  int  reason_wrong_password  =  8 ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					template  < typename  T >  
			
		
	
		
			
				
					T  get_response ( QDBusMessage  response ) {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -28,16 +33,27 @@ T get_response(QDBusMessage response){ 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					bool  compare_by_strength ( const  Network  & a ,  const  Network  & b ) {  
			
		
	
		
			
				
					  if  ( a . connected )  return  true ;   
			
		
	
		
			
				
					  if  ( b . connected )  return  false ;   
			
		
	
		
			
				
					  if  ( a . connected  = =  ConnectedType : : CONNECTED )  return  true ;   
			
		
	
		
			
				
					  if  ( b . connected  = =  ConnectedType : : CONNECTED )  return  false ;   
			
		
	
		
			
				
					  if  ( a . connected  = =  ConnectedType : : CONNECTING )  return  true ;   
			
		
	
		
			
				
					  if  ( b . connected  = =  ConnectedType : : CONNECTING )  return  false ;   
			
		
	
		
			
				
					  return  a . strength  >  b . strength ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					WifiManager : : WifiManager ( ) {  
			
		
	
		
			
				
					  qDBusRegisterMetaType < Connection > ( ) ;   
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					  connecting_to_network  =  " " ;   
			
		
	
		
			
				
					  adapter  =  get_adapter ( ) ;   
			
		
	
		
			
				
					  has_adapter  =  adapter  ! =  " " ;   
			
		
	
		
			
				
					  if ( has_adapter ) {   
			
		
	
		
			
				
					    QDBusInterface  nm ( nm_service ,  adapter ,  device_iface ,  bus ) ;   
			
		
	
		
			
				
					    bus . connect ( nm_service ,  adapter ,  device_iface ,  " StateChanged " ,  this ,  SLOT ( change ( unsigned  int ,  unsigned  int ,  unsigned  int ) ) ) ;   
			
		
	
		
			
				
					    
  
			
		
	
		
			
				
					    QDBusInterface  device_props ( nm_service ,  adapter ,  props_iface ,  bus ) ;   
			
		
	
		
			
				
					    QDBusMessage  response  =  device_props . call ( " Get " ,  device_iface ,  " State " ) ;   
			
		
	
		
			
				
					    raw_adapter_state  =  get_response < uint > ( response ) ;   
			
		
	
		
			
				
					    change ( raw_adapter_state ,  0 ,  0 ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WifiManager : : refreshNetworks ( ) {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -63,7 +79,6 @@ QList<Network> WifiManager::get_networks(){ 
			
		
	
		
			
				
					  QVariant  first  =   response . arguments ( ) . at ( 0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QString  active_ap  =  get_active_ap ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  const  QDBusArgument  & args  =  first . value < QDBusArgument > ( ) ;   
			
		
	
		
			
				
					  args . beginArray ( ) ;   
			
		
	
		
			
				
					  while  ( ! args . atEnd ( ) )  {   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -73,7 +88,17 @@ QList<Network> WifiManager::get_networks(){ 
			
		
	
		
			
				
					    QByteArray  ssid  =  get_property ( path . path ( ) ,  " Ssid " ) ;   
			
		
	
		
			
				
					    unsigned  int  strength  =  get_ap_strength ( path . path ( ) ) ;   
			
		
	
		
			
				
					    SecurityType  security  =  getSecurityType ( path . path ( ) ) ;   
			
		
	
		
			
				
					    Network  network  =  { path . path ( ) ,  ssid ,  strength ,  path . path ( ) = = active_ap ,  security } ;   
			
		
	
		
			
				
					    ConnectedType  ctype ;   
			
		
	
		
			
				
					    if ( path . path ( )  ! =  active_ap ) {   
			
		
	
		
			
				
					      ctype  =  ConnectedType : : DISCONNECTED ;   
			
		
	
		
			
				
					    } else {   
			
		
	
		
			
				
					      if ( ssid  = =  connecting_to_network ) {   
			
		
	
		
			
				
					        ctype  =  ConnectedType : : CONNECTING ;   
			
		
	
		
			
				
					      } else {   
			
		
	
		
			
				
					        ctype  =  ConnectedType : : CONNECTED ;   
			
		
	
		
			
				
					      }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    Network  network  =  { path . path ( ) ,  ssid ,  strength ,  ctype ,  security } ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    if  ( ssid . length ( ) ) {   
			
		
	
		
			
				
					      r . push_back ( network ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -96,10 +121,6 @@ SecurityType WifiManager::getSecurityType(QString path){ 
			
		
	
		
			
				
					  }  else  if ( ( sflag  &  0x1 )  & &  ( wpa_props  &  ( 0x333 )  & &  ! ( wpa_props  &  0x200 ) ) )  {   
			
		
	
		
			
				
					    return  SecurityType : : WPA ;   
			
		
	
		
			
				
					  }  else  {   
			
		
	
		
			
				
					    // qDebug() << "Cannot determine security type for " << get_property(path, "Ssid") << " with flags";
   
			
		
	
		
			
				
					    // qDebug() << "flag    " << sflag;
   
			
		
	
		
			
				
					    // qDebug() << "WpaFlag " << wpaflag;
   
			
		
	
		
			
				
					    // qDebug() << "RsnFlag " << rsnflag;
   
			
		
	
		
			
				
					    return  SecurityType : : UNSUPPORTED ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					}  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -113,12 +134,12 @@ void WifiManager::connect(Network n, QString password){ 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WifiManager : : connect ( Network  n ,  QString  username ,  QString  password ) {  
			
		
	
		
			
				
					  connecting_to_network  =  n . ssid ;   
			
		
	
		
			
				
					  QString  active_ap  =  get_active_ap ( ) ;   
			
		
	
		
			
				
					  if   ( active_ap ! = " " )  {   
			
		
	
		
			
				
					    clear _connections( get_property ( active_ap ,  " Ssid " ) ) ;   
			
		
	
		
			
				
					  if ( active_ap ! = " "  & &  active_ap ! = " / " )  {   
			
		
	
		
			
				
					    deactivate _connections( get_property ( active_ap ,  " Ssid " ) ) ;  //Disconnect from any connected networks 
    
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  clear_connections ( n . ssid ) ;   
			
		
	
		
			
				
					  qDebug ( )  < <  " Connecting to " < <  n . ssid  < <  " with username, password = "  < <  username  < <  " , "  < < password ;   
			
		
	
		
			
				
					  clear_connections ( n . ssid ) ;  //Clear all connections that may already exist to the network we are connecting
   
			
		
	
		
			
				
					  connect ( n . ssid ,  username ,  password ,  n . security_type ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -127,7 +148,7 @@ void WifiManager::connect(QByteArray ssid, QString username, QString password, S 
			
		
	
		
			
				
					  connection [ " connection " ] [ " type " ]  =  " 802-11-wireless " ;   
			
		
	
		
			
				
					  connection [ " connection " ] [ " uuid " ]  =  QUuid : : createUuid ( ) . toString ( ) . remove ( ' { ' ) . remove ( ' } ' ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  connection [ " connection " ] [ " id " ]  =  " OpenPilot connection  " + QString : : fromStdString ( ssid . toStdString ( ) ) ;  //TODO Add security type
    
			
		
	
		
			
				
					  connection [ " connection " ] [ " id " ]  =  " OpenPilot connection  " + QString : : fromStdString ( ssid . toStdString ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  connection [ " 802-11-wireless " ] [ " ssid " ]  =  ssid ;   
			
		
	
		
			
				
					  connection [ " 802-11-wireless " ] [ " mode " ]  =  " infrastructure " ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -143,28 +164,34 @@ void WifiManager::connect(QByteArray ssid, QString username, QString password, S 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QDBusInterface  nm_settings ( nm_service ,  nm_settings_path ,  nm_settings_iface ,  bus ) ;   
			
		
	
		
			
				
					  QDBusReply < QDBusObjectPath >  result  =  nm_settings . call ( " AddConnection " ,  QVariant : : fromValue ( connection ) ) ;   
			
		
	
		
			
				
					  if  ( ! result . isValid ( ) )  {   
			
		
	
		
			
				
					    qDebug ( )  < <  result . error ( ) . name ( )  < <  result . error ( ) . message ( ) ;   
			
		
	
		
			
				
					  }  else  {   
			
		
	
		
			
				
					    qDebug ( )  < <  result . value ( ) . path ( ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WifiManager : : deactivate_connections ( QString  ssid ) {  
			
		
	
		
			
				
					  for ( QDBusObjectPath  active_connection_raw  :  get_active_connections ( ) ) {   
			
		
	
		
			
				
					    QString  active_connection  =  active_connection_raw . path ( ) ;   
			
		
	
		
			
				
					    QDBusInterface  nm ( nm_service ,  active_connection ,  props_iface ,  bus ) ;   
			
		
	
		
			
				
					    QDBusObjectPath  pth  =  get_response < QDBusObjectPath > ( nm . call ( " Get " ,  connection_iface ,  " SpecificObject " ) ) ;   
			
		
	
		
			
				
					    QString  Ssid  =  get_property ( pth . path ( ) ,  " Ssid " ) ;   
			
		
	
		
			
				
					    if ( Ssid  = =  ssid ) {   
			
		
	
		
			
				
					      QDBusInterface  nm2 ( nm_service ,  nm_path ,  nm_iface ,  bus ) ;   
			
		
	
		
			
				
					      nm2 . call ( " DeactivateConnection " ,  QVariant : : fromValue ( active_connection_raw ) ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WifiManager : : print_active_connections ( ) {  
			
		
	
		
			
				
					  //TO-DO clean up, the code is not currently in use.
   
			
		
	
		
			
				
					QVector < QDBusObjectPath >  WifiManager : : get_active_connections ( ) {  
			
		
	
		
			
				
					  QDBusInterface  nm ( nm_service ,  nm_path ,  props_iface ,  bus ) ;   
			
		
	
		
			
				
					  QDBusMessage  response  =  nm . call ( " Get " ,  nm_iface ,  " ActiveConnections " ) ;   
			
		
	
		
			
				
					  QVariant  first  =  response . arguments ( ) . at ( 0 ) ;   
			
		
	
		
			
				
					  QDBusVariant  dbvFirst  =  first . value < QDBusVariant > ( ) ;   
			
		
	
		
			
				
					  QVariant  vFirst  =  dbvFirst . variant ( ) ;   
			
		
	
		
			
				
					  QDBusArgument  step4  =  vFirst . value < QDBusArgument > ( ) ;   
			
		
	
		
			
				
					  QDBusArgument  arr  =  get_response < QDBusArgument > ( response ) ;   
			
		
	
		
			
				
					  QVector < QDBusObjectPath >  conns ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QDBusObjectPath  path ;   
			
		
	
		
			
				
					  step4 . beginArray ( ) ;   
			
		
	
		
			
				
					  while  ( ! step4 . atEnd ( ) ) {   
			
		
	
		
			
				
					    step4 > >  path ;   
			
		
	
		
			
				
					    qDebug ( ) < < path . path ( ) ;   
			
		
	
		
			
				
					  arr . beginArray ( ) ;   
			
		
	
		
			
				
					  while  ( ! arr . atEnd ( ) ) {   
			
		
	
		
			
				
					    arr > >  path ;   
			
		
	
		
			
				
					    conns . push_back ( path ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  step4 . endArray ( ) ;   
			
		
	
		
			
				
					  return  conns ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WifiManager : : clear_connections ( QString  ssid ) {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -189,7 +216,6 @@ void WifiManager::clear_connections(QString ssid){ 
			
		
	
		
			
				
					        if ( inner_key  = =  " ssid " ) {   
			
		
	
		
			
				
					          QString  value  =  innerMap . value ( inner_key ) . value < QString > ( ) ;   
			
		
	
		
			
				
					          if ( value  = =  ssid ) {   
			
		
	
		
			
				
					            // qDebug()<<"Deleting "<<value;
   
			
		
	
		
			
				
					            nm2 . call ( " Delete " ) ;   
			
		
	
		
			
				
					          }   
			
		
	
		
			
				
					        }   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -202,7 +228,7 @@ void WifiManager::request_scan(){ 
			
		
	
		
			
				
					  if  ( ! has_adapter )  return ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QDBusInterface  nm ( nm_service ,  adapter ,  wireless_device_iface ,  bus ) ;   
			
		
	
		
			
				
					  QDBusMessage  response  =  nm . call ( " RequestScan " ,   QVariantMap ( ) ) ;   
			
		
	
		
			
				
					  nm . call ( " RequestScan " ,   QVariantMap ( ) ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					uint  WifiManager : : get_wifi_device_state ( ) {  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -259,3 +285,12 @@ QString WifiManager::get_adapter(){ 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  return  adapter_path ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WifiManager : : change ( unsigned  int  new_state , unsigned  int  previous_state , unsigned  int  change_reason ) {  
			
		
	
		
			
				
					  raw_adapter_state  =  new_state ;   
			
		
	
		
			
				
					  if ( new_state  = =  state_need_auth  & &  change_reason  = =  reason_wrong_password ) {   
			
		
	
		
			
				
					    emit  wrongPassword ( connecting_to_network ) ;   
			
		
	
		
			
				
					  } else  if ( new_state  = =  state_connected ) {   
			
		
	
		
			
				
					    connecting_to_network = " " ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					}