Refactoring: splitting and renaming listeners
-Splitting ProjectListener into multiple event handlers -Renaming SessionListener to SessionEventHandler -Bug fixes
This commit is contained in:
parent
09d15b4a80
commit
b5e56ca2bf
14 changed files with 132 additions and 115 deletions
|
|
@ -3,20 +3,26 @@ package com.coder.client;
|
|||
import java.util.HashSet;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.coder.client.project.ProjectListener;
|
||||
import com.coder.client.project.CreateNewProjectEventHandler;
|
||||
import com.coder.client.project.OpenProjectEventHandler;
|
||||
import com.coder.client.project.OpenProjectFailureEventHandler;
|
||||
import com.coder.client.project.ProjectEventHandler;
|
||||
import com.coder.client.project.SelectProjectEventHandler;
|
||||
|
||||
import zutil.log.LogUtil;
|
||||
|
||||
public class ProjectHandler {
|
||||
public static final Logger logger = LogUtil.getLogger();
|
||||
private HashSet<ProjectListener> projectListeners = new HashSet<ProjectListener>();
|
||||
private HashSet<ProjectEventHandler> projectEventHandlers = new HashSet<ProjectEventHandler>();
|
||||
|
||||
private String projectName = null;
|
||||
|
||||
public void triggerCreateNewProject() {
|
||||
projectName = null;
|
||||
for(ProjectListener listener : projectListeners){
|
||||
listener.createNewProject();
|
||||
for(ProjectEventHandler eventHandler : projectEventHandlers){
|
||||
if(eventHandler instanceof CreateNewProjectEventHandler){
|
||||
((CreateNewProjectEventHandler) eventHandler).createNewProject();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -29,26 +35,32 @@ public class ProjectHandler {
|
|||
this.projectName = name;
|
||||
}
|
||||
|
||||
public void triggerSelectProject() {
|
||||
for(ProjectListener listener : projectListeners){
|
||||
listener.selectProject();
|
||||
public void triggerSelectProjectEvent() {
|
||||
for(ProjectEventHandler eventHandler : projectEventHandlers){
|
||||
if(eventHandler instanceof SelectProjectEventHandler){
|
||||
((SelectProjectEventHandler) eventHandler).selectProject();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void triggerOpenProject() {
|
||||
for(ProjectListener listener : projectListeners){
|
||||
listener.openProject(projectName);
|
||||
public void triggerOpenProjectEvent() {
|
||||
for(ProjectEventHandler eventHandler : projectEventHandlers){
|
||||
if(eventHandler instanceof OpenProjectEventHandler){
|
||||
((OpenProjectEventHandler) eventHandler).openProject(projectName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addprojectListener(ProjectListener listener){
|
||||
this.projectListeners.add(listener);
|
||||
public void addprojectEventHandler(ProjectEventHandler eventHandler){
|
||||
this.projectEventHandlers.add(eventHandler);
|
||||
}
|
||||
|
||||
public void triggerOpenProjectFailure(String errorMsg){
|
||||
public void triggerOpenProjectFailureEvent(String errorMsg){
|
||||
projectName = null;
|
||||
for(ProjectListener listener : projectListeners){
|
||||
listener.openProjectFailed(errorMsg);
|
||||
for(ProjectEventHandler eventHandler : projectEventHandlers){
|
||||
if(eventHandler instanceof OpenProjectFailureEventHandler){
|
||||
((OpenProjectFailureEventHandler) eventHandler).openProjectFailed(errorMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,14 +9,14 @@ import zutil.log.LogUtil;
|
|||
|
||||
import com.coder.client.session.ProjectMessageListener;
|
||||
import com.coder.client.session.Session;
|
||||
import com.coder.client.session.SessionListener;
|
||||
import com.coder.client.session.SessionEventHandler;
|
||||
import com.coder.server.message.CoderMessage;
|
||||
|
||||
public class SessionHandler{
|
||||
public static final Logger logger = LogUtil.getLogger();
|
||||
|
||||
private Session session;
|
||||
private HashSet<SessionListener> sessionListeners = new HashSet<SessionListener>();
|
||||
private HashSet<SessionEventHandler> sessionEventHandlers = new HashSet<SessionEventHandler>();
|
||||
private HashSet<ProjectMessageListener> messageListeners = new HashSet<ProjectMessageListener>();
|
||||
|
||||
public boolean setupConnection(String url, int port){
|
||||
|
|
@ -28,13 +28,13 @@ public class SessionHandler{
|
|||
for(ProjectMessageListener listener : messageListeners){
|
||||
session.addMessageListener(listener);
|
||||
}
|
||||
for(SessionListener listener : sessionListeners){
|
||||
listener.sessionConnectionSuccess();
|
||||
for(SessionEventHandler eventHandler : sessionEventHandlers){
|
||||
eventHandler.sessionConnectionSuccess();
|
||||
}
|
||||
return true;
|
||||
}else{
|
||||
for(SessionListener listener : sessionListeners){
|
||||
listener.sessionConnectionFailure();
|
||||
for(SessionEventHandler eventHandler : sessionEventHandlers){
|
||||
eventHandler.sessionConnectionFailure();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -46,14 +46,14 @@ public class SessionHandler{
|
|||
}else{
|
||||
boolean success = session.authenticate(username, clearTextPassword);
|
||||
if(success){
|
||||
for(SessionListener listener : sessionListeners){
|
||||
listener.sessionAuthenticationSuccess();
|
||||
for(SessionEventHandler eventHandler : sessionEventHandlers){
|
||||
eventHandler.sessionAuthenticationSuccess();
|
||||
}
|
||||
session.start();
|
||||
return true;
|
||||
}else{
|
||||
for(SessionListener listener : sessionListeners){
|
||||
listener.sessionAuthenticationFailure();
|
||||
for(SessionEventHandler eventHandler : sessionEventHandlers){
|
||||
eventHandler.sessionAuthenticationFailure();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -81,16 +81,16 @@ public class SessionHandler{
|
|||
logger.info("closing session to server");
|
||||
session.close();
|
||||
session = null;
|
||||
for(SessionListener listener : sessionListeners){
|
||||
listener.sessionDisconnected(retry);
|
||||
for(SessionEventHandler eventHandler : sessionEventHandlers){
|
||||
eventHandler.sessionDisconnected(retry);
|
||||
}
|
||||
}else{
|
||||
logger.fine("cannot close current session: session already terminated");
|
||||
}
|
||||
}
|
||||
|
||||
public void addSessionListener(SessionListener listener){
|
||||
this.sessionListeners.add(listener);
|
||||
public void addSessionEventHandler(SessionEventHandler eventHandler){
|
||||
this.sessionEventHandlers.add(eventHandler);
|
||||
}
|
||||
|
||||
public void addMessageListener(ProjectMessageListener listener) {
|
||||
|
|
@ -103,8 +103,8 @@ public class SessionHandler{
|
|||
public void triggerAuthenticationCancel() {
|
||||
if(session.isConnected() && !session.isAuthenticated()){
|
||||
closeCurrentSession(false);
|
||||
for(SessionListener listener : sessionListeners){
|
||||
listener.sessionAuthenticationCancel();
|
||||
for(SessionEventHandler eventHandler : sessionEventHandlers){
|
||||
eventHandler.sessionAuthenticationCancel();
|
||||
}
|
||||
}else{
|
||||
logger.warning("Can only cancel a connected but not yet authenticated authentication. ignoring call");
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import zutil.log.LogUtil;
|
|||
|
||||
import com.coder.client.CoderClient;
|
||||
import com.coder.client.gui.GuiWindow;
|
||||
import com.coder.client.project.ProjectListener;
|
||||
import com.coder.client.project.OpenProjectEventHandler;
|
||||
import com.coder.client.property.CheckBoxProperty;
|
||||
import com.coder.client.property.CoderClientProperty;
|
||||
import com.coder.client.property.ComboBoxProperty;
|
||||
|
|
@ -66,10 +66,11 @@ public class EditorWindow extends GuiWindow {
|
|||
client.getProjectHandler().setProject(null);
|
||||
return;
|
||||
}else{
|
||||
client.showOnStage(EditorWindow.this);
|
||||
client.getProjectHandler().setProject(msg.name);
|
||||
}
|
||||
|
||||
logger.info("loading project \""+msg.name+"\"");
|
||||
client.showOnStage(EditorWindow.this); //TODO: show "loading project" popup instead
|
||||
|
||||
//handle name and description
|
||||
fileTreeView.getRoot().setValue(msg.name); //set file tree root name to the project name
|
||||
|
|
@ -93,6 +94,7 @@ public class EditorWindow extends GuiWindow {
|
|||
List<String> fileList = msg.fileList;
|
||||
fileTreeView.getRoot().getChildren().clear();
|
||||
for(String filePath : fileList){
|
||||
logger.finer("adding file \""+filePath+"\" to the file tree");
|
||||
if(filePath.endsWith("/")){
|
||||
logger.warning("file: \"" + filePath + "\" in file list is a directory and not a file. Currently not supported. Ignoring entry");
|
||||
continue;
|
||||
|
|
@ -101,21 +103,48 @@ public class EditorWindow extends GuiWindow {
|
|||
filePath = filePath.substring(1, filePath.length());
|
||||
}
|
||||
TreeItem<String> tmpParent = fileTreeView.getRoot();
|
||||
for(String fileSplit : filePath.split("/")){
|
||||
if(!tmpParent.getChildren().contains(fileSplit)){
|
||||
logger.finer("adding file/directory \""+fileSplit+"\" to directory \""+tmpParent+"\"");
|
||||
TreeItem<String> tmpChild = new TreeItem<String>(fileSplit);
|
||||
String[] filePathSpilt = filePath.split("/");
|
||||
for(int i = 0; i < filePathSpilt.length; ++i){
|
||||
if(i < filePathSpilt.length-1){
|
||||
String directoryName = filePathSpilt[i];
|
||||
if(!tmpParent.getChildren().contains(directoryName)){
|
||||
if(tmpParent == fileTreeView.getRoot()){
|
||||
logger.finer("adding directory \""+directoryName+"\" to directory \"/\"");
|
||||
}else{
|
||||
logger.finer("adding directory \""+directoryName+"\" to directory \""+tmpParent+"\"");
|
||||
}
|
||||
TreeItem<String> tmpChild = new TreeItem<String>(directoryName);
|
||||
tmpParent.getChildren().add(tmpChild);
|
||||
tmpParent = tmpChild;
|
||||
}else{
|
||||
int index = tmpParent.getChildren().indexOf(fileSplit);
|
||||
int index = tmpParent.getChildren().indexOf(directoryName);
|
||||
tmpParent = tmpParent.getChildren().get(index);
|
||||
}
|
||||
}else{
|
||||
String fileName = filePathSpilt[i];
|
||||
if(!tmpParent.getChildren().contains(fileName)){
|
||||
if(tmpParent == fileTreeView.getRoot()){
|
||||
logger.finer("adding file \""+fileName+"\" to directory \"/\"");
|
||||
}else{
|
||||
logger.finer("adding file \""+fileName+"\" to directory \""+tmpParent+"\"");
|
||||
}
|
||||
TreeItem<String> tmpChild = new TreeItem<String>(fileName);
|
||||
tmpParent.getChildren().add(tmpChild);
|
||||
tmpParent = tmpChild;
|
||||
}else{
|
||||
int index = tmpParent.getChildren().indexOf(fileName);
|
||||
tmpParent = tmpParent.getChildren().get(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(Exception e){
|
||||
logger.log(Level.FINE, "could not load the project", e);
|
||||
client.getProjectHandler().triggerOpenProjectFailure("ERROR: failure while loading project");
|
||||
|
||||
}
|
||||
}catch(Exception e){
|
||||
logger.log(Level.SEVERE, "exception while load the project", e);
|
||||
client.getProjectHandler().triggerOpenProjectFailureEvent("ERROR: failed to loading project");
|
||||
}
|
||||
|
||||
client.showOnStage(EditorWindow.this);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -130,15 +159,7 @@ public class EditorWindow extends GuiWindow {
|
|||
}
|
||||
});
|
||||
|
||||
client.getProjectHandler().addprojectListener(new ProjectListener() {
|
||||
@Override
|
||||
public void selectProject() {
|
||||
|
||||
}
|
||||
@Override
|
||||
public void openProjectFailed(String errorMsg) {
|
||||
|
||||
}
|
||||
client.getProjectHandler().addprojectEventHandler(new OpenProjectEventHandler() {
|
||||
@Override
|
||||
public void openProject(String projectName) {
|
||||
CoderMessage msg = new CoderMessage();
|
||||
|
|
@ -146,10 +167,6 @@ public class EditorWindow extends GuiWindow {
|
|||
msg.ProjectReq.name = projectName;
|
||||
client.getSessionHandler().sendMessage(msg);
|
||||
}
|
||||
@Override
|
||||
public void createNewProject() {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
|
@ -179,7 +196,7 @@ public class EditorWindow extends GuiWindow {
|
|||
@FXML
|
||||
protected void changeProject(ActionEvent event){
|
||||
client.getProjectHandler().setProject(null);
|
||||
client.getProjectHandler().triggerSelectProject();
|
||||
client.getProjectHandler().triggerSelectProjectEvent();
|
||||
}
|
||||
|
||||
@FXML
|
||||
|
|
@ -204,7 +221,7 @@ public class EditorWindow extends GuiWindow {
|
|||
}
|
||||
});
|
||||
|
||||
TreeItem<String> root = new TreeItem<String>("root");
|
||||
TreeItem<String> root = new TreeItem<String>("/");
|
||||
root.setExpanded(true);
|
||||
fileTreeView.setRoot(root);
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import javafx.scene.input.KeyEvent;
|
|||
|
||||
import com.coder.client.CoderClient;
|
||||
import com.coder.client.gui.GuiWindow;
|
||||
import com.coder.client.session.SessionListener;
|
||||
import com.coder.client.session.SessionEventHandler;
|
||||
|
||||
public class LoginDialog extends GuiWindow {
|
||||
public static final Logger logger = LogUtil.getLogger();
|
||||
|
|
@ -33,7 +33,7 @@ public class LoginDialog extends GuiWindow {
|
|||
public LoginDialog(final CoderClient client) throws IOException {
|
||||
super(LoginDialog.class.getResource("LoginDialog.fxml"));
|
||||
this.client = client;
|
||||
client.getSessionHandler().addSessionListener(new SessionListener() {
|
||||
client.getSessionHandler().addSessionEventHandler(new SessionEventHandler() {
|
||||
@Override
|
||||
public void sessionConnectionSuccess() {
|
||||
logger.fine("session connection successfull, will show the login dialog on the main stage");
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import zutil.log.LogUtil;
|
|||
|
||||
import com.coder.client.CoderClient;
|
||||
import com.coder.client.gui.GuiWindow;
|
||||
import com.coder.client.project.ProjectListener;
|
||||
import com.coder.client.project.CreateNewProjectEventHandler;
|
||||
import com.coder.client.session.ProjectTypeRspMsgListener;
|
||||
|
||||
public class NewProjectDialog extends GuiWindow {
|
||||
|
|
@ -59,19 +59,7 @@ public class NewProjectDialog extends GuiWindow {
|
|||
}
|
||||
});
|
||||
|
||||
client.getProjectHandler().addprojectListener(new ProjectListener() {
|
||||
@Override
|
||||
public void selectProject() {
|
||||
|
||||
}
|
||||
@Override
|
||||
public void openProjectFailed(String errorMsg) {
|
||||
|
||||
}
|
||||
@Override
|
||||
public void openProject(String projectName) {
|
||||
|
||||
}
|
||||
client.getProjectHandler().addprojectEventHandler(new CreateNewProjectEventHandler() {
|
||||
@Override
|
||||
public void createNewProject() {
|
||||
setErrorMessage("");
|
||||
|
|
@ -79,6 +67,7 @@ public class NewProjectDialog extends GuiWindow {
|
|||
client.showOnStage(NewProjectDialog.this);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -130,7 +119,7 @@ public class NewProjectDialog extends GuiWindow {
|
|||
protected void cancel(ActionEvent event){
|
||||
logger.fine("cancel button triggered");
|
||||
client.getProjectHandler().setProject(null);
|
||||
client.getProjectHandler().triggerSelectProject();
|
||||
client.getProjectHandler().triggerSelectProjectEvent();
|
||||
}
|
||||
|
||||
@FXML
|
||||
|
|
|
|||
|
|
@ -26,10 +26,11 @@ import javafx.util.Callback;
|
|||
|
||||
import com.coder.client.CoderClient;
|
||||
import com.coder.client.gui.GuiWindow;
|
||||
import com.coder.client.project.ProjectListener;
|
||||
import com.coder.client.project.OpenProjectFailureEventHandler;
|
||||
import com.coder.client.project.SelectProjectEventHandler;
|
||||
import com.coder.client.session.ProjectListRspMsgListener;
|
||||
import com.coder.client.session.ProjectRspMsgListener;
|
||||
import com.coder.client.session.SessionListener;
|
||||
import com.coder.client.session.SessionEventHandler;
|
||||
import com.coder.server.message.CoderMessage;
|
||||
import com.coder.server.message.ProjectListData;
|
||||
import com.coder.server.message.ProjectListReqMsg;
|
||||
|
|
@ -51,7 +52,7 @@ public class SelectProjectDialog extends GuiWindow {
|
|||
super(SelectProjectDialog.class.getResource("SelectProjectDialog.fxml"));
|
||||
this.client = client;
|
||||
|
||||
client.getSessionHandler().addSessionListener(new SessionListener() {
|
||||
client.getSessionHandler().addSessionEventHandler(new SessionEventHandler() {
|
||||
@Override
|
||||
public void sessionDisconnected(boolean retryToEstablishConnection) {
|
||||
|
||||
|
|
@ -97,18 +98,22 @@ public class SelectProjectDialog extends GuiWindow {
|
|||
if(msg.error != null){
|
||||
logger.severe("Server responded on the project request with the following error message: " + msg.error);
|
||||
setErrorMessage("ERROR: " + msg.error);
|
||||
client.showOnStage(SelectProjectDialog.this);
|
||||
}else{
|
||||
setErrorMessage("");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
client.getProjectHandler().addprojectListener(new ProjectListener() {
|
||||
client.getProjectHandler().addprojectEventHandler(new SelectProjectEventHandler() {
|
||||
@Override
|
||||
public void selectProject() {
|
||||
logger.fine("select project requested, will show the select project dialog on the main stage");
|
||||
client.showOnStage(SelectProjectDialog.this);
|
||||
}
|
||||
});
|
||||
|
||||
client.getProjectHandler().addprojectEventHandler(new OpenProjectFailureEventHandler() {
|
||||
@Override
|
||||
public void openProjectFailed(String errorMsg) {
|
||||
logger.fine("open project failed, setting error message to \""+errorMsg+"\"");
|
||||
|
|
@ -116,15 +121,8 @@ public class SelectProjectDialog extends GuiWindow {
|
|||
logger.fine("open project failed, will show the select project dialog on the main stage");
|
||||
client.showOnStage(SelectProjectDialog.this);
|
||||
}
|
||||
@Override
|
||||
public void openProject(String projectName) {
|
||||
|
||||
}
|
||||
@Override
|
||||
public void createNewProject() {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -226,7 +224,7 @@ public class SelectProjectDialog extends GuiWindow {
|
|||
ProjectListItem selectedItem = projectListView.getSelectionModel().getSelectedItem();
|
||||
client.getProjectHandler().setProject(selectedItem.getName());
|
||||
}
|
||||
client.getProjectHandler().triggerOpenProject();
|
||||
client.getProjectHandler().triggerOpenProjectEvent();
|
||||
}
|
||||
|
||||
public void clearProjectList(){
|
||||
|
|
|
|||
|
|
@ -30,9 +30,7 @@ import zutil.net.ssdp.StandardSSDPInfo;
|
|||
|
||||
import com.coder.client.CoderClient;
|
||||
import com.coder.client.gui.GuiWindow;
|
||||
import com.coder.client.session.ProjectRspMsgListener;
|
||||
import com.coder.client.session.SessionListener;
|
||||
import com.coder.server.message.ProjectRspMsg;
|
||||
import com.coder.client.session.SessionEventHandler;
|
||||
|
||||
public class SelectServerDialog extends GuiWindow {
|
||||
public static final Logger logger = LogUtil.getLogger();
|
||||
|
|
@ -50,7 +48,7 @@ public class SelectServerDialog extends GuiWindow {
|
|||
public SelectServerDialog(final CoderClient client) throws IOException {
|
||||
super(SelectServerDialog.class.getResource("SelectServerDialog.fxml"));
|
||||
this.client = client;
|
||||
client.getSessionHandler().addSessionListener(new SessionListener() {
|
||||
client.getSessionHandler().addSessionEventHandler(new SessionEventHandler() {
|
||||
@Override
|
||||
public void sessionConnectionSuccess() {
|
||||
setErrorMessage("");
|
||||
|
|
@ -92,20 +90,6 @@ public class SelectServerDialog extends GuiWindow {
|
|||
}
|
||||
});
|
||||
|
||||
client.getSessionHandler().addMessageListener(new ProjectRspMsgListener() {
|
||||
@Override
|
||||
public void messageReceived(final ProjectRspMsg msg) {
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if(msg.error != null){
|
||||
client.showOnStage(SelectServerDialog.this);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
client.getSSDPHandler().setSSDPServiceListener(new SSDPServiceListener() {
|
||||
@Override
|
||||
public void newService(final StandardSSDPInfo service) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
package com.coder.client.project;
|
||||
|
||||
public interface CreateNewProjectEventHandler extends ProjectEventHandler {
|
||||
public void createNewProject();
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.coder.client.project;
|
||||
|
||||
public interface OpenProjectEventHandler extends ProjectEventHandler {
|
||||
public void openProject(String projectName);
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.coder.client.project;
|
||||
|
||||
public interface OpenProjectFailureEventHandler extends ProjectEventHandler {
|
||||
public void openProjectFailed(String errorMsg);
|
||||
}
|
||||
5
src/com/coder/client/project/ProjectEventHandler.java
Normal file
5
src/com/coder/client/project/ProjectEventHandler.java
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package com.coder.client.project;
|
||||
|
||||
public interface ProjectEventHandler {
|
||||
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
package com.coder.client.project;
|
||||
|
||||
public interface ProjectListener {
|
||||
public void createNewProject();
|
||||
public void selectProject();
|
||||
public void openProject(String projectName);
|
||||
public void openProjectFailed(String errorMsg);
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.coder.client.project;
|
||||
|
||||
public interface SelectProjectEventHandler extends ProjectEventHandler {
|
||||
public void selectProject();
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
package com.coder.client.session;
|
||||
|
||||
|
||||
public interface SessionListener {
|
||||
public interface SessionEventHandler {
|
||||
|
||||
void sessionConnectionSuccess();
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue