project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/RoomList.java
changeset 7358 57a508884052
parent 7355 5673e95ef647
child 7461 38acbfdb484f
equal deleted inserted replaced
7355:5673e95ef647 7358:57a508884052
     2 
     2 
     3 import java.util.Collections;
     3 import java.util.Collections;
     4 import java.util.Map;
     4 import java.util.Map;
     5 import java.util.TreeMap;
     5 import java.util.TreeMap;
     6 
     6 
     7 import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomPtr;
       
     8 
       
     9 import android.database.DataSetObservable;
     7 import android.database.DataSetObservable;
    10 import android.util.Log;
     8 import android.util.Log;
       
     9 import android.util.Pair;
    11 
    10 
    12 public class RoomList extends DataSetObservable {
    11 public class RoomList extends DataSetObservable {
    13 	private long nextId = 1;
    12 	private long nextId = 1;
    14 	private Map<String, Room> rooms = new TreeMap<String, Room>();
    13 	private Map<String, Pair<Room, Long>> rooms = new TreeMap<String, Pair<Room, Long>>();
    15 	
    14 	
    16 	public void updateList(RoomPtr[] roomPtrs) {
    15 	public void updateList(Room[] newRooms) {
    17 		Map<String, Room> newMap = new TreeMap<String, Room>();
    16 		Map<String, Pair<Room, Long>> newMap = new TreeMap<String, Pair<Room, Long>>();
    18 		for(RoomPtr roomPtr : roomPtrs) {
    17 		for(Room room : newRooms) {
    19 			JnaFrontlib.Room room = roomPtr.deref();
    18 			Pair<Room, Long> oldEntry = rooms.get(room.name);
    20 			Room oldEntry = rooms.get(room.name);
       
    21 			if(oldEntry == null) {
    19 			if(oldEntry == null) {
    22 				newMap.put(room.name, buildRoom(room, nextId++));
    20 				newMap.put(room.name, Pair.create(room, nextId++));
    23 			} else {
    21 			} else {
    24 				newMap.put(room.name, buildRoom(room, oldEntry.id));
    22 				newMap.put(room.name, Pair.create(room, oldEntry.second));
    25 			}
    23 			}
    26 		}
    24 		}
    27 		rooms = newMap;
    25 		rooms = newMap;
    28 		notifyChanged();
    26 		notifyChanged();
    29 	}
    27 	}
    30 	
    28 	
    31 	public void addRoomWithNewId(RoomPtr roomPtr) {
    29 	public void addRoomWithNewId(Room room) {
    32 		putRoom(roomPtr.deref(), nextId++);
    30 		rooms.put(room.name, Pair.create(room, nextId++));
    33 		notifyChanged();
    31 		notifyChanged();
    34 	}
    32 	}
    35 	
    33 	
    36 	public void updateRoom(String name, RoomPtr roomPtr) {
    34 	public void updateRoom(String name, Room room) {
    37 		JnaFrontlib.Room room = roomPtr.deref();
    35 		Pair<Room, Long> oldEntry = rooms.get(name);
    38 		Room oldEntry = rooms.get(name);
       
    39 		if(oldEntry == null) {
    36 		if(oldEntry == null) {
    40 			Log.e("RoomList", "Received update for unknown room: "+name);
    37 			Log.e("RoomList", "Received update for unknown room: "+name);
    41 			putRoom(room, nextId++);
    38 			rooms.put(room.name, Pair.create(room, nextId++));
    42 		} else {
    39 		} else {
    43 			if(!name.equals(room.name)) {
    40 			if(!name.equals(room.name)) {
    44 				rooms.remove(name);
    41 				rooms.remove(name);
    45 			}
    42 			}
    46 			putRoom(room, oldEntry.id);
    43 			rooms.put(room.name, Pair.create(room, oldEntry.second));
    47 		}
    44 		}
    48 		notifyChanged();
    45 		notifyChanged();
    49 	}
    46 	}
    50 	
    47 	
    51 	public void removeRoom(String name) {
    48 	public void removeRoom(String name) {
    59 			rooms.clear();
    56 			rooms.clear();
    60 			notifyChanged();
    57 			notifyChanged();
    61 		}
    58 		}
    62 	}
    59 	}
    63 	
    60 	
    64 	public Map<String, Room> getMap() {
    61 	public Map<String, Pair<Room, Long>> getMap() {
    65 		return Collections.unmodifiableMap(rooms);
    62 		return Collections.unmodifiableMap(rooms);
    66 	}
    63 	}
    67 	
       
    68 	private void putRoom(JnaFrontlib.Room r, long id) {
       
    69 		rooms.put(r.name, buildRoom(r, id));
       
    70 	}
       
    71 	
       
    72 	private Room buildRoom(JnaFrontlib.Room r, long id) {
       
    73 		return new Room(r.name, r.map, r.scheme, r.weapons, r.owner, r.playerCount, r.teamCount, r.inProgress, id);
       
    74 	}
       
    75 }
    64 }