Skip to content
Snippets Groups Projects
Commit 2e0623a1 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Added proper backlog filtering, refactored some stuff

parent bc57c06a
Branches
Tags
No related merge requests found
Showing
with 608 additions and 116 deletions
package de.kuschku.libquassel.backlogmanagers;
package de.kuschku.libquassel.localtypes.backlogmanagers;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import java.util.List;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.message.Message;
import de.kuschku.libquassel.syncables.types.SyncableObject;
import de.kuschku.util.observables.AutoScroller;
import de.kuschku.util.observables.lists.ObservableSortedList;
public abstract class BacklogManager extends SyncableObject {
public abstract class BacklogManager<T extends BacklogManager<T>> extends SyncableObject<T> {
public abstract void requestBacklog(int bufferId, int from, int to, int count, int extra);
public abstract void receiveBacklog(int bufferId, int from, int to, int count, int extra, @NonNull List<Message> messages);
public abstract void displayMessage(int bufferId, @NonNull Message message);
public abstract ObservableSortedList<Message> get(int bufferId);
public abstract ObservableSortedList<Message> get(@IntRange(from = -1) int bufferId);
public abstract void bind(int bufferId, @NonNull RecyclerView.Adapter adapter, @Nullable AutoScroller scroller);
public abstract ObservableSortedList<Message> getFiltered(@IntRange(from = -1) int bufferId);
public abstract BacklogFilter getFilter(@IntRange(from = -1) int bufferId);
public abstract void requestMoreBacklog(int bufferId, int count);
public abstract void setClient(Client client);
}
package de.kuschku.libquassel.backlogmanagers;
package de.kuschku.libquassel.localtypes.backlogmanagers;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.util.SparseArray;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
......@@ -24,18 +26,28 @@ import de.kuschku.util.observables.lists.ObservableSortedList;
import static de.kuschku.util.AndroidAssert.assertNotNull;
public class SimpleBacklogManager extends BacklogManager {
public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
@NonNull
private final SparseArray<ObservableSortedList<Message>> backlogs = new SparseArray<>();
@NonNull
private final SparseArray<ObservableSortedList<Message>> filteredBacklogs = new SparseArray<>();
@NonNull
private final SparseArray<BacklogFilter> filters = new SparseArray<>();
@NonNull
private final BusProvider busProvider;
@Nullable
private Client client;
public SimpleBacklogManager(@NonNull BusProvider busProvider) {
this.busProvider = busProvider;
}
public void setClient(@Nullable Client client) {
this.client = client;
}
public void requestBacklog(int bufferId, int from, int to, int count, int extra) {
busProvider.dispatch(new SyncFunction("BacklogManager", "", "requestBacklog", Lists.newArrayList(
busProvider.dispatch(new SyncFunction<>("BacklogManager", "", "requestBacklog", Lists.newArrayList(
new QVariant<>("BufferId", bufferId),
new QVariant<>("MsgId", from),
new QVariant<>("MsgId", to),
......@@ -45,7 +57,7 @@ public class SimpleBacklogManager extends BacklogManager {
}
public void receiveBacklog(@IntRange(from = 0) int bufferId, int from, int to, int count, int extra, @NonNull List<Message> messages) {
get(bufferId).list.addAll(messages);
get(bufferId).addAll(messages);
busProvider.sendEvent(new BacklogReceivedEvent(bufferId));
}
......@@ -55,7 +67,7 @@ public class SimpleBacklogManager extends BacklogManager {
ObservableSortedList<Message> messages = get(bufferId);
assertNotNull(messages);
messages.list.add(message);
messages.add(message);
}
public void bind(@IntRange(from = 0) int bufferId, @NonNull RecyclerView.Adapter adapter, @Nullable AutoScroller scroller) {
......@@ -76,18 +88,48 @@ public class SimpleBacklogManager extends BacklogManager {
requestBacklog(bufferId, -1, messageId, count, 0);
}
public ObservableSortedList<Message> get(@IntRange(from = 0) int bufferId) {
if (backlogs.get(bufferId) == null)
backlogs.put(bufferId, new ObservableComparableSortedList<>(Message.class, true));
public ObservableSortedList<Message> get(@IntRange(from = -1) int bufferId) {
ensureExisting(bufferId);
ObservableSortedList<Message> messages = backlogs.get(bufferId);
assertNotNull(messages);
return backlogs.get(bufferId);
}
return messages;
public ObservableSortedList<Message> getFiltered(@IntRange(from = -1) int bufferId) {
ensureExisting(bufferId);
return filteredBacklogs.get(bufferId);
}
public BacklogFilter getFilter(@IntRange(from = -1) int bufferId) {
ensureExisting(bufferId);
return filters.get(bufferId);
}
private void ensureExisting(@IntRange(from = -1) int bufferId) {
if (backlogs.get(bufferId) == null) {
ObservableComparableSortedList<Message> messages = new ObservableComparableSortedList<>(Message.class, true);
ObservableComparableSortedList<Message> filteredMessages = new ObservableComparableSortedList<>(Message.class, true);
BacklogFilter backlogFilter = new BacklogFilter(client, messages, filteredMessages);
messages.addCallback(backlogFilter);
backlogs.put(bufferId, messages);
filteredBacklogs.put(bufferId, filteredMessages);
filters.put(bufferId, backlogFilter);
}
}
@Override
public void init(@NonNull InitDataFunction function, @NonNull BusProvider provider, @NonNull Client client) {
}
@Override
public void update(SimpleBacklogManager from) {
}
@Override
public void update(Map<String, QVariant> from) {
}
}
......@@ -21,16 +21,18 @@ public class CharSerializer implements PrimitiveSerializer<Character> {
@Override
public void serialize(@NonNull final ByteChannel channel, @NonNull final Character data) throws IOException {
final ByteBuffer buffer = Charset.forName("UTF-16BE").encode(String.valueOf(data.charValue()));
channel.write(buffer);
final ByteBuffer contentBuffer = Charset.forName("UTF-16BE").encode(String.copyValueOf(new char[]{data}));
channel.write(contentBuffer);
}
@NonNull
@Override
public Character deserialize(@NonNull final ByteBuffer buffer) throws IOException {
final ByteBuffer contentBuffer = ByteBuffer.allocate(2);
contentBuffer.put(buffer.array(), buffer.position(), 2);
buffer.position(buffer.position() + 2);
return Charset.forName("UTF-16BE").decode(buffer).get();
int len = 2;
final ByteBuffer contentBuffer = ByteBuffer.allocate(len);
contentBuffer.put(buffer.array(), buffer.position(), len);
contentBuffer.position(0);
buffer.position(buffer.position() + len);
return Charset.forName("UTF-16BE").decode(contentBuffer).toString().charAt(0);
}
}
......@@ -3,6 +3,7 @@ package de.kuschku.libquassel.primitives.serializers;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import de.kuschku.libquassel.primitives.types.BufferInfo;
import org.joda.time.DateTime;
import java.io.IOException;
......@@ -39,18 +40,22 @@ public class MessageSerializer implements PrimitiveSerializer<Message> {
@Nullable
@Override
public Message deserialize(@NonNull final ByteBuffer buffer) throws IOException {
Integer messageId = IntSerializer.get().deserialize(buffer);
DateTime time = new DateTime(((long) IntSerializer.get().deserialize(buffer)) * 1000);
Message.Type type = Message.Type.fromId(IntSerializer.get().deserialize(buffer));
Message.Flags flags = new Message.Flags(ByteSerializer.get().deserialize(buffer));
BufferInfo bufferInfo = BufferInfoSerializer.get().deserialize(buffer);
String sender = ByteArraySerializer.get().deserialize(buffer);
String message = ByteArraySerializer.get().deserialize(buffer);
assertNotNull(sender);
assertNotNull(message);
return new Message(
IntSerializer.get().deserialize(buffer),
new DateTime(((long) IntSerializer.get().deserialize(buffer)) * 1000),
Message.Type.fromId(IntSerializer.get().deserialize(buffer)),
new Message.Flags(ByteSerializer.get().deserialize(buffer)),
BufferInfoSerializer.get().deserialize(buffer),
messageId,
time,
type,
flags,
bufferInfo,
sender,
message
);
......
......@@ -2,6 +2,7 @@ package de.kuschku.libquassel.protocols;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
......@@ -9,17 +10,25 @@ import com.google.common.collect.Lists;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.CoreConnection;
import de.kuschku.libquassel.events.ConnectionChangeEvent;
import de.kuschku.libquassel.events.GeneralErrorEvent;
import de.kuschku.libquassel.functions.FunctionType;
import de.kuschku.libquassel.functions.serializers.HeartbeatReplySerializer;
import de.kuschku.libquassel.functions.serializers.HeartbeatSerializer;
import de.kuschku.libquassel.functions.serializers.InitDataFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.InitRequestFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.PackedInitDataFunctionSerializer;
......@@ -28,6 +37,8 @@ import de.kuschku.libquassel.functions.serializers.PackedSyncFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.UnpackedRpcCallFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.UnpackedSyncFunctionSerializer;
import de.kuschku.libquassel.functions.types.HandshakeFunction;
import de.kuschku.libquassel.functions.types.Heartbeat;
import de.kuschku.libquassel.functions.types.HeartbeatReply;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.functions.types.InitRequestFunction;
import de.kuschku.libquassel.functions.types.RpcCallFunction;
......@@ -38,6 +49,7 @@ import de.kuschku.libquassel.primitives.serializers.IntSerializer;
import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer;
import de.kuschku.libquassel.primitives.serializers.VariantVariantListSerializer;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.util.niohelpers.Helper;
import de.kuschku.util.niohelpers.WrappedChannel;
import static de.kuschku.util.AndroidAssert.assertNotNull;
......@@ -48,19 +60,22 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
*
* @author Janne Koschinski
*/
@SuppressWarnings({"unchecked"})
@SuppressWarnings({"unchecked", "unused"})
public class DatastreamPeer implements RemotePeer {
@NonNull
private final CoreConnection connection;
@NonNull
private final BusProvider busProvider;
@NonNull
private final ExecutorService parseExecutor;
@NonNull
private ByteBuffer buffer = ByteBuffer.allocate(0);
public DatastreamPeer(@NonNull CoreConnection connection, @NonNull BusProvider busProvider) {
this.connection = connection;
this.busProvider = busProvider;
this.busProvider.dispatch.register(this);
this.parseExecutor = Executors.newCachedThreadPool();
}
@NonNull
......@@ -104,6 +119,7 @@ public class DatastreamPeer implements RemotePeer {
}
public void onEventBackgroundThread(@NonNull SyncFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.<SyncFunction>get(),
UnpackedSyncFunctionSerializer.get().serialize(func)
......@@ -111,6 +127,7 @@ public class DatastreamPeer implements RemotePeer {
}
public void onEventBackgroundThread(@NonNull RpcCallFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.<RpcCallFunction>get(),
UnpackedRpcCallFunctionSerializer.get().serialize(func)
......@@ -118,6 +135,7 @@ public class DatastreamPeer implements RemotePeer {
}
public void onEventBackgroundThread(@NonNull InitRequestFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.<InitRequestFunction>get(),
InitRequestFunctionSerializer.get().serializePacked(func)
......@@ -125,16 +143,36 @@ public class DatastreamPeer implements RemotePeer {
}
public void onEventBackgroundThread(@NonNull InitDataFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.<InitDataFunction>get(),
InitDataFunctionSerializer.get().serialize(func)
));
}
public void onEventBackgroundThread(@NonNull Heartbeat func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.<InitDataFunction>get(),
HeartbeatSerializer.get().serialize(func)
));
}
public void onEventBackgroundThread(@NonNull HeartbeatReply func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.<InitDataFunction>get(),
HeartbeatReplySerializer.get().serialize(func)
));
}
public void onEventBackgroundThread(@NonNull HandshakeFunction func) {
assertNotNull(connection.getOutputExecutor());
Map<String, QVariant> variantMap = MessageTypeRegistry.toVariantMap(func.data).data;
assertNotNull(variantMap);
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantVariantListSerializer.get(),
DatastreamPeer.mapToList(MessageTypeRegistry.toVariantMap(func.data).data)
DatastreamPeer.mapToList(variantMap)
));
}
......@@ -143,7 +181,7 @@ public class DatastreamPeer implements RemotePeer {
}
private void handlePackedFunc(@NonNull List<QVariant> data) {
final FunctionType type = FunctionType.fromId((Integer) data.remove(0).data);
final FunctionType type = FunctionType.fromId((int) data.remove(0).data);
switch (type) {
case SYNC:
busProvider.handle(PackedSyncFunctionSerializer.get().deserialize(data));
......@@ -158,7 +196,11 @@ public class DatastreamPeer implements RemotePeer {
busProvider.handle(PackedInitDataFunctionSerializer.get().deserialize(data));
break;
case HEARTBEAT:
busProvider.handle(HeartbeatSerializer.get().deserialize(data));
break;
case HEARTBEATREPLY:
busProvider.handle(HeartbeatReplySerializer.get().deserialize(data));
break;
default:
busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data));
break;
......@@ -176,17 +218,7 @@ public class DatastreamPeer implements RemotePeer {
buffer = ByteBuffer.allocate(size);
connection.getChannel().read(buffer);
// TODO: Put this into a future with a time limit, and parallelize it.
final List data = VariantVariantListSerializer.get().deserialize(buffer);
if (connection.getStatus() == ConnectionChangeEvent.Status.CONNECTING
|| connection.getStatus() == ConnectionChangeEvent.Status.HANDSHAKE
|| connection.getStatus() == ConnectionChangeEvent.Status.CORE_SETUP_REQUIRED
|| connection.getStatus() == ConnectionChangeEvent.Status.USER_SETUP_REQUIRED
|| connection.getStatus() == ConnectionChangeEvent.Status.LOGIN_REQUIRED) {
handleHandshakeMessage(data);
} else {
handlePackedFunc(data);
}
parseExecutor.submit(new ParseRunnable(buffer));
}
@NonNull
......@@ -238,4 +270,33 @@ public class DatastreamPeer implements RemotePeer {
}
}
}
private class ParseRunnable implements Runnable {
ByteBuffer buffer;
public ParseRunnable(ByteBuffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
try {
// TODO: Put this into a future with a time limit, and parallelize it.
final List data = VariantVariantListSerializer.get().deserialize(buffer);
if (connection.getStatus() == ConnectionChangeEvent.Status.CONNECTING
|| connection.getStatus() == ConnectionChangeEvent.Status.HANDSHAKE
|| connection.getStatus() == ConnectionChangeEvent.Status.CORE_SETUP_REQUIRED
|| connection.getStatus() == ConnectionChangeEvent.Status.USER_SETUP_REQUIRED
|| connection.getStatus() == ConnectionChangeEvent.Status.LOGIN_REQUIRED) {
handleHandshakeMessage(data);
} else {
handlePackedFunc(data);
}
} catch (BufferUnderflowException|BufferOverflowException e) {
Helper.printHexDump(buffer.array());
busProvider.sendEvent(new GeneralErrorEvent(e));
} catch (Exception e) {
busProvider.sendEvent(new GeneralErrorEvent(e));
}
}
}
}
......@@ -8,17 +8,24 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.CoreConnection;
import de.kuschku.libquassel.events.ConnectionChangeEvent;
import de.kuschku.libquassel.events.GeneralErrorEvent;
import de.kuschku.libquassel.functions.FunctionType;
import de.kuschku.libquassel.functions.serializers.HeartbeatReplySerializer;
import de.kuschku.libquassel.functions.serializers.HeartbeatSerializer;
import de.kuschku.libquassel.functions.serializers.InitDataFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.InitRequestFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.UnpackedInitDataFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.UnpackedRpcCallFunctionSerializer;
import de.kuschku.libquassel.functions.serializers.UnpackedSyncFunctionSerializer;
import de.kuschku.libquassel.functions.types.HandshakeFunction;
import de.kuschku.libquassel.functions.types.Heartbeat;
import de.kuschku.libquassel.functions.types.HeartbeatReply;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.functions.types.InitRequestFunction;
import de.kuschku.libquassel.functions.types.RpcCallFunction;
......@@ -30,10 +37,12 @@ import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer;
import de.kuschku.libquassel.primitives.serializers.VariantSerializer;
import de.kuschku.libquassel.primitives.serializers.VariantVariantListSerializer;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.util.AndroidAssert;
import de.kuschku.util.niohelpers.WrappedChannel;
import static de.kuschku.libquassel.primitives.QMetaType.Type.QVariantList;
import static de.kuschku.libquassel.primitives.QMetaType.Type.QVariantMap;
import static de.kuschku.util.AndroidAssert.*;
/**
* A helper class processing incoming and outgoing messages.
......@@ -41,22 +50,26 @@ import static de.kuschku.libquassel.primitives.QMetaType.Type.QVariantMap;
*
* @author Janne Koschinski
*/
@SuppressWarnings({"unchecked"})
@SuppressWarnings({"unchecked", "unused"})
public class LegacyPeer implements RemotePeer {
@NonNull
private final CoreConnection connection;
@NonNull
private final BusProvider busProvider;
@NonNull
private final ExecutorService parseExecutor;
@NonNull
private ByteBuffer buffer = ByteBuffer.allocate(0);
public LegacyPeer(@NonNull CoreConnection connection, @NonNull BusProvider busProvider) {
this.connection = connection;
this.busProvider = busProvider;
this.busProvider.dispatch.register(this);
this.parseExecutor = Executors.newCachedThreadPool();
}
public final void onEventBackgroundThread(@NonNull SyncFunction func) {
assertNotNull(connection.getOutputExecutor());
final List serialize = UnpackedSyncFunctionSerializer.get().serialize(func);
connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
new QVariant(new QMetaType(List.class, QMetaType.Type.QVariantList, VariantVariantListSerializer.get()),
......@@ -64,21 +77,37 @@ public class LegacyPeer implements RemotePeer {
}
public void onEventBackgroundThread(@NonNull RpcCallFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
new QVariant<>(UnpackedRpcCallFunctionSerializer.get().serialize(func))));
}
public void onEventBackgroundThread(@NonNull InitRequestFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
new QVariant<>(InitRequestFunctionSerializer.get().serialize(func))));
}
public void onEventBackgroundThread(@NonNull InitDataFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
new QVariant<>(InitDataFunctionSerializer.get().serialize(func))));
}
public void onEventBackgroundThread(@NonNull Heartbeat func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
new QVariant<>(HeartbeatSerializer.get().serialize(func))));
}
public void onEventBackgroundThread(@NonNull HeartbeatReply func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
new QVariant<>(HeartbeatReplySerializer.get().serialize(func))));
}
public void onEventBackgroundThread(@NonNull HandshakeFunction func) {
assertNotNull(connection.getOutputExecutor());
connection.getOutputExecutor().submit(new OutputRunnable<>(
VariantSerializer.get(), MessageTypeRegistry.toVariantMap(func.data)));
}
......@@ -93,32 +122,7 @@ public class LegacyPeer implements RemotePeer {
buffer = ByteBuffer.allocate(size);
connection.getChannel().read(buffer);
// TODO: Put this into a future with a time limit, and parallelize it.
final QVariant data = VariantSerializer.get().deserialize(buffer);
if (data.type.type == QVariantMap) {
busProvider.handle(MessageTypeRegistry.from((Map<String, QVariant>) data.data));
} else if (data.type.type == QVariantList) {
final FunctionType type = FunctionType.fromId((Integer) ((List<Object>) data.data).remove(0));
switch (type) {
case SYNC:
busProvider.handle(UnpackedSyncFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case RPCCALL:
busProvider.handle(UnpackedRpcCallFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case INITREQUEST:
busProvider.handle(InitRequestFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case INITDATA:
busProvider.handle(UnpackedInitDataFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case HEARTBEAT:
case HEARTBEATREPLY:
default:
busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data));
break;
}
}
parseExecutor.submit(new ParseRunnable(buffer));
}
@NonNull
......@@ -168,4 +172,50 @@ public class LegacyPeer implements RemotePeer {
}
}
}
private class ParseRunnable implements Runnable {
ByteBuffer buffer;
public ParseRunnable(ByteBuffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
try {
// TODO: Put this into a future with a time limit, and parallelize it.
final QVariant data = VariantSerializer.get().deserialize(buffer);
assertNotNull(data.data);
if (data.type.type == QVariantMap) {
busProvider.handle(MessageTypeRegistry.from((Map<String, QVariant>) data.data));
} else if (data.type.type == QVariantList) {
final FunctionType type = FunctionType.fromId((Integer) ((List<Object>) data.data).remove(0));
switch (type) {
case SYNC:
busProvider.handle(UnpackedSyncFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case RPCCALL:
busProvider.handle(UnpackedRpcCallFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case INITREQUEST:
busProvider.handle(InitRequestFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case INITDATA:
busProvider.handle(UnpackedInitDataFunctionSerializer.get().deserialize((List<QVariant>) data.data));
break;
case HEARTBEAT:
busProvider.handle(HeartbeatSerializer.get().deserialize((List<QVariant>) data));
break;
case HEARTBEATREPLY:
busProvider.handle(HeartbeatReplySerializer.get().deserialize((List<QVariant>) data));
break;
default:
busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data));
break;
}
}
} catch (Exception e) {
busProvider.sendEvent(new GeneralErrorEvent(e));
}
}
}
}
......@@ -9,12 +9,15 @@ import java.util.Map;
import de.kuschku.libquassel.exceptions.UnknownTypeException;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferViewConfigSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferViewManagerSerializer;
import de.kuschku.libquassel.syncables.serializers.IdentitySerializer;
import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer;
import de.kuschku.libquassel.syncables.serializers.IrcChannelSerializer;
import de.kuschku.libquassel.syncables.serializers.IrcUserSerializer;
import de.kuschku.libquassel.syncables.serializers.NetworkConfigSerializer;
import de.kuschku.libquassel.syncables.serializers.NetworkSerializer;
import de.kuschku.libquassel.syncables.types.SyncableObject;
......@@ -23,6 +26,7 @@ public class SyncableRegistry {
private static final Map<String, ObjectSerializer<? extends SyncableObject>> map = new HashMap<>();
static {
map.put("IgnoreListManager", IgnoreListManagerSerializer.get());
map.put("BufferSyncer", BufferSyncerSerializer.get());
map.put("BufferViewConfig", BufferViewConfigSerializer.get());
map.put("BufferViewManager", BufferViewManagerSerializer.get());
......@@ -30,6 +34,8 @@ public class SyncableRegistry {
map.put("IrcChannel", IrcChannelSerializer.get());
map.put("IrcUser", IrcUserSerializer.get());
map.put("Network", NetworkSerializer.get());
map.put("NetworkConfig", NetworkConfigSerializer.get());
map.put("AliasManager", AliasManagerSerializer.get());
}
private SyncableRegistry() {
......@@ -39,7 +45,7 @@ public class SyncableRegistry {
@Nullable
public static SyncableObject from(@NonNull InitDataFunction function) throws UnknownTypeException {
ObjectSerializer<? extends SyncableObject> serializer = map.get(function.className);
if (serializer == null) throw new UnknownTypeException(function.className);
if (serializer == null) throw new UnknownTypeException(function.className, function);
return serializer.from(function);
}
}
package de.kuschku.libquassel.syncables;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
public @interface Synced {
}
package de.kuschku.libquassel.syncables.serializers;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.List;
import java.util.Map;
import de.kuschku.libquassel.functions.types.PackedFunction;
import de.kuschku.libquassel.functions.types.SerializedFunction;
import de.kuschku.libquassel.functions.types.UnpackedFunction;
import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.types.AliasManager;
public class AliasManagerSerializer implements ObjectSerializer<AliasManager> {
@NonNull
private static final AliasManagerSerializer serializer = new AliasManagerSerializer();
@NonNull
public static AliasManagerSerializer get() {
return serializer;
}
private AliasManagerSerializer() {
}
@Nullable
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull AliasManager data) {
throw new IllegalArgumentException();
}
@NonNull
@Override
public AliasManager fromDatastream(@NonNull Map<String, QVariant> map) {
return fromLegacy(map);
}
@NonNull
@Override
public AliasManager fromLegacy(@NonNull Map<String, QVariant> map) {
Map<String, QVariant<List<String>>> aliases = (Map<String, QVariant<List<String>>>) map.get("Aliases").data;
return new AliasManager(
aliases.get("names").data,
aliases.get("expansions").data
);
}
@Nullable
@Override
public AliasManager from(@NonNull SerializedFunction function) {
if (function instanceof PackedFunction)
return fromLegacy(((PackedFunction) function).getData());
else if (function instanceof UnpackedFunction)
return fromDatastream(((UnpackedFunction) function).getData());
else throw new IllegalArgumentException();
}
}
......@@ -30,25 +30,22 @@ public class BufferSyncerSerializer implements ObjectSerializer<BufferSyncer> {
@Nullable
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull BufferSyncer data) {
// TODO: Implement this
return null;
// FIXME: IMPLEMENT
throw new IllegalArgumentException();
}
@NonNull
@Override
public BufferSyncer fromDatastream(@NonNull Map<String, QVariant> map) {
return new BufferSyncer(
DatastreamPeer.unboxedListToMap((List<Integer>) map.get("LastSeenMsg").data),
DatastreamPeer.unboxedListToMap((List<Integer>) map.get("MarkerLines").data)
);
return fromLegacy(map);
}
@NonNull
@Override
public BufferSyncer fromLegacy(@NonNull Map<String, QVariant> map) {
return new BufferSyncer(
(Map<Integer, Integer>) map.get("LastSeenMsg").data,
(Map<Integer, Integer>) map.get("MarkerLines").data
DatastreamPeer.unboxedListToMap((List<Integer>) map.get("LastSeenMsg").data),
DatastreamPeer.unboxedListToMap((List<Integer>) map.get("LastSeenMsg").data)
);
}
......
......@@ -29,7 +29,8 @@ public class BufferViewManagerSerializer implements ObjectSerializer<BufferViewM
@Nullable
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull BufferViewManager data) {
return null;
// FIXME: IMPLEMENT
throw new IllegalArgumentException();
}
@NonNull
......
package de.kuschku.libquassel.syncables.serializers;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.List;
import java.util.Map;
import de.kuschku.libquassel.functions.types.PackedFunction;
import de.kuschku.libquassel.functions.types.SerializedFunction;
import de.kuschku.libquassel.functions.types.UnpackedFunction;
import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.types.IgnoreListManager;
public class IgnoreListManagerSerializer implements ObjectSerializer<IgnoreListManager> {
private static IgnoreListManagerSerializer serializer = new IgnoreListManagerSerializer();
public static IgnoreListManagerSerializer get() {
return serializer;
}
private IgnoreListManagerSerializer() {
}
@Nullable
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull IgnoreListManager data) {
// FIXME: IMPLEMENT
throw new IllegalArgumentException();
}
@NonNull
@Override
public IgnoreListManager fromDatastream(@NonNull Map<String, QVariant> map) {
return fromLegacy(map);
}
@NonNull
@Override
public IgnoreListManager fromLegacy(@NonNull Map<String, QVariant> map) {
Map<String, QVariant> internalMap = (Map<String, QVariant>) map.get("IgnoreList").data;
return new IgnoreListManager(
(List<Integer>) internalMap.get("scope").data,
(List<Integer>) internalMap.get("ignoreType").data,
(List<Boolean>) internalMap.get("isActive").data,
(List<String>) internalMap.get("scopeRule").data,
(List<Boolean>) internalMap.get("isRegEx").data,
(List<Integer>) internalMap.get("strictness").data,
(List<String>) internalMap.get("ignoreRule").data
);
}
@Nullable
@Override
public IgnoreListManager from(@NonNull SerializedFunction function) {
if (function instanceof PackedFunction)
return fromLegacy(((PackedFunction) function).getData());
else if (function instanceof UnpackedFunction)
return fromDatastream(((UnpackedFunction) function).getData());
else throw new IllegalArgumentException();
}
}
......@@ -30,12 +30,12 @@ public class IrcChannelSerializer implements ObjectSerializer<IrcChannel> {
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull IrcChannel data) {
final QVariant<Map<String, QVariant>> map = new QVariant<>(new HashMap<>());
map.data.put("name", new QVariant<>(data.name));
map.data.put("topic", new QVariant<>(data.topic));
map.data.put("password", new QVariant<>(data.password));
map.data.put("UserModes", StringObjectMapSerializer.<String>get().toVariantMap(data.UserModes));
map.data.put("ChanModes", new QVariant<>(data.ChanModes));
map.data.put("encrypted", new QVariant<>(data.encrypted));
map.data.put("name", new QVariant<>(data.getName()));
map.data.put("topic", new QVariant<>(data.getTopic()));
map.data.put("password", new QVariant<>(data.getPassword()));
map.data.put("UserModes", StringObjectMapSerializer.<String>get().toVariantMap(data.getUserModes()));
map.data.put("ChanModes", new QVariant<>(data.getChanModes()));
map.data.put("encrypted", new QVariant<>(data.isEncrypted()));
return map;
}
......
......@@ -36,22 +36,22 @@ public class IrcUserSerializer implements ObjectSerializer<IrcUser> {
final QVariant<Map<String, QVariant>> map = new QVariant<>(new HashMap<>());
assertNotNull(map.data);
map.data.put("server", new QVariant<>(data.server));
map.data.put("ircOperator", new QVariant<>(data.ircOperator));
map.data.put("away", new QVariant<>(data.away));
map.data.put("lastAwayMessage", new QVariant<>(data.lastAwayMessage));
map.data.put("idleTime", new QVariant<>(data.idleTime));
map.data.put("whoisServiceReply", new QVariant<>(data.whoisServiceReply));
map.data.put("suserHost", new QVariant<>(data.suserHost));
map.data.put("nick", new QVariant<>(data.nick));
map.data.put("realName", new QVariant<>(data.realName));
map.data.put("awayMessage", new QVariant<>(data.awayMessage));
map.data.put("loginTime", new QVariant<>(data.loginTime));
map.data.put("encrypted", new QVariant<>(data.encrypted));
map.data.put("channels", new QVariant<>(data.channels));
map.data.put("host", new QVariant<>(data.host));
map.data.put("userModes", new QVariant<>(data.userModes));
map.data.put("user", new QVariant<>(data.user));
map.data.put("server", new QVariant<>(data.getServer()));
map.data.put("ircOperator", new QVariant<>(data.getIrcOperator()));
map.data.put("away", new QVariant<>(data.isAway()));
map.data.put("lastAwayMessage", new QVariant<>(data.getLastAwayMessage()));
map.data.put("idleTime", new QVariant<>(data.getIdleTime()));
map.data.put("whoisServiceReply", new QVariant<>(data.getWhoisServiceReply()));
map.data.put("suserHost", new QVariant<>(data.getSuserHost()));
map.data.put("nick", new QVariant<>(data.getNick()));
map.data.put("realName", new QVariant<>(data.getRealName()));
map.data.put("awayMessage", new QVariant<>(data.getAwayMessage()));
map.data.put("loginTime", new QVariant<>(data.getLoginTime()));
map.data.put("encrypted", new QVariant<>(data.isEncrypted()));
map.data.put("channels", new QVariant<>(data.getChannels()));
map.data.put("host", new QVariant<>(data.getHost()));
map.data.put("userModes", new QVariant<>(data.getUserModes()));
map.data.put("user", new QVariant<>(data.getUser()));
return map;
}
......
package de.kuschku.libquassel.syncables.serializers;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Map;
import de.kuschku.libquassel.functions.types.PackedFunction;
import de.kuschku.libquassel.functions.types.SerializedFunction;
import de.kuschku.libquassel.functions.types.UnpackedFunction;
import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.types.NetworkConfig;
import de.kuschku.libquassel.syncables.types.SyncableObject;
public class NetworkConfigSerializer implements ObjectSerializer<NetworkConfig> {
private static NetworkConfigSerializer serializer = new NetworkConfigSerializer();
public static NetworkConfigSerializer get() {
return serializer;
}
private NetworkConfigSerializer() {
}
@Nullable
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull NetworkConfig data) {
// FIXME: IMPLEMENT
throw new IllegalArgumentException();
}
@NonNull
@Override
public NetworkConfig fromDatastream(@NonNull Map<String, QVariant> map) {
return fromLegacy(map);
}
@NonNull
@Override
public NetworkConfig fromLegacy(@NonNull Map<String, QVariant> map) {
return new NetworkConfig(
(int) map.get("autoWhoNickLimit").data,
(int) map.get("autoWhoDelay").data,
(boolean) map.get("autoWhoEnabled").data,
(boolean) map.get("standardCtcp").data,
(int) map.get("pingInterval").data,
(int) map.get("autoWhoInterval").data,
(int) map.get("maxPingCount").data,
(boolean) map.get("pingTimeoutEnabled").data
);
}
@Nullable
@Override
public NetworkConfig from(@NonNull SerializedFunction function) {
if (function instanceof PackedFunction)
return fromLegacy(((PackedFunction) function).getData());
else if (function instanceof UnpackedFunction)
return fromDatastream(((UnpackedFunction) function).getData());
else throw new IllegalArgumentException();
}
}
......@@ -37,8 +37,8 @@ public class NetworkSerializer implements ObjectSerializer<Network> {
@Nullable
@Override
public QVariant<Map<String, QVariant>> toVariantMap(@NonNull Network data) {
// FIXME: Implement this
return null;
// FIXME: IMPLEMENT
throw new IllegalArgumentException();
}
@NonNull
......@@ -51,7 +51,7 @@ public class NetworkSerializer implements ObjectSerializer<Network> {
final Map<String, IrcChannel> channelMap = new HashMap<>(channels.size());
for (IrcChannel channel : channels) {
channelMap.put(channel.name, channel);
channelMap.put(channel.getName(), channel);
}
final Map<String, IrcUser> userMap = new HashMap<>(users.size());
......@@ -87,6 +87,9 @@ public class NetworkSerializer implements ObjectSerializer<Network> {
for (IrcUser user : users) {
user.setNetwork(network);
}
for (IrcChannel channel : channels) {
channel.setNetwork(network);
}
return network;
}
......@@ -154,12 +157,12 @@ public class NetworkSerializer implements ObjectSerializer<Network> {
final Map<String, IrcChannel> channels = new HashMap<>(wrappedChannels.size());
for (Map.Entry<String, QVariant<Map<String, QVariant>>> entry : wrappedChannels.entrySet()) {
final IrcChannel ircChannel = IrcChannelSerializer.get().fromLegacy(entry.getValue().data);
channels.put(ircChannel.name, ircChannel);
channels.put(ircChannel.getName(), ircChannel);
}
final Map<String, IrcUser> users = new HashMap<>(wrappedUsers.size());
for (Map.Entry<String, QVariant<Map<String, QVariant>>> entry : wrappedUsers.entrySet()) {
final IrcUser ircUser = IrcUserSerializer.get().fromLegacy(entry.getValue().data);
users.put(ircUser.nick, ircUser);
users.put(ircUser.getNick(), ircUser);
}
final Map<String, String> supports = StringObjectMapSerializer.<String>get().fromLegacy((Map<String, QVariant>) map.get("Supports").data);
Network network = new Network(
......
package de.kuschku.libquassel.syncables.types;
import android.support.annotation.NonNull;
import java.util.List;
import java.util.Map;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer;
public class AliasManager extends SyncableObject<AliasManager> {
public List<String> names;
public List<String> expansions;
public AliasManager(List<String> names, List<String> expansions) {
this.names = names;
this.expansions = expansions;
}
@Override
public void init(@NonNull InitDataFunction function, @NonNull BusProvider provider, @NonNull Client client) {
}
@Override
public void update(AliasManager from) {
names = from.names;
expansions = from.expansions;
}
@Override
public void update(Map<String, QVariant> from) {
update(AliasManagerSerializer.get().fromDatastream(from));
}
}
......@@ -10,15 +10,18 @@ import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.message.Message;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.util.observables.lists.ObservableSortedList;
import static de.kuschku.util.AndroidAssert.assertNotNull;
public class BufferSyncer extends SyncableObject {
public class BufferSyncer extends SyncableObject<BufferSyncer> {
@NonNull
private final SparseIntArray LastSeenMsg = new SparseIntArray();
private SparseIntArray LastSeenMsg = new SparseIntArray();
@NonNull
private final SparseIntArray MarkerLines = new SparseIntArray();
private SparseIntArray MarkerLines = new SparseIntArray();
private Client client;
......@@ -41,6 +44,17 @@ public class BufferSyncer extends SyncableObject {
setClient(client);
}
@Override
public void update(BufferSyncer from) {
LastSeenMsg = from.LastSeenMsg;
MarkerLines = from.MarkerLines;
}
@Override
public void update(Map<String, QVariant> from) {
update(BufferSyncerSerializer.get().fromDatastream(from));
}
public void markBufferAsRead(@IntRange(from = 0) int bufferId) {
ObservableSortedList<Message> buffer = client.getBacklogManager().get(bufferId);
assertNotNull(buffer);
......@@ -69,4 +83,9 @@ public class BufferSyncer extends SyncableObject {
public int getMarkerLine(int bufferId) {
return MarkerLines.get(bufferId, -1);
}
public void removeBuffer(int bufferId) {
LastSeenMsg.put(bufferId, -1);
MarkerLines.put(bufferId, -1);
}
}
package de.kuschku.libquassel.syncables.types;
import android.net.*;
import android.support.annotation.NonNull;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferViewConfigSerializer;
import de.kuschku.util.AndroidAssert;
import de.kuschku.util.observables.callbacks.ElementCallback;
import de.kuschku.util.observables.lists.IObservableList;
import de.kuschku.util.observables.lists.ObservableElementList;
public class BufferViewConfig extends SyncableObject {
import static de.kuschku.util.AndroidAssert.*;
public class BufferViewConfig extends SyncableObject<BufferViewConfig> {
private String bufferViewName;
private List<Integer> TemporarilyRemovedBuffers;
private boolean hideInactiveNetworks;
private IObservableList<ElementCallback<Integer>, Integer> BufferList;
private IObservableList<ElementCallback<Integer>, Integer> NetworkList = new ObservableElementList<>();
private int allowedBufferTypes;
private boolean sortAlphabetically;
private boolean disableDecoration;
......@@ -24,12 +34,13 @@ public class BufferViewConfig extends SyncableObject {
private int minimumActivity;
private boolean hideInactiveBuffers;
private List<Integer> RemovedBuffers;
private Client client;
public BufferViewConfig(String bufferViewName, List<Integer> temporarilyRemovedBuffers, boolean hideInactiveNetworks, @NonNull List<Integer> bufferList, int allowedBufferTypes, boolean sortAlphabetically, boolean disableDecoration, boolean addNewBuffersAutomatically, int networkId, int minimumActivity, boolean hideInactiveBuffers, List<Integer> removedBuffers) {
this.bufferViewName = bufferViewName;
TemporarilyRemovedBuffers = temporarilyRemovedBuffers;
this.TemporarilyRemovedBuffers = temporarilyRemovedBuffers;
this.hideInactiveNetworks = hideInactiveNetworks;
BufferList = new ObservableElementList<>(bufferList);
this.BufferList = new ObservableElementList<>(bufferList);
this.allowedBufferTypes = allowedBufferTypes;
this.sortAlphabetically = sortAlphabetically;
this.disableDecoration = disableDecoration;
......@@ -37,7 +48,7 @@ public class BufferViewConfig extends SyncableObject {
this.networkId = networkId;
this.minimumActivity = minimumActivity;
this.hideInactiveBuffers = hideInactiveBuffers;
RemovedBuffers = removedBuffers;
this.RemovedBuffers = removedBuffers;
}
public String getBufferViewName() {
......@@ -114,6 +125,11 @@ public class BufferViewConfig extends SyncableObject {
public void setNetworkId(int networkId) {
this.networkId = networkId;
if (this.networkId != -1) {
this.NetworkList.addAll(client.getNetworks());
} else {
this.NetworkList.retainAll(Collections.singletonList(networkId));
}
}
public int getMinimumActivity() {
......@@ -161,10 +177,33 @@ public class BufferViewConfig extends SyncableObject {
@Override
public void init(@NonNull InitDataFunction function, @NonNull BusProvider provider, @NonNull Client client) {
this.client = client;
setObjectName(function.objectName);
assertNotNull(client.getBufferViewManager());
client.getBufferViewManager().BufferViews.put(Integer.valueOf(function.objectName), this);
}
@Override
public void update(BufferViewConfig from) {
this.bufferViewName = from.bufferViewName;
this.TemporarilyRemovedBuffers = from.TemporarilyRemovedBuffers;
this.hideInactiveNetworks = from.hideInactiveNetworks;
this.BufferList = from.BufferList;
this.allowedBufferTypes = from.allowedBufferTypes;
this.sortAlphabetically = from.sortAlphabetically;
this.disableDecoration = from.disableDecoration;
this.addNewBuffersAutomatically = from.addNewBuffersAutomatically;
this.networkId = from.networkId;
this.minimumActivity = from.minimumActivity;
this.hideInactiveBuffers = from.hideInactiveBuffers;
this.RemovedBuffers = from.RemovedBuffers;
}
@Override
public void update(Map<String, QVariant> from) {
update(BufferViewConfigSerializer.get().fromDatastream(from));
}
public void addBuffer(int bufferId, int position) {
BufferList.add(position, bufferId);
}
......@@ -182,4 +221,15 @@ public class BufferViewConfig extends SyncableObject {
removeBuffer(bufferId);
sync("removeBuffer", new Object[]{bufferId});
}
@NonNull
public IObservableList<ElementCallback<Integer>, Integer> getNetworkList() {
return NetworkList;
}
public void doLateInit() {
NetworkList.clear();
// This should initialize the network list
setNetworkId(getNetworkId());
}
}
......@@ -9,10 +9,14 @@ import java.util.Map;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferViewManagerSerializer;
public class BufferViewManager extends SyncableObject {
public class BufferViewManager extends SyncableObject<BufferViewManager> {
@NonNull
public final Map<Integer, BufferViewConfig> BufferViews = new HashMap<>();
public Map<Integer, BufferViewConfig> BufferViews = new HashMap<>();
private Client client;
public BufferViewManager(@NonNull List<Integer> BufferViewIds) {
for (int i : BufferViewIds) {
......@@ -30,7 +34,21 @@ public class BufferViewManager extends SyncableObject {
@Override
public void init(@NonNull InitDataFunction function, @NonNull BusProvider provider, @NonNull Client client) {
this.client = client;
setObjectName(function.objectName);
client.setBufferViewManager(this);
}
@Override
public void update(BufferViewManager from) {
this.BufferViews = from.BufferViews;
for (int id : BufferViews.keySet()) {
client.sendInitRequest("BufferViewConfig", String.valueOf(id));
}
}
@Override
public void update(Map<String, QVariant> from) {
update(BufferViewManagerSerializer.get().fromDatastream(from));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment