Hex Artifact Content
Not logged in

Artifact 605f06b62f06773db5303ea3e14e5739924c3303:


0000: 2f 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29  /* Copyright (c)
0010: 20 32 30 30 39 20 6d 61 69 64 73 61 66 65 2e 6e   2009 maidsafe.n
0020: 65 74 20 6c 69 6d 69 74 65 64 0a 41 6c 6c 20 72  et limited.All r
0030: 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2e 0a  ights reserved..
0040: 0a 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20  .Redistribution 
0050: 61 6e 64 20 75 73 65 20 69 6e 20 73 6f 75 72 63  and use in sourc
0060: 65 20 61 6e 64 20 62 69 6e 61 72 79 20 66 6f 72  e and binary for
0070: 6d 73 2c 20 77 69 74 68 20 6f 72 20 77 69 74 68  ms, with or with
0080: 6f 75 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  out modification
0090: 2c 0a 61 72 65 20 70 65 72 6d 69 74 74 65 64 20  ,.are permitted 
00a0: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 74 68  provided that th
00b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
00c0: 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
00d0: 0a 20 20 20 20 2a 20 52 65 64 69 73 74 72 69 62  .    * Redistrib
00e0: 75 74 69 6f 6e 73 20 6f 66 20 73 6f 75 72 63 65  utions of source
00f0: 20 63 6f 64 65 20 6d 75 73 74 20 72 65 74 61 69   code must retai
0100: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 6f 70 79  n the above copy
0110: 72 69 67 68 74 20 6e 6f 74 69 63 65 2c 0a 20 20  right notice,.  
0120: 20 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63    this list of c
0130: 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  onditions and th
0140: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63  e following disc
0150: 6c 61 69 6d 65 72 2e 0a 20 20 20 20 2a 20 52 65  laimer..    * Re
0160: 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 69 6e  distributions in
0170: 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d 75 73   binary form mus
0180: 74 20 72 65 70 72 6f 64 75 63 65 20 74 68 65 20  t reproduce the 
0190: 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 20  above copyright 
01a0: 6e 6f 74 69 63 65 2c 0a 20 20 20 20 74 68 69 73  notice,.    this
01b0: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64 69 74 69   list of conditi
01c0: 6f 6e 73 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c  ons and the foll
01d0: 6f 77 69 6e 67 20 64 69 73 63 6c 61 69 6d 65 72  owing disclaimer
01e0: 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
01f0: 61 74 69 6f 6e 0a 20 20 20 20 61 6e 64 2f 6f 72  ation.    and/or
0200: 20 6f 74 68 65 72 20 6d 61 74 65 72 69 61 6c 73   other materials
0210: 20 70 72 6f 76 69 64 65 64 20 77 69 74 68 20 74   provided with t
0220: 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 2e  he distribution.
0230: 0a 20 20 20 20 2a 20 4e 65 69 74 68 65 72 20 74  .    * Neither t
0240: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d  he name of the m
0250: 61 69 64 73 61 66 65 2e 6e 65 74 20 6c 69 6d 69  aidsafe.net limi
0260: 74 65 64 20 6e 6f 72 20 74 68 65 20 6e 61 6d 65  ted nor the name
0270: 73 20 6f 66 20 69 74 73 0a 20 20 20 20 63 6f 6e  s of its.    con
0280: 74 72 69 62 75 74 6f 72 73 20 6d 61 79 20 62 65  tributors may be
0290: 20 75 73 65 64 20 74 6f 20 65 6e 64 6f 72 73 65   used to endorse
02a0: 20 6f 72 20 70 72 6f 6d 6f 74 65 20 70 72 6f 64   or promote prod
02b0: 75 63 74 73 20 64 65 72 69 76 65 64 20 66 72 6f  ucts derived fro
02c0: 6d 20 74 68 69 73 0a 20 20 20 20 73 6f 66 74 77  m this.    softw
02d0: 61 72 65 20 77 69 74 68 6f 75 74 20 73 70 65 63  are without spec
02e0: 69 66 69 63 20 70 72 69 6f 72 20 77 72 69 74 74  ific prior writt
02f0: 65 6e 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a 0a  en permission...
0300: 54 48 49 53 20 53 4f 46 54 57 41 52 45 20 49 53  THIS SOFTWARE IS
0310: 20 50 52 4f 56 49 44 45 44 20 42 59 20 54 48 45   PROVIDED BY THE
0320: 20 43 4f 50 59 52 49 47 48 54 20 48 4f 4c 44 45   COPYRIGHT HOLDE
0330: 52 53 20 41 4e 44 20 43 4f 4e 54 52 49 42 55 54  RS AND CONTRIBUT
0340: 4f 52 53 20 22 41 53 20 49 53 22 20 41 4e 44 0a  ORS "AS IS" AND.
0350: 41 4e 59 20 45 58 50 52 45 53 53 20 4f 52 20 49  ANY EXPRESS OR I
0360: 4d 50 4c 49 45 44 20 57 41 52 52 41 4e 54 49 45  MPLIED WARRANTIE
0370: 53 2c 20 49 4e 43 4c 55 44 49 4e 47 2c 20 42 55  S, INCLUDING, BU
0380: 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20 54 4f  T NOT LIMITED TO
0390: 2c 20 54 48 45 20 49 4d 50 4c 49 45 44 0a 57 41  , THE IMPLIED.WA
03a0: 52 52 41 4e 54 49 45 53 20 4f 46 20 4d 45 52 43  RRANTIES OF MERC
03b0: 48 41 4e 54 41 42 49 4c 49 54 59 20 41 4e 44 20  HANTABILITY AND 
03c0: 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41  FITNESS FOR A PA
03d0: 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45  RTICULAR PURPOSE
03e0: 20 41 52 45 0a 44 49 53 43 4c 41 49 4d 45 44 2e   ARE.DISCLAIMED.
03f0: 20 20 49 4e 20 4e 4f 20 45 56 45 4e 54 20 53 48    IN NO EVENT SH
0400: 41 4c 4c 20 54 48 45 20 43 4f 50 59 52 49 47 48  ALL THE COPYRIGH
0410: 54 20 48 4f 4c 44 45 52 20 4f 52 20 43 4f 4e 54  T HOLDER OR CONT
0420: 52 49 42 55 54 4f 52 53 20 42 45 20 4c 49 41 42  RIBUTORS BE LIAB
0430: 4c 45 0a 46 4f 52 20 41 4e 59 20 44 49 52 45 43  LE.FOR ANY DIREC
0440: 54 2c 20 49 4e 44 49 52 45 43 54 2c 20 49 4e 43  T, INDIRECT, INC
0450: 49 44 45 4e 54 41 4c 2c 20 53 50 45 43 49 41 4c  IDENTAL, SPECIAL
0460: 2c 20 45 58 45 4d 50 4c 41 52 59 2c 20 4f 52 20  , EXEMPLARY, OR 
0470: 43 4f 4e 53 45 51 55 45 4e 54 49 41 4c 0a 44 41  CONSEQUENTIAL.DA
0480: 4d 41 47 45 53 20 28 49 4e 43 4c 55 44 49 4e 47  MAGES (INCLUDING
0490: 2c 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45  , BUT NOT LIMITE
04a0: 44 20 54 4f 2c 20 50 52 4f 43 55 52 45 4d 45 4e  D TO, PROCUREMEN
04b0: 54 20 4f 46 20 53 55 42 53 54 49 54 55 54 45 20  T OF SUBSTITUTE 
04c0: 47 4f 4f 44 53 20 4f 52 0a 53 45 52 56 49 43 45  GOODS OR.SERVICE
04d0: 53 3b 20 4c 4f 53 53 20 4f 46 20 55 53 45 2c 20  S; LOSS OF USE, 
04e0: 44 41 54 41 2c 20 4f 52 20 50 52 4f 46 49 54 53  DATA, OR PROFITS
04f0: 3b 20 4f 52 20 42 55 53 49 4e 45 53 53 20 49 4e  ; OR BUSINESS IN
0500: 54 45 52 52 55 50 54 49 4f 4e 29 20 48 4f 57 45  TERRUPTION) HOWE
0510: 56 45 52 0a 43 41 55 53 45 44 20 41 4e 44 20 4f  VER.CAUSED AND O
0520: 4e 20 41 4e 59 20 54 48 45 4f 52 59 20 4f 46 20  N ANY THEORY OF 
0530: 4c 49 41 42 49 4c 49 54 59 2c 20 57 48 45 54 48  LIABILITY, WHETH
0540: 45 52 20 49 4e 20 43 4f 4e 54 52 41 43 54 2c 20  ER IN CONTRACT, 
0550: 53 54 52 49 43 54 20 4c 49 41 42 49 4c 49 54 59  STRICT LIABILITY
0560: 2c 20 4f 52 0a 54 4f 52 54 20 28 49 4e 43 4c 55  , OR.TORT (INCLU
0570: 44 49 4e 47 20 4e 45 47 4c 49 47 45 4e 43 45 20  DING NEGLIGENCE 
0580: 4f 52 20 4f 54 48 45 52 57 49 53 45 29 20 41 52  OR OTHERWISE) AR
0590: 49 53 49 4e 47 20 49 4e 20 41 4e 59 20 57 41 59  ISING IN ANY WAY
05a0: 20 4f 55 54 20 4f 46 20 54 48 45 20 55 53 45 20   OUT OF THE USE 
05b0: 4f 46 0a 54 48 49 53 20 53 4f 46 54 57 41 52 45  OF.THIS SOFTWARE
05c0: 2c 20 45 56 45 4e 20 49 46 20 41 44 56 49 53 45  , EVEN IF ADVISE
05d0: 44 20 4f 46 20 54 48 45 20 50 4f 53 53 49 42 49  D OF THE POSSIBI
05e0: 4c 49 54 59 20 4f 46 20 53 55 43 48 20 44 41 4d  LITY OF SUCH DAM
05f0: 41 47 45 2e 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66  AGE..*/..#ifndef
0600: 20 4d 41 49 44 53 41 46 45 5f 44 48 54 5f 43 4f   MAIDSAFE_DHT_CO
0610: 4e 54 41 43 54 5f 48 5f 0a 23 64 65 66 69 6e 65  NTACT_H_.#define
0620: 20 4d 41 49 44 53 41 46 45 5f 44 48 54 5f 43 4f   MAIDSAFE_DHT_CO
0630: 4e 54 41 43 54 5f 48 5f 0a 0a 23 69 6e 63 6c 75  NTACT_H_..#inclu
0640: 64 65 20 3c 66 75 6e 63 74 69 6f 6e 61 6c 3e 0a  de <functional>.
0650: 23 69 6e 63 6c 75 64 65 20 3c 6d 65 6d 6f 72 79  #include <memory
0660: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 65 74 3e  >.#include <set>
0670: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0680: 67 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 76 65 63  g>.#include <vec
0690: 74 6f 72 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 22  tor>..#include "
06a0: 62 6f 6f 73 74 2f 73 65 72 69 61 6c 69 7a 61 74  boost/serializat
06b0: 69 6f 6e 2f 6e 76 70 2e 68 70 70 22 0a 23 69 6e  ion/nvp.hpp".#in
06c0: 63 6c 75 64 65 20 22 62 6f 6f 73 74 2f 73 65 72  clude "boost/ser
06d0: 69 61 6c 69 7a 61 74 69 6f 6e 2f 76 65 63 74 6f  ialization/vecto
06e0: 72 2e 68 70 70 22 0a 0a 23 69 6e 63 6c 75 64 65  r.hpp"..#include
06f0: 20 22 6d 61 69 64 73 61 66 65 2f 63 6f 6d 6d 6f   "maidsafe/commo
0700: 6e 2f 72 73 61 2e 68 22 0a 23 69 6e 63 6c 75 64  n/rsa.h".#includ
0710: 65 20 22 6d 61 69 64 73 61 66 65 2f 63 6f 6d 6d  e "maidsafe/comm
0720: 6f 6e 2f 75 74 69 6c 73 2e 68 22 0a 0a 23 69 6e  on/utils.h"..#in
0730: 63 6c 75 64 65 20 22 6d 61 69 64 73 61 66 65 2f  clude "maidsafe/
0740: 74 72 61 6e 73 70 6f 72 74 2f 63 6f 6e 74 61 63  transport/contac
0750: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d  t.h".#include "m
0760: 61 69 64 73 61 66 65 2f 74 72 61 6e 73 70 6f 72  aidsafe/transpor
0770: 74 2f 74 72 61 6e 73 70 6f 72 74 2e 68 22 0a 0a  t/transport.h"..
0780: 23 69 6e 63 6c 75 64 65 20 22 6d 61 69 64 73 61  #include "maidsa
0790: 66 65 2f 64 68 74 2f 6e 6f 64 65 5f 69 64 2e 68  fe/dht/node_id.h
07a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 61 69 64  ".#include "maid
07b0: 73 61 66 65 2f 64 68 74 2f 76 65 72 73 69 6f 6e  safe/dht/version
07c0: 2e 68 22 0a 0a 23 69 66 20 4d 41 49 44 53 41 46  .h"..#if MAIDSAF
07d0: 45 5f 44 48 54 5f 56 45 52 53 49 4f 4e 20 21 3d  E_DHT_VERSION !=
07e0: 20 33 32 30 30 0a 23 20 20 65 72 72 6f 72 20 54   3200.#  error T
07f0: 68 69 73 20 41 50 49 20 69 73 20 6e 6f 74 20 63  his API is not c
0800: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
0810: 68 65 20 69 6e 73 74 61 6c 6c 65 64 20 6c 69 62  he installed lib
0820: 72 61 72 79 2e 5c 0a 20 20 20 20 50 6c 65 61 73  rary.\.    Pleas
0830: 65 20 75 70 64 61 74 65 20 74 68 65 20 6d 61 69  e update the mai
0840: 64 73 61 66 65 2d 64 68 74 20 6c 69 62 72 61 72  dsafe-dht librar
0850: 79 2e 0a 23 65 6e 64 69 66 0a 0a 6e 61 6d 65 73  y..#endif..names
0860: 70 61 63 65 20 61 72 67 73 20 3d 20 73 74 64 3a  pace args = std:
0870: 3a 70 6c 61 63 65 68 6f 6c 64 65 72 73 3b 0a 0a  :placeholders;..
0880: 0a 6e 61 6d 65 73 70 61 63 65 20 6d 61 69 64 73  .namespace maids
0890: 61 66 65 20 7b 0a 0a 6e 61 6d 65 73 70 61 63 65  afe {..namespace
08a0: 20 64 68 74 20 7b 0a 0a 2f 2a 2a 20 4f 62 6a 65   dht {../** Obje
08b0: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ct containing a 
08c0: 4e 6f 64 65 27 73 20 4b 61 64 65 6d 6c 69 61 20  Node's Kademlia 
08d0: 49 44 20 61 6e 64 20 64 65 74 61 69 6c 73 20 6f  ID and details o
08e0: 66 20 69 74 73 20 65 6e 64 70 6f 69 6e 74 28 73  f its endpoint(s
08f0: 29 2e 0a 20 2a 20 20 40 63 6c 61 73 73 20 43 6f  ).. *  @class Co
0900: 6e 74 61 63 74 20 2a 2f 0a 63 6c 61 73 73 20 43  ntact */.class C
0910: 6f 6e 74 61 63 74 20 7b 20 20 2f 2f 20 3a 20 70  ontact {  // : p
0920: 75 62 6c 69 63 20 74 72 61 6e 73 70 6f 72 74 3a  ublic transport:
0930: 3a 43 6f 6e 74 61 63 74 20 7b 0a 20 70 75 62 6c  :Contact {. publ
0940: 69 63 3a 0a 20 20 2f 2a 2a 20 44 65 66 61 75 6c  ic:.  /** Defaul
0950: 74 20 63 6f 6e 73 74 72 75 63 74 6f 72 2e 20 2a  t constructor. *
0960: 2f 0a 20 20 43 6f 6e 74 61 63 74 28 29 3b 0a 0a  /.  Contact();..
0970: 20 20 2f 2a 2a 20 43 6f 70 79 20 63 6f 6e 73 74    /** Copy const
0980: 72 75 63 74 6f 72 2e 20 2a 2f 0a 20 20 43 6f 6e  ructor. */.  Con
0990: 74 61 63 74 28 63 6f 6e 73 74 20 43 6f 6e 74 61  tact(const Conta
09a0: 63 74 20 26 6f 74 68 65 72 29 3b 0a 0a 20 20 2f  ct &other);..  /
09b0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 2e 20  ** Constructor. 
09c0: 20 54 6f 20 63 72 65 61 74 65 20 61 20 76 61 6c   To create a val
09d0: 69 64 20 43 6f 6e 74 61 63 74 2c 20 69 6e 20 61  id Contact, in a
09e0: 6c 6c 20 63 61 73 65 73 20 74 68 65 20 6e 6f 64  ll cases the nod
09f0: 65 20 49 44 20 61 6e 64 0a 20 20 20 2a 20 20 65  e ID and.   *  e
0a00: 6e 64 70 6f 69 6e 74 20 6d 75 73 74 20 62 65 20  ndpoint must be 
0a10: 76 61 6c 69 64 2c 20 61 6e 64 20 74 68 65 72 65  valid, and there
0a20: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
0a30: 74 20 6f 6e 65 20 76 61 6c 69 64 20 6c 6f 63 61  t one valid loca
0a40: 6c 0a 20 20 20 2a 20 20 65 6e 64 70 6f 69 6e 74  l.   *  endpoint
0a50: 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
0a60: 66 6f 72 20 61 20 64 69 72 65 63 74 2d 63 6f 6e  for a direct-con
0a70: 6e 65 63 74 65 64 20 6e 6f 64 65 2c 20 74 68 65  nected node, the
0a80: 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 0a 20 20  re must be no.  
0a90: 20 2a 20 20 72 65 6e 64 65 7a 76 6f 75 73 20 65   *  rendezvous e
0aa0: 6e 64 70 6f 69 6e 74 2c 20 62 75 74 20 65 69 74  ndpoint, but eit
0ab0: 68 65 72 20 6f 66 20 74 63 70 34 34 33 20 6f 72  her of tcp443 or
0ac0: 20 74 63 70 38 30 20 6d 61 79 20 62 65 20 74 72   tcp80 may be tr
0ad0: 75 65 2e 20 20 46 6f 72 20 61 0a 20 20 20 2a 20  ue.  For a.   * 
0ae0: 20 6e 6f 6e 2d 64 69 72 65 63 74 2d 63 6f 6e 6e   non-direct-conn
0af0: 65 63 74 65 64 20 6e 6f 64 65 2c 20 62 6f 74 68  ected node, both
0b00: 20 6f 66 20 74 63 70 34 34 33 20 61 6e 64 20 74   of tcp443 and t
0b10: 63 70 38 30 20 6d 75 73 74 20 62 65 20 66 61 6c  cp80 must be fal
0b20: 73 65 2c 20 62 75 74 20 69 74 0a 20 20 20 2a 20  se, but it.   * 
0b30: 20 6d 61 79 20 68 61 76 65 20 61 20 72 65 6e 64   may have a rend
0b40: 65 7a 76 6f 75 73 20 65 6e 64 70 6f 69 6e 74 20  ezvous endpoint 
0b50: 73 65 74 2e 20 20 41 20 63 6f 6e 74 61 63 74 20  set.  A contact 
0b60: 69 73 20 64 65 65 6d 65 64 20 74 6f 20 62 65 20  is deemed to be 
0b70: 64 69 72 65 63 74 2d 0a 20 20 20 2a 20 20 63 6f  direct-.   *  co
0b80: 6e 6e 65 63 74 65 64 20 69 66 20 74 68 65 20 65  nnected if the e
0b90: 6e 64 70 6f 69 6e 74 20 65 71 75 61 6c 73 20 74  ndpoint equals t
0ba0: 68 65 20 66 69 72 73 74 20 6c 6f 63 61 6c 20 65  he first local e
0bb0: 6e 64 70 6f 69 6e 74 2e 0a 20 20 20 2a 20 20 40  ndpoint..   *  @
0bc0: 70 61 72 61 6d 5b 69 6e 5d 20 6e 6f 64 65 5f 69  param[in] node_i
0bd0: 64 20 54 68 65 20 63 6f 6e 74 61 63 74 27 73 20  d The contact's 
0be0: 4b 61 64 65 6d 6c 69 61 20 49 44 2e 0a 20 20 20  Kademlia ID..   
0bf0: 2a 20 20 40 70 61 72 61 6d 5b 69 6e 5d 20 65 6e  *  @param[in] en
0c00: 64 70 6f 69 6e 74 20 54 68 65 20 63 6f 6e 74 61  dpoint The conta
0c10: 63 74 27 73 20 65 78 74 65 72 6e 61 6c 20 65 6e  ct's external en
0c20: 64 70 6f 69 6e 74 2e 0a 20 20 20 2a 20 20 40 70  dpoint..   *  @p
0c30: 61 72 61 6d 5b 69 6e 5d 20 6c 6f 63 61 6c 5f 65  aram[in] local_e
0c40: 6e 64 70 6f 69 6e 74 73 20 54 68 65 20 63 6f 6e  ndpoints The con
0c50: 74 61 63 74 27 73 20 6c 6f 63 61 6c 20 65 6e 64  tact's local end
0c60: 70 6f 69 6e 74 73 2e 20 20 54 68 65 79 20 6d 75  points.  They mu
0c70: 73 74 20 61 6c 6c 0a 20 20 20 2a 20 20 20 20 20  st all.   *     
0c80: 20 20 20 20 20 20 20 20 68 61 76 65 20 74 68 65          have the
0c90: 20 73 61 6d 65 20 70 6f 72 74 2c 20 6f 72 20 6c   same port, or l
0ca0: 6f 63 61 6c 5f 65 6e 64 70 6f 69 6e 74 73 5f 20  ocal_endpoints_ 
0cb0: 77 69 6c 6c 20 62 65 20 73 65 74 20 65 6d 70 74  will be set empt
0cc0: 79 2e 0a 20 20 20 2a 20 20 40 70 61 72 61 6d 5b  y..   *  @param[
0cd0: 69 6e 5d 20 74 63 70 34 34 33 20 57 68 65 74 68  in] tcp443 Wheth
0ce0: 65 72 20 74 68 65 20 63 6f 6e 74 61 63 74 20 69  er the contact i
0cf0: 73 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 54  s listening on T
0d00: 43 50 20 70 6f 72 74 20 34 34 33 20 6f 72 20 6e  CP port 443 or n
0d10: 6f 74 2e 0a 20 20 20 2a 20 20 40 70 61 72 61 6d  ot..   *  @param
0d20: 5b 69 6e 5d 20 74 63 70 34 34 33 20 57 68 65 74  [in] tcp443 Whet
0d30: 68 65 72 20 74 68 65 20 63 6f 6e 74 61 63 74 20  her the contact 
0d40: 69 73 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20  is listening on 
0d50: 54 43 50 20 70 6f 72 74 20 38 30 20 6f 72 20 6e  TCP port 80 or n
0d60: 6f 74 2e 0a 20 20 20 2a 20 20 40 70 61 72 61 6d  ot..   *  @param
0d70: 5b 69 6e 5d 20 70 75 62 6c 69 63 5f 6b 65 79 5f  [in] public_key_
0d80: 69 64 20 49 44 20 6f 66 20 74 68 65 20 70 75 62  id ID of the pub
0d90: 6c 69 63 20 6b 65 79 20 77 68 69 63 68 20 73 68  lic key which sh
0da0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a  ould be used to.
0db0: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
0dc0: 20 65 6e 63 72 79 70 74 20 6d 65 73 73 61 67 65   encrypt message
0dd0: 73 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 74 61  s for this conta
0de0: 63 74 2e 0a 20 20 20 2a 20 20 40 70 61 72 61 6d  ct..   *  @param
0df0: 5b 69 6e 5d 20 70 75 62 6c 69 63 5f 6b 65 79 20  [in] public_key 
0e00: 50 75 62 6c 69 63 20 6b 65 79 20 77 68 69 63 68  Public key which
0e10: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
0e20: 74 6f 20 65 6e 63 72 79 70 74 20 6d 65 73 73 61  to encrypt messa
0e30: 67 65 73 0a 20 20 20 2a 20 20 20 20 20 20 20 20  ges.   *        
0e40: 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 63 6f       for this co
0e50: 6e 74 61 63 74 2e 0a 20 20 20 2a 20 20 40 70 61  ntact..   *  @pa
0e60: 72 61 6d 5b 69 6e 5d 20 6f 74 68 65 72 5f 69 6e  ram[in] other_in
0e70: 66 6f 20 41 6e 79 20 65 78 74 72 61 20 69 6e 66  fo Any extra inf
0e80: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 62 65 20 68  ormation to be h
0e90: 65 6c 64 2e 20 2a 2f 0a 20 20 43 6f 6e 74 61 63  eld. */.  Contac
0ea0: 74 28 63 6f 6e 73 74 20 4e 6f 64 65 49 64 20 26  t(const NodeId &
0eb0: 6e 6f 64 65 5f 69 64 2c 0a 20 20 20 20 20 20 20  node_id,.       
0ec0: 20 20 20 63 6f 6e 73 74 20 74 72 61 6e 73 70 6f     const transpo
0ed0: 72 74 3a 3a 45 6e 64 70 6f 69 6e 74 20 26 65 6e  rt::Endpoint &en
0ee0: 64 70 6f 69 6e 74 2c 0a 20 20 20 20 20 20 20 20  dpoint,.        
0ef0: 20 20 63 6f 6e 73 74 20 73 74 64 3a 3a 76 65 63    const std::vec
0f00: 74 6f 72 3c 74 72 61 6e 73 70 6f 72 74 3a 3a 45  tor<transport::E
0f10: 6e 64 70 6f 69 6e 74 3e 20 26 6c 6f 63 61 6c 5f  ndpoint> &local_
0f20: 65 6e 64 70 6f 69 6e 74 73 2c 0a 20 20 20 20 20  endpoints,.     
0f30: 20 20 20 20 20 63 6f 6e 73 74 20 74 72 61 6e 73       const trans
0f40: 70 6f 72 74 3a 3a 45 6e 64 70 6f 69 6e 74 20 26  port::Endpoint &
0f50: 72 65 6e 64 65 7a 76 6f 75 73 5f 65 6e 64 70 6f  rendezvous_endpo
0f60: 69 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 62  int,.          b
0f70: 6f 6f 6c 20 74 63 70 34 34 33 2c 0a 20 20 20 20  ool tcp443,.    
0f80: 20 20 20 20 20 20 62 6f 6f 6c 20 74 63 70 38 30        bool tcp80
0f90: 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ,.          cons
0fa0: 74 20 61 73 79 6d 6d 3a 3a 49 64 65 6e 74 69 74  t asymm::Identit
0fb0: 79 20 26 70 75 62 6c 69 63 5f 6b 65 79 5f 69 64  y &public_key_id
0fc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ,.          cons
0fd0: 74 20 61 73 79 6d 6d 3a 3a 50 75 62 6c 69 63 4b  t asymm::PublicK
0fe0: 65 79 20 26 70 75 62 6c 69 63 5f 6b 65 79 2c 0a  ey &public_key,.
0ff0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
1000: 73 74 64 3a 3a 73 74 72 69 6e 67 20 26 6f 74 68  std::string &oth
1010: 65 72 5f 69 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 2a  er_info);..  /**
1020: 20 44 65 73 74 72 75 63 74 6f 72 2e 20 2a 2f 0a   Destructor. */.
1030: 20 20 7e 43 6f 6e 74 61 63 74 28 29 3b 0a 0a 20    ~Contact();.. 
1040: 20 2f 2a 2a 20 47 65 74 74 65 72 2e 0a 20 20 20   /** Getter..   
1050: 2a 20 20 40 72 65 74 75 72 6e 20 54 68 65 20 63  *  @return The c
1060: 6f 6e 74 61 63 74 27 73 20 4b 61 64 65 6d 6c 69  ontact's Kademli
1070: 61 20 49 44 2e 20 2a 2f 0a 20 20 4e 6f 64 65 49  a ID. */.  NodeI
1080: 64 20 6e 6f 64 65 5f 69 64 28 29 20 63 6f 6e 73  d node_id() cons
1090: 74 3b 0a 0a 20 20 2f 2a 2a 20 47 65 74 74 65 72  t;..  /** Getter
10a0: 2e 0a 20 20 20 2a 20 20 40 72 65 74 75 72 6e 20  ..   *  @return 
10b0: 49 44 20 6f 66 20 74 68 65 20 70 75 62 6c 69 63  ID of the public
10c0: 20 6b 65 79 20 77 68 69 63 68 20 73 68 6f 75 6c   key which shoul
10d0: 64 20 62 65 20 75 73 65 64 20 74 6f 20 65 6e 63  d be used to enc
10e0: 72 79 70 74 20 6d 65 73 73 61 67 65 73 20 66 6f  rypt messages fo
10f0: 72 0a 20 20 20 2a 20 20 20 20 20 20 20 20 20 20  r.   *          
1100: 74 68 69 73 20 63 6f 6e 74 61 63 74 2e 20 2a 2f  this contact. */
1110: 0a 20 20 61 73 79 6d 6d 3a 3a 49 64 65 6e 74 69  .  asymm::Identi
1120: 74 79 20 70 75 62 6c 69 63 5f 6b 65 79 5f 69 64  ty public_key_id
1130: 28 29 20 63 6f 6e 73 74 3b 0a 0a 20 20 2f 2a 2a  () const;..  /**
1140: 20 47 65 74 74 65 72 2e 0a 20 20 20 2a 20 20 40   Getter..   *  @
1150: 72 65 74 75 72 6e 20 50 75 62 6c 69 63 20 6b 65  return Public ke
1160: 79 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  y which should b
1170: 65 20 75 73 65 64 20 74 6f 20 65 6e 63 72 79 70  e used to encryp
1180: 74 20 6d 65 73 73 61 67 65 73 20 66 6f 72 20 74  t messages for t
1190: 68 69 73 0a 20 20 20 2a 20 20 20 20 20 20 20 20  his.   *        
11a0: 20 20 63 6f 6e 74 61 63 74 2e 20 2a 2f 0a 20 20    contact. */.  
11b0: 61 73 79 6d 6d 3a 3a 50 75 62 6c 69 63 4b 65 79  asymm::PublicKey
11c0: 20 70 75 62 6c 69 63 5f 6b 65 79 28 29 20 63 6f   public_key() co
11d0: 6e 73 74 3b 0a 0a 20 20 2f 2a 2a 20 47 65 74 74  nst;..  /** Gett
11e0: 65 72 2e 0a 20 20 20 2a 20 20 40 72 65 74 75 72  er..   *  @retur
11f0: 6e 20 41 6e 79 20 65 78 74 72 61 20 69 6e 66 6f  n Any extra info
1200: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 66 6f 72  rmation held for
1210: 20 74 68 69 73 20 63 6f 6e 74 61 63 74 2e 20 2a   this contact. *
1220: 2f 0a 20 20 73 74 64 3a 3a 73 74 72 69 6e 67 20  /.  std::string 
1230: 6f 74 68 65 72 5f 69 6e 66 6f 28 29 20 63 6f 6e  other_info() con
1240: 73 74 3b 0a 0a 20 20 2f 2a 2a 20 47 65 74 74 65  st;..  /** Gette
1250: 72 2e 0a 20 20 20 2a 20 20 40 72 65 74 75 72 6e  r..   *  @return
1260: 20 54 68 65 20 63 6f 6e 74 61 63 74 27 73 20 65   The contact's e
1270: 78 74 65 72 6e 61 6c 20 65 6e 64 70 6f 69 6e 74  xternal endpoint
1280: 2e 20 2a 2f 0a 20 20 74 72 61 6e 73 70 6f 72 74  . */.  transport
1290: 3a 3a 45 6e 64 70 6f 69 6e 74 20 65 6e 64 70 6f  ::Endpoint endpo
12a0: 69 6e 74 28 29 20 63 6f 6e 73 74 3b 0a 0a 20 20  int() const;..  
12b0: 2f 2a 2a 20 47 65 74 74 65 72 2e 0a 20 20 20 2a  /** Getter..   *
12c0: 20 20 40 72 65 74 75 72 6e 20 54 68 65 20 63 6f    @return The co
12d0: 6e 74 61 63 74 27 73 20 6c 6f 63 61 6c 20 65 6e  ntact's local en
12e0: 64 70 6f 69 6e 74 73 2e 20 2a 2f 0a 20 20 73 74  dpoints. */.  st
12f0: 64 3a 3a 76 65 63 74 6f 72 3c 74 72 61 6e 73 70  d::vector<transp
1300: 6f 72 74 3a 3a 45 6e 64 70 6f 69 6e 74 3e 20 6c  ort::Endpoint> l
1310: 6f 63 61 6c 5f 65 6e 64 70 6f 69 6e 74 73 28 29  ocal_endpoints()
1320: 20 63 6f 6e 73 74 3b 0a 0a 20 20 2f 2a 2a 20 47   const;..  /** G
1330: 65 74 74 65 72 2e 0a 20 20 20 2a 20 20 40 72 65  etter..   *  @re
1340: 74 75 72 6e 20 54 68 65 20 63 6f 6e 74 61 63 74  turn The contact
1350: 27 73 20 72 65 6e 64 65 7a 6f 75 73 20 65 6e 64  's rendezous end
1360: 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 74 72 61 6e  point. */.  tran
1370: 73 70 6f 72 74 3a 3a 45 6e 64 70 6f 69 6e 74 20  sport::Endpoint 
1380: 72 65 6e 64 65 7a 76 6f 75 73 5f 65 6e 64 70 6f  rendezvous_endpo
1390: 69 6e 74 28 29 20 63 6f 6e 73 74 3b 0a 0a 20 20  int() const;..  
13a0: 2f 2a 2a 20 47 65 74 74 65 72 2e 0a 20 20 20 2a  /** Getter..   *
13b0: 20 20 40 72 65 74 75 72 6e 20 54 68 65 20 63 6f    @return The co
13c0: 6e 74 61 63 74 27 73 20 65 78 74 65 72 6e 61 6c  ntact's external
13d0: 20 65 6e 64 70 6f 69 6e 74 20 77 68 69 63 68 20   endpoint which 
13e0: 69 73 20 6f 6e 20 54 43 50 20 70 6f 72 74 20 34  is on TCP port 4
13f0: 34 33 2e 20 2a 2f 0a 20 20 74 72 61 6e 73 70 6f  43. */.  transpo
1400: 72 74 3a 3a 45 6e 64 70 6f 69 6e 74 20 74 63 70  rt::Endpoint tcp
1410: 34 34 33 65 6e 64 70 6f 69 6e 74 28 29 20 63 6f  443endpoint() co
1420: 6e 73 74 3b 0a 0a 20 20 2f 2a 2a 20 47 65 74 74  nst;..  /** Gett
1430: 65 72 2e 0a 20 20 20 2a 20 20 40 72 65 74 75 72  er..   *  @retur
1440: 6e 20 54 68 65 20 63 6f 6e 74 61 63 74 27 73 20  n The contact's 
1450: 65 78 74 65 72 6e 61 6c 20 65 6e 64 70 6f 69 6e  external endpoin
1460: 74 20 77 68 69 63 68 20 69 73 20 6f 6e 20 54 43  t which is on TC
1470: 50 20 70 6f 72 74 20 38 30 2e 20 2a 2f 0a 20 20  P port 80. */.  
1480: 74 72 61 6e 73 70 6f 72 74 3a 3a 45 6e 64 70 6f  transport::Endpo
1490: 69 6e 74 20 74 63 70 38 30 65 6e 64 70 6f 69 6e  int tcp80endpoin
14a0: 74 28 29 20 63 6f 6e 73 74 3b 0a 0a 20 20 2f 2a  t() const;..  /*
14b0: 2a 20 53 65 74 74 65 72 20 74 6f 20 6d 61 72 6b  * Setter to mark
14c0: 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 63 6f   which of the co
14d0: 6e 74 61 63 74 27 73 20 65 6e 64 70 6f 69 6e 74  ntact's endpoint
14e0: 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 66  s should be pref
14f0: 65 72 72 65 64 2e 0a 20 20 20 2a 20 20 40 70 61  erred..   *  @pa
1500: 72 61 6d 20 69 70 20 49 50 20 6f 66 20 70 72 65  ram ip IP of pre
1510: 66 65 72 72 65 64 20 65 6e 64 70 6f 69 6e 74 2e  ferred endpoint.
1520: 0a 20 20 20 2a 20 20 40 72 65 74 75 72 6e 20 53  .   *  @return S
1530: 75 63 63 65 73 73 20 6f 66 20 6f 70 65 72 61 74  uccess of operat
1540: 69 6f 6e 2e 20 2a 2f 0a 20 20 62 6f 6f 6c 20 53  ion. */.  bool S
1550: 65 74 50 72 65 66 65 72 72 65 64 45 6e 64 70 6f  etPreferredEndpo
1560: 69 6e 74 28 63 6f 6e 73 74 20 74 72 61 6e 73 70  int(const transp
1570: 6f 72 74 3a 3a 49 50 20 26 69 70 29 3b 0a 0a 20  ort::IP &ip);.. 
1580: 20 2f 2a 2a 20 47 65 74 74 65 72 2e 0a 20 20 20   /** Getter..   
1590: 2a 20 20 40 72 65 74 75 72 6e 20 54 68 65 20 63  *  @return The c
15a0: 6f 6e 74 61 63 74 27 73 20 70 72 65 66 65 72 72  ontact's preferr
15b0: 65 64 20 65 6e 64 70 6f 69 6e 74 2e 20 2a 2f 0a  ed endpoint. */.
15c0: 20 20 74 72 61 6e 73 70 6f 72 74 3a 3a 45 6e 64    transport::End
15d0: 70 6f 69 6e 74 20 50 72 65 66 65 72 72 65 64 45  point PreferredE
15e0: 6e 64 70 6f 69 6e 74 28 29 20 63 6f 6e 73 74 3b  ndpoint() const;
15f0: 0a 0a 20 20 2f 2a 2a 20 49 6e 64 69 63 61 74 65  ..  /** Indicate
1600: 20 77 68 65 74 68 65 72 20 74 68 65 20 63 6f 6e   whether the con
1610: 74 61 63 74 20 69 73 20 64 69 72 65 63 74 6c 79  tact is directly
1620: 2d 63 6f 6e 6e 65 63 74 65 64 20 6f 72 20 6e 6f  -connected or no
1630: 74 2e 0a 20 20 20 2a 20 20 40 72 65 74 75 72 6e  t..   *  @return
1640: 20 54 72 75 65 20 69 66 20 64 69 72 65 63 74 6c   True if directl
1650: 79 2d 63 6f 6e 6e 65 63 74 65 64 2c 20 65 6c 73  y-connected, els
1660: 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 62 6f  e false. */.  bo
1670: 6f 6c 20 49 73 44 69 72 65 63 74 6c 79 43 6f 6e  ol IsDirectlyCon
1680: 6e 65 63 74 65 64 28 29 20 63 6f 6e 73 74 3b 0a  nected() const;.
1690: 0a 20 20 69 6e 74 20 53 65 72 69 61 6c 69 73 65  .  int Serialise
16a0: 28 73 74 64 3a 3a 73 74 72 69 6e 67 20 2a 73 65  (std::string *se
16b0: 72 69 61 6c 69 73 65 64 29 20 63 6f 6e 73 74 3b  rialised) const;
16c0: 0a 0a 20 20 69 6e 74 20 50 61 72 73 65 28 63 6f  ..  int Parse(co
16d0: 6e 73 74 20 73 74 64 3a 3a 73 74 72 69 6e 67 20  nst std::string 
16e0: 26 73 65 72 69 61 6c 69 73 65 64 29 3b 0a 0a 20  &serialised);.. 
16f0: 20 2f 2a 2a 20 41 73 73 69 67 6e 6d 65 6e 74 20   /** Assignment 
1700: 6f 70 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 43  operator. */.  C
1710: 6f 6e 74 61 63 74 26 20 6f 70 65 72 61 74 6f 72  ontact& operator
1720: 3d 28 63 6f 6e 73 74 20 43 6f 6e 74 61 63 74 20  =(const Contact 
1730: 26 6f 74 68 65 72 29 3b 0a 0a 20 20 2f 2f 20 40  &other);..  // @
1740: 7b 0a 20 20 2f 2a 2a 20 45 71 75 61 6c 69 74 79  {.  /** Equality
1750: 20 61 6e 64 20 69 6e 65 71 75 61 6c 69 74 79 20   and inequality 
1760: 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 2a 20  operators..   * 
1770: 20 45 71 75 61 6c 69 74 79 20 69 73 20 62 61 73   Equality is bas
1780: 65 64 20 6f 6e 20 6e 6f 64 65 20 49 44 2e 20 20  ed on node ID.  
1790: 48 6f 77 65 76 65 72 20 69 66 20 62 6f 74 68 20  However if both 
17a0: 6e 6f 64 65 20 49 44 73 20 61 72 65 20 6b 5a 65  node IDs are kZe
17b0: 72 6f 49 64 2c 0a 20 20 20 2a 20 20 65 71 75 61  roId,.   *  equa
17c0: 6c 69 74 79 20 69 73 20 74 68 65 6e 20 62 61 73  lity is then bas
17d0: 65 64 20 6f 6e 20 65 6e 64 70 6f 69 6e 74 20 49  ed on endpoint I
17e0: 50 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  Ps.  Note that t
17f0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
1800: 20 20 2a 20 20 65 71 75 61 6c 69 74 79 20 69 73    *  equality is
1810: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
1820: 20 65 71 75 69 76 61 6c 65 6e 63 65 20 66 6f 72   equivalence for
1830: 20 43 6f 6e 74 61 63 74 73 2c 20 77 68 65 72 65   Contacts, where
1840: 20 65 71 75 69 76 61 6c 65 6e 63 65 20 69 73 0a   equivalence is.
1850: 20 20 20 2a 20 20 64 65 66 69 6e 65 64 20 61 73     *  defined as
1860: 20 6e 65 69 74 68 65 72 20 6f 66 20 74 77 6f 20   neither of two 
1870: 43 6f 6e 74 61 63 74 73 20 63 6f 6d 70 61 72 69  Contacts compari
1880: 6e 67 20 3c 20 74 68 61 6e 20 74 68 65 20 6f 74  ng < than the ot
1890: 68 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 2a 20  her, since.   * 
18a0: 20 6f 70 65 72 61 74 6f 72 3c 20 6f 6e 6c 79 20   operator< only 
18b0: 63 6f 6e 73 69 64 65 72 73 20 6e 6f 64 65 20 49  considers node I
18c0: 44 73 2e 20 2a 2f 0a 20 20 62 6f 6f 6c 20 6f 70  Ds. */.  bool op
18d0: 65 72 61 74 6f 72 3d 3d 28 63 6f 6e 73 74 20 43  erator==(const C
18e0: 6f 6e 74 61 63 74 20 26 6f 74 68 65 72 29 20 63  ontact &other) c
18f0: 6f 6e 73 74 3b 0a 20 20 62 6f 6f 6c 20 6f 70 65  onst;.  bool ope
1900: 72 61 74 6f 72 21 3d 28 63 6f 6e 73 74 20 43 6f  rator!=(const Co
1910: 6e 74 61 63 74 20 26 6f 74 68 65 72 29 20 63 6f  ntact &other) co
1920: 6e 73 74 3b 0a 20 20 2f 2f 20 40 7d 0a 0a 20 20  nst;.  // @}..  
1930: 2f 2f 20 40 7b 0a 20 20 2f 2a 2a 20 43 6f 6d 70  // @{.  /** Comp
1940: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73  arison operators
1950: 2e 0a 20 20 20 2a 20 20 43 6f 6d 70 61 72 69 73  ..   *  Comparis
1960: 6f 6e 73 20 61 72 65 20 62 61 73 65 64 20 6f 6e  ons are based on
1970: 20 6e 6f 64 65 20 49 44 20 28 6c 65 78 69 63 6f   node ID (lexico
1980: 67 72 61 70 68 69 63 61 6c 20 63 6f 6d 70 61 72  graphical compar
1990: 69 73 6f 6e 29 20 2a 2f 0a 20 20 62 6f 6f 6c 20  ison) */.  bool 
19a0: 6f 70 65 72 61 74 6f 72 3c 28 63 6f 6e 73 74 20  operator<(const 
19b0: 43 6f 6e 74 61 63 74 20 26 6f 74 68 65 72 29 20  Contact &other) 
19c0: 63 6f 6e 73 74 3b 0a 20 20 62 6f 6f 6c 20 6f 70  const;.  bool op
19d0: 65 72 61 74 6f 72 3e 28 63 6f 6e 73 74 20 43 6f  erator>(const Co
19e0: 6e 74 61 63 74 20 26 6f 74 68 65 72 29 20 63 6f  ntact &other) co
19f0: 6e 73 74 3b 0a 20 20 62 6f 6f 6c 20 6f 70 65 72  nst;.  bool oper
1a00: 61 74 6f 72 3c 3d 28 63 6f 6e 73 74 20 43 6f 6e  ator<=(const Con
1a10: 74 61 63 74 20 26 6f 74 68 65 72 29 20 63 6f 6e  tact &other) con
1a20: 73 74 3b 0a 20 20 62 6f 6f 6c 20 6f 70 65 72 61  st;.  bool opera
1a30: 74 6f 72 3e 3d 28 63 6f 6e 73 74 20 43 6f 6e 74  tor>=(const Cont
1a40: 61 63 74 20 26 6f 74 68 65 72 29 20 63 6f 6e 73  act &other) cons
1a50: 74 3b 0a 20 20 2f 2f 20 40 7d 0a 0a 20 70 72 69  t;.  // @}.. pri
1a60: 76 61 74 65 3a 0a 20 20 76 6f 69 64 20 49 6e 69  vate:.  void Ini
1a70: 74 28 29 3b 0a 20 20 76 6f 69 64 20 43 6c 65 61  t();.  void Clea
1a80: 72 28 29 3b 0a 20 20 62 6f 6f 6c 20 4d 6f 76 65  r();.  bool Move
1a90: 4c 6f 63 61 6c 45 6e 64 70 6f 69 6e 74 54 6f 46  LocalEndpointToF
1aa0: 69 72 73 74 28 63 6f 6e 73 74 20 74 72 61 6e 73  irst(const trans
1ab0: 70 6f 72 74 3a 3a 49 50 20 26 69 70 29 3b 0a 20  port::IP &ip);. 
1ac0: 20 62 6f 6f 6c 20 49 70 4d 61 74 63 68 65 73 45   bool IpMatchesE
1ad0: 6e 64 70 6f 69 6e 74 28 63 6f 6e 73 74 20 74 72  ndpoint(const tr
1ae0: 61 6e 73 70 6f 72 74 3a 3a 49 50 20 26 69 70 2c  ansport::IP &ip,
1af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
1b10: 74 72 61 6e 73 70 6f 72 74 3a 3a 45 6e 64 70 6f  transport::Endpo
1b20: 69 6e 74 20 26 65 6e 64 70 6f 69 6e 74 29 3b 0a  int &endpoint);.
1b30: 20 20 4e 6f 64 65 49 64 20 6e 6f 64 65 5f 69 64    NodeId node_id
1b40: 5f 3b 0a 20 20 61 73 79 6d 6d 3a 3a 49 64 65 6e  _;.  asymm::Iden
1b50: 74 69 74 79 20 70 75 62 6c 69 63 5f 6b 65 79 5f  tity public_key_
1b60: 69 64 5f 3b 0a 20 20 61 73 79 6d 6d 3a 3a 50 75  id_;.  asymm::Pu
1b70: 62 6c 69 63 4b 65 79 20 70 75 62 6c 69 63 5f 6b  blicKey public_k
1b80: 65 79 5f 3b 0a 20 20 73 74 64 3a 3a 73 74 72 69  ey_;.  std::stri
1b90: 6e 67 20 6f 74 68 65 72 5f 69 6e 66 6f 5f 3b 0a  ng other_info_;.
1ba0: 20 20 74 72 61 6e 73 70 6f 72 74 3a 3a 43 6f 6e    transport::Con
1bb0: 74 61 63 74 20 74 72 61 6e 73 70 6f 72 74 5f 64  tact transport_d
1bc0: 65 74 61 69 6c 73 5f 3b 0a 7d 3b 0a 0a 0a 2f 2a  etails_;.};.../*
1bd0: 2a 20 52 65 74 75 72 6e 73 20 61 6e 20 61 62 62  * Returns an abb
1be0: 72 65 76 69 61 74 65 64 20 68 65 78 20 72 65 70  reviated hex rep
1bf0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 63  resentation of c
1c00: 6f 6e 74 61 63 74 27 73 20 4e 6f 64 65 49 64 20  ontact's NodeId 
1c10: 2a 2f 0a 73 74 64 3a 3a 73 74 72 69 6e 67 20 44  */.std::string D
1c20: 65 62 75 67 49 64 28 63 6f 6e 73 74 20 43 6f 6e  ebugId(const Con
1c30: 74 61 63 74 20 26 63 6f 6e 74 61 63 74 29 3b 0a  tact &contact);.
1c40: 0a 2f 2a 2a 20 52 65 74 75 72 6e 73 20 74 72 75  ./** Returns tru
1c50: 65 20 69 66 20 6e 6f 64 65 5f 69 64 20 69 73 20  e if node_id is 
1c60: 63 6c 6f 73 65 72 20 74 6f 20 74 61 72 67 65 74  closer to target
1c70: 20 74 68 61 6e 20 63 6f 6e 74 61 63 74 2e 20 2a   than contact. *
1c80: 2f 0a 62 6f 6f 6c 20 43 6c 6f 73 65 72 54 6f 54  /.bool CloserToT
1c90: 61 72 67 65 74 28 63 6f 6e 73 74 20 4e 6f 64 65  arget(const Node
1ca0: 49 64 20 26 6e 6f 64 65 5f 69 64 2c 0a 20 20 20  Id &node_id,.   
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 63 6f 6e 73 74 20 43 6f 6e 74 61 63 74 20 26   const Contact &
1cd0: 63 6f 6e 74 61 63 74 2c 0a 20 20 20 20 20 20 20  contact,.       
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1cf0: 73 74 20 4e 6f 64 65 49 64 20 26 74 61 72 67 65  st NodeId &targe
1d00: 74 29 3b 0a 0a 2f 2a 2a 20 52 65 74 75 72 6e 73  t);../** Returns
1d10: 20 74 72 75 65 20 69 66 20 63 6f 6e 74 61 63 74   true if contact
1d20: 31 20 69 73 20 63 6c 6f 73 65 72 20 74 6f 20 74  1 is closer to t
1d30: 61 72 67 65 74 20 74 68 61 6e 20 63 6f 6e 74 61  arget than conta
1d40: 63 74 32 2e 20 2a 2f 0a 62 6f 6f 6c 20 43 6c 6f  ct2. */.bool Clo
1d50: 73 65 72 54 6f 54 61 72 67 65 74 28 63 6f 6e 73  serToTarget(cons
1d60: 74 20 43 6f 6e 74 61 63 74 20 26 63 6f 6e 74 61  t Contact &conta
1d70: 63 74 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ct1,.           
1d80: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 43           const C
1d90: 6f 6e 74 61 63 74 20 26 63 6f 6e 74 61 63 74 32  ontact &contact2
1da0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1db0: 20 20 20 20 20 20 63 6f 6e 73 74 20 4e 6f 64 65        const Node
1dc0: 49 64 20 26 74 61 72 67 65 74 29 3b 0a 0a 2f 2a  Id &target);../*
1dd0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1de0: 66 20 6e 6f 64 65 5f 69 64 20 69 73 20 63 6c 6f  f node_id is clo
1df0: 73 65 72 20 74 6f 20 74 61 72 67 65 74 20 74 68  ser to target th
1e00: 61 6e 20 61 6e 79 20 6f 66 20 63 6c 6f 73 65 73  an any of closes
1e10: 74 5f 63 6f 6e 74 61 63 74 73 2e 20 2a 2f 0a 62  t_contacts. */.b
1e20: 6f 6f 6c 20 4e 6f 64 65 57 69 74 68 69 6e 43 6c  ool NodeWithinCl
1e30: 6f 73 65 73 74 28 63 6f 6e 73 74 20 4e 6f 64 65  osest(const Node
1e40: 49 64 20 26 6e 6f 64 65 5f 69 64 2c 0a 20 20 20  Id &node_id,.   
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 20 63 6f 6e 73 74 20 73 74 64 3a 3a 76      const std::v
1e70: 65 63 74 6f 72 3c 43 6f 6e 74 61 63 74 3e 20 26  ector<Contact> &
1e80: 63 6c 6f 73 65 73 74 5f 63 6f 6e 74 61 63 74 73  closest_contacts
1e90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ea0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 4e           const N
1eb0: 6f 64 65 49 64 20 26 74 61 72 67 65 74 29 3b 0a  odeId &target);.
1ec0: 0a 2f 2a 2a 20 45 72 61 73 65 73 20 61 6c 6c 20  ./** Erases all 
1ed0: 63 6f 6e 74 61 63 74 73 20 66 72 6f 6d 20 76 65  contacts from ve
1ee0: 63 74 6f 72 20 77 68 69 63 68 20 68 61 76 65 20  ctor which have 
1ef0: 74 68 65 20 67 69 76 65 6e 20 6e 6f 64 65 5f 69  the given node_i
1f00: 64 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a  d and returns. *
1f10: 20 20 74 72 75 65 20 69 66 20 61 6e 79 20 77 65    true if any we
1f20: 72 65 20 65 72 61 73 65 64 2e 20 2a 2f 0a 62 6f  re erased. */.bo
1f30: 6f 6c 20 52 65 6d 6f 76 65 43 6f 6e 74 61 63 74  ol RemoveContact
1f40: 28 63 6f 6e 73 74 20 4e 6f 64 65 49 64 20 26 6e  (const NodeId &n
1f50: 6f 64 65 5f 69 64 2c 20 73 74 64 3a 3a 76 65 63  ode_id, std::vec
1f60: 74 6f 72 3c 43 6f 6e 74 61 63 74 3e 20 2a 63 6f  tor<Contact> *co
1f70: 6e 74 61 63 74 73 29 3b 0a 0a 2f 2a 2a 20 43 61  ntacts);../** Ca
1f80: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c  n be used to hol
1f90: 64 20 61 20 73 65 74 20 6f 66 20 43 6f 6e 74 61  d a set of Conta
1fa0: 63 74 73 20 6f 72 64 65 72 65 64 20 62 79 20 63  cts ordered by c
1fb0: 6c 6f 73 65 6e 65 73 73 20 74 6f 20 61 20 74 61  loseness to a ta
1fc0: 72 67 65 74 2e 20 2a 2f 0a 74 79 70 65 64 65 66  rget. */.typedef
1fd0: 20 73 74 64 3a 3a 73 65 74 3c 43 6f 6e 74 61 63   std::set<Contac
1fe0: 74 2c 20 73 74 64 3a 3a 66 75 6e 63 74 69 6f 6e  t, std::function
1ff0: 3c 62 6f 6f 6c 28 63 6f 6e 73 74 20 43 6f 6e 74  <bool(const Cont
2000: 61 63 74 26 2c 20 20 2f 2f 20 4e 4f 4c 49 4e 54  act&,  // NOLINT
2010: 20 28 46 72 61 73 65 72 29 0a 20 20 20 20 20 20   (Fraser).      
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 43 6f 6e         const Con
2050: 74 61 63 74 26 29 3e 3e 20 4f 72 64 65 72 65 64  tact&)>> Ordered
2060: 43 6f 6e 74 61 63 74 73 3b 0a 0a 2f 2a 2a 20 43  Contacts;../** C
2070: 72 65 61 74 65 73 20 61 6e 20 6e 65 77 20 65 6d  reates an new em
2080: 70 74 79 20 73 65 74 20 6f 66 20 43 6f 6e 74 61  pty set of Conta
2090: 63 74 73 20 6f 72 64 65 72 65 64 20 62 79 20 63  cts ordered by c
20a0: 6c 6f 73 65 6e 65 73 73 20 74 6f 20 74 61 72 67  loseness to targ
20b0: 65 74 2e 20 2a 2f 0a 69 6e 6c 69 6e 65 20 4f 72  et. */.inline Or
20c0: 64 65 72 65 64 43 6f 6e 74 61 63 74 73 20 43 72  deredContacts Cr
20d0: 65 61 74 65 4f 72 64 65 72 65 64 43 6f 6e 74 61  eateOrderedConta
20e0: 63 74 73 28 63 6f 6e 73 74 20 4e 6f 64 65 49 64  cts(const NodeId
20f0: 20 26 74 61 72 67 65 74 29 20 7b 0a 20 20 72 65   &target) {.  re
2100: 74 75 72 6e 20 4f 72 64 65 72 65 64 43 6f 6e 74  turn OrderedCont
2110: 61 63 74 73 28 0a 20 20 20 20 20 20 73 74 64 3a  acts(.      std:
2120: 3a 62 69 6e 64 28 73 74 61 74 69 63 5f 63 61 73  :bind(static_cas
2130: 74 3c 62 6f 6f 6c 28 2a 29 28 63 6f 6e 73 74 20  t<bool(*)(const 
2140: 43 6f 6e 74 61 63 74 26 2c 20 20 20 20 20 20 20  Contact&,       
2150: 20 20 20 20 2f 2f 20 4e 4f 4c 49 4e 54 20 28 46      // NOLINT (F
2160: 72 61 73 65 72 29 0a 20 20 20 20 20 20 20 20 20  raser).         
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
2190: 20 43 6f 6e 74 61 63 74 26 2c 0a 20 20 20 20 20   Contact&,.     
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
21c0: 6f 6e 73 74 20 4e 6f 64 65 49 64 26 29 3e 28 26  onst NodeId&)>(&
21d0: 43 6c 6f 73 65 72 54 6f 54 61 72 67 65 74 29 2c  CloserToTarget),
21e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f0: 20 61 72 67 73 3a 3a 5f 31 2c 20 61 72 67 73 3a   args::_1, args:
2200: 3a 5f 32 2c 20 74 61 72 67 65 74 29 29 3b 0a 7d  :_2, target));.}
2210: 0a 0a 2f 2a 2a 20 43 72 65 61 74 65 73 20 61 6e  ../** Creates an
2220: 20 6e 65 77 20 73 65 74 20 6f 66 20 43 6f 6e 74   new set of Cont
2230: 61 63 74 73 20 6f 72 64 65 72 65 64 20 62 79 20  acts ordered by 
2240: 63 6c 6f 73 65 6e 65 73 73 20 74 6f 20 74 61 72  closeness to tar
2250: 67 65 74 2c 20 69 6e 69 74 69 61 6c 69 73 65 64  get, initialised
2260: 0a 20 2a 20 20 77 69 74 68 20 61 20 63 6f 70 79  . *  with a copy
2270: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 62 65 74   of elements bet
2280: 77 65 65 6e 20 66 69 72 73 74 20 28 69 6e 63 6c  ween first (incl
2290: 75 73 69 76 65 29 20 61 6e 64 20 6c 61 73 74 20  usive) and last 
22a0: 28 65 78 63 6c 75 73 69 76 65 29 2e 20 2a 2f 0a  (exclusive). */.
22b0: 74 65 6d 70 6c 61 74 65 20 3c 74 79 70 65 6e 61  template <typena
22c0: 6d 65 20 49 6e 70 75 74 49 74 65 72 61 74 6f 72  me InputIterator
22d0: 3e 0a 4f 72 64 65 72 65 64 43 6f 6e 74 61 63 74  >.OrderedContact
22e0: 73 20 43 72 65 61 74 65 4f 72 64 65 72 65 64 43  s CreateOrderedC
22f0: 6f 6e 74 61 63 74 73 28 49 6e 70 75 74 49 74 65  ontacts(InputIte
2300: 72 61 74 6f 72 20 66 69 72 73 74 2c 0a 20 20 20  rator first,.   
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 49 6e 70 75 74 49 74 65 72 61 74 6f 72     InputIterator
2340: 20 6c 61 73 74 2c 0a 20 20 20 20 20 20 20 20 20   last,.         
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2370: 73 74 20 4e 6f 64 65 49 64 20 26 74 61 72 67 65  st NodeId &targe
2380: 74 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 4f 72  t) {.  return Or
2390: 64 65 72 65 64 43 6f 6e 74 61 63 74 73 28 66 69  deredContacts(fi
23a0: 72 73 74 2c 20 6c 61 73 74 2c 0a 20 20 20 20 20  rst, last,.     
23b0: 20 73 74 64 3a 3a 62 69 6e 64 28 73 74 61 74 69   std::bind(stati
23c0: 63 5f 63 61 73 74 3c 62 6f 6f 6c 28 2a 29 28 63  c_cast<bool(*)(c
23d0: 6f 6e 73 74 20 43 6f 6e 74 61 63 74 26 2c 20 20  onst Contact&,  
23e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 4c 49           // NOLI
23f0: 4e 54 20 28 46 72 61 73 65 72 29 0a 20 20 20 20  NT (Fraser).    
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 63 6f 6e 73 74 20 43 6f 6e 74 61 63 74 26 2c 0a  const Contact&,.
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 63 6f 6e 73 74 20 4e 6f 64 65 49 64      const NodeId
2460: 26 29 3e 28 26 43 6c 6f 73 65 72 54 6f 54 61 72  &)>(&CloserToTar
2470: 67 65 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  get),.          
2480: 20 20 20 20 20 20 61 72 67 73 3a 3a 5f 31 2c 20        args::_1, 
2490: 61 72 67 73 3a 3a 5f 32 2c 20 74 61 72 67 65 74  args::_2, target
24a0: 29 29 3b 0a 7d 0a 0a 0a 62 6f 6f 6c 20 57 72 69  ));.}...bool Wri
24b0: 74 65 43 6f 6e 74 61 63 74 73 54 6f 46 69 6c 65  teContactsToFile
24c0: 28 63 6f 6e 73 74 20 66 73 3a 3a 70 61 74 68 20  (const fs::path 
24d0: 26 66 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  &filename,.     
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 73 74 64 3a 3a 76 65 63 74 6f 72 3c      std::vector<
2500: 43 6f 6e 74 61 63 74 3e 20 2a 63 6f 6e 74 61 63  Contact> *contac
2510: 74 73 29 3b 0a 0a 62 6f 6f 6c 20 52 65 61 64 43  ts);..bool ReadC
2520: 6f 6e 74 61 63 74 73 46 72 6f 6d 46 69 6c 65 28  ontactsFromFile(
2530: 63 6f 6e 73 74 20 66 73 3a 3a 70 61 74 68 20 26  const fs::path &
2540: 66 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  filename,.      
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 73 74 64 3a 3a 76 65 63 74 6f 72 3c      std::vector<
2570: 43 6f 6e 74 61 63 74 3e 20 2a 63 6f 6e 74 61 63  Contact> *contac
2580: 74 73 29 3b 0a 0a 7d 20 20 2f 2f 20 6e 61 6d 65  ts);..}  // name
2590: 73 70 61 63 65 20 64 68 74 0a 0a 7d 20 20 2f 2f  space dht..}  //
25a0: 20 6e 61 6d 65 73 70 61 63 65 20 6d 61 69 64 73   namespace maids
25b0: 61 66 65 0a 0a 23 65 6e 64 69 66 20 20 2f 2f 20  afe..#endif  // 
25c0: 4d 41 49 44 53 41 46 45 5f 44 48 54 5f 43 4f 4e  MAIDSAFE_DHT_CON
25d0: 54 41 43 54 5f 48 5f 0a                          TACT_H_.