/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.modules.messaging.actions; import java.io.IOException; import java.util.ArrayList; import java.util.List; import im.actor.core.api.ApiPeer; import im.actor.core.api.ApiOutPeer; import im.actor.core.api.base.SeqUpdate; import im.actor.core.api.rpc.RequestDeleteMessage; import im.actor.core.api.rpc.ResponseSeq; import im.actor.core.api.updates.UpdateMessageDelete; import im.actor.core.entity.Peer; import im.actor.core.modules.ModuleContext; import im.actor.core.modules.messaging.actions.entity.Delete; import im.actor.core.modules.messaging.actions.entity.DeleteStorage; import im.actor.core.modules.ModuleActor; import im.actor.core.network.RpcCallback; import im.actor.core.network.RpcException; import im.actor.runtime.storage.SyncKeyValue; public class MessageDeleteActor extends ModuleActor { private SyncKeyValue syncKeyValue; private DeleteStorage deleteStorage; public MessageDeleteActor(ModuleContext context) { super(context); this.syncKeyValue = context.getMessagesModule().getCursorStorage(); } @Override public void preStart() { super.preStart(); byte[] data = syncKeyValue.get(CURSOR_DELETE); if (data != null) { try { deleteStorage = DeleteStorage.fromBytes(data); } catch (IOException e) { e.printStackTrace(); deleteStorage = new DeleteStorage(); } } else { deleteStorage = new DeleteStorage(); } for (Peer peer : deleteStorage.getPendingDeletions().keySet()) { Delete delete = deleteStorage.getPendingDeletions().get(peer); if (delete.getRids().size() > 0) { performDelete(peer, delete.getRids()); } } } void saveStorage() { syncKeyValue.put(CURSOR_DELETE, deleteStorage.toByteArray()); } public void performDelete(final Peer peer, final List<Long> rids) { final ApiOutPeer outPeer = buidOutPeer(peer); final ApiPeer apiPeer = buildApiPeer(peer); request(new RequestDeleteMessage(outPeer, rids), new RpcCallback<ResponseSeq>() { @Override public void onResult(ResponseSeq response) { if (deleteStorage.getPendingDeletions().containsKey(peer)) { deleteStorage.getPendingDeletions().get(peer).getRids().removeAll(rids); saveStorage(); } updates().onUpdateReceived(new SeqUpdate(response.getSeq(),response.getState(), UpdateMessageDelete.HEADER,new UpdateMessageDelete(apiPeer, rids).toByteArray())); } @Override public void onError(RpcException e) { } }); } public void onDeleteMessage(Peer peer, List<Long> rids) { // Add to storage if (!deleteStorage.getPendingDeletions().containsKey(peer)) { deleteStorage.getPendingDeletions().put(peer, new Delete(peer,new ArrayList<Long>())); } deleteStorage.getPendingDeletions().get(peer).getRids().addAll(rids); saveStorage(); // Perform deletion performDelete(peer, rids); } @Override public void onReceive(Object message) { if (message instanceof DeleteMessage) { DeleteMessage deleteMessage = (DeleteMessage) message; ArrayList<Long> rids = new ArrayList<Long>(); for (long l : deleteMessage.getRids()) { rids.add(l); } onDeleteMessage(deleteMessage.getPeer(), rids); } else { super.onReceive(message); } } public static class DeleteMessage { private Peer peer; private long[] rids; public DeleteMessage(Peer peer, long[] rids) { this.peer = peer; this.rids = rids; } public Peer getPeer() { return peer; } public long[] getRids() { return rids; } } }