📄 packagewizard.cpp
字号:
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 + -