Browse files

Added some exception handling

  • Loading branch information...
1 parent 83e8990 commit 9270d13981a1ff1a2180d9b8aafeeb1aa91d12e6 Animesh Kumar committed with filmaj Feb 13, 2011
View
33 framework/assets/js/websocket.js
@@ -30,16 +30,14 @@
// WebSocket Object. All listener methods are cleaned up!
var WebSocket = global.WebSocket = function(url) {
- // must be overloaded
- this.onopen = null;
- this.onmessage = null;
- this.onclose = null;
- this.onerror = null;
-
// get a new websocket object from factory (check com.strumsoft.websocket.WebSocketFactory.java)
this.socket = WebSocketFactory.getInstance(url);
// store in registry
- WebSocket.store[this.socket.getId()] = this;
+ if(this.socket) {
+ WebSocket.store[this.socket.getId()] = this;
+ } else {
+ throw new Error('websocket instantiation failed! Address could be wrong.');
+ }
};
// storage to hold websocket object for later invokation of event methods
@@ -62,6 +60,7 @@
WebSocket.store[evt._target]['onerror'].call(global, evt._data);
}
+ // instance event methods
WebSocket.prototype.send = function(data) {
this.socket.send(data);
}
@@ -73,5 +72,23 @@
WebSocket.prototype.getReadyState = function() {
this.socket.getReadyState();
}
-
+ ///////////// Must be overloaded
+ WebSocket.prototype.onopen = function(){
+ throw new Error('onopen not implemented.');
+ };
+
+ // alerts message pushed from server
+ WebSocket.prototype.onmessage = function(msg){
+ throw new Error('onmessage not implemented.');
+ };
+
+ // alerts message pushed from server
+ WebSocket.prototype.onerror = function(msg){
+ throw new Error('onerror not implemented.');
+ };
+
+ // alert close event
+ WebSocket.prototype.onclose = function(){
+ throw new Error('onclose not implemented.');
+ };
})();
View
98 framework/src/com/phonegap/websocket/WebSocket.java
@@ -43,6 +43,7 @@
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
+import android.util.Log;
import android.webkit.WebView;
/**
@@ -246,17 +247,42 @@ protected WebSocket(WebView appView, URI uri, Draft draft, String id) {
// //////////////////////////////////////////////////////////////////////////////////////
/**
* Starts a new Thread and connects to server
+ *
+ * @throws IOException
*/
- public void connect() {
+ public Thread connect() throws IOException {
this.running = true;
- (new Thread(this)).start();
+ this.readyState = WEBSOCKET_STATE_CONNECTING;
+ // open socket
+ socketChannel = SocketChannel.open();
+ socketChannel.configureBlocking(false);
+ // set address
+ socketChannel.connect(new InetSocketAddress(uri.getHost(), port));
+ // start a thread to make connection
+
+ // More info:
+ // http://groups.google.com/group/android-developers/browse_thread/thread/45a8b53e9bf60d82
+ // http://stackoverflow.com/questions/2879455/android-2-2-and-bad-address-family-on-socket-connect
+ System.setProperty("java.net.preferIPv4Stack", "true");
+ System.setProperty("java.net.preferIPv6Addresses", "false");
+
+ selector = Selector.open();
+ socketChannel.register(selector, SelectionKey.OP_CONNECT);
+ Log.v("websocket", "Starting a new thread to manage data reading/writing");
+
+ Thread th = new Thread(this);
+ th.start();
+ // return thread object for explicit closing, if needed
+ return th;
}
public void run() {
- try {
- _connect();
- } catch (IOException e) {
- this.onError(e);
+ while (this.running) {
+ try {
+ _connect();
+ } catch (IOException e) {
+ this.onError(e);
+ }
}
}
@@ -265,7 +291,7 @@ public void run() {
*/
public void close() {
this.readyState = WebSocket.WEBSOCKET_STATE_CLOSING;
-
+
// close socket channel
try {
this.socketChannel.close();
@@ -274,10 +300,10 @@ public void close() {
}
this.running = false;
selector.wakeup();
-
+
// fire onClose method
this.onClose();
-
+
this.readyState = WebSocket.WEBSOCKET_STATE_CLOSED;
}
@@ -289,7 +315,7 @@ public void close() {
*/
public void send(String text) {
try {
- if(this.readyState == WEBSOCKET_STATE_OPEN){
+ if (this.readyState == WEBSOCKET_STATE_OPEN) {
_send(text);
} else {
this.onError(new NotYetConnectedException());
@@ -389,45 +415,31 @@ private boolean _send(String text) throws IOException {
// actual connection logic
private void _connect() throws IOException {
- this.readyState = WEBSOCKET_STATE_CONNECTING;
- socketChannel = SocketChannel.open();
- socketChannel.configureBlocking(false);
- socketChannel.connect(new InetSocketAddress(uri.getHost(), port));
-
- // More info:
- // http://groups.google.com/group/android-developers/browse_thread/thread/45a8b53e9bf60d82
- // http://stackoverflow.com/questions/2879455/android-2-2-and-bad-address-family-on-socket-connect
- System.setProperty("java.net.preferIPv4Stack", "true");
- System.setProperty("java.net.preferIPv6Addresses", "false");
+ // Continuous loop that is only supposed to end when "close" is called.
- selector = Selector.open();
- socketChannel.register(selector, SelectionKey.OP_CONNECT);
+ selector.select();
+ Set<SelectionKey> keys = selector.selectedKeys();
+ Iterator<SelectionKey> i = keys.iterator();
- // Continuous loop that is only supposed to end when "close" is called.
- while (this.running) {
- selector.select();
- Set<SelectionKey> keys = selector.selectedKeys();
- Iterator<SelectionKey> i = keys.iterator();
-
- while (i.hasNext()) {
- SelectionKey key = i.next();
- i.remove();
- if (key.isConnectable()) {
- if (socketChannel.isConnectionPending()) {
- socketChannel.finishConnect();
- }
- socketChannel.register(selector, SelectionKey.OP_READ);
- _writeHandshake();
+ while (i.hasNext()) {
+ SelectionKey key = i.next();
+ i.remove();
+ if (key.isConnectable()) {
+ if (socketChannel.isConnectionPending()) {
+ socketChannel.finishConnect();
}
- if (key.isReadable()) {
- try {
- _read();
- } catch (NoSuchAlgorithmException nsa) {
- this.onError(nsa);
- }
+ socketChannel.register(selector, SelectionKey.OP_READ);
+ _writeHandshake();
+ }
+ if (key.isReadable()) {
+ try {
+ _read();
+ } catch (NoSuchAlgorithmException nsa) {
+ this.onError(nsa);
}
}
}
+
}
private void _writeHandshake() throws IOException {
View
22 framework/src/com/phonegap/websocket/WebSocketFactory.java
@@ -26,7 +26,6 @@
package com.phonegap.websocket;
import java.net.URI;
-import java.net.URISyntaxException;
import java.util.Random;
import android.webkit.WebView;
@@ -53,14 +52,25 @@ public WebSocketFactory(WebView appView) {
this.appView = appView;
}
- public WebSocket getInstance(String url) throws URISyntaxException {
+ public WebSocket getInstance(String url) {
+ // use Draft75 by default
return getInstance(url, WebSocket.Draft.DRAFT75);
}
- public WebSocket getInstance(String url, WebSocket.Draft draft) throws URISyntaxException {
- WebSocket socket = new WebSocket(appView, new URI(url), draft, getRandonUniqueId());
- socket.connect();
- return socket;
+ public WebSocket getInstance(String url, WebSocket.Draft draft) {
+ WebSocket socket = null;
+ Thread th = null;
+ try {
+ socket = new WebSocket(appView, new URI(url), draft, getRandonUniqueId());
+ th = socket.connect();
+ return socket;
+ } catch (Exception e) {
+ //Log.v("websocket", e.toString());
+ if(th != null) {
+ th.interrupt();
+ }
+ }
+ return null;
}
/**

0 comments on commit 9270d13

Please sign in to comment.