platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java in rhodes-3.0.2 vs platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java in rhodes-3.1.0.beta.1
- old
+ new
@@ -1,5 +1,31 @@
+/*------------------------------------------------------------------------
+* (The MIT License)
+*
+* Copyright (c) 2008-2011 Rhomobile, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+* THE SOFTWARE.
+*
+* http://rhomobile.com
+*------------------------------------------------------------------------*/
+
package com.rhomobile.rhodes.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -23,12 +49,15 @@
private static final String TAG = "SSLImplJava";
private static SSLSocketFactory factory = null;
private SSLSocket sock;
- private int sockfd;
-
+
+ //Used from jni
+ @SuppressWarnings("unused")
+ private int sockfd;
+
private InputStream is;
private OutputStream os;
public native RhoSockAddr getRemoteSockAddr(int sockfd);
@@ -70,64 +99,90 @@
return factory;
}
public boolean connect(int fd, boolean sslVerifyPeer) {
try {
- sockfd = fd;
- RhoSockAddr remote = getRemoteSockAddr(sockfd);
- Socket s = new RhoSocket(sockfd, remote);
- SSLSocketFactory f = getFactory(sslVerifyPeer);
- sock = (SSLSocket)f.createSocket(s, remote.host.toString(), remote.port, true);
- sock.setUseClientMode(true);
- os = sock.getOutputStream();
- is = sock.getInputStream();
- return true;
+ RhoSockAddr remote = getRemoteSockAddr(fd);
+ Socket s = new RhoSocket(fd, remote);
+ SSLSocketFactory f = getFactory(sslVerifyPeer);
+
+ SSLSocket aSock = (SSLSocket)f.createSocket(s, remote.host.toString(), remote.port, true);
+ aSock.setUseClientMode(true);
+
+ synchronized (this) {
+ sock = aSock;
+ os = sock.getOutputStream();
+ is = sock.getInputStream();
+ sockfd = fd;
+ }
+ return true;
}
catch (Exception e) {
reportFail("connect", e);
e.printStackTrace();
return false;
}
}
public void shutdown() {
try {
- if (sock != null)
- sock.close();
+ if (sock != null) {
+ synchronized (this) {
+ if (sock != null) {
+ sock.close();
+ sock = null;
+ os = null;
+ is = null;
+
+ //TODO: check file descriptor is closed gracefully
+ sockfd = -1;
+ }
+ }
+ }
}
- catch (IOException e) {
- Logger.I(TAG, "shutdown fails: IOException: " + e.getMessage());
- }
catch (Exception e) {
reportFail("shutdown", e);
}
}
public boolean send(byte[] data) {
try {
- if (os == null)
- return false;
- os.write(data);
- return true;
+ if (os != null) {
+ OutputStream aOs = null;
+ synchronized (this) {
+ if (os != null)
+ aOs = os;
+ }
+ if (aOs != null) {
+ aOs.write(data);
+ return true;
+ }
+ }
}
catch (Exception e) {
reportFail("send", e);
- return false;
}
+ return false;
}
public int recv(byte[] data) {
try {
- if (is == null)
- return -1;
-
- int size = data.length;
- int n = is.read(data, 0, size);
- return n;
+ if (is != null) {
+ InputStream aIs = null;
+ synchronized (this) {
+ if (is != null)
+ aIs = is;
+ }
+ if (aIs != null) {
+ int size = data.length;
+ int n = is.read(data, 0, size);
+ return n;
+ }
+ }
}
catch (Exception e) {
reportFail("recv", e);
- return -1;
}
- }
-
+ return -1;
+ }
+
}