QVariantMap WebBridgeRS::downloadFile(QString qname, QString qhash, int qsize){ QVariantMap qdd; FileInfo fi; /* look up path */ if (rsFiles->alreadyHaveFile(RsFileHash(qhash.toStdString()), fi)){ qdd.insert("status","downloaded"); qdd.insert("path",QString::fromUtf8(fi.path.c_str())); qdd.insert("hash",QString::fromStdString(fi.hash.toStdString())); qdd.insert("fname",QString::fromUtf8(fi.fname.c_str())); qdd.insert("size",QString::number(fi.size)); return qdd; } // Get a list of available direct sources, in case the file is browsable only. // FileInfo finfo ; rsFiles->FileDetails(RsFileHash(qhash.toStdString()), RS_FILE_HINTS_REMOTE, finfo) ; std::list<RsPeerId> srcIds; for(std::list<TransferInfo>::const_iterator it(finfo.peers.begin());it!=finfo.peers.end();++it) { #ifdef DEBUG_RSLINK std::cerr << " adding peerid " << (*it).peerId << std::endl ; #endif srcIds.push_back((*it).peerId) ; } /*QString cleanname = link.name() ; static const QString bad_chars_str = "/\\\"*:?<>|" ; for(int i=0;i<cleanname.length();++i) for(int j=0;j<bad_chars_str.length();++j) if(cleanname[i] == bad_chars_str[j]) { cleanname[i] = '_'; flag |= RSLINK_PROCESS_NOTIFY_BAD_CHARS ; } */ if (rsFiles->FileRequest(qname.toStdString(), RsFileHash(qhash.toStdString()), qsize, "", RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds)) { //fileAdded.append(link.name()); //return true; qdd.insert("status","starting"); } else { //fileExist.append(link.name()); //return false; qdd.insert("status","downloading"); } return qdd; }
// return MHD_NO or MHD_YES virtual int handleRequest( struct MHD_Connection *connection, const char *url, const char */*method*/, const char */*version*/, const char */*upload_data*/, size_t */*upload_data_size*/) { if(rsFiles == 0) { sendMessage(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Error: rsFiles is null. Retroshare is probably not yet started."); return MHD_YES; } if(url[0] == 0 || (mHash=RsFileHash(url+strlen(FILESTREAMER_ENTRY_PATH))).isNull()) { sendMessage(connection, MHD_HTTP_NOT_FOUND, "Error: URL is not a valid file hash"); return MHD_YES; } FileInfo info; std::list<RsFileHash> dls; rsFiles->FileDownloads(dls); if(!(rsFiles->alreadyHaveFile(mHash, info) || std::find(dls.begin(), dls.end(), mHash) != dls.end())) { sendMessage(connection, MHD_HTTP_NOT_FOUND, "Error: file not existing on local peer and not downloading. Start the download before streaming it."); return MHD_YES; } mSize = info.size; struct MHD_Response* resp = MHD_create_response_from_callback( mSize, 1024*1024, &contentReadercallback, this, NULL); // only mp3 at the moment MHD_add_response_header(resp, "Content-Type", "audio/mpeg3"); secure_queue_response(connection, MHD_HTTP_OK, resp); MHD_destroy_response(resp); return MHD_YES; }
void WebBridgeRS::onDownloadComplete(QString hash) { QVariantMap qdd; FileInfo fi; /* look up path */ if (rsFiles->alreadyHaveFile(RsFileHash(hash.toStdString()), fi)){ qdd.insert("status","downloaded"); qdd.insert("path",QString::fromUtf8(fi.path.c_str())); qdd.insert("hash",QString::fromStdString(fi.hash.toStdString())); qdd.insert("fname",QString::fromUtf8(fi.fname.c_str())); qdd.insert("size",QString::number(fi.size)); emit rsDownloaded(qdd); } }
/** * @brief RsCollectionDialog::download: Start downloading checked items */ void RsCollectionDialog::download() { std::cerr << "Downloading!" << std::endl; QString dldir = QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()) ; std::cerr << "downloading all these files:" << std::endl; QTreeWidgetItemIterator itemIterator(ui._fileEntriesTW); QTreeWidgetItem *item; while ((item = *itemIterator) != NULL) { ++itemIterator; if (item->checkState(COLUMN_FILE) == Qt::Checked) { std::cerr << item->data(COLUMN_HASH,ROLE_NAME).toString().toStdString() << " " << item->text(COLUMN_HASH).toStdString() << " " << item->text(COLUMN_SIZE).toStdString() << " " << item->data(COLUMN_HASH,ROLE_PATH).toString().toStdString() << std::endl; ColFileInfo colFileInfo; colFileInfo.hash = item->text(COLUMN_HASH); colFileInfo.name = item->data(COLUMN_HASH,ROLE_NAME).toString(); colFileInfo.path = item->data(COLUMN_HASH,ROLE_PATH).toString(); colFileInfo.type = item->data(COLUMN_HASH,ROLE_TYPE).toUInt(); colFileInfo.size = item->data(COLUMN_SIZE,ROLE_SELSIZE).toULongLong(); QString cleanPath = dldir + colFileInfo.path ; std::cerr << "making directory " << cleanPath.toStdString() << std::endl; if(!QDir(QApplication::applicationDirPath()).mkpath(cleanPath)) QMessageBox::warning(NULL,QObject::tr("Unable to make path"),QObject::tr("Unable to make path:")+"<br> "+cleanPath) ; if (colFileInfo.type==DIR_TYPE_FILE) rsFiles->FileRequest(colFileInfo.name.toUtf8().constData(), RsFileHash(colFileInfo.hash.toStdString()), colFileInfo.size, cleanPath.toUtf8().constData(), RS_FILE_REQ_ANONYMOUS_ROUTING, std::list<RsPeerId>()); } else {//if (item->checkState(COLUMN_FILE) == Qt::Checked) std::cerr<<"Skipping file : " << item->data(COLUMN_HASH,ROLE_NAME).toString().toStdString() << std::endl; }//if (item->checkState(COLUMN_FILE) == Qt::Checked) }//while ((item = *itemIterator) != NULL) close(); }
QTreeWidgetItem *TurtleRouterDialog::findParentHashItem(const std::string& hash) { static const std::string null_hash = RsFileHash().toStdString() ; // look for the hash, and insert a new element if necessary. // QList<QTreeWidgetItem*> items = _f2f_TW->findItems((hash==null_hash)?tr("Unknown hashes"):QString::fromStdString(hash),Qt::MatchStartsWith) ; if(items.empty()) { QStringList stl ; stl.push_back((hash==null_hash)?tr("Unknown hashes"):QString::fromStdString(hash)) ; QTreeWidgetItem *item = new QTreeWidgetItem(_f2f_TW,stl) ; _f2f_TW->insertTopLevelItem(0,item) ; return item ; } else return items.front() ; }
/* download the recommendations... */ void MessageWidget::getcurrentrecommended() { MessageInfo msgInfo; if (rsMail->getMessage(currMsgId, msgInfo) == false) { return; } std::list<RsPeerId> srcIds; srcIds.push_back(msgInfo.rspeerid_srcId); QModelIndexList list = ui.msgList->selectionModel()->selectedIndexes(); std::map<int,FileInfo> files ; for (QModelIndexList::const_iterator it(list.begin());it!=list.end();++it) { FileInfo& fi(files[it->row()]) ; switch (it->column()) { case COLUMN_FILE_NAME: fi.fname = it->data().toString().toUtf8().constData(); break ; case COLUMN_FILE_SIZE: fi.size = it->data(Qt::UserRole).toULongLong() ; break ; case COLUMN_FILE_HASH: fi.hash = RsFileHash(it->data().toString().toStdString()) ; break ; } } for(std::map<int,FileInfo>::const_iterator it(files.begin());it!=files.end();++it) { const FileInfo& fi(it->second) ; std::cout << "Requesting file " << fi.fname << ", size=" << fi.size << ", hash=" << fi.hash << std::endl ; if (rsFiles->FileRequest(fi.fname, fi.hash, fi.size, "", RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds) == false) { QMessageBox mb(QObject::tr("File Request canceled"), QObject::tr("The following has not been added to your download list, because you already have it:")+"\n " + QString::fromUtf8(fi.fname.c_str()), QMessageBox::Critical, QMessageBox::Ok, 0, 0); mb.exec(); } } }
QVariantMap WebBridgeRS::fileDetails(QString qhash) { QVariantMap qdd; FileInfo finfo; /* look up path */ if (rsFiles->FileDetails(RsFileHash(qhash.toStdString()), RS_FILE_HINTS_EXTRA | RS_FILE_HINTS_DOWNLOAD, finfo)){ qdd.insert("status","found"); qdd.insert("path",QString::fromUtf8(finfo.path.c_str())); qdd.insert("hash",QString::fromStdString(finfo.hash.toStdString())); qdd.insert("fname",QString::fromUtf8(finfo.fname.c_str())); qdd.insert("size",QString::number(finfo.size)); qdd.insert("avail",QString::number(finfo.avail)); qdd.insert("downloadStatus",QString::number(finfo.downloadStatus)); qdd.insert("tfRate",QString::number(finfo.tfRate)); qdd.insert("transfered",QString::number(finfo.transfered)); } else { qdd.insert("status","notfound"); } return qdd; }
void NotifyQt::UpdateGUI() { if(RsAutoUpdatePage::eventsLocked()) return ; { QMutexLocker m(&_mutex) ; if(!_enabled) return ; } static bool already_updated = false ; // these only update once at start because they may already have been set before // the gui is running, then they get updated by callbacks. if(!already_updated) { emit messagesChanged() ; emit neighboursChanged(); emit configChanged(); already_updated = true ; } /* Finally Check for PopupMessages / System Error Messages */ if (rsNotify) { uint32_t sysid; uint32_t type; std::string title, id, msg; /* You can set timeToShow, timeToLive and timeToHide or can leave the standard */ ToasterItem *toaster = NULL; if (rsNotify->NotifyPopupMessage(type, id, title, msg)) { uint popupflags = Settings->getNotifyFlags(); switch(type) { case RS_POPUP_ENCRYPTED_MSG: SoundManager::play(SOUND_MESSAGE_ARRIVED); if ((popupflags & RS_POPUP_MSG) && !_disableAllToaster) { toaster = new ToasterItem(new MessageToaster("", tr("Encrypted message"), QString("[%1]").arg(tr("Encrypted message")))); } break; case RS_POPUP_MSG: SoundManager::play(SOUND_MESSAGE_ARRIVED); if ((popupflags & RS_POPUP_MSG) && !_disableAllToaster) { toaster = new ToasterItem(new MessageToaster(id, QString::fromUtf8(title.c_str()), QString::fromUtf8(msg.c_str()))); } break; case RS_POPUP_CONNECT: SoundManager::play(SOUND_USER_ONLINE); if ((popupflags & RS_POPUP_CONNECT) && !_disableAllToaster) { toaster = new ToasterItem(new OnlineToaster(RsPeerId(id))); } break; case RS_POPUP_DOWNLOAD: SoundManager::play(SOUND_DOWNLOAD_COMPLETE); if ((popupflags & RS_POPUP_DOWNLOAD) && !_disableAllToaster) { /* id = file hash */ toaster = new ToasterItem(new DownloadToaster(RsFileHash(id), QString::fromUtf8(title.c_str()))); } break; case RS_POPUP_CHAT: if ((popupflags & RS_POPUP_CHAT) && !_disableAllToaster) { // TODO: fix for distant chat, look up if dstant chat uses RS_POPUP_CHAT ChatDialog *chatDialog = ChatDialog::getChat(ChatId(RsPeerId(id))); ChatWidget *chatWidget; if (chatDialog && (chatWidget = chatDialog->getChatWidget()) && chatWidget->isActive()) { // do not show when active break; } toaster = new ToasterItem(new ChatToaster(RsPeerId(id), QString::fromUtf8(msg.c_str()))); } break; case RS_POPUP_GROUPCHAT: if ((popupflags & RS_POPUP_GROUPCHAT) && !_disableAllToaster) { MainWindow *mainWindow = MainWindow::getInstance(); if (mainWindow && mainWindow->isActiveWindow() && !mainWindow->isMinimized()) { if (MainWindow::getActivatePage() == MainWindow::Friends) { if (FriendsDialog::isGroupChatActive()) { // do not show when active break; } } } toaster = new ToasterItem(new GroupChatToaster(RsPeerId(id), QString::fromUtf8(msg.c_str()))); } break; case RS_POPUP_CHATLOBBY: if ((popupflags & RS_POPUP_CHATLOBBY) && !_disableAllToaster) { ChatId chat_id(id); ChatDialog *chatDialog = ChatDialog::getChat(chat_id); ChatWidget *chatWidget; if (chatDialog && (chatWidget = chatDialog->getChatWidget()) && chatWidget->isActive()) { // do not show when active break; } ChatLobbyDialog *chatLobbyDialog = dynamic_cast<ChatLobbyDialog*>(chatDialog); RsGxsId sender(title); if (!chatLobbyDialog || chatLobbyDialog->isParticipantMuted(sender)) break; // participant is muted toaster = new ToasterItem(new ChatLobbyToaster(chat_id.toLobbyId(), sender, QString::fromUtf8(msg.c_str()))); } break; case RS_POPUP_CONNECT_ATTEMPT: if ((popupflags & RS_POPUP_CONNECT_ATTEMPT) && !_disableAllToaster) { // id = gpgid // title = ssl name // msg = peer id toaster = new ToasterItem(new FriendRequestToaster(RsPgpId(id), QString::fromUtf8(title.c_str()), RsPeerId(msg))); } break; } } /*Now check Plugins*/ if (!toaster) { int pluginCount = rsPlugins->nbPlugins(); for (int i = 0; i < pluginCount; ++i) { RsPlugin *rsPlugin = rsPlugins->plugin(i); if (rsPlugin) { ToasterNotify *toasterNotify = rsPlugin->qt_toasterNotify(); if (toasterNotify) { toaster = toasterNotify->toasterItem(); continue; } } } } if (toaster) { /* init attributes */ toaster->widget->setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint); /* add toaster to waiting list */ //QMutexLocker lock(&waitingToasterMutex); waitingToasterList.push_back(toaster); } if (rsNotify->NotifySysMessage(sysid, type, title, msg)) { /* make a warning message */ switch(type) { case RS_SYS_ERROR: QMessageBox::critical(MainWindow::getInstance(), QString::fromUtf8(title.c_str()), QString::fromUtf8(msg.c_str())); break; case RS_SYS_WARNING: QMessageBox::warning(MainWindow::getInstance(), QString::fromUtf8(title.c_str()), QString::fromUtf8(msg.c_str())); break; default: case RS_SYS_INFO: QMessageBox::information(MainWindow::getInstance(), QString::fromUtf8(title.c_str()), QString::fromUtf8(msg.c_str())); break; } } if (rsNotify->NotifyLogMessage(sysid, type, title, msg)) { /* make a log message */ std::string logMesString = title + " " + msg; switch(type) { case RS_SYS_ERROR: case RS_SYS_WARNING: case RS_SYS_INFO: emit logInfoChanged(QString::fromUtf8(logMesString.c_str())); } } } /* Now start the waiting toasters */ startWaitingToasters(); }
void TurtleRouterDialog::updateTunnelRequests( const std::vector<std::vector<std::string> >& hashes_info, const std::vector<std::vector<std::string> >& tunnels_info, const std::vector<TurtleRequestDisplayInfo >& search_reqs_info, const std::vector<TurtleRequestDisplayInfo >& tunnel_reqs_info) { // now display this in the QTableWidgets QStringList stl ; // remove all children of top level objects for(int i=0;i<_f2f_TW->topLevelItemCount();++i) { QTreeWidgetItem *taken ; while( (taken = _f2f_TW->topLevelItem(i)->takeChild(0)) != NULL) delete taken ; } for(uint i=0;i<hashes_info.size();++i) findParentHashItem(hashes_info[i][0]) ; bool unknown_hash_found = false ; // check that an entry exist for all hashes for(uint i=0;i<tunnels_info.size();++i) { const std::string& hash(tunnels_info[i][3]) ; QTreeWidgetItem *parent = findParentHashItem(hash) ; if(parent->text(0).left(14) == tr("Unknown hashes")) unknown_hash_found = true ; QString str = tr("Tunnel id") + ": " + QString::fromUtf8(tunnels_info[i][0].c_str()) + "\t [" + QString::fromUtf8(tunnels_info[i][2].c_str()) + "] --> [" + QString::fromUtf8(tunnels_info[i][1].c_str()) + "]\t\t " + tr("last transfer") + ": " + QString::fromStdString(tunnels_info[i][4]) + "\t " + tr("Speed") + ": " + QString::fromStdString(tunnels_info[i][5]) ; stl.clear() ; stl.push_back(str) ; parent->addChild(new QTreeWidgetItem(stl)) ; } for(uint i=0;i<search_reqs_info.size();++i) { QString str = tr("Request id: %1\t from [%2]\t %3 secs ago").arg(search_reqs_info[i].request_id,0,16).arg(getPeerName(search_reqs_info[i].source_peer_id)).arg(search_reqs_info[i].age); stl.clear() ; stl.push_back(str) ; top_level_s_requests->addChild(new QTreeWidgetItem(stl)) ; } top_level_s_requests->setText(0, tr("Search requests") + "(" + QString::number(search_reqs_info.size()) + ")" ) ; for(uint i=0;i<tunnel_reqs_info.size();++i) if(i+MAX_TUNNEL_REQUESTS_DISPLAY >= tunnel_reqs_info.size() || i < MAX_TUNNEL_REQUESTS_DISPLAY) { QString str = tr("Request id: %1\t from [%2]\t %3 secs ago").arg(tunnel_reqs_info[i].request_id,0,16).arg(getPeerName(tunnel_reqs_info[i].source_peer_id)).arg(tunnel_reqs_info[i].age); stl.clear() ; stl.push_back(str) ; top_level_t_requests->addChild(new QTreeWidgetItem(stl)) ; } else if(i == MAX_TUNNEL_REQUESTS_DISPLAY) { stl.clear() ; stl.push_back(QString("...")) ; top_level_t_requests->addChild(new QTreeWidgetItem(stl)) ; } top_level_t_requests->setText(0, tr("Tunnel requests") + "("+QString::number(tunnel_reqs_info.size()) + ")") ; QTreeWidgetItem *unknown_hashs_item = findParentHashItem(RsFileHash().toStdString()) ; unknown_hashs_item->setText(0,tr("Unknown hashes") + " (" + QString::number(unknown_hashs_item->childCount())+QString(")")) ; // Ok, this is a N2 search, but there are very few elements in the list. for(int i=2;i<_f2f_TW->topLevelItemCount();) { bool found = false ; if(_f2f_TW->topLevelItem(i)->text(0).left(14) == tr("Unknown hashes") && unknown_hash_found) found = true ; if(_f2f_TW->topLevelItem(i)->childCount() > 0) // this saves uploading hashes found = true ; for(uint j=0;j<hashes_info.size() && !found;++j) if(_f2f_TW->topLevelItem(i)->text(0).toStdString() == hashes_info[j][0]) found=true ; if(!found) delete _f2f_TW->takeTopLevelItem(i) ; else ++i ; } }