Exemple #1
0
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;
}