Download::Download(UserConnection& conn, QueueItem& qi, const string& path, bool supportsTrees) throw() : Transfer(conn, path, qi.getTTH()), tempTarget(qi.getTempTarget()), file(0), treeValid(false) { conn.setDownload(this); if(qi.isSet(QueueItem::FLAG_PARTIAL_LIST)) { setType(TYPE_PARTIAL_LIST); } else if(qi.isSet(QueueItem::FLAG_USER_LIST)) { setType(TYPE_FULL_LIST); } if(qi.getSize() != -1) { if(HashManager::getInstance()->getTree(getTTH(), getTigerTree())) { setTreeValid(true); setSegment(qi.getNextSegment(getTigerTree().getBlockSize(), conn.getChunkSize())); } else if(supportsTrees && !qi.getSource(conn.getUser())->isSet(QueueItem::Source::FLAG_NO_TREE) && qi.getSize() > HashManager::MIN_BLOCK_SIZE) { // Get the tree unless the file is small (for small files, we'd probably only get the root anyway) setType(TYPE_TREE); getTigerTree().setFileSize(qi.getSize()); setSegment(Segment(0, -1)); } else { // Use the root as tree to get some sort of validation at least... getTigerTree() = TigerTree(qi.getSize(), qi.getSize(), getTTH()); setTreeValid(true); setSegment(qi.getNextSegment(getTigerTree().getBlockSize(), 0)); } } }
string SearchResult::toSR(const Client& c) const noexcept { // File: "$SR %s %s%c%s %d/%d%c%s (%s)|" // Directory: "$SR %s %s %d/%d%c%s (%s)|" string tmp; tmp.reserve(128); tmp.append("$SR ", 4); tmp.append(Text::fromUtf8(c.getMyNick(), c.get(HubSettings::NmdcEncoding))); tmp.append(1, ' '); string acpFile = Text::fromUtf8(path, c.get(HubSettings::NmdcEncoding)); if(type == TYPE_FILE) { tmp.append(acpFile); tmp.append(1, '\x05'); tmp.append(Util::toString(size)); } else { tmp.append(acpFile, 0, acpFile.length() - 1); } tmp.append(1, ' '); tmp.append(Util::toString(freeSlots)); tmp.append(1, '/'); tmp.append(Util::toString(totalSlots)); tmp.append(1, '\x05'); tmp.append("TTH:" + getTTH().toBase32()); tmp.append(" (", 2); tmp.append(c.getIpPort()); tmp.append(")|", 2); return tmp; }
double QxrdCenterFinder::getR(double x, double y) const { double tth = getTTH(x, y); double r = get_DetectorDistance()*tan(tth*M_PI/180.0); return r; }
AdcCommand Download::getCommand(bool zlib) { AdcCommand cmd(AdcCommand::CMD_GET); cmd.addParam(Transfer::names[getType()]); if(getType() == TYPE_PARTIAL_LIST) { cmd.addParam(Util::toAdcFile(getPath())); } else if(getType() == TYPE_FULL_LIST) { if(isSet(Download::FLAG_XML_BZ_LIST)) { cmd.addParam(USER_LIST_NAME_BZ); } else { cmd.addParam(USER_LIST_NAME); } } else { cmd.addParam("TTH/" + getTTH().toBase32()); } cmd.addParam(Util::toString(getStartPos())); cmd.addParam(Util::toString(getSize())); if(zlib && BOOLSETTING(COMPRESS_TRANSFERS)) { cmd.addParam("ZL1"); } return cmd; }
AdcCommand SearchResult::toRES(char type) const { AdcCommand cmd(AdcCommand::CMD_RES, type); cmd.addParam("SI", Util::toString(size)); cmd.addParam("SL", Util::toString(freeSlots)); cmd.addParam("FN", Util::toAdcFile(file)); cmd.addParam("TR", getTTH().toBase32()); return cmd; }
Download::Download(UserConnection& conn, QueueItem& qi, const string& path, bool supportsTrees) noexcept : Transfer(conn, path, qi.getTTH()), tempTarget(qi.getTempTarget()), file(0), treeValid(false) { conn.setDownload(this); QueueItem::SourceConstIter source = qi.getSource(getUser()); if(qi.isSet(QueueItem::FLAG_PARTIAL_LIST)) { setType(TYPE_PARTIAL_LIST); } else if(qi.isSet(QueueItem::FLAG_USER_LIST)) { setType(TYPE_FULL_LIST); } if(getType() == TYPE_FILE && qi.getSize() != -1) { if(HashManager::getInstance()->getTree(getTTH(), getTigerTree())) { setTreeValid(true); setSegment(qi.getNextSegment(getTigerTree().getBlockSize(), conn.getChunkSize(),conn.getSpeed(), source->getPartialSource())); } else if(supportsTrees && conn.isSet(UserConnection::FLAG_SUPPORTS_TTHL) && !qi.getSource(conn.getUser())->isSet(QueueItem::Source::FLAG_NO_TREE) && qi.getSize() > HashManager::MIN_BLOCK_SIZE) { // Get the tree unless the file is small (for small files, we'd probably only get the root anyway) setType(TYPE_TREE); getTigerTree().setFileSize(qi.getSize()); setSegment(Segment(0, -1)); } else { // Use the root as tree to get some sort of validation at least... getTigerTree() = TigerTree(qi.getSize(), qi.getSize(), getTTH()); setTreeValid(true); setSegment(qi.getNextSegment(getTigerTree().getBlockSize(), 0, 0, source->getPartialSource())); } if(getSegment().getOverlapped()) { setFlag(FLAG_OVERLAP); // set overlapped flag to original segment for(DownloadList::const_iterator i = qi.getDownloads().begin(); i != qi.getDownloads().end(); ++i) { if((*i)->getSegment().contains(getSegment())) { (*i)->setOverlapped(true); break; } } } } }
void Transfer::getParams(const UserConnection& aSource, StringMap& params) { params["userNI"] = aSource.getUser()->getNick(); params["userI4"] = aSource.getRemoteIp(); params["hub"] = aSource.getUser()->getClientName(); params["hubURL"] = aSource.getUser()->getClientUrl(); params["fileSI"] = Util::toString(getSize()); params["fileSIshort"] = Util::formatBytes(getSize()); params["fileSIchunk"] = Util::toString(getTotal()); params["fileSIchunkshort"] = Util::formatBytes(getTotal()); params["fileSIactual"] = Util::toString(getActual()); params["fileSIactualshort"] = Util::formatBytes(getActual()); params["speed"] = Util::formatBytes(getAverageSpeed()) + "/s"; params["time"] = Util::formatSeconds((GET_TICK() - getStart()) / 1000); params["fileTR"] = getTTH().toBase32(); }
AdcCommand SearchResult::toRES(char aType) const noexcept { AdcCommand cmd(AdcCommand::CMD_RES, aType); cmd.addParam("SI", Util::toString(size)); cmd.addParam("SL", Util::toString(freeSlots)); cmd.addParam("FN", Util::toAdcFile(path)); if (!SettingsManager::lanMode && type != TYPE_DIRECTORY) cmd.addParam("TR", getTTH().toBase32()); cmd.addParam("DM", Util::toString(date)); if (type == TYPE_DIRECTORY) { cmd.addParam("FI", Util::toString(files)); cmd.addParam("FO", Util::toString(folders)); } return cmd; }
const string& QueueItem::getTempTarget() { if(!isSet(QueueItem::FLAG_USER_LIST) && tempTarget.empty()) { if(!SETTING(TEMP_DOWNLOAD_DIRECTORY).empty() && (File::getSize(getTarget()) == -1)) { #ifdef _WIN32 dcpp::StringMap sm; if(target.length() >= 3 && target[1] == ':' && target[2] == '\\') sm["targetdrive"] = target.substr(0, 3); else sm["targetdrive"] = Util::getConfigPath().substr(0, 3); setTempTarget(Util::formatParams(SETTING(TEMP_DOWNLOAD_DIRECTORY), sm, false) + getTempName(getTargetFileName(), getTTH())); #else //_WIN32 setTempTarget(SETTING(TEMP_DOWNLOAD_DIRECTORY) + getTempName(getTargetFileName(), getTTH())); #endif //_WIN32 } } return tempTarget; }
MemoryInputStream* ShareManager::getTree(const string& virtualFile) const { TigerTree tree; if(virtualFile.compare(0, 4, "TTH/") == 0) { if(!HashManager::getInstance()->getTree(TTHValue(virtualFile.substr(4)), tree)) return nullptr; } else { try { TTHValue tth = getTTH(virtualFile); //if(!tth) { return nullptr; } HashManager::getInstance()->getTree(tth, tree); } catch(const Exception&) { return nullptr; } } ByteVector buf = tree.getLeafData(); return new MemoryInputStream(&buf[0], buf.size()); }
void Transfer::getParams(const UserConnection& aSource, StringMap& params) { params["userCID"] = aSource.getUser()->getCID().toBase32(); params["userNI"] = Util::toString(ClientManager::getInstance()->getNicks(aSource.getUser()->getCID(), aSource.getHubUrl())); params["userI4"] = aSource.getRemoteIp(); StringList hubNames = ClientManager::getInstance()->getHubNames(aSource.getUser()->getCID(), aSource.getHubUrl()); if(hubNames.empty()) hubNames.push_back(_("Offline")); params["hub"] = Util::toString(hubNames); StringList hubs = ClientManager::getInstance()->getHubs(aSource.getUser()->getCID(), aSource.getHubUrl()); if(hubs.empty()) hubs.push_back(_("Offline")); params["hubURL"] = Util::toString(hubs); params["fileSI"] = Util::toString(getSize()); params["fileSIshort"] = Util::formatBytes(getSize()); params["fileSIactual"] = Util::toString(getActual()); params["fileSIactualshort"] = Util::formatBytes(getActual()); params["speed"] = str(F_("%1%/s") % Util::formatBytes(getAverageSpeed())); params["time"] = Util::formatSeconds((GET_TICK() - getStart()) / 1000); params["fileTR"] = getTTH().toBase32(); }
AdcCommand Download::getCommand(bool zlib, const string& mySID) const { AdcCommand cmd(AdcCommand::CMD_GET); cmd.addParam(Transfer::names[getType()]); if(getType() == TYPE_PARTIAL_LIST) { if (isSet(Download::FLAG_TTHLIST_BUNDLE)) { //these must be converted to adc file when adding (if needed, no slash for bundle requests) cmd.addParam(getTempTarget()); } else { cmd.addParam(Util::toAdcFile(getTempTarget())); } } else if(getType() == TYPE_FULL_LIST) { if(isSet(Download::FLAG_XML_BZ_LIST)) { cmd.addParam(USER_LIST_NAME_BZ); } else { cmd.addParam(USER_LIST_NAME); } } else { cmd.addParam("TTH/" + getTTH().toBase32()); } cmd.addParam(Util::toString(getStartPos())); cmd.addParam(Util::toString(getSegmentSize())); if(!mySID.empty()) //add requester's SID (mySID) to the filelist request, so he can find the hub we are calling from. cmd.addParam("ID", mySID); if(zlib && SETTING(COMPRESS_TRANSFERS)) { cmd.addParam("ZL1"); } if(isSet(Download::FLAG_RECURSIVE) && getType() == TYPE_PARTIAL_LIST) { cmd.addParam("RE1"); } if(isSet(Download::FLAG_QUEUE) && getType() == TYPE_PARTIAL_LIST) { cmd.addParam("TL1"); } return cmd; }
void Transfer::getParams(const UserConnection& aSource, StringMap& params) const { params["userCID"] = aSource.getUser()->getCID().toBase32(); params["userNI"] = Util::toString(ClientManager::getInstance()->getNicks(aSource.getUser()->getCID(), aSource.getHubUrl())); params["userI4"] = aSource.getRemoteIp(); StringList hubNames = ClientManager::getInstance()->getHubNames(aSource.getUser()->getCID(), aSource.getHubUrl()); if(hubNames.empty()) hubNames.push_back(STRING(OFFLINE)); params["hub"] = Util::toString(hubNames); StringList hubs = ClientManager::getInstance()->getHubs(aSource.getUser()->getCID(), aSource.getHubUrl()); if(hubs.empty()) hubs.push_back(STRING(OFFLINE)); params["hubURL"] = Util::toString(hubs); params["fileSI"] = Util::toString(getSize()); params["fileSIshort"] = Util::formatBytes(getSize()); params["fileSIchunk"] = Util::toString(getPos()); params["fileSIchunkshort"] = Util::formatBytes(getPos()); params["fileSIactual"] = Util::toString(getActual()); params["fileSIactualshort"] = Util::formatBytes(getActual()); params["speed"] = Util::formatBytes(static_cast<int64_t>(getAverageSpeed())) + "/s"; params["time"] = Text::fromT(Util::formatSeconds((GET_TICK() - getStart()) / 1000)); params["fileTR"] = getTTH().toBase32(); }
ViewFilePtr ViewFileManager::addUserFileThrow(const string& aFileName, int64_t aSize, const TTHValue& aTTH, const HintedUser& aUser, bool aIsText) { if (ShareManager::getInstance()->isFileShared(aTTH)) { return addLocalFile(aTTH, aIsText); } if (aUser == ClientManager::getInstance()->getMe()) { return nullptr; } if (getFile(aTTH)) { return nullptr; } auto qi = QueueManager::getInstance()->addOpenedItem(aFileName, aSize, aTTH, aUser, true, aIsText); auto file = createFile(qi->getTarget(), qi->getTTH(), aIsText, false); if (file) { file->onAddedQueue(qi->getTarget(), qi->getSize()); } return file; }
AdcCommand Download::getCommand(bool zlib, const string& mySID) const noexcept { AdcCommand cmd(AdcCommand::CMD_GET); cmd.addParam(Transfer::names[getType()]); if(getType() == TYPE_PARTIAL_LIST) { cmd.addParam(getListDirectoryPath()); } else if(getType() == TYPE_FULL_LIST) { if(isSet(Download::FLAG_XML_BZ_LIST)) { cmd.addParam(USER_LIST_NAME_BZ); } else { cmd.addParam(USER_LIST_NAME); } } else { cmd.addParam("TTH/" + getTTH().toBase32()); } cmd.addParam(Util::toString(getStartPos())); cmd.addParam(Util::toString(getSegmentSize())); if(!mySID.empty()) //add requester's SID (mySID) to the filelist request, so he can find the hub we are calling from. cmd.addParam("ID", mySID); if(zlib && SETTING(COMPRESS_TRANSFERS)) { cmd.addParam("ZL1"); } if(isSet(Download::FLAG_RECURSIVE) && getType() == TYPE_PARTIAL_LIST) { cmd.addParam("RE1"); } if(isSet(Download::FLAG_QUEUE) && getType() == TYPE_PARTIAL_LIST) { cmd.addParam("TL1"); } return cmd; }
double QxrdCenterFinder::getTTH(QPointF pt) const { return getTTH(pt.x(), pt.y()); }
Download::Download(UserConnection& conn, QueueItem& qi) noexcept : Transfer(conn, qi.getTarget(), qi.getTTH()), tempTarget(qi.getTempTarget()) { conn.setDownload(this); QueueItem::SourceConstIter source = qi.getSource(getUser()); if(qi.isSet(QueueItem::FLAG_PARTIAL_LIST)) { setType(TYPE_PARTIAL_LIST); } else if(qi.isSet(QueueItem::FLAG_USER_LIST)) { setType(TYPE_FULL_LIST); } if(source->isSet(QueueItem::Source::FLAG_PARTIAL)) setFlag(FLAG_PARTIAL); if(qi.isSet(QueueItem::FLAG_CLIENT_VIEW)) setFlag(FLAG_VIEW); if(qi.isSet(QueueItem::FLAG_MATCH_QUEUE)) setFlag(FLAG_QUEUE); if(qi.isSet(QueueItem::FLAG_VIEW_NFO)) setFlag(FLAG_NFO); if(qi.isSet(QueueItem::FLAG_RECURSIVE_LIST)) setFlag(FLAG_RECURSIVE); if(qi.isSet(QueueItem::FLAG_TTHLIST_BUNDLE)) setFlag(FLAG_TTHLIST_BUNDLE); if (qi.getPriority() == QueueItemBase::HIGHEST) setFlag(FLAG_HIGHEST_PRIO); if (qi.getBundle()) { dcassert(!qi.isSet(QueueItem::FLAG_USER_LIST)); dcassert(!qi.isSet(QueueItem::FLAG_TEXT)); setBundle(qi.getBundle()); } if(getType() == TYPE_FILE && qi.getSize() != -1) { if(HashManager::getInstance()->getTree(getTTH(), getTigerTree())) { setTreeValid(true); setSegment(qi.getNextSegment(getTigerTree().getBlockSize(), conn.getChunkSize(), conn.getSpeed(), source->getPartialSource(), true)); qi.setBlockSize(getTigerTree().getBlockSize()); } else if(conn.isSet(UserConnection::FLAG_SUPPORTS_TTHL) && !source->isSet(QueueItem::Source::FLAG_NO_TREE) && qi.getSize() > HashManager::MIN_BLOCK_SIZE) { // Get the tree unless the file is small (for small files, we'd probably only get the root anyway) setType(TYPE_TREE); getTigerTree().setFileSize(qi.getSize()); setSegment(Segment(0, -1)); } else { // Use the root as tree to get some sort of validation at least... getTigerTree() = TigerTree(qi.getSize(), qi.getSize(), getTTH()); setTreeValid(true); setSegment(qi.getNextSegment(getTigerTree().getBlockSize(), 0, 0, source->getPartialSource(), true)); } if ((getStartPos() + getSegmentSize()) != qi.getSize() || (conn.getDownload() && conn.getDownload()->isSet(FLAG_CHUNKED))) { setFlag(FLAG_CHUNKED); } if(getSegment().getOverlapped()) { setFlag(FLAG_OVERLAP); // set overlapped flag to original segment for(auto d: qi.getDownloads()) { if(d->getSegment().contains(getSegment())) { d->setOverlapped(true); break; } } } } }
double QxrdCenterFinder::getDist(double x, double y) const { double tth = getTTH(x,y); return get_DetectorDistance()/cos(tth*M_PI/180.0); }