void KEquityPriceUpdateDlg::slotQuoteFailed(const QString& _id, const QString& _symbol) { QList<QTreeWidgetItem*> foundItems = lvEquityList->findItems(_id, Qt::MatchExactly, ID_COL); QTreeWidgetItem* item = 0; if (! foundItems.empty()) item = foundItems.at(0); // Give the user some options int result; if (_id.contains(" ")) { result = KMessageBox::warningContinueCancel(this, i18n("Failed to retrieve an exchange rate for %1 from %2. It will be skipped this time.", _symbol, item->text(SOURCE_COL)), i18n("Price Update Failed")); } else { result = KMessageBox::questionYesNoCancel(this, QString("<qt>%1</qt>").arg(i18n("Failed to retrieve a quote for %1 from %2. Press <b>No</b> to remove the online price source from this security permanently, <b>Yes</b> to continue updating this security during future price updates or <b>Cancel</b> to stop the current update operation.", _symbol, item->text(SOURCE_COL))), i18n("Price Update Failed"), KStandardGuiItem::yes(), KStandardGuiItem::no()); } if (result == KMessageBox::No) { // Disable price updates for this security MyMoneyFileTransaction ft; try { // Get this security (by ID) MyMoneySecurity security = MyMoneyFile::instance()->security(_id.toUtf8()); // Set the quote source to blank security.setValue("kmm-online-source", QString()); security.setValue("kmm-online-quote-system", QString()); // Re-commit the security MyMoneyFile::instance()->modifySecurity(security); ft.commit(); } catch (const MyMoneyException &e) { KMessageBox::error(this, QString("<qt>") + i18n("Cannot update security <b>%1</b>: %2", _symbol, e.what()) + QString("</qt>"), i18n("Price Update Failed")); } } // As long as the user doesn't want to cancel, move on! if (result != KMessageBox::Cancel) { QTreeWidgetItem* next = 0; prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); item->setSelected(false); // launch the NEXT one ... in case of m_fUpdateAll == false, we // need to parse the list to find the next selected one next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); if (!m_fUpdateAll) { while (next && !next->isSelected()) { prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); } } if (next) { m_webQuote.launch(next->text(SYMBOL_COL), next->text(ID_COL), next->text(SOURCE_COL)); } else { finishUpdate(); } } else { finishUpdate(); } }
void FvUpdater::finishUpdate(QString pathToFinish) { pathToFinish = pathToFinish.isEmpty() ? QCoreApplication::applicationDirPath() : pathToFinish; QDir appDir(pathToFinish); appDir.setFilter( QDir::Files | QDir::Dirs ); QFileInfoList dirEntries = appDir.entryInfoList(); foreach (QFileInfo fi, dirEntries) { if ( fi.isDir() ) { QString dirname = fi.fileName(); if ((dirname==".") || (dirname == "..")) continue; // recursive clean up subdirectory finishUpdate(fi.filePath()); } else { if(fi.suffix()=="oldversion") if( !appDir.remove( fi.absoluteFilePath() ) ) qDebug()<<"Error: Unable to clean up file: "<<fi.absoluteFilePath(); } } // For each dir entry END }
bool DCCollector::initiateTCPUpdate( int cmd, ClassAd* ad1, ClassAd* ad2, bool nonblocking ) { if( update_rsock ) { delete update_rsock; update_rsock = NULL; } if(nonblocking) { UpdateData *ud = new UpdateData(cmd, Sock::reli_sock, ad1, ad2, this); // Note that UpdateData automatically adds itself to the pending_update_list. if (this->pending_update_list.size() == 1) { startCommand_nonblocking(cmd, Sock::reli_sock, 20, NULL, UpdateData::startUpdateCallback, ud ); } return true; } Sock *sock = startCommand(cmd, Sock::reli_sock, 20); if(!sock) { newError( CA_COMMUNICATION_ERROR, "Failed to send TCP update command to collector" ); dprintf(D_ALWAYS,"Failed to send update to %s.\n",idStr()); return false; } update_rsock = (ReliSock *)sock; return finishUpdate( this, update_rsock, ad1, ad2 ); }
void DefinitionUpdater::checkReply() { // check for server side redirection QVariant redir = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (!redir.isNull()) { reply->deleteLater(); // start update again with redirected URL url = redir.toUrl(); update(); return; } // final URL found -> get data reply->deleteLater(); reply = qnam.get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), this, SLOT(finishUpdate())); connect(reply, SIGNAL(readyRead()), this, SLOT(checkVersion())); }
void Updater::requestNext() { if( !canMakeUpdate() ) { return; } ++m_currentAdIndex; if( m_currentAdIndex < cTotalNumberOfAds ) { constructAdUrl(); requestLastModfied(); } else { finishUpdate(); } }
bool DCCollector::sendTCPUpdate( int cmd, ClassAd* ad1, ClassAd* ad2, bool nonblocking ) { dprintf( D_FULLDEBUG, "Attempting to send update via TCP to collector %s\n", update_destination ); if( ! update_rsock ) { // we don't have a TCP sock for sending an update. we've // got to create one. this is a somewhat complicated // process, since we've got to create a ReliSock, connect // to the collector, and start a security session. // unfortunately, the only way to start a security session // is to send an initial command, so we'll handle that // update at the same time. if the security API changes // in the future, we'll be able to make this code a little // more straight-forward... return initiateTCPUpdate( cmd, ad1, ad2, nonblocking ); } // otherwise, we've already got our socket, it's connected, // the security session is going, etc. so, all we have to do // is send the actual update to the existing socket. the only // thing we have to watch out for is if the collector // invalidated our cached socket, and if so, we'll have to // start another connection. // since finishUpdate() assumes we've already sent the command // int, and since we do *NOT* want to use startCommand() again // on a cached TCP socket, just code the int ourselves... update_rsock->encode(); update_rsock->put( cmd ); if( finishUpdate(this, update_rsock, ad1, ad2) ) { return true; } dprintf( D_FULLDEBUG, "Couldn't reuse TCP socket to update collector, " "starting new connection\n" ); delete update_rsock; update_rsock = NULL; return initiateTCPUpdate( cmd, ad1, ad2, nonblocking ); }
bool DCCollector::sendUDPUpdate( int cmd, ClassAd* ad1, ClassAd* ad2, bool nonblocking ) { // with UDP it's pretty straight forward. We always want to // use Daemon::startCommand() so we get all the security stuff // in every update. In fact, we want to recreate the SafeSock // itself each time, since it doesn't seem to work if we reuse // the SafeSock object from one update to the next... dprintf( D_FULLDEBUG, "Attempting to send update via UDP to collector %s\n", update_destination ); bool raw_protocol = false; if( cmd == UPDATE_COLLECTOR_AD || cmd == INVALIDATE_COLLECTOR_ADS ) { // we *never* want to do security negotiation with the // developer collector. raw_protocol = true; } if(nonblocking) { UpdateData *ud = new UpdateData(cmd, Sock::safe_sock, ad1, ad2, this); if (this->pending_update_list.size() == 1) { startCommand_nonblocking(cmd, Sock::safe_sock, 20, NULL, UpdateData::startUpdateCallback, ud, NULL, raw_protocol ); } return true; } Sock *ssock = startCommand(cmd, Sock::safe_sock, 20, NULL, NULL, raw_protocol); if(!ssock) { newError( CA_COMMUNICATION_ERROR, "Failed to send UDP update command to collector" ); return false; } bool success = finishUpdate( this, ssock, ad1, ad2 ); delete ssock; return success; }
void KEquityPriceUpdateDlg::slotReceivedQuote(const QString& _id, const QString& _symbol, const QDate& _date, const double& _price) { QList<QTreeWidgetItem*> foundItems = lvEquityList->findItems(_id, Qt::MatchExactly, ID_COL); QTreeWidgetItem* item = 0; if (! foundItems.empty()) item = foundItems.at(0); QTreeWidgetItem* next = 0; if (item) { if (_price > 0.0f && _date.isValid()) { QDate date = _date; if (date > QDate::currentDate()) date = QDate::currentDate(); double price = _price; QString id = _id.toUtf8(); MyMoneySecurity sec; if (_id.contains(" ") == 0) { MyMoneySecurity security = MyMoneyFile::instance()->security(id); QString factor = security.value("kmm-online-factor"); if (!factor.isEmpty()) { price *= MyMoneyMoney(factor).toDouble(); } try { sec = MyMoneyFile::instance()->security(id); sec = MyMoneyFile::instance()->security(sec.tradingCurrency()); } catch (const MyMoneyException &) { sec = MyMoneySecurity(); } } else { QRegExp splitrx("([0-9a-z\\.]+)[^a-z0-9]+([0-9a-z\\.]+)", Qt::CaseInsensitive); if (splitrx.indexIn(_id) != -1) { try { sec = MyMoneyFile::instance()->security(splitrx.cap(2).toUtf8()); } catch (const MyMoneyException &) { sec = MyMoneySecurity(); } } } item->setText(PRICE_COL, KGlobal::locale()->formatMoney(price, sec.tradingSymbol(), KMyMoneyGlobalSettings::pricePrecision())); item->setText(DATE_COL, date.toString(Qt::ISODate)); logStatusMessage(i18n("Price for %1 updated (id %2)", _symbol, _id)); // make sure to make OK button available btnOK->setEnabled(true); } else { logErrorMessage(i18n("Received an invalid price for %1, unable to update.", _symbol)); } prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); item->setSelected(false); // launch the NEXT one ... in case of m_fUpdateAll == false, we // need to parse the list to find the next selected one next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); if (!m_fUpdateAll) { while (next && !next->isSelected()) { prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); } } } else { logErrorMessage(i18n("Received a price for %1 (id %2), but this symbol is not on the list. Aborting entire update.", _symbol, _id)); } if (next) { m_webQuote.launch(next->text(SYMBOL_COL), next->text(ID_COL), next->text(SOURCE_COL)); } else { finishUpdate(); } }