|
@@ -23,6 +23,7 @@
|
23
|
23
|
package com.dmdirc;
|
24
|
24
|
|
25
|
25
|
import com.dmdirc.config.profiles.Profile;
|
|
26
|
+import com.dmdirc.events.FrameClosingEvent;
|
26
|
27
|
import com.dmdirc.events.ServerConnectErrorEvent;
|
27
|
28
|
import com.dmdirc.events.ServerConnectedEvent;
|
28
|
29
|
import com.dmdirc.events.ServerConnectingEvent;
|
|
@@ -83,6 +84,8 @@ import javax.net.ssl.SSLException;
|
83
|
84
|
import org.slf4j.Logger;
|
84
|
85
|
import org.slf4j.LoggerFactory;
|
85
|
86
|
|
|
87
|
+import net.engio.mbassy.listener.Handler;
|
|
88
|
+
|
86
|
89
|
import static com.dmdirc.util.LogUtils.APP_ERROR;
|
87
|
90
|
import static com.google.common.base.Preconditions.checkNotNull;
|
88
|
91
|
|
|
@@ -90,7 +93,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
90
|
93
|
* The Server class represents the client's view of a server. It maintains a list of all channels,
|
91
|
94
|
* queries, etc, and handles parser callbacks pertaining to the server.
|
92
|
95
|
*/
|
93
|
|
-public class Server extends FrameContainer implements Connection {
|
|
96
|
+public class Server implements Connection {
|
94
|
97
|
|
95
|
98
|
private static final Logger LOG = LoggerFactory.getLogger(Server.class);
|
96
|
99
|
/** The name of the general domain. */
|
|
@@ -163,6 +166,7 @@ public class Server extends FrameContainer implements Connection {
|
163
|
166
|
private final HighlightManager highlightManager;
|
164
|
167
|
/** Listener to use for config changes. */
|
165
|
168
|
private final ConfigChangeListener configListener = (domain, key) -> updateTitle();
|
|
169
|
+ private final FrameContainer windowModel;
|
166
|
170
|
/** The future used when a reconnect timer is scheduled. */
|
167
|
171
|
private ScheduledFuture<?> reconnectTimerFuture;
|
168
|
172
|
|
|
@@ -183,16 +187,14 @@ public class Server extends FrameContainer implements Connection {
|
183
|
187
|
@Nonnull final Profile profile,
|
184
|
188
|
final BackBufferFactory backBufferFactory,
|
185
|
189
|
final UserManager userManager) {
|
186
|
|
- super("server-disconnected",
|
187
|
|
- getHost(uri),
|
188
|
|
- getHost(uri),
|
189
|
|
- configMigrator.getConfigProvider(),
|
190
|
|
- backBufferFactory,
|
191
|
|
- eventBus,
|
192
|
|
- Arrays.asList(
|
193
|
|
- WindowComponent.TEXTAREA.getIdentifier(),
|
194
|
|
- WindowComponent.INPUTFIELD.getIdentifier(),
|
195
|
|
- WindowComponent.CERTIFICATE_VIEWER.getIdentifier()));
|
|
190
|
+ // TODO: Pass this in
|
|
191
|
+ windowModel =
|
|
192
|
+ new FrameContainer("server-disconnected", getHost(uri), getHost(uri),
|
|
193
|
+ configMigrator.getConfigProvider(), backBufferFactory, eventBus,
|
|
194
|
+ Arrays.asList(WindowComponent.TEXTAREA.getIdentifier(),
|
|
195
|
+ WindowComponent.INPUTFIELD.getIdentifier(),
|
|
196
|
+ WindowComponent.CERTIFICATE_VIEWER.getIdentifier()));
|
|
197
|
+ windowModel.setConnection(this);
|
196
|
198
|
|
197
|
199
|
this.parserFactory = parserFactory;
|
198
|
200
|
this.identityFactory = identityFactory;
|
|
@@ -206,7 +208,7 @@ public class Server extends FrameContainer implements Connection {
|
206
|
208
|
this.inviteManager = new InviteManagerImpl(this);
|
207
|
209
|
|
208
|
210
|
awayMessage = Optional.empty();
|
209
|
|
- eventHandler = new ServerEventHandler(this, groupChatManager, getEventBus());
|
|
211
|
+ eventHandler = new ServerEventHandler(this, groupChatManager, windowModel.getEventBus());
|
210
|
212
|
|
211
|
213
|
this.address = uri;
|
212
|
214
|
this.profile = profile;
|
|
@@ -214,14 +216,15 @@ public class Server extends FrameContainer implements Connection {
|
214
|
216
|
|
215
|
217
|
updateIcon();
|
216
|
218
|
|
217
|
|
- getConfigManager().addChangeListener("formatter", "serverName", configListener);
|
218
|
|
- getConfigManager().addChangeListener("formatter", "serverTitle", configListener);
|
|
219
|
+ windowModel.getConfigManager().addChangeListener("formatter", "serverName", configListener);
|
|
220
|
+ windowModel.getConfigManager().addChangeListener("formatter", "serverTitle", configListener);
|
219
|
221
|
|
220
|
|
- initBackBuffer();
|
221
|
|
- this.highlightManager = new HighlightManager(getConfigManager(),
|
222
|
|
- new ColourManager(getConfigManager()));
|
|
222
|
+ windowModel.initBackBuffer();
|
|
223
|
+ this.highlightManager = new HighlightManager(windowModel.getConfigManager(),
|
|
224
|
+ new ColourManager(windowModel.getConfigManager()));
|
223
|
225
|
highlightManager.init();
|
224
|
|
- getEventBus().subscribe(highlightManager);
|
|
226
|
+ windowModel.getEventBus().subscribe(highlightManager);
|
|
227
|
+ windowModel.getEventBus().subscribe(this);
|
225
|
228
|
}
|
226
|
229
|
|
227
|
230
|
/**
|
|
@@ -278,7 +281,8 @@ public class Server extends FrameContainer implements Connection {
|
278
|
281
|
return;
|
279
|
282
|
case CONNECTED:
|
280
|
283
|
case CONNECTING:
|
281
|
|
- disconnect(getConfigManager().getOption(DOMAIN_GENERAL, "quitmessage"));
|
|
284
|
+ disconnect(windowModel.getConfigManager()
|
|
285
|
+ .getOption(DOMAIN_GENERAL, "quitmessage"));
|
282
|
286
|
case DISCONNECTING:
|
283
|
287
|
while (!myState.getState().isDisconnected()) {
|
284
|
288
|
try {
|
|
@@ -313,7 +317,7 @@ public class Server extends FrameContainer implements Connection {
|
313
|
317
|
parser = Optional.ofNullable(buildParser());
|
314
|
318
|
|
315
|
319
|
if (!parser.isPresent()) {
|
316
|
|
- getEventBus().publishAsync(
|
|
320
|
+ windowModel.getEventBus().publishAsync(
|
317
|
321
|
new ServerUnknownProtocolEvent(this, address.getScheme()));
|
318
|
322
|
return;
|
319
|
323
|
}
|
|
@@ -338,7 +342,7 @@ public class Server extends FrameContainer implements Connection {
|
338
|
342
|
}
|
339
|
343
|
}
|
340
|
344
|
|
341
|
|
- getEventBus().publish(new ServerConnectingEvent(this, address));
|
|
345
|
+ windowModel.getEventBus().publish(new ServerConnectingEvent(this, address));
|
342
|
346
|
}
|
343
|
347
|
|
344
|
348
|
@Override
|
|
@@ -356,12 +360,12 @@ public class Server extends FrameContainer implements Connection {
|
356
|
360
|
|
357
|
361
|
@Override
|
358
|
362
|
public void reconnect() {
|
359
|
|
- reconnect(getConfigManager().getOption(DOMAIN_GENERAL, "reconnectmessage"));
|
|
363
|
+ reconnect(windowModel.getConfigManager().getOption(DOMAIN_GENERAL, "reconnectmessage"));
|
360
|
364
|
}
|
361
|
365
|
|
362
|
366
|
@Override
|
363
|
367
|
public void disconnect() {
|
364
|
|
- disconnect(getConfigManager().getOption(DOMAIN_GENERAL, "quitmessage"));
|
|
368
|
+ disconnect(windowModel.getConfigManager().getOption(DOMAIN_GENERAL, "quitmessage"));
|
365
|
369
|
}
|
366
|
370
|
|
367
|
371
|
@Override
|
|
@@ -403,7 +407,8 @@ public class Server extends FrameContainer implements Connection {
|
403
|
407
|
parserLock.readLock().unlock();
|
404
|
408
|
}
|
405
|
409
|
|
406
|
|
- if (getConfigManager().getOptionBool(DOMAIN_GENERAL, "closequeriesonquit")) {
|
|
410
|
+ if (windowModel.getConfigManager()
|
|
411
|
+ .getOptionBool(DOMAIN_GENERAL, "closequeriesonquit")) {
|
407
|
412
|
closeQueries();
|
408
|
413
|
}
|
409
|
414
|
}
|
|
@@ -423,9 +428,10 @@ public class Server extends FrameContainer implements Connection {
|
423
|
428
|
}
|
424
|
429
|
|
425
|
430
|
final int delay = Math.max(1000,
|
426
|
|
- getConfigManager().getOptionInt(DOMAIN_GENERAL, "reconnectdelay"));
|
|
431
|
+ windowModel.getConfigManager().getOptionInt(DOMAIN_GENERAL, "reconnectdelay"));
|
427
|
432
|
|
428
|
|
- getEventBus().publishAsync(new ServerReconnectScheduledEvent(this, delay / 1000));
|
|
433
|
+ windowModel.getEventBus().publishAsync(
|
|
434
|
+ new ServerReconnectScheduledEvent(this, delay / 1000));
|
429
|
435
|
|
430
|
436
|
reconnectTimerFuture = executorService.schedule(() -> {
|
431
|
437
|
synchronized (myStateLock) {
|
|
@@ -483,7 +489,8 @@ public class Server extends FrameContainer implements Connection {
|
483
|
489
|
if (!getState().isDisconnected()) {
|
484
|
490
|
newQuery.reregister();
|
485
|
491
|
}
|
486
|
|
- getInputModel().get().getTabCompleter().addEntry(TabCompletionType.QUERY_NICK, nick);
|
|
492
|
+ windowModel.getInputModel().get().getTabCompleter()
|
|
493
|
+ .addEntry(TabCompletionType.QUERY_NICK, nick);
|
487
|
494
|
queries.put(lnick, newQuery);
|
488
|
495
|
}
|
489
|
496
|
|
|
@@ -492,8 +499,10 @@ public class Server extends FrameContainer implements Connection {
|
492
|
499
|
|
493
|
500
|
@Override
|
494
|
501
|
public void updateQuery(final Query query, final String oldNick, final String newNick) {
|
495
|
|
- getInputModel().get().getTabCompleter().removeEntry(TabCompletionType.QUERY_NICK, oldNick);
|
496
|
|
- getInputModel().get().getTabCompleter().addEntry(TabCompletionType.QUERY_NICK, newNick);
|
|
502
|
+ windowModel.getInputModel().get().getTabCompleter()
|
|
503
|
+ .removeEntry(TabCompletionType.QUERY_NICK, oldNick);
|
|
504
|
+ windowModel.getInputModel().get().getTabCompleter()
|
|
505
|
+ .addEntry(TabCompletionType.QUERY_NICK, newNick);
|
497
|
506
|
|
498
|
507
|
queries.put(converter.toLowerCase(newNick), query);
|
499
|
508
|
queries.remove(converter.toLowerCase(oldNick));
|
|
@@ -506,7 +515,7 @@ public class Server extends FrameContainer implements Connection {
|
506
|
515
|
|
507
|
516
|
@Override
|
508
|
517
|
public void delQuery(final Query query) {
|
509
|
|
- getInputModel().get().getTabCompleter().removeEntry(
|
|
518
|
+ windowModel.getInputModel().get().getTabCompleter().removeEntry(
|
510
|
519
|
TabCompletionType.QUERY_NICK, query.getNickname());
|
511
|
520
|
queries.remove(converter.toLowerCase(query.getNickname()));
|
512
|
521
|
}
|
|
@@ -545,7 +554,8 @@ public class Server extends FrameContainer implements Connection {
|
545
|
554
|
*/
|
546
|
555
|
@Nullable
|
547
|
556
|
private Parser buildParser() {
|
548
|
|
- final Parser myParser = parserFactory.getParser(profile, address, getConfigManager())
|
|
557
|
+ final Parser myParser = parserFactory
|
|
558
|
+ .getParser(profile, address, windowModel.getConfigManager())
|
549
|
559
|
.orElse(null);
|
550
|
560
|
|
551
|
561
|
if (myParser != null) {
|
|
@@ -554,8 +564,8 @@ public class Server extends FrameContainer implements Connection {
|
554
|
564
|
|
555
|
565
|
if (myParser instanceof SecureParser) {
|
556
|
566
|
final CertificateManager certificateManager =
|
557
|
|
- new CertificateManager(this, address.getHost(), getConfigManager(),
|
558
|
|
- userSettings, getEventBus());
|
|
567
|
+ new CertificateManager(this, address.getHost(), windowModel.getConfigManager(),
|
|
568
|
+ userSettings, windowModel.getEventBus());
|
559
|
569
|
final SecureParser secureParser = (SecureParser) myParser;
|
560
|
570
|
secureParser.setTrustManagers(certificateManager);
|
561
|
571
|
secureParser.setKeyManagers(certificateManager.getKeyManager());
|
|
@@ -582,7 +592,7 @@ public class Server extends FrameContainer implements Connection {
|
582
|
592
|
final String icon = myState.getState() == ServerState.CONNECTED
|
583
|
593
|
? protocolDescription.get().isSecure(address)
|
584
|
594
|
? "secure-server" : "server" : "server-disconnected";
|
585
|
|
- setIcon(icon);
|
|
595
|
+ windowModel.setIcon(icon);
|
586
|
596
|
}
|
587
|
597
|
|
588
|
598
|
/**
|
|
@@ -726,37 +736,38 @@ public class Server extends FrameContainer implements Connection {
|
726
|
736
|
return myState;
|
727
|
737
|
}
|
728
|
738
|
|
729
|
|
- @Override
|
730
|
|
- public void close() {
|
731
|
|
- synchronized (myStateLock) {
|
732
|
|
- eventHandler.unregisterCallbacks();
|
733
|
|
- getConfigManager().removeListener(configListener);
|
734
|
|
- highlightManager.stop();
|
735
|
|
- getEventBus().unsubscribe(highlightManager);
|
736
|
|
- executorService.shutdown();
|
737
|
|
-
|
738
|
|
- disconnect();
|
|
739
|
+ @Handler
|
|
740
|
+ private void handleClose(final FrameClosingEvent event) {
|
|
741
|
+ if (event.getContainer() == windowModel) {
|
|
742
|
+ synchronized (myStateLock) {
|
|
743
|
+ eventHandler.unregisterCallbacks();
|
|
744
|
+ windowModel.getConfigManager().removeListener(configListener);
|
|
745
|
+ highlightManager.stop();
|
|
746
|
+ windowModel.getEventBus().unsubscribe(highlightManager);
|
|
747
|
+ executorService.shutdown();
|
739
|
748
|
|
740
|
|
- myState.transition(ServerState.CLOSING);
|
741
|
|
- }
|
|
749
|
+ disconnect();
|
742
|
750
|
|
743
|
|
- groupChatManager.closeAll();
|
744
|
|
- closeQueries();
|
745
|
|
- inviteManager.removeInvites();
|
|
751
|
+ myState.transition(ServerState.CLOSING);
|
|
752
|
+ }
|
746
|
753
|
|
747
|
|
- super.close();
|
|
754
|
+ groupChatManager.closeAll();
|
|
755
|
+ closeQueries();
|
|
756
|
+ inviteManager.removeInvites();
|
|
757
|
+ windowModel.getEventBus().unsubscribe(this);
|
|
758
|
+ }
|
748
|
759
|
}
|
749
|
760
|
|
750
|
761
|
@Override
|
751
|
762
|
public WindowModel getWindowModel() {
|
752
|
|
- return this;
|
|
763
|
+ return windowModel;
|
753
|
764
|
}
|
754
|
765
|
|
755
|
766
|
@Override
|
756
|
767
|
public void sendCTCPReply(final String source, final String type, final String args) {
|
757
|
768
|
if ("VERSION".equalsIgnoreCase(type)) {
|
758
|
769
|
parser.get().sendCTCPReply(source, "VERSION",
|
759
|
|
- "DMDirc " + getConfigManager().getOption("version", "version") +
|
|
770
|
+ "DMDirc " + windowModel.getConfigManager().getOption("version", "version") +
|
760
|
771
|
" - https://www.dmdirc.com/");
|
761
|
772
|
} else if ("PING".equalsIgnoreCase(type)) {
|
762
|
773
|
parser.get().sendCTCPReply(source, "PING", args);
|
|
@@ -765,11 +776,6 @@ public class Server extends FrameContainer implements Connection {
|
765
|
776
|
}
|
766
|
777
|
}
|
767
|
778
|
|
768
|
|
- @Override
|
769
|
|
- public Optional<Connection> getConnection() {
|
770
|
|
- return Optional.of(this);
|
771
|
|
- }
|
772
|
|
-
|
773
|
779
|
@Override
|
774
|
780
|
public void updateTitle() {
|
775
|
781
|
synchronized (myStateLock) {
|
|
@@ -785,9 +791,9 @@ public class Server extends FrameContainer implements Connection {
|
785
|
791
|
getLocalUser().map(User::getNickname).orElse("Unknown")
|
786
|
792
|
};
|
787
|
793
|
|
788
|
|
- setName(Formatter.formatMessage(getConfigManager(),
|
|
794
|
+ windowModel.setName(Formatter.formatMessage(windowModel.getConfigManager(),
|
789
|
795
|
"serverName", arguments));
|
790
|
|
- setTitle(Formatter.formatMessage(getConfigManager(),
|
|
796
|
+ windowModel.setTitle(Formatter.formatMessage(windowModel.getConfigManager(),
|
791
|
797
|
"serverTitle", arguments));
|
792
|
798
|
} finally {
|
793
|
799
|
parserLock.readLock().unlock();
|
|
@@ -808,7 +814,7 @@ public class Server extends FrameContainer implements Connection {
|
808
|
814
|
return;
|
809
|
815
|
}
|
810
|
816
|
|
811
|
|
- getEventBus().publish(new ServerDisconnectedEvent(this));
|
|
817
|
+ windowModel.getEventBus().publish(new ServerDisconnectedEvent(this));
|
812
|
818
|
|
813
|
819
|
eventHandler.unregisterCallbacks();
|
814
|
820
|
|
|
@@ -837,14 +843,16 @@ public class Server extends FrameContainer implements Connection {
|
837
|
843
|
|
838
|
844
|
updateIcon();
|
839
|
845
|
|
840
|
|
- if (getConfigManager().getOptionBool(DOMAIN_GENERAL, "closequeriesondisconnect")) {
|
|
846
|
+ if (windowModel.getConfigManager()
|
|
847
|
+ .getOptionBool(DOMAIN_GENERAL, "closequeriesondisconnect")) {
|
841
|
848
|
closeQueries();
|
842
|
849
|
}
|
843
|
850
|
|
844
|
851
|
inviteManager.removeInvites();
|
845
|
852
|
updateAwayState(Optional.empty());
|
846
|
853
|
|
847
|
|
- if (getConfigManager().getOptionBool(DOMAIN_GENERAL, "reconnectondisconnect")
|
|
854
|
+ if (windowModel.getConfigManager()
|
|
855
|
+ .getOptionBool(DOMAIN_GENERAL, "reconnectondisconnect")
|
848
|
856
|
&& myState.getState() == ServerState.TRANSIENTLY_DISCONNECTED) {
|
849
|
857
|
doDelayedReconnect();
|
850
|
858
|
}
|
|
@@ -884,10 +892,11 @@ public class Server extends FrameContainer implements Connection {
|
884
|
892
|
|
885
|
893
|
updateIcon();
|
886
|
894
|
|
887
|
|
- getEventBus().publish(new ServerConnectErrorEvent(this, getErrorDescription
|
888
|
|
- (errorInfo)));
|
|
895
|
+ windowModel.getEventBus().publish(new ServerConnectErrorEvent(this,
|
|
896
|
+ getErrorDescription(errorInfo)));
|
889
|
897
|
|
890
|
|
- if (getConfigManager().getOptionBool(DOMAIN_GENERAL, "reconnectonconnectfailure")) {
|
|
898
|
+ if (windowModel.getConfigManager()
|
|
899
|
+ .getOptionBool(DOMAIN_GENERAL, "reconnectonconnectfailure")) {
|
891
|
900
|
doDelayedReconnect();
|
892
|
901
|
}
|
893
|
902
|
}
|
|
@@ -949,7 +958,7 @@ public class Server extends FrameContainer implements Connection {
|
949
|
958
|
groupChatManager.handleConnected();
|
950
|
959
|
}
|
951
|
960
|
|
952
|
|
- getEventBus().publish(new ServerConnectedEvent(this));
|
|
961
|
+ windowModel.getEventBus().publish(new ServerConnectedEvent(this));
|
953
|
962
|
}
|
954
|
963
|
|
955
|
964
|
@Override
|
|
@@ -960,7 +969,7 @@ public class Server extends FrameContainer implements Connection {
|
960
|
969
|
@Override
|
961
|
970
|
public void updateIgnoreList() {
|
962
|
971
|
ignoreList.clear();
|
963
|
|
- ignoreList.addAll(getConfigManager().getOptionList("network", "ignorelist"));
|
|
972
|
+ ignoreList.addAll(windowModel.getConfigManager().getOptionList("network", "ignorelist"));
|
964
|
973
|
}
|
965
|
974
|
|
966
|
975
|
@Override
|