001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.wma;
028:
029: import com.sun.midp.io.j2me.push.ProtocolPush;
030: import java.io.IOException;
031: import java.io.InterruptedIOException;
032: import javax.microedition.io.ConnectionNotFoundException;
033: import com.sun.midp.security.Permissions;
034: import com.sun.midp.midlet.MIDletSuite;
035:
036: /**
037: * Implementation of push behaviour.
038: */
039: public class ProtocolPushImpl extends ProtocolPush {
040:
041: /** Instance */
042: private static ProtocolPushImpl pushInstance;
043:
044: /**
045: * Get instance of this class.
046: * @return class instance
047: */
048: protected ProtocolPush getInstance() {
049: if (pushInstance == null) {
050: pushInstance = new ProtocolPushImpl();
051: }
052: return (ProtocolPush) pushInstance;
053: }
054:
055: /**
056: * Called when registration is checked.
057: * @param connection generic connection <em>protocol</em>, <em>host</em>
058: * and <em>port number</em>
059: * (optional parameters may be included
060: * separated with semi-colons (;))
061: * @param midlet class name of the <code>MIDlet</code> to be launched,
062: * when new external data is available
063: * @param filter a connection URL string indicating which senders
064: * are allowed to cause the MIDlet to be launched
065: * @exception IllegalArgumentException if the connection string is not
066: * valid
067: * @exception ClassNotFoundException if the <code>MIDlet</code> class
068: * name can not be found in the current
069: * <code>MIDlet</code> suite
070: */
071: public void checkRegistration(String connection, String midlet,
072: String filter) {
073: // for cbs: protocol, the filter is ignored
074: if (connection.startsWith("cbs://")) {
075: return;
076: }
077:
078: if (filter == null || filter.length() == 0) {
079: throw new IllegalArgumentException("NULL of empty filter");
080: }
081:
082: /*
083: * for sms: the filter is compared against MSISDN field of the push message
084: *
085: * msisdn ::== "+" digits | digits
086: * digit ::== "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
087: * digits ::== digit | digit digits
088: *
089: * '*' and '?' are allowed according to the MIDP spec.
090: */
091: for (int i = (filter.charAt(0) == '+') ? 1 : 0; i < filter
092: .length(); i++) {
093: char ch = filter.charAt(i);
094: if ((ch >= '0' && ch <= '9') || ch == '*' || ch == '?') {
095: continue;
096: }
097: throw new IllegalArgumentException("Invalid filter: "
098: + filter);
099: }
100:
101: }
102:
103: /**
104: * Called when registration is established.
105: * @param midletSuite MIDlet suite for the suite registering,
106: * the suite only has to implement isRegistered,
107: * checkForPermission, and getID.
108: * @param connection generic connection <em>protocol</em>, <em>host</em>
109: * and <em>port number</em>
110: * (optional parameters may be included
111: * separated with semi-colons (;))
112: * @param midlet class name of the <code>MIDlet</code> to be launched,
113: * when new external data is available
114: * @param filter a connection URL string indicating which senders
115: * are allowed to cause the MIDlet to be launched
116: * @exception IllegalArgumentException if the connection string is not
117: * valid
118: * @exception IOException if the connection is already
119: * registered or if there are insufficient resources
120: * to handle the registration request
121: * @exception ClassNotFoundException if the <code>MIDlet</code> class
122: * name can not be found in the current
123: * <code>MIDlet</code> suite
124: */
125: public void registerConnection(MIDletSuite midletSuite,
126: String connection, String midlet, String filter)
127: throws IllegalArgumentException, IOException,
128: ClassNotFoundException {
129:
130: checkIsNotHost(connection, false);
131:
132: if (connection.startsWith("sms://")) {
133: try {
134: Class.forName("com.sun.midp.io.j2me.sms.Protocol");
135: } catch (ClassNotFoundException e) {
136: throw new ConnectionNotFoundException(
137: "Connection not supported");
138: }
139:
140: /*
141: * Check the suite permission for the connection
142: * and close the connection immediately.
143: */
144: try {
145: midletSuite.checkForPermission(Permissions.SMS_SERVER,
146: connection);
147: } catch (InterruptedException ie) {
148: throw new InterruptedIOException(
149: "Interrupted while trying to ask the user permission");
150: }
151: } else if (connection.startsWith("cbs://")) {
152: try {
153: Class.forName("com.sun.midp.io.j2me.cbs.Protocol");
154: } catch (ClassNotFoundException e) {
155: throw new ConnectionNotFoundException(
156: "Connection not supported");
157: }
158:
159: try {
160: midletSuite.checkForPermission(Permissions.CBS_SERVER,
161: connection);
162: } catch (InterruptedException ie) {
163: throw new InterruptedIOException(
164: "Interrupted while trying to ask the user permission");
165: }
166: }
167: }
168: }
|