1a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org/* 2a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * libjingle 3a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * Copyright 2013, Google Inc. 4a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * 5a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * Redistribution and use in source and binary forms, with or without 6a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * modification, are permitted provided that the following conditions are met: 7a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * 8a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 9a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * this list of conditions and the following disclaimer. 10a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 11a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 12a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * and/or other materials provided with the distribution. 13a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 14a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * derived from this software without specific prior written permission. 15a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * 16a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org */ 27a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 28a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.orgpackage org.webrtc; 29a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 30a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.orgimport java.nio.ByteBuffer; 31a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 32a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org/** Java wrapper for a C++ DataChannelInterface. */ 33a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.orgpublic class DataChannel { 34a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Java wrapper for WebIDL RTCDataChannel. */ 35a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public static class Init { 36a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public boolean ordered = true; 37a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org // Optional unsigned short in WebIDL, -1 means unspecified. 38a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public int maxRetransmitTimeMs = -1; 39a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org // Optional unsigned short in WebIDL, -1 means unspecified. 40a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public int maxRetransmits = -1; 41a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public String protocol = ""; 42b3def34cf749b768e74cde9cb5c0b68dbf0f5308fischman@webrtc.org public boolean negotiated = false; 43a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org // Optional unsigned short in WebIDL, -1 means unspecified. 44a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public int id = -1; 45a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 46a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public Init() {} 47a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 48a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org // Called only by native code. 49a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org private Init( 50a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org boolean ordered, int maxRetransmitTimeMs, int maxRetransmits, 51a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org String protocol, boolean negotiated, int id) { 52a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.ordered = ordered; 53a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.maxRetransmitTimeMs = maxRetransmitTimeMs; 54a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.maxRetransmits = maxRetransmits; 55a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.protocol = protocol; 56a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.negotiated = negotiated; 57a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.id = id; 58a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 59a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 60a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 61a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Java version of C++ DataBuffer. The atom of data in a DataChannel. */ 62a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public static class Buffer { 63a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** The underlying data. */ 64a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public final ByteBuffer data; 65a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 66a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** 67a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * Indicates whether |data| contains UTF-8 text or "binary data" 68a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * (i.e. anything else). 69a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org */ 70a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public final boolean binary; 71a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 72a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public Buffer(ByteBuffer data, boolean binary) { 73a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.data = data; 74a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.binary = binary; 75a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 76a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 77a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 78a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Java version of C++ DataChannelObserver. */ 79a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public interface Observer { 80a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** The data channel state has changed. */ 81a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public void onStateChange(); 82a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** 83a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * A data buffer was successfully received. NOTE: |buffer.data| will be 84a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * freed once this function returns so callers who want to use the data 85a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * asynchronously must make sure to copy it first. 86a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org */ 87a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public void onMessage(Buffer buffer); 88a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 89a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 90a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Keep in sync with DataChannelInterface::DataState. */ 91a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public enum State { CONNECTING, OPEN, CLOSING, CLOSED }; 92a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 93a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org private final long nativeDataChannel; 94a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org private long nativeObserver; 95a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 96a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public DataChannel(long nativeDataChannel) { 97a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org this.nativeDataChannel = nativeDataChannel; 98a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 99a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 100a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Register |observer|, replacing any previously-registered observer. */ 101a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public void registerObserver(Observer observer) { 102a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org if (nativeObserver != 0) { 103a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org unregisterObserverNative(nativeObserver); 104a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 105a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org nativeObserver = registerObserverNative(observer); 106a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 107a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org private native long registerObserverNative(Observer observer); 108a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 109a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Unregister the (only) observer. */ 110a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public void unregisterObserver() { 111a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org unregisterObserverNative(nativeObserver); 112a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 113a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org private native void unregisterObserverNative(long nativeObserver); 114a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 115a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public native String label(); 116a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 117a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public native State state(); 118a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 119a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** 120a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * Return the number of bytes of application data (UTF-8 text and binary data) 121a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * that have been queued using SendBuffer but have not yet been transmitted 122a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org * to the network. 123a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org */ 124a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public native long bufferedAmount(); 125a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 126a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Close the channel. */ 127a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public native void close(); 128a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 129a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Send |data| to the remote peer; return success. */ 130a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public boolean send(Buffer buffer) { 131a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org // TODO(fischman): this could be cleverer about avoiding copies if the 132a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org // ByteBuffer is direct and/or is backed by an array. 133a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org byte[] data = new byte[buffer.data.remaining()]; 134a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org buffer.data.get(data); 135a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org return sendNative(data, buffer.binary); 136a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org } 137a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org private native boolean sendNative(byte[] data, boolean binary); 138a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org 139a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org /** Dispose of native resources attached to this channel. */ 140a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org public native void dispose(); 141a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org}; 142