def haveNoRouteOutgoing(self, transactionID, isPayerSide): self.state = self.states.cancelled return self.__removeTimeouts() + \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Cancel() ), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ]
def haveNoRouteOutgoing(self, transactionID, isPayerSide): if self.state != self.states.confirmed: raise Exception( "haveNoRouteOutgoing should not be called in state %s" % \ self.state ) self.state = self.states.cancelled return \ [ messages.OutboundMessage(localID = self.ID, message = \ messages.Cancel() ) ]
def settleRollbackOutgoing(self, msg): if self.state != self.states.locked: raise Exception( "settleRollbackOutgoing should not be called in state %s" % \ self.state ) log.log("Payer: received settleRollback -> cancelled") self.state = self.states.cancelled return self.__removeTimeouts() + \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Cancel() ), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ]
def msg_confirm(self, msg): log.log("PayerLink: Received confirm: %s" % str(msg.agreement)) if self.state != self.states.hasReceipt: raise Exception( "msg_confirm should not be called in state %s" % \ self.state ) ret = [] if msg.agreement: self.state = self.states.confirmed ret = \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Confirm(meetingPointID=self.meetingPointID) ), messages.MakeRoute( #This will start the transaction routing ID=messages.payerLocalID, routingContext=self.routingContext, amount=self.amount, transactionID=self.transactionID, startTime=None, #Will be received from the payee side endTime=None, #Will be received from the payee side meetingPointID=self.meetingPointID, isPayerSide=True ) ] else: self.state = self.states.cancelled ret = self.__removeTimeouts() + \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Cancel() ), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ] return ret
def parse_message_from_response(self): length = messages.bytes_to_number( self.message_buffer[0:4] ) + 4 #length indicated by the first 4 bytes + 4 for those first 4 bytes bytestring = self.message_buffer[:length] if self.message_buffer[0:4] == '\x00\x00\x00\x00': #no msg_id message_obj = KeepAlive(response=bytestring) else: message_obj = { 0: lambda: messages.Choke(response=bytestring), 1: lambda: messages.Unchoke(response=bytestring), 2: lambda: messages.Interested(response=bytestring), 3: lambda: messaged.Interested(response=bytestring), 4: lambda: messages.Have(response=bytestring), 5: lambda: messages.Bitfield(response=bytestring), 6: lambda: messages.Request(response=bytestring), 7: lambda: messages.Piece(response=bytestring), 8: lambda: messages.Cancel(response=bytestring), 9: lambda: messages.Port(response=bytestring), }[self.message_buffer[4]]() #response[4] is the msg_id self.message_buffer = self.message_buffer[length:] return message_obj