javacommons/gcfprotocols/socket/socket/javasrc.s60/com/nokia/mj/impl/gcf/protocol/socket/Protocol.java
changeset 26 dc7c549001d5
child 64 0ea12c182930
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/gcfprotocols/socket/socket/javasrc.s60/com/nokia/mj/impl/gcf/protocol/socket/Protocol.java	Thu May 27 12:49:31 2010 +0300
@@ -0,0 +1,207 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.mj.impl.gcf.protocol.socket;
+
+import java.io.IOException;
+import com.nokia.mj.impl.rt.support.Jvm;
+import com.nokia.mj.impl.gcf.utils.*;
+import com.nokia.mj.impl.socket.SocketConnectionImpl;
+import com.nokia.mj.impl.socket.ServerSocketConnectionImpl;
+import com.nokia.mj.impl.rt.support.ApplicationUtils;
+import com.nokia.mj.impl.gcf.utils.UrlParser;
+import com.nokia.mj.impl.utils.Logger;
+import com.nokia.mj.impl.connectionmanager.ConnectionManager;
+import com.nokia.mj.impl.connectionmanager.AccessPoint;
+import com.nokia.mj.impl.rt.support.ApplicationInfo;
+import com.nokia.mj.impl.utils.Uid;
+
+/*
+ * Implementation of Connector class of GCF framework The protocol class is the
+ * entry point for connection types When connector.open is called, the VM finds
+ * the com.nokia.mj.impl.gcf.protocol."scheme".Protocol class which implements
+ * openConnection method which is called by the Vm.
+ */
+
+public class Protocol
+{
+
+    static
+    {
+        try
+        {
+            Jvm.loadSystemLibrary("javasocket");
+        }
+        catch (Exception e)
+        {
+            Logger.ELOG(Logger.ESOCKET, e.toString());
+        }
+    }
+
+    public Protocol()
+    {
+
+    }
+
+    public javax.microedition.io.Connection openConnection(String aUri,
+            int aMode, boolean aTimeouts) throws IOException
+    {
+
+        String apnstring = null;
+        String urls = null;
+        int apnid = -1;
+        int index = -1;
+        String fullurl = "socket:" + aUri;
+        ConnectionManager cminstance = null;
+        AccessPoint apn = null;
+        index = aUri.indexOf(";nokia_netid=");
+        if (index != -1)
+        {
+            apnstring = aUri.substring(index);
+            int equalindex = apnstring.indexOf('=');
+            if (equalindex != -1)
+            {
+                String temp = apnstring.substring(equalindex + 1);
+                try
+                {
+                    apnid = Integer.parseInt(temp);
+                }
+                catch (NumberFormatException e)
+                {
+                    throw new IllegalArgumentException("Invalid URL: "
+                                                       + fullurl);
+                }
+            }
+            else
+            {
+                throw new IllegalArgumentException("Invalid URL: " + fullurl);
+            }
+            urls = aUri.substring(0, index);
+        }
+        else
+        {
+            index = aUri.indexOf(";nokia_apnid=");
+            if (index != -1)
+            {
+                apnstring = aUri.substring(index);
+                int equalindex = apnstring.indexOf('=');
+                if (equalindex != -1)
+                {
+                    String temp = apnstring.substring(equalindex + 1);
+                    try
+                    {
+                        apnid = Integer.parseInt(temp);
+                    }
+                    catch (NumberFormatException e)
+                    {
+                        throw new IllegalArgumentException("Invalid URL: "
+                                                           + fullurl);
+                    }
+                }
+                else
+                {
+                    throw new IllegalArgumentException("Invalid URL: "
+                                                       + fullurl);
+                }
+                urls = aUri.substring(0, index);
+            }
+            else
+            {
+                urls = aUri;
+            }
+        }
+        Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                   "socket +openConnection -after removing nokia_apnid : " + urls);
+
+        UrlParser SocURL = new UrlParser("socket", urls);
+        Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                   "socket - protocol class : port = " + SocURL.port);
+        if (SocURL.getPort() == 8080 || SocURL.getPort() == 443
+                || SocURL.getPort() == 80)
+        {
+            if (ApplicationInfo.getInstance().getRuntimeType().equals(
+                        ApplicationInfo.RUNTIME_MIDP) == true)
+            {
+                if ((ApplicationInfo.getInstance().getProtectionDomain()
+                        .equals(ApplicationInfo.UNIDENTIFIED_THIRD_PARTY_DOMAIN)) == true)
+                {
+                    Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                               "Throwing security exception for restricted port");
+                    throw new SecurityException("Unable to open socket connection: port "+SocURL.getPort()+" is restricted");
+                }
+            }
+        }
+        if (SocURL.host == null)
+        {
+            Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                       "socket - protocol class : server connection");
+            ApplicationUtils appUtils = ApplicationUtils.getInstance();
+            SocketPermissionImpl per = new SocketPermissionImpl("socket://");
+            appUtils.checkPermission(per);
+            /* security related stuff */
+            Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                       "socket - protocol class : after security check");
+            return new ServerSocketConnectionImpl(SocURL, aMode);
+        }
+        else
+        {
+            Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                       "socket - protocol class : client connection");
+            if (SocURL.port == -1)
+            {
+                /* client connecction should have a port number */
+                throw new IllegalArgumentException("Invalid URL: " + fullurl);
+            }
+            ApplicationUtils appUtils = ApplicationUtils.getInstance();
+            SocketPermissionImpl per = new SocketPermissionImpl("socket://*");
+            appUtils.checkPermission(per);
+            /* security related stuff */
+            Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                       "socket - protocol class : after security check");
+
+            // remove comments if open c patch available
+            cminstance = ConnectionManager.getInstance();
+            Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                       "after getting ConnectionManager instance");
+            // get application suite uid
+            try
+            {
+                Uid appSuite = ApplicationInfo.getInstance().getSuiteUid();
+                try
+                {
+                    // remove comments if open c patch available
+                    apn = cminstance.getNetworkAccessPoint(appSuite, aUri);
+                }
+                catch (Exception e)
+                {
+                    Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                               "+secureconnection Protocol getNetworkAccessPoint threw Exception");
+                }
+                Logger.LOG(Logger.ESOCKET, Logger.EInfo, "apn.getType = "
+                           + apn.getType() + " apn.getNapId= " + apn.getNapId());
+            }
+            catch (Exception e)
+            {
+                Logger.LOG(Logger.ESOCKET, Logger.EInfo,
+                           "getSuiteUid exception ");
+            }
+
+            return new SocketConnectionImpl(SocURL, aMode, -1, cminstance, apn);
+        }
+    }
+}