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

📄 packagewizard.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	QString d = cur->fullDescription();	if ( d.isEmpty() ) d = tr("No details.");	PackageDetails det(this,0,TRUE);	det.setCaption(tr("Package: %1").arg(cur->name()));	det.description->setText(d);	det.showMaximized();	cur->setSelected(det.exec());	updatePackageNext();    }}void PackageWizard::updateServerSelection(){    int nservers = 0;    QDict<void> dict;    bool dups=FALSE;    for (QListViewItem* i = servers->firstChild(); i; i = i->nextSibling()) {	ServerListItem* item = (ServerListItem*)i;	if ( dict.find(item->id()) ) {	    dups = TRUE;	    item->setDup(TRUE);	} else {	    item->setDup(FALSE);	}	dict.insert(item->id(),(void*)1);	if ( item->isOn() )	    nservers++;    }    setNextEnabled( page_servers, nservers>0 && !dups );}void PackageWizard::showPage( QWidget* w ){    if ( w != currentPage() ) {	committed = FALSE;	if ( w == page_servers ) {	} else if ( w == page_packages ) {	    if ( currentPage() == page_mode	      || currentPage() == page_servers ) {		// Slow, show page now		packagelist->clear();		PackageWizardBase::showPage(w);		qApp->processEvents();		updatePackageList();	    }	} else if ( w == page_share ) {	} else if ( w == page_location ) {	    if ( location->fileSystem() ) {		setNextEnabled( page_location, TRUE );	    } else {		setNextEnabled( page_location, FALSE );	    }	} else if ( w == page_confirmation ) {	    LabelMaker lm( confirmation );	    lm.addString( "<P>" );	    if ( mode_doc->isChecked() || mode_net->isChecked() ) {		if ( mode_doc->isChecked() )		    lm.addString( tr("Installing on %1","eg. SD card").arg(location->fileSystem()->name()) );		else		    lm.addString( tr("Installing from network to %1","eg. SD card").arg(location->fileSystem()->name()) );		lm.addString( "<ul>" );		for (QListViewItem* i = packagelist->firstChild(); i; i = i->nextSibling()) {		    PackageItem* item = (PackageItem*)i;		    if ( item->isSelected() )			lm.addPackage( item->name() );		}		lm.addString( "</ul>" );		finishButton()->setText(tr("Install"));	    } else if ( mode_rm->isChecked() ) {		lm.addString( tr("Uninstall:") );		lm.addString( "<ul>" );		for (QListViewItem* i = packagelist->firstChild(); i; i = i->nextSibling()) {		    PackageItem* item = (PackageItem*)i;		    if ( item->isSelected() )			lm.addPackage( item->name() );		}		lm.addString( "</ul>" );		finishButton()->setText(tr("Remove"));	    } else {		// Sharing not implemented	    }	}	setAppropriates();    }    PackageWizardBase::showPage(w);}bool PackageWizard::eventFilter( QObject * o, QEvent *e ){    if ( o == packagelist && e->type()==QEvent::Resize ) {	QFontMetrics fm = packagelist->fontMetrics();	int w0 = fm.width("xxxxxx")+packagelist->width()/6;	int w2 = fm.width("0000000")+4;	int w1 = packagelist->width()-w2-w0-packagelist->frameWidth()*2-	    packagelist->verticalScrollBar()->width();	packagelist->setColumnWidth(0,w0);	packagelist->setColumnWidth(1,w1);	packagelist->setColumnWidth(2,w2);    }    return FALSE;}void PackageWizard::newServer(){    ServerListItem* item;    if ( servername->isEnabled() || serverurl->text().isEmpty() ) {	int n=1;	bool dup=TRUE;	QString nm;	while (dup) {	    nm = tr("Package Feed");	    if ( n>1 )		nm += " "+QString::number(n);	    dup = FALSE;	    for (QListViewItem* i = servers->firstChild(); i; i = i->nextSibling()) {		ServerListItem* oitem = (ServerListItem*)i;		if ( ServerListItem::id(nm)==oitem->id() )		    dup = TRUE;	    }	    n++;	}	item = new ServerListItem(servers,nm);	item->setText(0, nm);	item->setText(1, "http://");    } else {	// allows one-level undo	item = new ServerListItem(servers,servername->text());	item->setText(1, serverurl->text());    }    item->setOn(TRUE);    editServer(item);}void PackageWizard::editServer(QListViewItem* i){    ServerListItem* item = (ServerListItem*)i;    if ( servername->isEnabled() ) {	disconnect( servername, SIGNAL(textChanged(const QString&)), this, SLOT(nameChanged(const QString&)) );	disconnect( serverurl, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&)) );    } else {	servername->setEnabled(TRUE);	serverurl->setEnabled(TRUE);    }    servername->setText( item->text(0) );    serverurl->setText( item->text(1) );    editedserver = item;    connect( servername, SIGNAL(textChanged(const QString&)), this, SLOT(nameChanged(const QString&)) );    connect( serverurl, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&)) );}void PackageWizard::removeServer(){    if (servers->childCount() > 0) {	disconnect( servername, SIGNAL(textChanged(const QString&)), this, SLOT(nameChanged(const QString&)) );	disconnect( serverurl, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&)) );	disconnect( servers, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(editServer(QListViewItem*)) );	//	// Point editserver at something legitimate.	//	delete editedserver;	if (!servers->selectedItem()) {	    servers->setSelected(servers->firstChild(), TRUE);	}	editedserver = (ServerListItem*)servers->selectedItem();	connect( servers, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(editServer(QListViewItem*)) );	//	// Disable edits if there are no more servers.	//	if (!editedserver) {	    servername->clear();	    serverurl->clear();	    servername->setEnabled(FALSE);	    serverurl->setEnabled(FALSE);	} else {	    servername->setText(editedserver->text(0));	    serverurl->setText(editedserver->text(1));	}    }}void PackageWizard::nameChanged(const QString& t){    disconnect( servers, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(editServer(QListViewItem*)) );    editedserver->setText(0,t);    connect( servers, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(editServer(QListViewItem*)) );    updateServerSelection();}void PackageWizard::urlChanged(const QString& t){    editedserver->setText(1,t);}/*static void selectComboItem(QComboBox *cb, const QString s){    for (int i=0; i<cb->count(); i++) {	if ( cb->text(i) == s ) {	    cb->setCurrentItem(i);	    return;	}    }}*/void PackageWizard::updatePackageList(){    packagelist->clear();    if ( mode_doc->isChecked() ) {	insertLocalPackageItems();	setNextEnabled( page_packages, FALSE );    } else if ( mode_net->isChecked() ) {	writeSettings();	QString out;	runIpkg("update",out); // No tr	insertPackageItems(FALSE);    } else {	insertPackageItems(TRUE);    }}void PackageWizard::insertLocalPackageItems(){    QDict<void> installed = installedPackages();    DocLnkSet docs;    Global::findDocuments(&docs,"application/ipkg");    for (QListIterator<DocLnk> it(docs.children()); it.current(); ++it) {	const DocLnk& lnk = **it;	// only show un-installed packages.	if (!installed.find(packageId(lnk.file()))) {	    PackageItem* item = new PackageItem(packagelist,lnk,		    FALSE);	    if ( !item->parseInfo() ) {		infoPending.append(item);		if ( infoPending.count() == 1 )		    startInfoProcess();	    }	}    }}void PackageWizard::startInfoProcess(){    if ( infoPending.count() ) {	if ( !infoProcess ) {	    infoProcess = new QProcess(this);	    connect(infoProcess, SIGNAL(readyReadStdout()), this, SLOT(infoReadyRead()));	    connect(infoProcess, SIGNAL(readyReadStderr()), this, SLOT(infoReadError()));	    connect(infoProcess, SIGNAL(processExited()), this, SLOT(infoDone()));	}	info="";	infoProcess->clearArguments();	infoProcess->addArgument("qipkg-info-file");	PackageItem* item = (PackageItem*)infoPending.at(0);	infoProcess->addArgument(item->file());	infoProcess->start();	infoProcess->setPriority(infoProcess->priority()+20); // dont hog CPU    }}void PackageWizard::infoReadyRead(){    while ( infoProcess->canReadLineStdout() ) {        QString f = infoProcess->readLineStdout();	info.append("\n");	info.append(f);    }}void PackageWizard::infoReadError(){    // blabber from tar}void PackageWizard::infoDone(){    PackageItem* item = (PackageItem*)infoPending.take(0);    item->setInfo(info);    startInfoProcess();}QDict<void> PackageWizard::installedPackages(){    QDict<void> installed;    QString status = ipkgStatusOutput();    delete installedRootDict;    installedRootDict = 0;    if ( !status.isEmpty() ) {	QRegExp separatorRegExp( ":[\t ]+" );	QStringList lines = QStringList::split('\n',status,TRUE);	QString name;	QString status;	QString root;	for (QStringList::Iterator it = lines.begin(); it!=lines.end(); ++it) {	    QString line = *it;	    if ( line.length()<=1 ) {		// EOR		if ( !name.isEmpty() ) {		    if ( status.contains(" installed") ) { // No tr			installed.replace(name,(void*)1);			if ( !root.isEmpty() && root != "/" ) {			    if ( !installedRootDict ) {				installedRootDict = new QDict<QString>;				installedRootDict->setAutoDelete( TRUE );			    }			    installedRootDict->replace( name, new QString(root) );			}		    }		    name=QString::null;		}		status=QString::null;		root=QString::null;	    } else if ( line[0] == ' ' || line[0] == '\t' ) {		// continuation	    } else {		int sep = line.find(separatorRegExp);		if ( sep >= 0 ) {		    QString tag = line.left(sep);		    if ( tag == "Package" ) { // No tr			name = line.mid(sep+2).simplifyWhiteSpace();		    } else if ( tag == "Status" ) { // No tr			status = line.mid(sep+1);		    } else if ( tag == "Root" )  { // No tr			root = line.mid(sep+2).simplifyWhiteSpace();		    }		}	    }	}    }    return installed;}void PackageWizard::insertPackageItems(bool installed_only){    QDict<void> installed = installedPackages();    QString info = ipkgInfoOutput();    if ( !info.isEmpty() ) {	QStringList lines = QStringList::split('\n',info,TRUE);	QStringList record;	for (QStringList::Iterator it = lines.begin(); it!=lines.end(); ++it) {	    QString line = *it;	    if ( line.length()<=1 ) {		// EOR		QString description_short;		QString description;		QString name;		QString size;		QString sec;		if ( parseInfo(record, name, description_short, description, size, sec) ) {		    bool inst = installed.find(name);		    if ( installed_only == inst ) {			new PackageItem(packagelist,name,description_short,description,size,inst);			installed.remove( name );		    }		}		record.clear();	    } else {		record.append(line);	    }	}    }    if ( installed_only && installed.count() ) {	// we have some packages without description	QDictIterator<void> it( installed );	for( ; it.current(); ++it ) {	    new PackageItem( packagelist, it.currentKey(), "", "?" , "?", TRUE );	}    }}void PackageWizard::revertFailedInstalls(QString& out){    QStringList failed;    QString status = ipkgStatusOutput();    if ( !status.isEmpty() ) {	QRegExp separatorRegExp( ":[\t ]+" );	QStringList lines = QStringList::split('\n',status,TRUE);	QString name;	QString status;	for (QStringList::Iterator it = lines.begin(); it!=lines.end(); ++it) {	    QString line = *it;	    if ( line.length()<=1 ) {		// EOR		if ( !name.isEmpty() ) {		    if ( status.contains(" not-installed") ) // No tr			failed.append(name);		    name="";		}		status="";	    } else if ( line[0] == ' ' || line[0] == '\t' ) {		// continuation	    } else {		int sep = line.find(separatorRegExp);		if ( sep >= 0 ) {		    QString tag = line.left(sep);		    if ( tag == "Package" ) { // No tr			name = line.mid(sep+2).simplifyWhiteSpace();		    } else if ( tag == "Status" ) { // No tr			status = line.mid(sep+1);		    }		}	    }	}    }    for (QStringList::Iterator it = failed.begin(); it!=failed.end(); ++it) {	QString e;	runIpkg(QStringList() << "remove" << *it, e); // No tr	out += e;    }}PackageItem* PackageWizard::current() const{    return (PackageItem*)packagelist->currentItem();}/* void PackageWizard::doCurrentDetails(bool multi){    PackageItem* pit = current();    if ( pit ) {	if ( !details ) {	    details = new PackageDetails;	    connect( details->install, SIGNAL(clicked()),		    this, SLOT(installCurrent()));	    connect( details->remove, SIGNAL(clicked()),		    this, SLOT(removeCurrent()));	    details->description->setTextFormat(RichText);	}	if ( multi ) {	    disconnect( details->ignore, SIGNAL(clicked()),		    details, SLOT(close()));	    connect( details->ignore, SIGNAL(clicked()),		    this, SLOT(doNextDetails()));	} else {	    disconnect( details->ignore, SIGNAL(clicked()),		    this, SLOT(doNextDetails()));	    connect( details->ignore, SIGNAL(clicked()),		    details, SLOT(close()));	}	pit->setSelected(FALSE);	details->setCaption("Package: " + pit->name()); // No tr	details->description->setText(fullDetails(pit->name()));	details->install->setEnabled(!pit->isInstalled());	details->remove->setEnabled(pit->isInstalled());	details->showMaximized();    }} *//*QString PackageWizard::fullDetails(const QString& pk){    QString status;    Process ipkg_status(QStringList() << "ipkg" << "info" << pk);    if ( ipkg_status.exec("",status) ) {	QStringList lines = QStringList::split('\n',status,TRUE);	QString description;	for (QStringList::Iterator it = lines.begin(); it!=lines.end(); ++it) {	    QString line = *it;	    if ( line == " ." ) {		description.append("<p>");	    } else if ( line[0] == ' ' || line[0] == '\t' ) {		// continuation		description.append(" ");		description.append(Qtopia::escapeString(line));	    } else {		int sep = line.find(QRegExp(":[\t ]+"));		if ( sep >= 0 ) {		    QString tag = line.left(sep);		    description.append("<br>");		    description.append("<b>");		    description.append(Qtopia::escapeString(tag));		    description.append(":</b> ");		    description.append(Qtopia::escapeString(line.mid(sep+2)));		} else {		    description.append(" ");		    description.append(Qtopia::escapeString(line));		}	    }	}	return description;    }    return QString::null;}*/bool PackageWizard::readIpkgConfig(const QString& conffile){    QFile conf(conffile);    ServerListItem* currentserver=0;    if ( conf.open(IO_ReadOnly) ) {	QTextStream s(&conf);	servers->clear();	ipkg_old=0;	while ( !s.atEnd() ) {	    QString l = s.readLine();	    QStringList token = QStringList::split(' ', l);	    if ( token[0] == "src" || token[0] == "#src" ) {		// script-based ipkg cannot handles spaces		QString name = token[1];		for (int i=0; i<(int)name.length(); ++i)		    if ( name[i]=='_' ) name[i] = ' ';		ServerListItem* item = new ServerListItem(servers,name);		currentserver=item;		item->setText(1, token[2]);		item->setOn( token[0] == "src" );	    } else if ( token[0] == "dest" ) {		// needs UI	    } else if ( token[0] == "option" ) { // No tr		// ### somehow need to use the settings from netsetup

⌨️ 快捷键说明

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