project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/RoomList.java
changeset 7352 641f11cdd319
parent 7346 b0f67c5b4215
child 7355 5673e95ef647
equal deleted inserted replaced
7349:12fdfd2038d4 7352:641f11cdd319
     1 package org.hedgewars.hedgeroid.netplay;
     1 package org.hedgewars.hedgeroid.netplay;
       
     2 
       
     3 import java.util.Collections;
       
     4 import java.util.Map;
       
     5 import java.util.TreeMap;
     2 
     6 
     3 import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomPtr;
     7 import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomPtr;
     4 
     8 
       
     9 import android.database.DataSetObservable;
     5 import android.util.Log;
    10 import android.util.Log;
     6 
    11 
     7 public class RoomList extends ObservableLinkedHashMap<String, Room> {
    12 public class RoomList extends DataSetObservable {
     8 	private long nextId = 1;
    13 	private long nextId = 1;
       
    14 	private Map<String, Room> rooms = new TreeMap<String, Room>();
       
    15 	
       
    16 	public void updateList(RoomPtr[] roomPtrs) {
       
    17 		Map<String, Room> newMap = new TreeMap<String, Room>();
       
    18 		for(RoomPtr roomPtr : roomPtrs) {
       
    19 			JnaFrontlib.Room room = roomPtr.deref();
       
    20 			Room oldEntry = rooms.get(room.name);
       
    21 			if(oldEntry == null) {
       
    22 				newMap.put(room.name, buildRoom(room, nextId++));
       
    23 			} else {
       
    24 				newMap.put(room.name, buildRoom(room, oldEntry.id));
       
    25 			}
       
    26 		}
       
    27 		rooms = newMap;
       
    28 		notifyChanged();
       
    29 	}
     9 	
    30 	
    10 	public void addRoomWithNewId(RoomPtr roomPtr) {
    31 	public void addRoomWithNewId(RoomPtr roomPtr) {
    11 		JnaFrontlib.Room r = roomPtr.deref();
    32 		putRoom(roomPtr.deref(), nextId++);
    12 		long id = nextId++;
    33 		notifyChanged();
    13 		put(r.name, new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, id));
       
    14 	}
    34 	}
    15 	
    35 	
    16 	public void updateRoom(String name, RoomPtr roomPtr) {
    36 	public void updateRoom(String name, RoomPtr roomPtr) {
    17 		Room oldEntry = getMap().get(name);
    37 		JnaFrontlib.Room room = roomPtr.deref();
       
    38 		Room oldEntry = rooms.get(name);
    18 		if(oldEntry == null) {
    39 		if(oldEntry == null) {
    19 			Log.e("RoomList", "Received update for unknown room: "+name);
    40 			Log.e("RoomList", "Received update for unknown room: "+name);
       
    41 			putRoom(room, nextId++);
    20 		} else {
    42 		} else {
    21 			JnaFrontlib.Room r = roomPtr.deref();
    43 			if(!name.equals(room.name)) {
    22 			/*
    44 				rooms.remove(name);
    23 			 *  TODO Room renames are handled as re-insertions which push the room
       
    24 			 *  up to the top of the list again. Should maybe be revisited (sorting by ID is an option)
       
    25 			 */
       
    26 			if(!r.name.equals(oldEntry.name)) {
       
    27 				remove(oldEntry.name);
       
    28 			}
    45 			}
    29 			put(r.name, new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, oldEntry.id));
    46 			putRoom(room, oldEntry.id);
       
    47 		}
       
    48 		notifyChanged();
       
    49 	}
       
    50 	
       
    51 	public void removeRoom(String name) {
       
    52 		if(rooms.remove(name) != null) {
       
    53 			notifyChanged();
    30 		}
    54 		}
    31 	}
    55 	}
    32 
    56 	
    33 	public static interface Observer extends ObservableLinkedHashMap.Observer<String, Room> { }
    57 	public Map<String, Room> getMap() {
       
    58 		return Collections.unmodifiableMap(rooms);
       
    59 	}
       
    60 	
       
    61 	private void putRoom(JnaFrontlib.Room r, long id) {
       
    62 		rooms.put(r.name, buildRoom(r, id));
       
    63 	}
       
    64 	
       
    65 	private Room buildRoom(JnaFrontlib.Room r, long id) {
       
    66 		return new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, id);
       
    67 	}
    34 }
    68 }