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 javax.microedition.content;
028:
029: import javax.microedition.content.ContentHandlerServer;
030: import javax.microedition.content.ActionNameMap;
031: import javax.microedition.content.Invocation;
032: import javax.microedition.content.RequestListener;
033:
034: import com.sun.midp.content.ContentHandlerImpl;
035: import com.sun.midp.content.InvocationImpl;
036:
037: import java.io.EOFException;
038: import java.io.IOException;
039: import java.io.DataInputStream;
040: import java.io.DataOutputStream;
041:
042: /**
043: * The internal structure of a registered content handler.
044: */
045: final class ContentHandlerServerImpl extends ContentHandlerImpl
046: implements ContentHandlerServer {
047:
048: /** The listener to notify. */
049: private RequestListener listener;
050:
051: /**
052: * Construct an empty ContentHandlerServerImpl
053: * that has the same fields as the existing handler.
054: * @param handler the ContentHandlerImpl to clone
055: */
056: ContentHandlerServerImpl(ContentHandlerImpl handler) {
057: super (handler);
058: }
059:
060: /**
061: * Gets the next Invocation request pending for this
062: * ContentHandlerServer.
063: * The method can be unblocked with a call to
064: * {@link #cancelGetRequest cancelGetRequest}.
065: * The application should process the Invocation as
066: * a request to perform the <code>action</code> on the content.
067: *
068: * @param wait <code>true</code> if the method must wait for
069: * for an Invocation if one is not available;
070: * <code>false</code> if the method MUST NOT wait.
071: *
072: * @return the next pending Invocation or <code>null</code>
073: * if no Invocation is available; <code>null</code>
074: * if cancelled with {@link #cancelGetRequest cancelGetRequest}
075: * @see javax.microedition.content.Registry#invoke
076: * @see javax.microedition.content.ContentHandlerServer#finish
077: */
078: public Invocation getRequest(boolean wait) {
079: Invocation request = new Invocation((InvocationImpl) null);
080: InvocationImpl invoc = super .getRequest(wait, request);
081: if (invoc != null) {
082: // Wrap it in an Invocation instance
083: request.setInvocImpl(invoc);
084: return request;
085: }
086: return null;
087: }
088:
089: /**
090: * Finish this Invocation and set the status for the response.
091: * The <code>finish</code> method may only be called when this
092: * Invocation
093: * has a status of <code>ACTIVE</code> or <code>HOLD</code>.
094: * <p>
095: * The content handler may modify the URL, type, action, or
096: * arguments before invoking <code>finish</code>.
097: * If the method {@link Invocation#getResponseRequired} returns
098: * <code>true</code> then the modified
099: * values MUST be returned to the invoking application.
100: *
101: * @param invoc the Invocation to finish
102: * @param status the new status of the Invocation. This MUST be either
103: * <code>OK</code> or <code>CANCELLED</code>.
104: *
105: * @return <code>true</code> if the MIDlet suite MUST
106: * voluntarily exit before the response can be returned to the
107: * invoking application
108: *
109: * @exception IllegalArgumentException if the new
110: * <code>status</code> of the Invocation
111: * is not <code>OK</code> or <code>CANCELLED</code>
112: * @exception IllegalStateException if the current
113: * <code>status</code> of the
114: * Invocation is not <code>ACTIVE</code> or <code>HOLD</code>
115: * @exception NullPointerException if the invocation is <code>null</code>
116: */
117: public boolean finish(Invocation invoc, int status) {
118: return finish(invoc.getInvocImpl(), status);
119: }
120:
121: /**
122: * Set the listener to be notified when a new request is
123: * available for this content handler. The request MUST
124: * be retrieved using {@link #getRequest}.
125: *
126: * @param listener the listener to register;
127: * <code>null</code> to remove the listener.
128: */
129: public void setListener(RequestListener listener) {
130: // Start/set the thread needed to monitor the InvocationStore
131: this .listener = listener;
132: super .setListener(listener);
133: }
134:
135: /**
136: * Notify the listener of a pending Request.
137: */
138: protected void requestNotify() {
139: RequestListener l = listener;
140: if (l != null) {
141: l.invocationRequestNotify(this);
142: }
143: }
144:
145: }
|