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