Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Morlunk/Jumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Comminos <andrewcomminos@gmail.com>2013-08-03 06:42:12 +0400
committerAndrew Comminos <andrewcomminos@gmail.com>2013-08-03 06:42:12 +0400
commitd3815b40c84c3c15979aa243f04532b75a09e1e4 (patch)
tree5e647972975f443d2f40e5033e26add964d7b471
parentd7959eaf50e5ee5b17962200fab751f7fca30244 (diff)
Various fixes to user and channel state handling.
-rw-r--r--src/main/java/com/morlunk/jumble/JumbleService.java4
-rw-r--r--src/main/java/com/morlunk/jumble/net/JumbleConnection.java31
-rw-r--r--src/main/java/com/morlunk/jumble/net/UserHandler.java14
3 files changed, 34 insertions, 15 deletions
diff --git a/src/main/java/com/morlunk/jumble/JumbleService.java b/src/main/java/com/morlunk/jumble/JumbleService.java
index 76041d6..c04e3a8 100644
--- a/src/main/java/com/morlunk/jumble/JumbleService.java
+++ b/src/main/java/com/morlunk/jumble/JumbleService.java
@@ -98,7 +98,9 @@ public class JumbleService extends Service implements JumbleConnection.JumbleCon
@Override
public boolean isConnected() throws RemoteException {
- return mConnection.isConnected();
+ if(mConnection != null)
+ return mConnection.isConnected();
+ return false;
}
@Override
diff --git a/src/main/java/com/morlunk/jumble/net/JumbleConnection.java b/src/main/java/com/morlunk/jumble/net/JumbleConnection.java
index 139225c..d3a055b 100644
--- a/src/main/java/com/morlunk/jumble/net/JumbleConnection.java
+++ b/src/main/java/com/morlunk/jumble/net/JumbleConnection.java
@@ -330,14 +330,19 @@ public class JumbleConnection {
*/
public void disconnect() {
mConnected = false;
- try {
- mTCP.disconnect();
- if(mUDP != null) mUDP.disconnect();
- } catch (IOException e) {
- e.printStackTrace();
- }
- mTCP = null;
- mUDP = null;
+ mNetworkHandler.postAtFrontOfQueue(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ mTCP.disconnect();
+ if(mUDP != null) mUDP.disconnect();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ mTCP = null;
+ mUDP = null;
+ }
+ });
mExecutorService.shutdown();
mPingExecutorService.shutdown();
}
@@ -351,6 +356,14 @@ public class JumbleConnection {
mPingExecutorService.shutdownNow();
mTCP = null;
mUDP = null;
+ if(mListener != null) {
+ mMainHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mListener.onConnectionDisconnected();
+ }
+ });
+ }
}
/**
@@ -366,7 +379,7 @@ public class JumbleConnection {
}
});
}
- disconnect();
+ forceDisconnect();
}
/**
diff --git a/src/main/java/com/morlunk/jumble/net/UserHandler.java b/src/main/java/com/morlunk/jumble/net/UserHandler.java
index 0f48e82..fe557ca 100644
--- a/src/main/java/com/morlunk/jumble/net/UserHandler.java
+++ b/src/main/java/com/morlunk/jumble/net/UserHandler.java
@@ -66,6 +66,9 @@ public class UserHandler extends JumbleMessageHandler.Stub {
if(msg.hasName()) {
user = new User(msg.getSession(), msg.getName());
mUsers.put(msg.getSession(), user);
+ // Assume in root channel. TODO FIX ME PLEASE OH GOD WHY DOES THIS WORK
+ Channel root = mService.getChannelHandler().getChannel(0);
+ root.addUser(user.getSession());
newUser = true;
}
else
@@ -151,9 +154,11 @@ public class UserHandler extends JumbleMessageHandler.Stub {
user.setChannelId(msg.getChannelId());
- if(channel.getId() != old.getId()) {
+ if(old != null)
old.removeUser(user.getSession());
- channel.addUser(user.getSession());
+
+ channel.addUser(user.getSession());
+ if(!newUser) {
mService.notifyObservers(new JumbleService.ObserverRunnable() {
@Override
public void run(IJumbleObserver observer) throws RemoteException {
@@ -203,10 +208,9 @@ public class UserHandler extends JumbleMessageHandler.Stub {
*/
if(msg.getSession() != mService.getSession()) {
- Channel channel = mService.getChannelHandler().getChannel(msg.getSession());
- channel.removeUser(msg.getSession());
-
final User user = mService.getUserHandler().getUser(msg.getSession());
+ Channel channel = mService.getChannelHandler().getChannel(user.getChannelId());
+ channel.removeUser(user.getSession());
mService.notifyObservers(new JumbleService.ObserverRunnable() {
@Override