public DataStructure createDataStructure() throws DataFormatException { MessagePayloadMessage msg = new MessagePayloadMessage(); msg.setMessageId(123); msg.setPayload((Payload)(new PayloadTest()).createDataStructure()); msg.setSessionId(321); return msg; } public DataStructure createStructureToRead() { return new MessagePayloadMessage(); }
/** * Recieve a payload message and let the app know its available */ public void addNewMessage(MessagePayloadMessage msg) { Long mid = Long.valueOf(msg.getMessageId()); _availableMessages.put(mid, msg); long id = msg.getMessageId(); byte data[] = msg.getPayload().getUnencryptedData(); if ((data == null) || (data.length <= 0)) { if (_log.shouldLog(Log.CRIT)) _log.log(Log.CRIT, getPrefix() + "addNewMessage of a message with no unencrypted data", new Exception("Empty message")); } else { int size = data.length; _availabilityNotifier.available(id, size); if (_log.shouldLog(Log.INFO)) _log.info(getPrefix() + "Notified availability for session " + _sessionId + ", message " + id); } }
public DataStructure createStructureToRead() { return new MessagePayloadMessage(); }
public void handleMessage(I2CPMessage message, I2PSessionImpl session) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Handle message " + message + " for session " + session); try { MessagePayloadMessage msg = (MessagePayloadMessage) message; long id = msg.getMessageId(); decryptPayload(msg, session); session.addNewMessage(msg); // Small chance of this, but // if we are a new I2P lib talking to an old router // and we don't send this, the router will OOM as it has // no cleaner for old messages. // Check router version from handshake // and send it all the time if 0.9.3 or less // (needs router version saving support in SetDateMessageHandler) if (!session.getFastReceive()) { ReceiveMessageEndMessage m = new ReceiveMessageEndMessage(); m.setMessageId(id); m.setSessionId(msg.getSessionId()); session.sendMessage(m); } } catch (DataFormatException dfe) { session.propogateError("Error handling a new payload message", dfe); } catch (I2PSessionException ise) { session.propogateError("Error handling a new payload message", ise); } }
private static int getByte(MessagePayloadMessage msg, int i) { return msg.getPayload().getUnencryptedData()[i] & 0xff; }
return new MessageStatusMessage(); case MessagePayloadMessage.MESSAGE_TYPE: return new MessagePayloadMessage(); case ReceiveMessageBeginMessage.MESSAGE_TYPE: return new ReceiveMessageBeginMessage();
/** * Pull the unencrypted data from the message that we've already prefetched and * notified the user that its available. * */ public byte[] receiveMessage(int msgId) throws I2PSessionException { MessagePayloadMessage msg = _availableMessages.remove(Long.valueOf(msgId)); if (msg == null) { _log.error("Receive message " + msgId + " had no matches"); return null; } updateActivity(); return msg.getPayload().getUnencryptedData(); }
/** * Deliver the message directly, skip notification * @since 0.9.4 */ private void sendMessage(long id) throws I2CPMessageException { MessagePayloadMessage msg = new MessagePayloadMessage(); msg.setMessageId(id); SessionId sid = _runner.getSessionId(_toDest.calculateHash()); if (sid == null) { if (_log.shouldLog(Log.WARN)) _log.warn("No session for " + _toDest.calculateHash()); return; } msg.setSessionId(sid.getSessionId()); msg.setPayload(_payload); _runner.doSend(msg); } }
/** * Receive a payload message and let the app know its available */ @Override public void addNewMessage(MessagePayloadMessage msg) { Long mid = Long.valueOf(msg.getMessageId()); _availableMessages.put(mid, msg); long id = msg.getMessageId(); byte data[] = msg.getPayload().getUnencryptedData(); if ((data == null) || (data.length <= 0)) { if (_log.shouldLog(Log.CRIT)) _log.log(Log.CRIT, getPrefix() + "addNewMessage of a message with no unencrypted data", new Exception("Empty message")); return; } int size = data.length; if (size < 10) { _log.error(getPrefix() + "length too short for gzip header: " + size); return; } ((MuxedAvailabilityNotifier)_availabilityNotifier).available(id, size, getProto(msg), getFromPort(msg), getToPort(msg)); }
/** * Decrypt the payload * * We don't really decrypt (no more end-to-end crypto) * If we do, we need to use the correct key manager in the decrypt() call below */ private Payload decryptPayload(MessagePayloadMessage msg, I2PSessionImpl session) throws DataFormatException { Payload payload = msg.getPayload(); //if (!I2CPMessageProducer.END_TO_END_CRYPTO) { payload.setUnencryptedData(payload.getEncryptedData()); return payload; //} //byte[] data = _context.elGamalAESEngine().decrypt(payload.getEncryptedData(), session.getDecryptionKey()); //if (data == null) { // if (_log.shouldLog(Log.WARN)) // _log.warn("Error decrypting the payload"); // throw new DataFormatException("Unable to decrypt the payload"); //} //payload.setUnencryptedData(data); //return payload; } }
if (_log.shouldLog(Log.DEBUG)) _log.debug("Handling receive begin: id = " + message.getMessageId()); MessagePayloadMessage msg = new MessagePayloadMessage(); msg.setMessageId(message.getMessageId()); msg.setSessionId(message.getSessionId()); Payload payload = _runner.getPayload(new MessageId(message.getMessageId())); if (payload == null) { return; msg.setPayload(payload); try { _runner.doSend(msg);