|
@@ -231,6 +231,8 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
|
231
|
231
|
private final Map<String, CapabilityState> capabilities = new HashMap<>();
|
232
|
232
|
/** Handler for whois responses. */
|
233
|
233
|
private final WhoisResponseHandler whoisHandler;
|
|
234
|
+ /** Used to synchronize calls to resetState. */
|
|
235
|
+ private final Object resetStateSync = new Object();
|
234
|
236
|
|
235
|
237
|
/**
|
236
|
238
|
* Default constructor, ServerInfo and MyInfo need to be added separately (using IRC.me and IRC.server).
|
|
@@ -590,7 +592,11 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
|
590
|
592
|
* Callback to all objects implementing the SocketClosed Callback.
|
591
|
593
|
*/
|
592
|
594
|
protected void callSocketClosed() {
|
593
|
|
- getCallbackManager().publish(new SocketCloseEvent(this, new Date()));
|
|
595
|
+ // Don't allow state resetting whilst there may be handlers requiring
|
|
596
|
+ // state.
|
|
597
|
+ synchronized (resetStateSync) {
|
|
598
|
+ getCallbackManager().publish(new SocketCloseEvent(this, new Date()));
|
|
599
|
+ }
|
594
|
600
|
}
|
595
|
601
|
|
596
|
602
|
/**
|
|
@@ -643,36 +649,38 @@ public class IRCParser extends BaseSocketAwareParser implements SecureParser, En
|
643
|
649
|
//---------------------------------------------------------------------------
|
644
|
650
|
/** Reset internal state (use before doConnect). */
|
645
|
651
|
private void resetState() {
|
646
|
|
- // Reset General State info
|
647
|
|
- got001 = false;
|
648
|
|
- post005 = false;
|
649
|
|
- // Clear the hash tables
|
650
|
|
- channelList.clear();
|
651
|
|
- clientList.clear();
|
652
|
|
- h005Info.clear();
|
653
|
|
- prefixModes.clear();
|
654
|
|
- chanModesOther.clear();
|
655
|
|
- chanModesBool.clear();
|
656
|
|
- userModes.clear();
|
657
|
|
- chanPrefix = DEFAULT_CHAN_PREFIX;
|
658
|
|
- // Clear output queue.
|
659
|
|
- if (out != null) {
|
660
|
|
- out.clearQueue();
|
661
|
|
- }
|
662
|
|
- setServerName("");
|
663
|
|
- networkName = "";
|
664
|
|
- lastLine = null;
|
665
|
|
- myself = new IRCClientInfo(this, userModes, "myself").setFake(true);
|
|
652
|
+ synchronized (resetStateSync) {
|
|
653
|
+ // Reset General State info
|
|
654
|
+ got001 = false;
|
|
655
|
+ post005 = false;
|
|
656
|
+ // Clear the hash tables
|
|
657
|
+ channelList.clear();
|
|
658
|
+ clientList.clear();
|
|
659
|
+ h005Info.clear();
|
|
660
|
+ prefixModes.clear();
|
|
661
|
+ chanModesOther.clear();
|
|
662
|
+ chanModesBool.clear();
|
|
663
|
+ userModes.clear();
|
|
664
|
+ chanPrefix = DEFAULT_CHAN_PREFIX;
|
|
665
|
+ // Clear output queue.
|
|
666
|
+ if (out != null) {
|
|
667
|
+ out.clearQueue();
|
|
668
|
+ }
|
|
669
|
+ setServerName("");
|
|
670
|
+ networkName = "";
|
|
671
|
+ lastLine = null;
|
|
672
|
+ myself = new IRCClientInfo(this, userModes, "myself").setFake(true);
|
666
|
673
|
|
667
|
|
- synchronized (serverInformationLines) {
|
668
|
|
- serverInformationLines.clear();
|
669
|
|
- }
|
670
|
|
- stopPingTimer();
|
|
674
|
+ synchronized (serverInformationLines) {
|
|
675
|
+ serverInformationLines.clear();
|
|
676
|
+ }
|
|
677
|
+ stopPingTimer();
|
671
|
678
|
|
672
|
|
- currentSocketState = SocketState.CLOSED;
|
673
|
|
- setEncoding(IRCEncoding.RFC1459);
|
|
679
|
+ currentSocketState = SocketState.CLOSED;
|
|
680
|
+ setEncoding(IRCEncoding.RFC1459);
|
674
|
681
|
|
675
|
|
- whoisHandler.stop();
|
|
682
|
+ whoisHandler.stop();
|
|
683
|
+ }
|
676
|
684
|
}
|
677
|
685
|
|
678
|
686
|
/**
|