Support changed peeraddress after reconnect

This commit is contained in:
Manfred Karrer 2015-04-07 19:30:37 +02:00
parent 973aa73c76
commit bea3dbc445
8 changed files with 95 additions and 58 deletions

View file

@ -24,6 +24,7 @@ import io.bitsquare.btc.WalletService;
import io.bitsquare.common.taskrunner.Model; import io.bitsquare.common.taskrunner.Model;
import io.bitsquare.crypto.SignatureService; import io.bitsquare.crypto.SignatureService;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.p2p.AddressService;
import io.bitsquare.p2p.MailboxMessage; import io.bitsquare.p2p.MailboxMessage;
import io.bitsquare.p2p.MessageService; import io.bitsquare.p2p.MessageService;
import io.bitsquare.p2p.Peer; import io.bitsquare.p2p.Peer;
@ -152,6 +153,7 @@ abstract public class Trade implements Model, Serializable {
public void init(MessageService messageService, public void init(MessageService messageService,
WalletService walletService, WalletService walletService,
AddressService addressService,
TradeWalletService tradeWalletService, TradeWalletService tradeWalletService,
BlockChainService blockChainService, BlockChainService blockChainService,
SignatureService signatureService, SignatureService signatureService,
@ -160,6 +162,7 @@ abstract public class Trade implements Model, Serializable {
processModel.onAllServicesInitialized(offer, processModel.onAllServicesInitialized(offer,
messageService, messageService,
addressService,
walletService, walletService,
tradeWalletService, tradeWalletService,
blockChainService, blockChainService,

View file

@ -484,6 +484,7 @@ public class TradeManager {
private void initTrade(Trade trade) { private void initTrade(Trade trade) {
trade.init(messageService, trade.init(messageService,
walletService, walletService,
addressService,
tradeWalletService, tradeWalletService,
blockChainService, blockChainService,
signatureService, signatureService,

View file

@ -76,17 +76,20 @@ public class BuyerAsOffererProtocol extends TradeProtocol implements BuyerProtoc
@Override @Override
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) { public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
if (trade == null)
this.trade = trade; this.trade = trade;
log.debug("setMailboxMessage " + mailboxMessage); log.debug("setMailboxMessage " + mailboxMessage);
// Might be called twice, so check that its only processed once
if (!processModel.isMailboxMessageProcessed()) { // Find first the actual peer address, as it might have changed in the meantime
processModel.mailboxMessageProcessed(); findPeerAddress(processModel.tradingPeer.getP2pSigPubKey(),
() -> {
if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) { if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) {
handle((RequestFinalizePayoutTxMessage) mailboxMessage); handle((RequestFinalizePayoutTxMessage) mailboxMessage);
} }
} },
(errorMessage -> {
log.error(errorMessage);
}));
} }

View file

@ -74,17 +74,20 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
@Override @Override
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) { public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
if (trade == null)
this.trade = trade; this.trade = trade;
log.debug("setMailboxMessage " + mailboxMessage); log.debug("setMailboxMessage " + mailboxMessage);
// Might be called twice, so check that its only processed once
if (!processModel.isMailboxMessageProcessed()) { // Find first the actual peer address, as it might have changed in the meantime
processModel.mailboxMessageProcessed(); findPeerAddress(trade.getOffer().getP2pSigPubKey(),
() -> {
if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) { if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) {
handle((RequestFinalizePayoutTxMessage) mailboxMessage); handle((RequestFinalizePayoutTxMessage) mailboxMessage);
} }
} },
(errorMessage -> {
log.error(errorMessage);
}));
} }
@Override @Override

View file

@ -26,6 +26,7 @@ import io.bitsquare.common.taskrunner.Model;
import io.bitsquare.crypto.SignatureService; import io.bitsquare.crypto.SignatureService;
import io.bitsquare.fiat.FiatAccount; import io.bitsquare.fiat.FiatAccount;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.p2p.AddressService;
import io.bitsquare.p2p.MessageService; import io.bitsquare.p2p.MessageService;
import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.messages.TradeMessage;
import io.bitsquare.user.User; import io.bitsquare.user.User;
@ -55,6 +56,7 @@ public class ProcessModel implements Model, Serializable {
// Transient/Immutable // Transient/Immutable
transient private MessageService messageService; transient private MessageService messageService;
transient private AddressService addressService;
transient private WalletService walletService; transient private WalletService walletService;
transient private TradeWalletService tradeWalletService; transient private TradeWalletService tradeWalletService;
transient private BlockChainService blockChainService; transient private BlockChainService blockChainService;
@ -65,7 +67,6 @@ public class ProcessModel implements Model, Serializable {
// Mutable // Mutable
public final TradingPeer tradingPeer; public final TradingPeer tradingPeer;
transient private boolean mailboxMessageProcessed;
transient private TradeMessage tradeMessage; transient private TradeMessage tradeMessage;
private String takeOfferFeeTxId; private String takeOfferFeeTxId;
private List<TransactionOutput> connectedOutputsForAllInputs; private List<TransactionOutput> connectedOutputsForAllInputs;
@ -88,6 +89,7 @@ public class ProcessModel implements Model, Serializable {
public void onAllServicesInitialized(Offer offer, public void onAllServicesInitialized(Offer offer,
MessageService messageService, MessageService messageService,
AddressService addressService,
WalletService walletService, WalletService walletService,
TradeWalletService tradeWalletService, TradeWalletService tradeWalletService,
BlockChainService blockChainService, BlockChainService blockChainService,
@ -96,6 +98,7 @@ public class ProcessModel implements Model, Serializable {
User user) { User user) {
this.offer = offer; this.offer = offer;
this.messageService = messageService; this.messageService = messageService;
this.addressService = addressService;
this.walletService = walletService; this.walletService = walletService;
this.tradeWalletService = tradeWalletService; this.tradeWalletService = tradeWalletService;
this.blockChainService = blockChainService; this.blockChainService = blockChainService;
@ -155,15 +158,6 @@ public class ProcessModel implements Model, Serializable {
return tradeMessage; return tradeMessage;
} }
public void mailboxMessageProcessed() {
this.mailboxMessageProcessed = true;
}
@Nullable
public boolean isMailboxMessageProcessed() {
return mailboxMessageProcessed;
}
@Nullable @Nullable
public Transaction getTakeOfferFeeTx() { public Transaction getTakeOfferFeeTx() {
return takeOfferFeeTx; return takeOfferFeeTx;
@ -265,4 +259,8 @@ public class ProcessModel implements Model, Serializable {
@Override @Override
public void onComplete() { public void onComplete() {
} }
public AddressService getAddressService() {
return addressService;
}
} }

View file

@ -77,20 +77,22 @@ public class SellerAsOffererProtocol extends TradeProtocol implements SellerProt
@Override @Override
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) { public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
if (trade == null)
this.trade = trade; this.trade = trade;
log.debug("setMailboxMessage " + mailboxMessage); log.debug("setMailboxMessage " + mailboxMessage);
// Might be called twice, so check that its only processed once // Find first the actual peer address, as it might have changed in the meantime
if (!processModel.isMailboxMessageProcessed()) { findPeerAddress(processModel.tradingPeer.getP2pSigPubKey(),
processModel.mailboxMessageProcessed(); () -> {
if (mailboxMessage instanceof FiatTransferStartedMessage) { if (mailboxMessage instanceof FiatTransferStartedMessage) {
handle((FiatTransferStartedMessage) mailboxMessage); handle((FiatTransferStartedMessage) mailboxMessage);
} }
else if (mailboxMessage instanceof DepositTxPublishedMessage) { else if (mailboxMessage instanceof DepositTxPublishedMessage) {
handle((DepositTxPublishedMessage) mailboxMessage); handle((DepositTxPublishedMessage) mailboxMessage);
} }
} },
(errorMessage -> {
log.error(errorMessage);
}));
} }

View file

@ -76,13 +76,13 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
@Override @Override
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) { public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
if (trade == null)
this.trade = trade; this.trade = trade;
log.debug("setMailboxMessage " + mailboxMessage); log.debug("setMailboxMessage " + mailboxMessage);
// Might be called twice, so check that its only processed once
if (!processModel.isMailboxMessageProcessed()) { // Find first the actual peer address, as it might have changed in the meantime
processModel.mailboxMessageProcessed(); findPeerAddress(trade.getOffer().getP2pSigPubKey(),
() -> {
if (mailboxMessage instanceof FiatTransferStartedMessage) { if (mailboxMessage instanceof FiatTransferStartedMessage) {
handle((FiatTransferStartedMessage) mailboxMessage); handle((FiatTransferStartedMessage) mailboxMessage);
} }
@ -92,7 +92,10 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
else if (mailboxMessage instanceof PayoutTxFinalizedMessage) { else if (mailboxMessage instanceof PayoutTxFinalizedMessage) {
handle((PayoutTxFinalizedMessage) mailboxMessage); handle((PayoutTxFinalizedMessage) mailboxMessage);
} }
} },
(errorMessage -> {
log.error(errorMessage);
}));
} }
@Override @Override

View file

@ -17,8 +17,12 @@
package io.bitsquare.trade.protocol.trade; package io.bitsquare.trade.protocol.trade;
import io.bitsquare.common.handlers.ErrorMessageHandler;
import io.bitsquare.common.handlers.ResultHandler;
import io.bitsquare.p2p.MailboxMessage; import io.bitsquare.p2p.MailboxMessage;
import io.bitsquare.p2p.MessageHandler; import io.bitsquare.p2p.MessageHandler;
import io.bitsquare.p2p.Peer;
import io.bitsquare.p2p.listener.GetPeerAddressListener;
import io.bitsquare.trade.OffererTrade; import io.bitsquare.trade.OffererTrade;
import io.bitsquare.trade.TakerTrade; import io.bitsquare.trade.TakerTrade;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
@ -28,6 +32,8 @@ import io.bitsquare.trade.states.TakerTradeState;
import org.bitcoinj.utils.Threading; import org.bitcoinj.utils.Threading;
import java.security.PublicKey;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -55,8 +61,26 @@ public abstract class TradeProtocol {
abstract public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade); abstract public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade);
protected void findPeerAddress(PublicKey p2pSigPubKey, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
try {
processModel.getAddressService().findPeerAddress(p2pSigPubKey, new GetPeerAddressListener() {
@Override
public void onResult(Peer peer) {
trade.setTradingPeer(peer);
resultHandler.handleResult();
}
@Override
public void onFailed() {
errorMessageHandler.handleErrorMessage("findPeerAddress failed");
}
});
} catch (Throwable t) {
errorMessageHandler.handleErrorMessage("findPeerAddress failed with error: " + t.getMessage());
}
}
public void checkPayoutTxTimeLock(Trade trade) { public void checkPayoutTxTimeLock(Trade trade) {
if (trade == null)
this.trade = trade; this.trade = trade;
boolean needPayoutTxBroadcast = false; boolean needPayoutTxBroadcast = false;