Package net.cis.client.main.ctrl

Source Code of net.cis.client.main.ctrl.LoginController

package net.cis.client.main.ctrl;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import net.cis.client.game.common.threading.IGameDestroyCallback;
import net.cis.client.game.ctrl.GameApplication;
import net.cis.client.game.ctrl.GameController;
import net.cis.client.login.AbstractLoginController;
import net.cis.client.main.ClientMain;
import net.cis.common.model.system.UserData;
import net.cis.common.model.system.message.AuthorizeMessage;
import net.cis.common.model.system.message.GameInformationMessage;
import net.cis.common.model.system.message.GameVersionMessage;
import net.cis.common.model.system.message.UserDataMessage;

import org.apache.commons.logging.LogFactory;

import com.jme3.network.Client;
import com.jme3.network.Message;
import com.jme3.network.MessageListener;
import com.jme3.network.Network;
import com.jme3.network.NetworkClient;
import com.jme3.niftygui.NiftyJmeDisplay;

public class LoginController extends AbstractLoginController implements MessageListener<Client> {
  private final GameApplication gameApp;
  private boolean authorized = false;
  private Timer startLoginTimer;
  private final NiftyJmeDisplay niftyDisplay;

  public LoginController(GameApplication gameApp, NiftyJmeDisplay niftyDisplay) {
    this.gameApp = gameApp;
    this.niftyDisplay = niftyDisplay;
  }

  @Override
  public void doLogin(String name, String password, String server) {
    final Client cisClient = initClient(server);
    if (cisClient == null)
      return;

    HandshakeController handshakeController = new HandshakeController(cisClient, callback);
    cisClient.addClientStateListener(handshakeController);
    cisClient.addMessageListener(handshakeController, GameVersionMessage.class, GameInformationMessage.class,
        AuthorizeMessage.class);
    cisClient.addMessageListener(this, UserDataMessage.class);
    gameApp.addGameDestroyCallback(new IGameDestroyCallback() {
      @Override
      public void destroy() {
        cisClient.close();
      }
    });
    cisClient.start();

    startLoginTimer = startLoginTimer();
    handshakeController.authenticate(name, password);
  }

  @Override
  public void messageReceived(Client source, Message m) {
    if (!(m instanceof UserDataMessage))
      throw new RuntimeException("Error! This must not happen!");

    if (!authorized) {
      authorized = true;
      startLoginTimer.cancel();
      startLoginTimer = null;

      String msg = "Authorization successful!";
      LogFactory.getLog(LoginController.class).info(msg);
      callback.statusMessage(msg);
    }

    UserDataMessage userDataMsg = (UserDataMessage) m;
    startGame(userDataMsg.getUserData());
  }

  public void startGame(UserData userData) {
    // TODO: UserData verarbeiten (Position des spielers, ...)
    GameController gc = new GameController(userData, niftyDisplay);
    gameApp.getStateManager().attach(gc);
  }

  private Client initClient(String server) {
    String[] serverStrings = server.split(":");
    int port = 0;
    if (serverStrings.length != 2) {
      String errMsg = "Wrong Server-Format: " + server;
      loginFailed(errMsg);
      LogFactory.getLog(ClientMain.class).warn(errMsg);
      return null;
    }

    try {
      port = Integer.parseInt(serverStrings[1]);
    } catch (NumberFormatException e) {
      String errMsg = "Wrong portnumber: " + serverStrings[1];
      loginFailed(errMsg);
      LogFactory.getLog(ClientMain.class).warn(errMsg, e);
    }
    final NetworkClient cisClient = Network.createClient();

    try {
      cisClient.connectToServer(serverStrings[0], port, port);
    } catch (IOException e) {
      String errMsg = "Could not find server!";
      LogFactory.getLog(ClientMain.class).warn(errMsg, e);
      loginFailed(errMsg);

      return null;
    }

    return cisClient;
  }

  private Timer startLoginTimer() {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        String errMsg = "Timeout while trying to connect!";
        loginFailed(errMsg);
        LogFactory.getLog(LoginController.class).warn(errMsg);
      }
    }, 10000);
    return timer;
  }
}
TOP

Related Classes of net.cis.client.main.ctrl.LoginController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.