project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/RoomList.java
changeset 7352 641f11cdd319
parent 7346 b0f67c5b4215
child 7355 5673e95ef647
--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/RoomList.java	Sat Jul 21 14:56:52 2012 +0200
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/RoomList.java	Mon Jul 23 00:17:06 2012 +0200
@@ -1,34 +1,68 @@
 package org.hedgewars.hedgeroid.netplay;
 
+import java.util.Collections;
+import java.util.Map;
+import java.util.TreeMap;
+
 import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomPtr;
 
+import android.database.DataSetObservable;
 import android.util.Log;
 
-public class RoomList extends ObservableLinkedHashMap<String, Room> {
+public class RoomList extends DataSetObservable {
 	private long nextId = 1;
+	private Map<String, Room> rooms = new TreeMap<String, Room>();
+	
+	public void updateList(RoomPtr[] roomPtrs) {
+		Map<String, Room> newMap = new TreeMap<String, Room>();
+		for(RoomPtr roomPtr : roomPtrs) {
+			JnaFrontlib.Room room = roomPtr.deref();
+			Room oldEntry = rooms.get(room.name);
+			if(oldEntry == null) {
+				newMap.put(room.name, buildRoom(room, nextId++));
+			} else {
+				newMap.put(room.name, buildRoom(room, oldEntry.id));
+			}
+		}
+		rooms = newMap;
+		notifyChanged();
+	}
 	
 	public void addRoomWithNewId(RoomPtr roomPtr) {
-		JnaFrontlib.Room r = roomPtr.deref();
-		long id = nextId++;
-		put(r.name, new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, id));
+		putRoom(roomPtr.deref(), nextId++);
+		notifyChanged();
 	}
 	
 	public void updateRoom(String name, RoomPtr roomPtr) {
-		Room oldEntry = getMap().get(name);
+		JnaFrontlib.Room room = roomPtr.deref();
+		Room oldEntry = rooms.get(name);
 		if(oldEntry == null) {
 			Log.e("RoomList", "Received update for unknown room: "+name);
+			putRoom(room, nextId++);
 		} else {
-			JnaFrontlib.Room r = roomPtr.deref();
-			/*
-			 *  TODO Room renames are handled as re-insertions which push the room
-			 *  up to the top of the list again. Should maybe be revisited (sorting by ID is an option)
-			 */
-			if(!r.name.equals(oldEntry.name)) {
-				remove(oldEntry.name);
+			if(!name.equals(room.name)) {
+				rooms.remove(name);
 			}
-			put(r.name, new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, oldEntry.id));
+			putRoom(room, oldEntry.id);
+		}
+		notifyChanged();
+	}
+	
+	public void removeRoom(String name) {
+		if(rooms.remove(name) != null) {
+			notifyChanged();
 		}
 	}
-
-	public static interface Observer extends ObservableLinkedHashMap.Observer<String, Room> { }
+	
+	public Map<String, Room> getMap() {
+		return Collections.unmodifiableMap(rooms);
+	}
+	
+	private void putRoom(JnaFrontlib.Room r, long id) {
+		rooms.put(r.name, buildRoom(r, id));
+	}
+	
+	private Room buildRoom(JnaFrontlib.Room r, long id) {
+		return new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, id);
+	}
 }