⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 networksettings.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "networksettings.h"#include "addnetworksetting.h"#include <qtopia/networkinterface.h>#include <qtopia/network.h>#include <qtopia/contextmenu.h>#include <qtopia/global.h>#include <qtopia/config.h>#include <qtopia/resource.h>#include <qtopia/qpeapplication.h>#ifdef QWS#include <qtopia/qcopenvelope_qws.h>#endif#include <qtopia/qlibrary.h>#include <qtopia/qpemessagebox.h>#ifdef QTOPIA_PHONE#include <qtopia/phone/smsmessage.h>#include <qtopia/wap/wsppdu.h>#include <qtopia/wap/otareader.h>#endif#include <qmessagebox.h>#include <qpushbutton.h>#include <qlistbox.h>#include <qdir.h>#include <qlayout.h>#include <qlabel.h>#include <qaction.h>#include <qdict.h>#include <qobjectlist.h>#include <qbuffer.h>/*  *  Constructs a NetworkConnections which is a child of 'parent', with the  *  name 'name' and widget flags set to 'f'  */NetworkSettings::NetworkSettings( QWidget* parent,  const char* name, WFlags fl ) :    QWidget(parent,name,fl){    firstshow = TRUE;    tid_close_self = 0;    emptyString = tr("<p>There are no network services running.");    notEmptyString = tr("<p>This is the state of the network services running:");    QVBoxLayout *vb = new QVBoxLayout(this);    vb->setAutoAdd(TRUE);#ifdef QTOPIA_PHONE    ContextMenu *contextMenu = new ContextMenu(this);    a_add = new QAction( tr("Add..."), QString::null, 0, this );    connect( a_add, SIGNAL( activated() ), this, SLOT( addSetting() ) );    a_add->addTo(contextMenu);    a_remove = new QAction( tr("Remove"), QString::null, 0, this );    connect( a_remove, SIGNAL( activated() ), this, SLOT( removeSetting() ) );    a_remove->addTo(contextMenu);    a_props = new QAction( tr("Properties..."), QString::null, 0, this );    connect( a_props, SIGNAL( activated() ), this, SLOT( doProperties() ) );    a_props->addTo(contextMenu);    a_remove->setEnabled( false );    a_props->setEnabled( false );    settings = new QListBox(this);    settings->setFrameStyle(QFrame::NoFrame);    states = 0; // Not used    status = new QLabel(this);    connect(settings, SIGNAL(selected(int)), this, SLOT(serviceSelected()) );    connect(settings, SIGNAL(selectionChanged()), this, SLOT(updateActions()) );    setCaption(tr("Internet"));    QCopChannel* netChannel = new QCopChannel( "QPE/Network", this );    connect( netChannel, SIGNAL(received(const QCString&,const QByteArray&)),             this, SLOT(netMessage(const QCString&,const QByteArray&)) );#else    base = new NetworkSettingsBase(this);    connect(base->add, SIGNAL(clicked()), this, SLOT(addSetting()));    connect(base->remove, SIGNAL(clicked()), this, SLOT(removeSetting()));    connect(base->props, SIGNAL(clicked()), this, SLOT(doProperties()));    base->remove->setEnabled( false );    base->props->setEnabled( false );    settings = base->settings;    states = base->states;    connect(settings, SIGNAL(selectionChanged()), this, SLOT(serviceSelected()) );    setCaption(base->caption());#endif    loadSettings();#ifdef QTOPIA_PHONE    QObject::connect	( qApp, SIGNAL( appMessage(const QCString&,const QByteArray&) ),	  this, SLOT( appMessage(const QCString&,const QByteArray&) ) );#endif#ifdef QWS    Network::connectChoiceChange(this,SLOT(updateCurrent()));#endif    updateCurrent();}/*   *  Destroys the object and frees any allocated resources */NetworkSettings::~NetworkSettings(){    // no need to delete child widgets, Qt does it all for us}void NetworkSettings::loadSettings(){#ifdef QWS    int i = settings->currentItem();    if ( i < 0 ) i = 0;    filelist = Network::choices(settings);    if ( settings->count() )	settings->setCurrentItem(i);#endif}void NetworkSettings::addSetting(){    addSetting(FALSE);}void NetworkSettings::addSetting(bool first){    AddNetworkSetting a(first, this);    a.showMaximized();    if ( a.exec() )	addSetting(a.selectedFile(),TRUE);}QString NetworkSettings::addSetting(const QString& baseconfig, bool edit){    QString basename = QFileInfo(baseconfig).baseName();    QDir settingsdir(Network::settingsDir());    QString uniq = "";    int n=0;    QString filename;    do {	filename = settingsdir.filePath(basename + uniq + ".conf");	uniq = QString::number(n++);    } while (QFile::exists(filename));    // copy    {	QFile i(baseconfig);	if ( !i.open(IO_ReadOnly) )	    return QString::null;	QFile o(filename);	if ( !o.open(IO_WriteOnly) )	    return QString::null;	o.writeBlock(i.readAll());    }    bool ok = TRUE;    {	Config cfg(filename, Config::File);	cfg.setGroup("Help");	cfg.clearGroup();	cfg.setGroup("Info");	QString type = cfg.readEntry("Type");	NetworkInterface* plugin;	if ( cfg.readNumEntry("Unique",0) && n > 1 ) {	    QMessageBox::information(this,tr("Error"),		tr("<p>Only one %1 can be added. Remove the current one, "		    "or change its Properties").arg(cfg.readEntry("Name")));	    plugin = 0;	} else {#ifdef QWS	    plugin = Network::loadPlugin(type);#endif	}	if ( plugin ) {	    if ( (ok = plugin->create(cfg)) ) {		if ( edit ) {		    cfg.setGroup("Properties");		    if ( !plugin->doProperties(this, cfg) ) {			plugin->remove(cfg);			plugin = 0;			ok = FALSE;		    }		}	    }	} else {	    ok = FALSE;	}    }    if ( ok ) {	loadSettings();#ifndef QT_NO_COP	QCopEnvelope("QPE/Network", "choicesChanged()");#endif	return filename;    } else {	QFile::remove(filename);	return QString::null;    }}void NetworkSettings::updateActions(){#ifdef QTOPIA_PHONE    bool sel = settings->currentItem() != -1;    a_remove->setEnabled( TRUE );    a_props->setEnabled( sel );#endif}void NetworkSettings::serviceSelected(){    bool sel = false;    QString selfile;    QStringList::ConstIterator it = filelist.begin();    for (QListBoxItem* i=settings->firstItem(); i; i=i->next(), ++it) {	if ( i->selected() ) {	    sel = true;	    selfile = *it;	    break;	}    }#ifdef QTOPIA_PHONE    if ( sel ) {	Config cfg(selfile,Config::File);	cfg.setGroup("Info");	QString type = cfg.readEntry("Type");	NetworkInterface* plugin = Network::loadPlugin(type);	if ( plugin ) {	    if ( plugin->isActive(cfg) ) {		Network::stop();	    } else if ( plugin->isAvailable(cfg) ) {		Network::start(selfile);	    } else {		QMessageBox::information(this,tr("Error"),		    tr("<p>Service cannot be explicitly started."));	    }	} else {	    qWarning("No plugin type '%s' (%s)",type.latin1(),selfile.latin1());	}    }#else    base->remove->setEnabled( sel );    base->props->setEnabled( sel );#endif}void NetworkSettings::removeSetting(){    bool ch=FALSE;    QStringList::ConstIterator it = filelist.begin();    for (QListBoxItem* i=settings->firstItem(); i; i=i->next(), ++it) {	if ( i->selected() && QPEMessageBox::confirmDelete( 0,                     NetworkSettings::tr( "Network" ), i->text()) ) {	    removeSetting(*it);	    ch = TRUE;	}    }    if ( ch ) {	loadSettings();#ifndef QT_NO_COP	QCopEnvelope("QPE/Network", "choicesChanged()");#endif#ifdef QTOPIA_PHONE	updateActions();#else	serviceSelected();#endif    }}void NetworkSettings::removeSetting(const QString& cfgfile){#ifdef QWS    Config cfg(cfgfile, Config::File);    cfg.setGroup("Info");    QString type = cfg.readEntry("Type");    NetworkInterface* plugin = Network::loadPlugin(type);    if ( plugin ) {	if ( !plugin->remove(cfg) )	    return;    }#endif    QFile::remove(cfgfile);}void NetworkSettings::doProperties(){    QStringList::ConstIterator it = filelist.begin();    for (QListBoxItem* i=settings->firstItem(); i; i=i->next(), ++it) {	if ( i->selected() ) {	    doProperties(*it);	    loadSettings();#ifndef QT_NO_COP	    QCopEnvelope("QPE/Network", "choicesChanged()");#endif	    return;	}    }}void NetworkSettings::doProperties(const QString& cfgfile){#ifdef QWS    Config cfg(cfgfile, Config::File);    cfg.setGroup("Info");    QString type = cfg.readEntry("Type");    NetworkInterface* plugin = Network::loadPlugin(type);    if ( plugin ) {	cfg.setGroup("Properties");	plugin->doProperties(this, cfg);	updateCurrent();    }#endif}void NetworkSettings::updateCurrent(){#ifdef QTOPIA_PHONE    QStringList::ConstIterator it = filelist.begin();    int ind=0;    for (QListBoxItem* i=settings->firstItem(); i; i=i->next(), ++it, ++ind) {	Config cfg(*it, Config::File);	cfg.setGroup("Info");	QString type = cfg.readEntry("Type");	NetworkInterface* plugin = Network::loadPlugin(type);	if ( plugin ) {	    QString x;	    /* Not meaningful to user	    if ( plugin->isAvailable(cfg) )		x += tr(" (available)");	    */	    if ( plugin->isActive(cfg) )		x += tr(" (active)");	    if ( !x.isEmpty() )		settings->changeItem(		    Resource::loadPixmap("Network/" + type),		    cfg.readEntry("Name")+x,		    ind);	}    }#else    bool v = states->isVisible();    if ( v ) states->hide();    const QObjectList *l = states->children();    if ( l ) {	start: {	    QObjectListIt i(*l);	    while (i.current()) {		if (i.current()->isWidgetType()) {		    delete i.current();		    goto start;		}		++i;	    }	}    }    delete states->layout();#ifdef QWS    Network::addStateWidgets(states);#endif    if ( v ) states->show();#endif}void NetworkSettings::show(){    QWidget::show();    if ( firstshow ) {	firstshow = FALSE;	if ( settings->count()==0 ) {	    addSetting(TRUE);	    if ( settings->count()==0 ) {		// close (from inside show(), so be careful)		tid_close_self = startTimer(0);	    }	}    }}void NetworkSettings::timerEvent(QTimerEvent* e){    if ( e->timerId() == tid_close_self ) {	killTimer(tid_close_self);	tid_close_self=0;	close();	firstshow = TRUE;    }}void NetworkSettings::netMessage( const QCString& #ifdef QTOPIA_PHONE    msg, const QByteArray& data#else    , const QByteArray&#endif ){#ifdef QTOPIA_PHONE    if (msg == "progress(QString,int)" ) {	QDataStream stream(data,IO_ReadOnly);        QString p;        int flag;        stream >> p >> flag;	status->setText(p);    }#endif}void NetworkSettings::appMessage( const QCString& #ifdef QTOPIA_PHONE    msg, const QByteArray& data#else    , const QByteArray&#endif        ){#ifdef QTOPIA_PHONE    if (msg == "smsApplicationDatagram(SMSMessage)") {	QDataStream stream(data,IO_ReadOnly);	SMSMessage smsMessage;	stream >> smsMessage;	if (smsMessage.destinationPort() == 2948 ||	// WAP/OMA-style	    smsMessage.destinationPort() == 49999) {	// Nokia-style	    QBuffer pushpdu(smsMessage.applicationData());	    pushpdu.open(IO_ReadOnly);	    WspPduDecoder decoder(&pushpdu);	    WspPush push = decoder.decodePush();	    const WspField *field = push.header("Content-Type");	    QString tmp = (field ? field->value : QString());	    OtaReader *reader = 0;	    if (tmp.find("application/vnd.wap.connectivity-wbxml") >= 0) {		reader = new OtaReader( OtaReader::Wap );	    } else if (tmp.find("application/x-wap-prov.browser-settings")			    >= 0) {		reader = new OtaReader( OtaReader::Nokia );	    }	    if ( reader ) {		OtaCharacteristicList *list		    = reader->parseCharacteristics( push.data() );		QString xml = reader->toXml( push.data() );		qDebug("%s", xml.latin1());		delete reader;		if ( list ) {		    NetworkInterfaceProperties settings = list->toConfig();		    applyRemoteSettings( smsMessage.sender(), settings );		    delete list;		}	    }	}    }#endif}#ifdef QTOPIA_PHONEvoid NetworkSettings::applyRemoteSettings( const QString& from, const NetworkInterfaceProperties& settings ){    // Dump the settings to the debug stream.    settings.debugDump();    // Ask the user if they wish to apply the settings.    QString name = settings["name"].toString();    QString cfgfile;    QString text;    if ( name.isEmpty() )	text = tr("<qt>Received network settings.  Do you wish to apply them?</qt>");    else {	for ( QStringList::ConstIterator it = filelist.begin(); it!= filelist.end(); ++it ) {	    Config cfg(*it,Config::File);	    cfg.setGroup("Info");	    if ( cfg.readEntry("Id") == name ) {		cfgfile = *it;		break;	    }	}	if ( cfgfile.isEmpty() )	    text = tr("<qt>Received network settings for \"%1\".  Do you wish to apply them?</qt>").arg(name);	else	    text = tr("<qt>Received updated network settings for \"%1\".  Do you wish to apply them?</qt>").arg(name);    }    QMessageBox box( tr("Internet"), text, QMessageBox::NoIcon,		     QMessageBox::Ok | QMessageBox::Default,		     QMessageBox::Cancel, QMessageBox::NoButton );    if ( box.exec() != QMessageBox::Ok )	return;    // Set a default name based on the sender's phone number if necessary.    if ( name.isEmpty() ) {	name = from;	if ( name.length() > 0 && name[0] == '+' )	    name = name.mid(1);    }    if ( cfgfile.isEmpty() ) {	cfgfile = addSetting(QPEApplication::qpeDir()+"etc/network/OTAGPRS.conf",FALSE);	if ( cfgfile.isEmpty() ) {	    qWarning("Cannot create OTA GPRS network config");	    return;	}    }    Config cfg(cfgfile,Config::File);    cfg.setGroup("Info");    cfg.writeEntry("Id",name);    cfg.writeEntry("UserSelectable",1);    QString type = cfg.readEntry("Type");    NetworkInterface2* plugin = Network::loadPlugin2(type);    cfg.setGroup("Properties");    if ( plugin && plugin->setProperties(cfg,settings) )	return;    qWarning("Failed to set OTA properties");}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -