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; + } + }