public MessageOutputStream writeMessage() throws IOException { int tries = 50; IntIndexMap<OutboundMessage> outboundMessages = this.outboundMessages; openOutboundMessage(); boolean ok = false; try { final Random random = ThreadLocalRandom.current(); while (tries > 0) { final int id = random.nextInt() & 0xfffe; if (! outboundMessages.containsKey(id)) { OutboundMessage message = new OutboundMessage((short) id, this, outboundWindow, maxOutboundMessageSize); OutboundMessage existing = outboundMessages.putIfAbsent(message); if (existing == null) { ok = true; return message; } } tries --; } throw log.channelBusy(); } finally { if (! ok) { closeOutboundMessage(); } } }
void handleWindowOpen(final Pooled<ByteBuffer> pooled) { ByteBuffer buffer = pooled.getResource(); int id = buffer.getShort() & 0xffff; final OutboundMessage outboundMessage = outboundMessages.get(id); if (outboundMessage == null) { // ignore; probably harmless...? return; } outboundMessage.acknowledge(buffer.getInt() & 0x7FFFFFFF); }
public Pooled<ByteBuffer> getBuffer(boolean firstBuffer) throws IOException { Pooled<ByteBuffer> pooled = allocate(Protocol.MESSAGE_DATA); boolean ok = false; try { ByteBuffer buffer = pooled.getResource(); //Reserve room for the transmit data which is 4 bytes buffer.limit(buffer.limit() - 4); buffer.put(firstBuffer ? Protocol.MSG_FLAG_NEW : 0); // flags // header size plus window size int windowPlusHeader = maximumWindow + 8; if (buffer.remaining() > windowPlusHeader) { // never try to write more than the maximum window size buffer.limit(windowPlusHeader); } ok = true; return pooled; } finally { if (! ok) pooled.free(); } }
private IOException overrun() { try { return new IOException("Maximum message size overrun"); } finally { cancel(); } }
OutboundMessage msg = new OutboundMessage("+94123456789", "SMS test: sample message from StackOverflow"); msg.setFrom("chandpriyankara");
void handleAsyncClose(final Pooled<ByteBuffer> pooled) { ByteBuffer buffer = pooled.getResource(); int id = buffer.getShort() & 0xffff; final OutboundMessage outboundMessage = outboundMessages.get(id); if (outboundMessage == null) { // ignore; probably harmless...? return; } outboundMessage.remoteClosed(); }
void dumpState(final StringBuilder b) { final int state = channelState; final int inboundMessageCnt = (state & INBOUND_MESSAGES_MASK) >>> (Integer.numberOfTrailingZeros(ONE_INBOUND_MESSAGE)); final int outboundMessageCnt = (state & OUTBOUND_MESSAGES_MASK) >>> (Integer.numberOfTrailingZeros(ONE_OUTBOUND_MESSAGE)); b.append(" ").append(String.format("%s channel ID %08x summary:\n", (channelId & 0x80000000) == 0 ? "Inbound" : "Outbound", channelId)); b.append(" ").append("* Flags: "); if (Bits.allAreSet(state, READ_CLOSED)) b.append("read-closed "); if (Bits.allAreSet(state, WRITE_CLOSED)) b.append("write-closed "); b.append('\n'); b.append(" ").append("* ").append(inboundMessageQueue.size()).append(" pending inbound messages\n"); b.append(" ").append("* ").append(inboundMessageCnt).append(" (max ").append(maxInboundMessages).append(") inbound messages\n"); b.append(" ").append("* ").append(outboundMessageCnt).append(" (max ").append(maxOutboundMessages).append(") outbound messages\n"); b.append(" ").append("* Pending inbound messages:\n"); for (InboundMessage inboundMessage : inboundMessageQueue) { inboundMessage.dumpState(b); } b.append(" ").append("* Inbound messages:\n"); for (InboundMessage inboundMessage : inboundMessages) { inboundMessage.dumpState(b); } b.append(" ").append("* Outbound messages:\n"); for (OutboundMessage outboundMessage : outboundMessages) { outboundMessage.dumpState(b); } } }
public void write(final int b) throws IOException { if (remaining > 1) { pipeOutputStream.write(b); remaining--; } else { throw overrun(); } }
public void write(final byte[] b) throws IOException { write(b, 0, b.length); }
public void flush() throws IOException { try { pipeOutputStream.flush(); } catch (IOException e) { cancel(); throw e; } }
void handleAsyncClose(final Pooled<ByteBuffer> pooled) { ByteBuffer buffer = pooled.getResource(); int id = buffer.getShort() & 0xffff; final OutboundMessage outboundMessage = outboundMessages.get(id); if (outboundMessage == null) { // ignore; probably harmless...? return; } outboundMessage.remoteClosed(); }
void dumpState(final StringBuilder b) { final int state = channelState; final int inboundMessageCnt = (state & INBOUND_MESSAGES_MASK) >>> (Integer.numberOfTrailingZeros(ONE_INBOUND_MESSAGE)); final int outboundMessageCnt = (state & OUTBOUND_MESSAGES_MASK) >>> (Integer.numberOfTrailingZeros(ONE_OUTBOUND_MESSAGE)); b.append(" ").append(String.format("%s channel ID %08x summary:\n", (channelId & 0x80000000) == 0 ? "Inbound" : "Outbound", channelId)); b.append(" ").append("* Flags: "); if (Bits.allAreSet(state, READ_CLOSED)) b.append("read-closed "); if (Bits.allAreSet(state, WRITE_CLOSED)) b.append("write-closed "); b.append('\n'); b.append(" ").append("* ").append(inboundMessageQueue.size()).append(" pending inbound messages\n"); b.append(" ").append("* ").append(inboundMessageCnt).append(" (max ").append(maxInboundMessages).append(") inbound messages\n"); b.append(" ").append("* ").append(outboundMessageCnt).append(" (max ").append(maxOutboundMessages).append(") outbound messages\n"); b.append(" ").append("* Pending inbound messages:\n"); for (InboundMessage inboundMessage : inboundMessageQueue) { inboundMessage.dumpState(b); } b.append(" ").append("* Inbound messages:\n"); for (InboundMessage inboundMessage : inboundMessages) { inboundMessage.dumpState(b); } b.append(" ").append("* Outbound messages:\n"); for (OutboundMessage outboundMessage : outboundMessages) { outboundMessage.dumpState(b); } } }
public void write(final byte[] b, final int off, final int len) throws IOException { if ((long) len > remaining) { throw overrun(); } pipeOutputStream.write(b, off, len); remaining -= len; }
msg = new OutboundMessage("+00123456567889", "Hello from SMSLib!"); here replace +00123456567889 with +<your number with ISD code>
public void close() throws IOException { try { synchronized (pipeOutputStream) { pipeOutputStream.notifyAll(); pipeOutputStream.close(); } } catch (IOException e) { cancel(); throw e; } }