public void put(AxolotlAddress address, T value) { synchronized (MAP_LOCK) { Map<Integer, T> devices = map.get(address.getName()); if (devices == null) { devices = new HashMap<>(); map.put(address.getName(), devices); } devices.put(address.getDeviceId(), value); } }
public Map<Integer, T> getAll(AxolotlAddress address) { synchronized (MAP_LOCK) { Map<Integer, T> devices = map.get(address.getName()); if (devices == null) { return new HashMap<>(); } return devices; } }
public T get(AxolotlAddress address) { synchronized (MAP_LOCK) { Map<Integer, T> devices = map.get(address.getName()); if (devices == null) { return null; } return devices.get(address.getDeviceId()); } }
private String getSessionName(AxolotlAddress axolotlAddress) { Recipient recipient = RecipientFactory.getRecipientsFromString(context, axolotlAddress.getName(), true) .getPrimaryRecipient(); long recipientId = recipient.getRecipientId(); int deviceId = axolotlAddress.getDeviceId(); return recipientId + (deviceId == TextSecureAddress.DEFAULT_DEVICE_ID ? "" : "." + deviceId); }
private void buildSessionFromPEP(final AxolotlAddress address) { Log.i( Config.LOGTAG, AxolotlService.getLogprefix(account) + "Building new sesstion for " + address.getDeviceId()); try { IqPacket bundlesPacket = mXmppConnectionService .getIqGenerator() .retrieveBundlesForDevice(Jid.fromString(address.getName()), address.getDeviceId()); Log.d( Config.LOGTAG, AxolotlService.getLogprefix(account) + "Retrieving bundle: " + bundlesPacket); mXmppConnectionService.sendIqPacket( account, bundlesPacket, new OnIqPacketReceived() { private void finish() { AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toString(), 0); if (!fetchStatusMap.getAll(ownAddress).containsValue(FetchStatus.PENDING) && !fetchStatusMap.getAll(address).containsValue(FetchStatus.PENDING)) { mXmppConnectionService.keyStatusUpdated(); } } @Override public void onIqPacketReceived(Account account, IqPacket packet) { Log.d( Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received preKey IQ packet, processing..."); final IqParser parser = mXmppConnectionService.getIqParser(); final List<PreKeyBundle> preKeyBundleList = parser.preKeys(packet); final PreKeyBundle bundle = parser.bundle(packet); if (preKeyBundleList.isEmpty() || bundle == null) { Log.e( Config.LOGTAG, AxolotlService.getLogprefix(account) + "preKey IQ packet invalid: " + packet); fetchStatusMap.put(address, FetchStatus.ERROR); finish(); return; } Random random = new Random(); final PreKeyBundle preKey = preKeyBundleList.get(random.nextInt(preKeyBundleList.size())); if (preKey == null) { // should never happen fetchStatusMap.put(address, FetchStatus.ERROR); finish(); return; } final PreKeyBundle preKeyBundle = new PreKeyBundle( 0, address.getDeviceId(), preKey.getPreKeyId(), preKey.getPreKey(), bundle.getSignedPreKeyId(), bundle.getSignedPreKey(), bundle.getSignedPreKeySignature(), bundle.getIdentityKey()); axolotlStore.saveIdentity(address.getName(), bundle.getIdentityKey()); try { SessionBuilder builder = new SessionBuilder(axolotlStore, address); builder.process(preKeyBundle); XmppAxolotlSession session = new XmppAxolotlSession( account, axolotlStore, address, bundle.getIdentityKey().getFingerprint().replaceAll("\\s", "")); sessions.put(address, session); fetchStatusMap.put(address, FetchStatus.SUCCESS); } catch (UntrustedIdentityException | InvalidKeyException e) { Log.e( Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error building session for " + address + ": " + e.getClass().getName() + ", " + e.getMessage()); fetchStatusMap.put(address, FetchStatus.ERROR); } finish(); } }); } catch (InvalidJidException e) { Log.e( Config.LOGTAG, AxolotlService.getLogprefix(account) + "Got address with invalid jid: " + address.getName()); } }
public boolean hasAny(AxolotlAddress address) { synchronized (MAP_LOCK) { Map<Integer, T> devices = map.get(address.getName()); return devices != null && !devices.isEmpty(); } }