public ConversationMetadata(DataInput in) throws IOException { byte version = in.readByte(); if (version != VERSION) { throw new IOException("Expected version " + VERSION + " but was " + version); } int count = in.readByte(); items = new ArrayList<>(count); for (int i = 0; i < count; ++i) { items.add(new ConversationMetadataItem(in)); } }
for (ConversationMetadataItem item : items) { rows[index++] = new Object[] { item.getConversationState(), item.getLocalConversationId(), item.getConversationId(), item.getUserId(), hideIfSanitized(item.getDataFile()), hideIfSanitized(item.getMessagesFile()), hideIfSanitized(item.getConversationToken()), hideIfSanitized(item.getConversationEncryptionKey()) };
if (LOGGED_IN.equals(item.getConversationState())) { item.setConversationState(LOGGED_OUT); item.setConversationEncryptionKey(null); item.setConversationToken(null); item = new ConversationMetadataItem(conversation.getLocalIdentifier(), conversation.getConversationId(), conversation.getConversationDataFile(), conversation.getConversationMessagesFile()); conversationMetadata.addItem(item); } else { assertTrue(conversation.getConversationId() != null || conversation.hasState(ANONYMOUS_PENDING) || conversation.hasState(LEGACY_PENDING), "Missing conversation id for state: %s", conversation.getState()); item.setConversationId(conversation.getConversationId()); item.setConversationState(conversation.getState()); if (conversation.hasActiveState()) { item.setConversationToken(notNull(conversation.getConversationToken())); item.setConversationEncryptionKey(notNull(conversation.getEncryptionKey())); item.setUserId(notNull(conversation.getUserId()));
private Conversation loadConversation(ConversationMetadataItem item) throws SerializerException, ConversationLoadException { checkConversationQueue(); // logged-in conversations should use an encryption key which was received from the backend. EncryptionKey conversationEncryptionKey = encryptionKey; if (LOGGED_IN.equals(item.getConversationState())) { conversationEncryptionKey = item.getConversationEncryptionKey(); if (conversationEncryptionKey == null) { throw new ConversationLoadException("Missing conversation encryption key"); } } // TODO: use same serialization logic across the project final Conversation conversation = new Conversation(item.getDataFile(), item.getMessagesFile(), conversationEncryptionKey); conversation.setState(item.getConversationState()); // set the state same as the item's state conversation.setUserId(item.getUserId()); conversation.setConversationToken(item.getConversationToken()); // TODO: this would be overwritten by the next call // try to migrate legacy conversation first boolean migrated = conversation.migrateConversationData(); // if failed - load from encrypted data if (!migrated) { conversation.loadConversationData(); } // check inconsistency conversation.checkInternalConsistency(); return conversation; }
@Override public boolean accept(ConversationMetadataItem item) { return state.equals(item.getConversationState()); } });
@Override public boolean accept(ConversationMetadataItem item) { return StringUtils.equal(item.getLocalConversationId(), conversation.getLocalIdentifier()); } });
sendLoginRequest(conversationItem.getConversationId(), userId, token, callback); return;