Match Wiki Protocol-spec to program
This commit is contained in:
parent
28a9d4741c
commit
a93bee3005
|
@ -240,7 +240,6 @@ class receiveDataThread(threading.Thread):
|
||||||
self.sock.settimeout(600) #We'll send out a pong every 5 minutes to make sure the connection stays alive if there has been no other traffic to send lately.
|
self.sock.settimeout(600) #We'll send out a pong every 5 minutes to make sure the connection stays alive if there has been no other traffic to send lately.
|
||||||
self.streamNumber = streamNumber
|
self.streamNumber = streamNumber
|
||||||
self.payloadLength = 0 #This is the protocol payload length thus it doesn't include the 24 byte message header
|
self.payloadLength = 0 #This is the protocol payload length thus it doesn't include the 24 byte message header
|
||||||
self.receivedgetbiginv = False #Gets set to true once we receive a getbiginv message from our peer. An abusive peer might request it too much so we use this variable to check whether they have already asked for a big inv message.
|
|
||||||
self.objectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave = {}
|
self.objectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave = {}
|
||||||
shared.connectedHostsList[self.HOST] = 0 #The very fact that this receiveData thread exists shows that we are connected to the remote host. Let's add it to this list so that an outgoingSynSender thread doesn't try to connect to it.
|
shared.connectedHostsList[self.HOST] = 0 #The very fact that this receiveData thread exists shows that we are connected to the remote host. Let's add it to this list so that an outgoingSynSender thread doesn't try to connect to it.
|
||||||
self.connectionIsOrWasFullyEstablished = False #set to true after the remote node and I accept each other's version messages. This is needed to allow the user interface to accurately reflect the current number of connections.
|
self.connectionIsOrWasFullyEstablished = False #set to true after the remote node and I accept each other's version messages. This is needed to allow the user interface to accurately reflect the current number of connections.
|
||||||
|
@ -349,14 +348,10 @@ class receiveDataThread(threading.Thread):
|
||||||
self.recinv(self.data[24:self.payloadLength+24])
|
self.recinv(self.data[24:self.payloadLength+24])
|
||||||
elif remoteCommand == 'getdata\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
elif remoteCommand == 'getdata\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
||||||
self.recgetdata(self.data[24:self.payloadLength+24])
|
self.recgetdata(self.data[24:self.payloadLength+24])
|
||||||
elif remoteCommand == 'getbiginv\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
|
||||||
self.sendBigInv()
|
|
||||||
elif remoteCommand == 'msg\x00\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
elif remoteCommand == 'msg\x00\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
||||||
self.recmsg(self.data[24:self.payloadLength+24])
|
self.recmsg(self.data[24:self.payloadLength+24])
|
||||||
elif remoteCommand == 'broadcast\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
elif remoteCommand == 'broadcast\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
||||||
self.recbroadcast(self.data[24:self.payloadLength+24])
|
self.recbroadcast(self.data[24:self.payloadLength+24])
|
||||||
elif remoteCommand == 'getaddr\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
|
||||||
self.sendaddr()
|
|
||||||
elif remoteCommand == 'ping\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
elif remoteCommand == 'ping\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
||||||
self.sendpong()
|
self.sendpong()
|
||||||
elif remoteCommand == 'pong\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
elif remoteCommand == 'pong\x00\x00\x00\x00\x00\x00\x00\x00' and self.connectionIsOrWasFullyEstablished:
|
||||||
|
@ -454,50 +449,45 @@ class receiveDataThread(threading.Thread):
|
||||||
return
|
return
|
||||||
self.sendBigInv()
|
self.sendBigInv()
|
||||||
|
|
||||||
def sendBigInv(self): #I used capitals in for this function name because there is no such Bitmessage command as 'biginv'.
|
def sendBigInv(self):
|
||||||
if self.receivedgetbiginv:
|
shared.sqlLock.acquire()
|
||||||
print 'We have already sent a big inv message to this peer. Ignoring request.'
|
#Select all hashes which are younger than two days old and in this stream.
|
||||||
return
|
t = (int(time.time())-maximumAgeOfObjectsThatIAdvertiseToOthers,int(time.time())-lengthOfTimeToHoldOnToAllPubkeys,self.streamNumber)
|
||||||
else:
|
shared.sqlSubmitQueue.put('''SELECT hash FROM inventory WHERE ((receivedtime>? and objecttype<>'pubkey') or (receivedtime>? and objecttype='pubkey')) and streamnumber=?''')
|
||||||
self.receivedgetbiginv = True
|
shared.sqlSubmitQueue.put(t)
|
||||||
shared.sqlLock.acquire()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
#Select all hashes which are younger than two days old and in this stream.
|
shared.sqlLock.release()
|
||||||
t = (int(time.time())-maximumAgeOfObjectsThatIAdvertiseToOthers,int(time.time())-lengthOfTimeToHoldOnToAllPubkeys,self.streamNumber)
|
bigInvList = {}
|
||||||
shared.sqlSubmitQueue.put('''SELECT hash FROM inventory WHERE ((receivedtime>? and objecttype<>'pubkey') or (receivedtime>? and objecttype='pubkey')) and streamnumber=?''')
|
for row in queryreturn:
|
||||||
shared.sqlSubmitQueue.put(t)
|
hash, = row
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
if hash not in self.objectsOfWhichThisRemoteNodeIsAlreadyAware:
|
||||||
shared.sqlLock.release()
|
bigInvList[hash] = 0
|
||||||
bigInvList = {}
|
else:
|
||||||
for row in queryreturn:
|
shared.printLock.acquire()
|
||||||
hash, = row
|
print 'Not including an object hash in a big inv message because the remote node is already aware of it.'#This line is here to check that this feature is working.
|
||||||
if hash not in self.objectsOfWhichThisRemoteNodeIsAlreadyAware:
|
shared.printLock.release()
|
||||||
|
#We also have messages in our inventory in memory (which is a python dictionary). Let's fetch those too.
|
||||||
|
for hash, storedValue in shared.inventory.items():
|
||||||
|
if hash not in self.objectsOfWhichThisRemoteNodeIsAlreadyAware:
|
||||||
|
objectType, streamNumber, payload, receivedTime = storedValue
|
||||||
|
if streamNumber == self.streamNumber and receivedTime > int(time.time())-maximumAgeOfObjectsThatIAdvertiseToOthers:
|
||||||
bigInvList[hash] = 0
|
bigInvList[hash] = 0
|
||||||
else:
|
else:
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
print 'Not including an object hash in a big inv message because the remote node is already aware of it.'#This line is here to check that this feature is working.
|
print 'Not including an object hash in a big inv message because the remote node is already aware of it.'#This line is here to check that this feature is working.
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
#We also have messages in our inventory in memory (which is a python dictionary). Let's fetch those too.
|
numberOfObjectsInInvMessage = 0
|
||||||
for hash, storedValue in shared.inventory.items():
|
payload = ''
|
||||||
if hash not in self.objectsOfWhichThisRemoteNodeIsAlreadyAware:
|
#Now let us start appending all of these hashes together. They will be sent out in a big inv message to our new peer.
|
||||||
objectType, streamNumber, payload, receivedTime = storedValue
|
for hash, storedValue in bigInvList.items():
|
||||||
if streamNumber == self.streamNumber and receivedTime > int(time.time())-maximumAgeOfObjectsThatIAdvertiseToOthers:
|
payload += hash
|
||||||
bigInvList[hash] = 0
|
numberOfObjectsInInvMessage += 1
|
||||||
else:
|
if numberOfObjectsInInvMessage >= 50000: #We can only send a max of 50000 items per inv message but we may have more objects to advertise. They must be split up into multiple inv messages.
|
||||||
shared.printLock.acquire()
|
|
||||||
print 'Not including an object hash in a big inv message because the remote node is already aware of it.'#This line is here to check that this feature is working.
|
|
||||||
shared.printLock.release()
|
|
||||||
numberOfObjectsInInvMessage = 0
|
|
||||||
payload = ''
|
|
||||||
#Now let us start appending all of these hashes together. They will be sent out in a big inv message to our new peer.
|
|
||||||
for hash, storedValue in bigInvList.items():
|
|
||||||
payload += hash
|
|
||||||
numberOfObjectsInInvMessage += 1
|
|
||||||
if numberOfObjectsInInvMessage >= 50000: #We can only send a max of 50000 items per inv message but we may have more objects to advertise. They must be split up into multiple inv messages.
|
|
||||||
self.sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload)
|
|
||||||
payload = ''
|
|
||||||
numberOfObjectsInInvMessage = 0
|
|
||||||
if numberOfObjectsInInvMessage > 0:
|
|
||||||
self.sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload)
|
self.sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload)
|
||||||
|
payload = ''
|
||||||
|
numberOfObjectsInInvMessage = 0
|
||||||
|
if numberOfObjectsInInvMessage > 0:
|
||||||
|
self.sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload)
|
||||||
|
|
||||||
#Self explanatory. Notice that there is also a broadcastinv function for broadcasting invs to everyone in our stream.
|
#Self explanatory. Notice that there is also a broadcastinv function for broadcasting invs to everyone in our stream.
|
||||||
def sendinvMessageToJustThisOnePeer(self,numberOfObjects,payload):
|
def sendinvMessageToJustThisOnePeer(self,numberOfObjects,payload):
|
||||||
|
|
|
@ -755,8 +755,8 @@ class MyForm(QtGui.QMainWindow):
|
||||||
n = Notify.Notification.new(title, subtitle,'notification-message-email')
|
n = Notify.Notification.new(title, subtitle,'notification-message-email')
|
||||||
n.show()
|
n.show()
|
||||||
return
|
return
|
||||||
# Show with tray
|
else:
|
||||||
self.trayIcon.showMessage(title, subtitle, 1, 2000)
|
self.tray.showMessage(title, subtitle, 1, 2000)
|
||||||
|
|
||||||
def tableWidgetInboxKeyPressEvent(self,event):
|
def tableWidgetInboxKeyPressEvent(self,event):
|
||||||
if event.key() == QtCore.Qt.Key_Delete:
|
if event.key() == QtCore.Qt.Key_Delete:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user