systemservicerequestprotocolams.java
来自「This is a resource based on j2me embedde」· Java 代码 · 共 243 行
JAVA
243 行
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * 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 version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package com.sun.midp.services;import com.sun.midp.links.*;import java.io.*;final class SystemServiceRequestProtocolAMS { final static int SERVICE_REQUEST_STATUS_OK = 0; final static int SERVICE_REQUEST_STATUS_ERROR = 1; private final static int INVALID_STATE = -1; private final static int WAIT_FOR_BEGIN_SESSION_STATE = 1; private final static int WAIT_FOR_SERVICE_ID_STATE = 2; private final static int SEND_SERVICE_REQUEST_STATUS_STATE = 3; private final static int SEND_SERVICE_TO_CLIENT_LINK_STATE = 4; private final static int SEND_CLIENT_TO_SERVICE_LINK_STATE = 5; private final static int WAIT_FOR_LINKS_RECEIVED_ACK_STATE = 6; private final static int WAIT_FOR_END_SESSION_STATE = 7; private final static int END_SESSION_STATE = 8; private final static int END_STATE = 9; private SystemServiceRequestListener requestListener; private int state = INVALID_STATE; SystemServiceRequestProtocolAMS( SystemServiceRequestListener requestListener) { /** * Argument sanity check */ if (requestListener == null) { throw new NullPointerException(); } this.requestListener = requestListener; } SystemServiceConnectionLinks handleServiceRequest( SystemServiceConnectionLinks sendReceiveLinks) throws ClosedLinkException, InterruptedIOException, IOException { Link sendLink = sendReceiveLinks.getSendLink(); Link receiveLink = sendReceiveLinks.getReceiveLink(); /** * Arguments sanity checks */ if (sendLink == null || receiveLink == null) { throw new NullPointerException(); } if (!sendLink.isOpen() || !receiveLink.isOpen()) { throw new IllegalStateException(); } SystemServiceConnectionLinks connectionLinks = null; state = WAIT_FOR_BEGIN_SESSION_STATE; try { connectionLinks = doHandleServiceRequest(sendLink, receiveLink); } finally { state = INVALID_STATE; } return connectionLinks; } private SystemServiceConnectionLinks doHandleServiceRequest( Link sendLink, Link receiveLink) throws ClosedLinkException, InterruptedIOException, IOException { String serviceID = ""; SystemServiceConnectionLinks connectionLinks = null; if (state == INVALID_STATE) { throw new IllegalStateException(); } while (state != END_STATE) { switch (state) { case WAIT_FOR_BEGIN_SESSION_STATE: { // wait for session begin request LinkMessage msg = receiveLink.receive(); String str = msg.extractString(); // check request validity if (!str.equals( SystemServiceRequestProtocolClient.START_SESSION_STR)) { throw new IllegalStateException(); } // advance to next state state = WAIT_FOR_SERVICE_ID_STATE; break; } case WAIT_FOR_SERVICE_ID_STATE: { // wait for service id LinkMessage msg = receiveLink.receive(); serviceID = msg.extractString(); // advance to next state state = SEND_SERVICE_REQUEST_STATUS_STATE; break; } case SEND_SERVICE_REQUEST_STATUS_STATE: { // try to obtain connection to service int status = SERVICE_REQUEST_STATUS_OK; try { connectionLinks = null; connectionLinks = requestListener.onServiceRequest(serviceID); } finally { if (connectionLinks == null) { status = SERVICE_REQUEST_STATUS_ERROR; } // send status ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream os = new DataOutputStream(bos); os.writeInt(status); byte[] data = bos.toByteArray(); LinkMessage msg = LinkMessage.newDataMessage(data); sendLink.send(msg); // advance to next state if (status == SERVICE_REQUEST_STATUS_OK) { state = SEND_SERVICE_TO_CLIENT_LINK_STATE; } else { state = END_STATE; } } break; } case SEND_SERVICE_TO_CLIENT_LINK_STATE: { // send service to client link Link link = connectionLinks.getSendLink(); LinkMessage msg = LinkMessage.newLinkMessage(link); sendLink.send(msg); // advance to next state state = SEND_CLIENT_TO_SERVICE_LINK_STATE; break; } case SEND_CLIENT_TO_SERVICE_LINK_STATE: { // send client to service link Link link = connectionLinks.getReceiveLink(); LinkMessage msg = LinkMessage.newLinkMessage(link); sendLink.send(msg); // advance to next state state = WAIT_FOR_LINKS_RECEIVED_ACK_STATE; break; } case WAIT_FOR_LINKS_RECEIVED_ACK_STATE: { // wait for links recieved ack LinkMessage msg = receiveLink.receive(); String str = msg.extractString(); // check request validity if (!str.equals(SystemServiceRequestProtocolClient. LINKS_RECEIVED_ACK_STR)) { throw new IllegalStateException(); } // notify listener about connection passed to client if (connectionLinks != null) { requestListener.onLinksPassedToClient(connectionLinks); } // advance to next state state = WAIT_FOR_END_SESSION_STATE; break; } case WAIT_FOR_END_SESSION_STATE: { // wait for session end request LinkMessage msg = receiveLink.receive(); String str = msg.extractString(); // check request validity if (!str.equals( SystemServiceRequestProtocolClient.END_SESSION_STR)) { throw new IllegalStateException(); } // advance to next state state = END_SESSION_STATE; break; } case END_SESSION_STATE: { // advance to next state state = END_STATE; break; } } } state = INVALID_STATE; return connectionLinks; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?