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 } |