bool DialupImpl::start( const QVariant /*options*/ ) { if ( ifaceStatus != QtopiaNetworkInterface::Down ) { switch ( ifaceStatus ) { case QtopiaNetworkInterface::Unknown: updateTrigger( QtopiaNetworkInterface::NotInitialized, tr("Interface hasn't been initialized yet.") ); break; case QtopiaNetworkInterface::Unavailable: updateTrigger( QtopiaNetworkInterface::NotAvailable, tr("Interface is not available.") ); break; case QtopiaNetworkInterface::Up: case QtopiaNetworkInterface::Pending: case QtopiaNetworkInterface::Demand: updateTrigger( QtopiaNetworkInterface::NotConnected, tr("Interface already started/active.") ); break; default: break; } qLog(Network) << "ppp interface cannot be started " <<configIface->configFile(); return false; } QtopiaNetworkProperties prop = configIface->getProperties(); QStringList args; const bool demand = prop.value("Properties/Autostart").toString() == "y"; const QtopiaNetwork::Type t = type(); #ifdef QTOPIA_CELL if ( t & QtopiaNetwork::PhoneModem ) { if ( regState != QTelephony::RegistrationHome && regState != QTelephony::RegistrationRoaming ) { //we want to start the network but we don't have a network //registration yet. wait till registration is done then go ahead //and start iface qLog(Network) << "Cannot start dialup yet due to missing" << "network registration. try again later"; registrationStateChanged(); //ask for first update updateTrigger( QtopiaNetworkInterface::NotConnected, tr("Missing network registration. Try again later.") ); return false; } } #endif if ( t & QtopiaNetwork::NamedModem || t & QtopiaNetwork::PCMCIA ) { QString dev = device(); if ( dev.isEmpty() || dev == "internal") { qLog(Network) << "No external device"; updateTrigger( QtopiaNetworkInterface::NotConnected, tr("Missing external serial device.") ); return false; } if ( dev.startsWith("/dev/") ) dev = dev.mid(5); args << dev; args << "updetach"; } #ifdef QTOPIA_CELL else { args << "nodetach"; } #endif args << "debug"; args << "call"; const QString peerID = prop.value("Serial/PeerID").toString(); if ( peerID.isEmpty() ) { qLog(Network) << "Missing peer ID"; updateTrigger( QtopiaNetworkInterface::NotConnected, tr("Missing peer ID. Please reconfigure device.") ); return false; } args << peerID; QString password = prop.value("Properties/Password").toString(); if (!password.isEmpty()) { args << "password"; args << password; } const QString logfile = Qtopia::tempDir() + "qpe-pppd-log-"+peerID; args << "logfile"; args << logfile; QFile::remove( logfile ) ; if ( t & QtopiaNetwork::NamedModem || t & QtopiaNetwork::PCMCIA ) { qLog(Network) << "###################################"; qLog(Network) << "Starting ppp using external modem: " << args.join(" "); args.prepend("start"); //cmd for network script thread.addScriptToRun( pppScript, args ); } else { //QtopiaNetwork::PhoneModem #ifdef QTOPIA_CELL const QString path = Qtopia::applicationFileName("Network", "chat"); const QString connectF = path+"/connect-"+peerID; const QString disconnectF = path+"/disconnect-"+peerID; //Create a data call qLog(Network) << "###################################"; qLog(Network) << "Starting ppp using internal modem: " << args.join(" "); qLog(Network) << "connect: " << connectF; qLog(Network) << "disconnect: " << disconnectF; qLog(Network) << "demand dialing: " << (demand ? "yes" : "no"); QDialOptions pppd; pppd.setUseIpModule( true ); pppd.setIpProgramName( PPPD_BINARY ); pppd.setIpConnectScript( connectF ); pppd.setIpDisconnectScript( disconnectF ); pppd.setIpDemandDialing( demand ); pppd.setIpArgs( args ); //Make sure that an existing call is stopped. if ( !dataCall.isNull() ) { dataCall.hangup(); } if ( !callManager ) callManager = new QPhoneCallManager( this ); //Dial the new call. if ( callManager ) { dataCall = callManager->create( "IP" ); dataCall.connectNotification( this, SLOT(connectNotification(QPhoneCall,QPhoneCall::Notification,QString))); dataCall.connectStateChanged( this, SLOT(phoneCallStateChanged(QPhoneCall)) ); dataCall.dial( pppd ); } else { qLog(Network) << "No call manager created"; } #endif } state = Initialize; logIndex = 0; tidStateUpdate = startTimer( 1000 ); if ( demand ) ifaceStatus = QtopiaNetworkInterface::Demand; else ifaceStatus = QtopiaNetworkInterface::Pending; netSpace->setAttribute( "State", ifaceStatus ); updateTrigger(); delayedGatewayInstall = true; return true; }