📄 newstuff.cpp.svn-base
字号:
displayMessage( i18n("Timeout. Check internet connection!"), Error );}void NewStuffDialog::slotSortingSelected( int sortType ) // SLOT{ d->itemsView->setSorting( sortType );}//BEGIN ProvidersList Loadingvoid NewStuffDialog::slotLoadProvidersList(){ // delete an eventually pending job. note that this method should be called once! if ( d->providersListJob.job ) d->providersListJob.job->kill(); // create a job that will feed providersList data KIO::TransferJob * job = KIO::get( KUrl( PROVIDERS_URL ), false /*refetch*/, false /*progress*/ ); connect( job, SIGNAL( data( KIO::Job *, const QByteArray & ) ), this, SLOT( slotProvidersListInfoData( KIO::Job *, const QByteArray & ) ) ); connect( job, SIGNAL( result( KJob * ) ), this, SLOT( slotProvidersListResult( KJob * ) ) ); // create a job description and data holder d->providersListJob.job = job; d->providersListJob.receivedData = ""; // start the 'network watchdog timer' d->networkTimer->start( 10*1000 ); // inform the user displayMessage( i18n("Loading providers list...") );}void NewStuffDialog::slotProvidersListInfoData( KIO::Job * job, const QByteArray & data ){ // safety checks if ( job != d->providersListJob.job || data.isEmpty() ) return; // append the data buffer to the 'receivedData' string d->providersListJob.receivedData.append( QString::fromUtf8( data ) );}void NewStuffDialog::slotProvidersListResult( KJob * job ){ // discard contents from older jobs if ( d->providersListJob.job != job ) return; // stop network watchdog d->networkTimer->stop(); // discard job pointer (will be deleted by itself) d->providersListJob.job = 0; // if there are no errors parse dom from xml data QDomDocument doc; if ( job->error() || d->providersListJob.receivedData.isEmpty() ) { displayMessage( i18n("Network: Error loading the list of providers!"), Error ); return; } else if ( d->providersListJob.receivedData.contains("404 Not Found") ) { displayMessage( i18n("Network: Cannot find the list of providers!"), Error ); return; } else if ( !doc.setContent( d->providersListJob.receivedData ) ) { displayMessage( i18n("Problems reading the list of providers. Please retry later."), Info ); return; } // clear the current list of providers QList< Provider * >::iterator it = d->providers.begin(), iEnd = d->providers.end(); for ( ; it != iEnd; ++it ) delete *it; d->providers.clear(); d->typeCombo->clear(); // fill in the list of providers QDomNode providerNode = doc.documentElement().firstChild(); while ( !providerNode.isNull() ) { QDomElement elem = providerNode.toElement(); providerNode = providerNode.nextSibling(); if ( elem.tagName() == "provider" ) d->providers.append( new Provider( elem ) ); } // inform user about providers in the list if ( d->providers.count() < 1 ) { displayMessage( i18n("No providers available at the moment. Please retry later."), Info ); return; } else displayMessage( i18n("Loaded %1 providers", d->providers.count() ) ); // update the providers ComboBox for ( it = d->providers.begin(), iEnd = d->providers.end(); it != iEnd; ++it ) { const Provider * provider = *it; // provider icon: using local KIconLoader, not loading from remote url QIcon icon = DesktopIconSet( provider->icon().url(), 16 ); QString name = provider->name(); // insert provider in combo d->typeCombo->addItem( icon, name ); } // automatically load the first provider d->typeCombo->setEnabled( true ); d->typeCombo->setCurrentIndex( 0 ); QTimer::singleShot( 500, this, SLOT( slotLoadProvider() ) );}//END ProvidersList Loading//BEGIN Provider contents Loadingvoid NewStuffDialog::slotLoadProvider( int pNumber ){ // safety check if ( !d->typeCombo->isEnabled() || pNumber < 0 || pNumber >= (int)d->providers.count() ) { displayMessage( i18n("Error with this provider"), Error ); return; } // create a job that will feed provider data const Provider * provider = d->providers[ pNumber ]; KIO::TransferJob * job = KIO::get( provider->downloadUrl(), false /*refetch*/, false /*progress*/ ); connect( job, SIGNAL( data( KIO::Job *, const QByteArray & ) ), this, SLOT( slotProviderInfoData( KIO::Job *, const QByteArray & ) ) ); connect( job, SIGNAL( result( KJob * ) ), this, SLOT( slotProviderInfoResult( KJob * ) ) ); // create a job description and data holder ProviderJobInfo info; d->providerJobs[ job ] = info; // inform the user displayMessage( i18n( "Loading %1...", provider->name() ) ); // start the 'network watchdog timer' d->networkTimer->start( 30*1000 ); // block any possible recourring calls while we're running d->typeCombo->setEnabled( false );}void NewStuffDialog::slotProviderInfoData( KIO::Job * job, const QByteArray & data ){ // safety checks if ( data.isEmpty() || !d->providerJobs.contains( job ) ) return; // append the data buffer to the 'receivedData' string d->providerJobs[ job ].receivedData.append( QString::fromUtf8( data ) );}void NewStuffDialog::slotProviderInfoResult( KJob * job ){ // stop network watchdog d->networkTimer->stop(); // enable gui controls d->typeCombo->setEnabled( true ); d->sortCombo->setEnabled( true ); // safety check if ( job->error() || !d->providerJobs.contains( job ) || d->providerJobs[ job ].receivedData.isEmpty() || d->providerJobs[ job ].receivedData.contains("404 Not Found") ) { d->providerJobs.remove( job ); displayMessage( i18n("Error loading provider description!"), Error ); return; } // build XML DOM from the received data QDomDocument doc; bool docOk = doc.setContent( d->providerJobs[ job ].receivedData ); d->providerJobs.remove( job ); if ( !docOk ) { displayMessage( i18n("Problems parsing provider description."), Info ); return; } // create AvailableItem(s) based on the knewstuff.dtd AvailableItem::List itemList; QDomNode stuffNode = doc.documentElement().firstChild(); while ( !stuffNode.isNull() ) { QDomElement elem = stuffNode.toElement(); stuffNode = stuffNode.nextSibling(); // WARNING: disabled the stuff type checking (use only in kate afaik) if ( elem.tagName() == "stuff" /*&& elem.attribute( "type", RES_TYPE ) == RES_TYPE*/ ) itemList.append( new AvailableItem( elem ) ); } // update the control widget and inform user about the current operation d->itemsView->setItems( itemList ); if ( itemList.count() ) displayMessage( i18n("There are %1 resources available.", itemList.count() ) ); else displayMessage( i18n("No resources available on this provider." ) );}//END Provider contents loading//BEGIN File(s) Transferringvoid NewStuffDialog::slotDownloadItem( AvailableItem * item ){ // create a job that will download the file KIO::FileCopyJob * job = KIO::file_copy( item->url(), item->destinationPath(), -1 /*perms*/, true /*overwrite*/, false /*resume*/, false /*showProgressInfo*/ ); connect( job, SIGNAL( infoMessage( KJob *, const QString & ) ), this, SLOT( slotItemMessage( KJob *, const QString & ) ) ); connect( job, SIGNAL( percent ( KJob *, unsigned long ) ), this, SLOT( slotItemPercentage( KJob *, unsigned long ) ) ); connect( job, SIGNAL( result( KJob * ) ), this, SLOT( slotItemResult( KJob * ) ) ); // create a job description and data holder ItemTransferInfo info; info.item = item; d->transferJobs[ job ] = info; // update item status item->setState( AvailableItem::Installing ); item->setProgress( 0.0 ); d->itemsView->updateItem( item ); // inform the user displayMessage( i18n( "Installing '%1', this could take some time ...", item->name() ) );}void NewStuffDialog::slotItemMessage( KJob * job, const QString & message ){ // safety check if ( !d->transferJobs.contains( job ) ) return; // update item state AvailableItem * item = d->transferJobs[ job ].item; kDebug() << "Name: " << item->name() << " msg: '" << message << "'." << endl; d->itemsView->updateItem( item );}void NewStuffDialog::slotItemPercentage( KJob * job, unsigned long percent ){ // safety check if ( !d->transferJobs.contains( job ) ) return; // update item state AvailableItem * item = d->transferJobs[ job ].item; item->setProgress( (float)percent / 100.0 ); d->itemsView->updateItem( item );}void NewStuffDialog::slotItemResult( KJob * job ){ // safety check if ( !d->transferJobs.contains( job ) ) return; // get item and remove job AvailableItem * item = d->transferJobs[ job ].item; d->transferJobs.remove( job ); // error handling if ( job->error() ) { displayMessage( i18n( "Network error while retrieving %1. Installation canceled.", item->name() ), Error ); return; } // update item state item->setState( AvailableItem::Normal ); item->setProgress( 100.0 ); d->itemsView->updateItem( item ); /* UNCOMPRESS (specify uncompression method) KTar tar( fileName, "application/x-gzip" ); tar.open( QIODevice::ReadOnly ); const KArchiveDirectory *dir = tar.directory(); dir->copyTo( "somedir" ); tar.close(); QFile::remove( fileName ); */ /* EXECUTE (specify the 'cmd' command) QStringList list = QStringList::split( " ", cmd ), list2; for ( QStringList::iterator it = list.begin(); it != list.end(); it++ ) list2 << (*it).replace("%f", fileName); KProcess proc; proc << list2; proc.start( KProcess::Block ); */ // inform the user ... displayMessage( i18n( "Installed! %1 is yours now.", item->name() ), Info ); // ... and any listening object emit installedFile( item->name(), item->category() );}//END File(s) Transferring#include "newstuff.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -