/usr/include/libktorrent/dht/database.h is in libktorrent-dev 1.3.1-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | /***************************************************************************
* Copyright (C) 2005 by Joris Guisson *
* joris.guisson@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef DHTDATABASE_H
#define DHTDATABASE_H
#include <qmap.h>
#include <qlist.h>
#include <net/address.h>
#include <util/ptrmap.h>
#include <util/constants.h>
#include <util/array.h>
#include "key.h"
namespace dht
{
/// Each item may only exist for 30 minutes
const bt::Uint32 MAX_ITEM_AGE = 30 * 60 * 1000;
/**
* @author Joris Guisson
*
* Item in the database, will keep track of an IP and port combination.
* As well as the time it was inserted.
*/
class DBItem
{
public:
DBItem();
DBItem(const net::Address & addr);
DBItem(const DBItem & item);
virtual ~DBItem();
/// See if the item is expired
bool expired(bt::TimeStamp now) const;
/// Get the address of an item
const net::Address & getAddress() const {return addr;}
/**
* Pack this item into a buffer, the buffer needs to big enough to handle IPv6 addresses (so 16 + 2 (for the port))
* @param buf The buffer
* @return The number of bytes used
*/
bt::Uint32 pack(bt::Uint8* buf) const;
DBItem & operator = (const DBItem & item);
private:
net::Address addr;
bt::TimeStamp time_stamp;
};
typedef QList<DBItem> DBItemList;
/**
* @author Joris Guisson
*
* Class where all the key value paires get stored.
*/
class Database
{
public:
Database();
virtual ~Database();
/**
* Store an entry in the database
* @param key The key
* @param dbi The DBItem to store
*/
void store(const dht::Key & key, const DBItem & dbi);
/**
* Get max_entries items from the database, which have
* the same key, items are taken randomly from the list.
* If the key is not present no items will be returned, if
* there are fewer then max_entries items for the key, all
* entries will be returned
* @param key The key to search for
* @param dbl The list to store the items in
* @param max_entries The maximum number entries
* @param ip_version Wanted IP version (4 or 6)
*/
void sample(const dht::Key & key, DBItemList & dbl, bt::Uint32 max_entries, bt::Uint32 ip_version);
/**
* Expire all items older then 30 minutes
* @param now The time it is now
* (we pass this along so we only have to calculate it once)
*/
void expire(bt::TimeStamp now);
/**
* Generate a write token, which will give peers write access to
* the DB.
* @param addr The address of the peer
* @return A Key
*/
dht::Key genToken(const net::Address & addr);
/**
* Check if a received token is OK.
* @param token The token received
* @param addr The address of the peer
* @return true if the token was given to this peer, false other wise
*/
bool checkToken(const dht::Key & token, const net::Address & addr);
/// Test whether or not the DB contains a key
bool contains(const dht::Key & key) const;
/// Insert an empty item (only if it isn't already in the DB)
void insert(const dht::Key & key);
private:
bt::PtrMap<dht::Key, DBItemList> items;
QMap<dht::Key, bt::TimeStamp> tokens;
};
}
#endif
|