📄 dialup.cpp
字号:
mkdir("/etc/ppp/peers",0700); QFile options("/etc/ppp/peers/"+acid); if ( options.open(IO_WriteOnly) ) { QTextStream opt(&options); opt << cfg.readEntry("speed") << "\n"; QString dial = dialString(cfg); //opt << "debug\n";#ifdef QTOPIA_PHONE opt << "connect '" // No tr << QPEApplication::qpeDir() << "/bin/qtopia-dial-internal'\n"; opt << "disconnect '" // No tr << QPEApplication::qpeDir() << "/bin/qtopia-stop-internal'\n";#else opt << "connect '/usr/sbin/chat " // No tr "-s -v " "ABORT \"NO CARRIER\" " // No tr "ABORT \"NO DIALTONE\" " // No tr "ABORT \"BUSY\" " // No tr << "\"\" ATZ OK " + dial + " CONNECT'\n";#endif if ( cfg.readBoolEntry("crtscts") ) opt << "crtscts\n"; else opt << "nocrtscts\n"; opt << "noipdefault\n"; opt << "modem\n"; // No tr QString user = cfg.readEntry("username"); if ( !user.isEmpty() ) opt << "user " << Global::stringQuote(user) << "\n"; // No tr int dialmode = cfg.readNumEntry("dialmode",0); if ( dialmode == 2 ) opt << "demand\n"; // No tr int idlet = cfg.readNumEntry("idletime",120); if ( dialmode > 0 && idlet ) opt << "idle " << idlet << "\n"; // No tr if ( cfg.readBoolEntry("usepeerdns",TRUE) ) opt << "usepeerdns\n"; if ( cfg.readBoolEntry("defaultroute",TRUE) ) opt << "defaultroute\n"; int cdel = cfg.readNumEntry("connectdelay",0); if ( cdel ) opt << "connect-delay " << cdel << "\n"; if ( !acid.isEmpty() ) opt << "remotename " << acid << "\n"; QString pw = cfg.readEntry("password"); bool pwsetok = TRUE; if ( !pw.isEmpty() ) pwsetok = setPapSecret(user,acid,pw,""); else pwsetok = setPapSecret(user,acid,QString::null,""); if ( !pwsetok ) { QMessageBox::critical(parent,Dialup::tr("I/O Error"), Dialup::tr("<P>Cannot write to PPP password files.")); return FALSE; } return TRUE; } else { QMessageBox::critical(parent,Dialup::tr("I/O Error"), Dialup::tr("<P>Cannot write to %1.").arg(options.name())); return FALSE; }}QString DialupImpl::dev( Config& cfg ) const{ QString d = cfg.readEntry("SerialDevice"); if ( d.isEmpty() ) { QString ct = cardType(cfg); if ( !ct.isEmpty() ) { FILE* f = fopen("/var/run/stab", "r"); if (!f) f = fopen("/var/state/pcmcia/stab", "r"); if (!f) f = fopen("/var/lib/pcmcia/stab", "r"); if ( f ) { char line[1024]; char devtype[80]; char devname[80]; while ( fgets( line, 1024, f ) ) { // 0 serial serial_cs 0 ttyS0 4 64 if ( sscanf(line,"%*d %s %*s %*s %s", devtype, devname )==2 ) { if ( ct == devtype ) { fclose(f); return QString("/dev/")+devname; } } } fclose(f); } } } return d;}bool DialupImpl::create( Config& ){ // nothing special return TRUE;}bool DialupImpl::remove( Config&cfg ){ stop(cfg); cfg.setGroup("Info"); QString peer = cfg.readEntry( "Id" ); if ( !peer.isEmpty() ) { peer = "/etc/ppp/peers/" + peer; unlink( peer.latin1() ); } return TRUE;}class PppMon : public QObject { Q_OBJECT enum { Initialize, Connect, Authenticate, Timing, Disappearing } state; int age; int start; bool demand; QString logfile;public: PppMon(bool demanddialing) : demand(demanddialing) { age = 0; start = 0; state = Initialize; logfile= Global::tempDir()+ "qpe-pppd-log"; progress(demand ? tr("Waiting for activity") : tr("Initializing modem"),1); startTimer(demand ? 8000 /* progress less interesting */ : 2000); } ~PppMon() { }protected: void timerEvent(QTimerEvent*) { if ( state == Disappearing ) { killTimers(); delete this; return; } QFile logf(logfile); if ( logf.open(IO_ReadOnly) ) { QString log = logf.readAll(); log.replace(QRegExp("\r"),""); switch (state) { case Initialize: if ( log.find(QRegExp("\nFailed"))>=start ) { // No tr progress(tr("Connection failed"),0); state = Disappearing; } else if ( demand ) { int ns; if ( (ns=log.find(QRegExp("Starting link\n")))>=start ) { // No tr progress(tr("Connecting"),5); state = Connect; start = ns+1; } } else { int ns; if ( (ns=log.find(QRegExp("\nOK\n -- got it")))>=start ) { // No tr progress(tr("Connecting"),1); state = Connect; start = ns+1; } } break; case Connect: if ( log.find(QRegExp("\nCONNECT[^\n]*\n -- got it"))>=start ) { // No tr progress(tr("Authenticating"),1); // No tr state = Authenticate; } else if ( log.find(QRegExp("\nNO DIALTONE"))>=start ) { progress(tr("No dialtone"),0); state = Disappearing; } else if ( log.find(QRegExp("\nNO CARRIER"))>=start ) { progress(tr("No carrier"),0); state = Disappearing; } else if ( log.find(QRegExp("\nBUSY"))>=start ) { progress(tr("Number is busy"),0); state = Disappearing; } else if ( log.find(QRegExp("\nalarm"))>=start ) { // No tr progress(tr("Timed out"),0); state = Disappearing; } else if ( log.find(QRegExp("\nFailed"))>=start ) { // No tr progress(tr("Connection failed"),0); state = Disappearing; } break; case Authenticate: if ( log.find(QRegExp("\nPAP authentication failed"))>=start ) { // No tr progress(tr("Authentication Failed"),0); state = Disappearing; } else if ( log.find(QRegExp("\nCHAP authentication failed"))>=start ) { // No tr progress(tr("Authentication Failed"),0); state = Disappearing; } else if ( log.find(QRegExp("\nipcp: up"))>=start ) { // No tr progress(tr("Connected"),5); if ( demand ) state = Timing; else state = Disappearing; } break; case Timing: if ( log.find(QRegExp("\nConnection terminated"))>=start ) { // No tr progress(tr("Waiting for activity"),1); state = Initialize; } break; case Disappearing: break; } if ( !demand && age++ > 120 ) // fail-safe self destruction state = Disappearing; } else state = Disappearing; } void progress(const QString& p, int flag) {#ifndef QT_NO_COP QCopEnvelope e("QPE/Network", "progress(QString,int)"); if ( demand ) flag |= 2; e << p << flag;#endif }};bool DialupImpl::start( Config& cfg ){ return start(cfg,QString::null);}bool DialupImpl::start( Config& cfg, const QString& password ){ // start pppd QString cmd = cfg.readEntry("script"); QStringList args; if ( cmd.isEmpty() ) { if ( !cfg.readBoolEntry("usepeerdns",TRUE) ) { bool any=FALSE; for (int i=1; i<5 && !any; i++) any = !cfg.readEntry("dns"+QString::number(i)).isEmpty(); if ( any ) { QFile rc("/etc/ppp/resolv.conf"); if ( rc.open(IO_WriteOnly) ) { QTextStream stream(&rc); for (int i=1; i<5; i++) { QString dns = cfg.readEntry("dns"+QString::number(i)); if ( !dns.isEmpty() ) stream << "nameserver " << dns << "\n"; } } else { qWarning("Cannot write to /etc/ppp/resolv.conf file."); } } } cfg.setGroup("Info"); args.append("/usr/sbin/pppd"); // No tr#ifdef QTOPIA_PHONE args.append("nodetach"); // No tr args.append("notty"); // No tr#else QString d = dev(cfg); if ( d.isEmpty() ) { qWarning("No device for card type %s",cardType(cfg).latin1()); return FALSE; } args.append("updetach"); // No tr args.append(d);#endif args.append("debug"); // No tr args.append("call"); // No tr args.append(cfg.readEntry("Id")); // No tr } else { args = QStringList::split(" ", cmd);#ifndef QTOPIA_PHONE args.append(dev(cfg));#endif } if ( !password.isNull() ) { args.append("password"); // No tr args.append(password); } args.append("logfile"); // No tr args.append(logfile); QFile::remove(logfile);#ifdef QTOPIA_PHONE // Construct the full dial control string. QString dial = dialString(cfg); // Split the dial control string into setup commands and phone number. QStringList init = QStringList::split(" ", dial); QStringList::Iterator iter; QString number; for ( iter = init.begin(); iter != init.end(); ) { if ( *iter == "OK" ) { // The phone library will take care of looking for "OK". iter = init.remove(iter); } else if ( (*iter).startsWith("ATD") ) { // The dial command, starting with ATD, ATDT, or ATDP. number = (*iter).mid(3); if ( number.startsWith("T") || number.startsWith("P") ) { number = number.mid(1); } iter = init.remove(iter); } else { ++iter; } } // Create a data call. PhoneLine line; bool demand = cfg.readNumEntry("dialmode",0) == 2; line.startData( number, init, args, demand);#else // Quote the command-line before passing it to "system". cmd = args[0]; for ( uint posn = 1; posn < args.count(); ++posn ) { cmd += " " + Global::shellQuote(args[posn]); } cmd += " &"; system("cardctl resume"); system(cmd.latin1());#endif cfg.setGroup("Properties"); int dialmode = cfg.readNumEntry("dialmode",0); (void)new PppMon(dialmode==2); return TRUE;}bool DialupImpl::stop( Config& cfg ){#ifdef QTOPIA_PHONE Q_CONST_UNUSED(cfg); PhoneLine line; line.stopData(); return TRUE;#else // kill pppd QString d = device(cfg); if ( !QFile::exists("/var/run/"+d+".pid") ) d += "0"; QFile pid("/var/run/"+d+".pid"); if ( pid.open(IO_ReadOnly) ) { QString s(pid.readAll()); int p = s.toInt(); if ( p ) { kill(p,SIGTERM); // SIGHUP not enough for demand dialing pppd system("cardctl suspend"); return TRUE; } } return FALSE;#endif}bool DialupImpl::isAvailable( Config& cfg ) const{#ifdef QTOPIA_PHONE Q_CONST_UNUSED(cfg); return TRUE;#else QString d = dev(cfg); if ( d.isEmpty() ) return FALSE; return QFile::exists(d);#endif}bool DialupImpl::needPassword( Config& cfg ) const{ return cfg.readEntry("password").isEmpty();}bool DialupImpl::setProperties( Config& cfg, const NetworkInterfaceProperties& settings ){ // XXX relationship between these proxies and WWW proxies??? cfg.writeEntry("wapProxyAddress", settings["proxyAddress"].toString()); cfg.writeEntry("wapProxyAddressType", settings["proxyAddressType"].toString()); cfg.writeEntry("wapProxyLoginType", settings["proxyLoginType"].toString()); cfg.writeEntry("wapProxyAuthName", settings["proxyAuthName"].toString()); cfg.writeEntry("wapProxyAuthPassword", settings["proxyAuthPassword"].toString()); cfg.writeEntry("wapProxyPort", settings["proxyPort"].toString()); cfg.writeEntry("wapProxyService", settings["proxyService"].toString()); cfg.writeEntry("wapDefaultHomePage", settings["homePage"].toString()); cfg.writeEntry("mmsURL", settings["mmsUrl"].toString()); QString acid = cfg.readEntry("Id"); // Remove old password QString prev_user = cfg.readEntry("username"); QString user = settings["authName"].toString(); if ( prev_user != user ) { cfg.writeEntry("username",user); setPapSecret(prev_user,acid,QString::null,""); } cfg.writeEntry("apn", settings["accessPoint"].toString()); cfg.writeEntry("password", settings["authPassword"].toString()); return writeSystemFiles(0,cfg);}#include "dialup.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -