// Path: java/anyremote/client/android/util/ISocket.java
// public interface ISocket {
// 	public void close();
// 	// public boolean isConnected(); BluetoothSocket API level 14 or higher
// 	public InputStream getInputStream();
// 	public OutputStream getOutputStream();
// 
// }
// 
// Path: java/anyremote/client/android/util/ProtocolMessage.java
// public class ProtocolMessage {
// 	public static final int FULL     = 0;
// 	public static final int FIRST    = 1;
// 	public static final int INTERMED = 2;
// 	public static final int LAST     = 3;
// 	
// 	public int id;
// 	public int stage;
// 	public Vector tokens;
// }
// 
// Path: java/anyremote/client/android/util/UserException.java
// public class UserException extends Exception {
// 	private String error, details;
// 	
// 	static final long serialVersionUID = 1232123;
// 
// 	public UserException(String error, String details) {
// 
// 		this(error, details, null);
// 	}
// 
// 	public UserException(String error, String details, Exception ex) {
// 
// 		this.error = error;
// 
// 		if (details == null) {
// 			if (ex != null && ex.getMessage() != null) {
// 				this.details = ex.getMessage();
// 			} else {
// 				this.details = "";
// 			}
// 		} else {
// 			if (ex != null && ex.getMessage() != null) {
// 				if (details.endsWith(".")) {
// 					details = details.substring(0, details.length() - 1);
// 				}
// 				this.details = details + " (" + ex.getMessage() + ").";
// 			} else {
// 				this.details = details;
// 			}
// 		}
// 
// 	}
// 
// 	// Get the error details
// 	public String getDetails() {
// 		return details;
// 	}
// 
// 	// Get the error title
// 	public String getError() {
// 		return error;
// 	}
// }


import java.util.Vector;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import anyremote.client.android.util.ISocket;
import anyremote.client.android.util.ProtocolMessage;
import anyremote.client.android.util.UserException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
//
// anyRemote android client
// a bluetooth/wi-fi remote control for Linux.
//
// Copyright (C) 2011-2018 Mikhail Fedotov <anyremote@mail.ru>
// 
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//

package anyremote.client.android;


/**
 * A connection sets up a connection to the server and handles receiving and
 * sending of messages from/to the server.
 */
public final class Connection implements Runnable {

	static final int BUFFER_SIZE = 4096;

	static final int ENDS_AT_CEND = 1;
	static final int ENDS_AT_COMMA = 3;
	static final int ENDS_AT_NOMORE = 5;

	static final int READ_NO = 0;
	static final int READ_CMDID = 1;
	static final int READ_PART = 3;
	
	static final int  QUEUE_CAPACITY = 2048;
	
	boolean charMode;
	byte[] bArray;
	int curCmdId;
	int readingEndsAt;
	int readStage;
	int wasRead;
	int btoRead;
	Vector cmdTokens;

	Integer runSignal;
	Vector cmdQueue;
	StringBuilder dataQueue;

	private boolean closed = false;

	private final Dispatcher connectionListener;

	private boolean connectionListenerNotifiedAboutError = false;

	private final DataInputStream dis;
	private final DataOutputStream dos;

// Path: java/anyremote/client/android/util/ISocket.java
// public interface ISocket {
// 	public void close();
// 	// public boolean isConnected(); BluetoothSocket API level 14 or higher
// 	public InputStream getInputStream();
// 	public OutputStream getOutputStream();
// 
// }
// 
// Path: java/anyremote/client/android/util/ProtocolMessage.java
// public class ProtocolMessage {
// 	public static final int FULL     = 0;
// 	public static final int FIRST    = 1;
// 	public static final int INTERMED = 2;
// 	public static final int LAST     = 3;
// 	
// 	public int id;
// 	public int stage;
// 	public Vector tokens;
// }
// 
// Path: java/anyremote/client/android/util/UserException.java
// public class UserException extends Exception {
// 	private String error, details;
// 	
// 	static final long serialVersionUID = 1232123;
// 
// 	public UserException(String error, String details) {
// 
// 		this(error, details, null);
// 	}
// 
// 	public UserException(String error, String details, Exception ex) {
// 
// 		this.error = error;
// 
// 		if (details == null) {
// 			if (ex != null && ex.getMessage() != null) {
// 				this.details = ex.getMessage();
// 			} else {
// 				this.details = "";
// 			}
// 		} else {
// 			if (ex != null && ex.getMessage() != null) {
// 				if (details.endsWith(".")) {
// 					details = details.substring(0, details.length() - 1);
// 				}
// 				this.details = details + " (" + ex.getMessage() + ").";
// 			} else {
// 				this.details = details;
// 			}
// 		}
// 
// 	}
// 
// 	// Get the error details
// 	public String getDetails() {
// 		return details;
// 	}
// 
// 	// Get the error title
// 	public String getError() {
// 		return error;
// 	}
// }


// Path: java/anyremote/client/android/Connection.java
import java.util.Vector;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import anyremote.client.android.util.ISocket;
import anyremote.client.android.util.ProtocolMessage;
import anyremote.client.android.util.UserException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

//
// anyRemote android client
// a bluetooth/wi-fi remote control for Linux.
//
// Copyright (C) 2011-2018 Mikhail Fedotov <anyremote@mail.ru>
// 
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//

package anyremote.client.android;


/**
 * A connection sets up a connection to the server and handles receiving and
 * sending of messages from/to the server.
 */
public final class Connection implements Runnable {

	static final int BUFFER_SIZE = 4096;

	static final int ENDS_AT_CEND = 1;
	static final int ENDS_AT_COMMA = 3;
	static final int ENDS_AT_NOMORE = 5;

	static final int READ_NO = 0;
	static final int READ_CMDID = 1;
	static final int READ_PART = 3;
	
	static final int  QUEUE_CAPACITY = 2048;
	
	boolean charMode;
	byte[] bArray;
	int curCmdId;
	int readingEndsAt;
	int readStage;
	int wasRead;
	int btoRead;
	Vector cmdTokens;

	Integer runSignal;
	Vector cmdQueue;
	StringBuilder dataQueue;

	private boolean closed = false;

	private final Dispatcher connectionListener;

	private boolean connectionListenerNotifiedAboutError = false;

	private final DataInputStream dis;
	private final DataOutputStream dos;

	private final ISocket sock;