001: /*
002: * Portions Copyright 2000-2007 Sun Microsystems, Inc. All Rights
003: * Reserved. Use is subject to license terms.
004: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU General Public License version
008: * 2 only, as published by the Free Software Foundation.
009: *
010: * This program is distributed in the hope that it will be useful, but
011: * WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * General Public License version 2 for more details (a copy is
014: * included at /legal/license.txt).
015: *
016: * You should have received a copy of the GNU General Public License
017: * version 2 along with this work; if not, write to the Free Software
018: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
019: * 02110-1301 USA
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
022: * Clara, CA 95054 or visit www.sun.com if you need additional
023: * information or have any questions.
024: */
025: /*
026: * RefreshManager.java
027: *
028: * Created on Apr 8, 2004
029: *
030: */
031: package gov.nist.microedition.sip;
032:
033: import gov.nist.siplite.message.Request;
034:
035: import java.util.Hashtable;
036: import java.util.Timer;
037:
038: import javax.microedition.sip.SipClientConnection;
039: import javax.microedition.sip.SipConnectionNotifier;
040: import javax.microedition.sip.SipRefreshListener;
041:
042: import com.sun.midp.log.Logging;
043: import com.sun.midp.log.LogChannels;
044:
045: /**
046: * Refresh manager.
047: *
048: * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
049: */
050: public class RefreshManager {
051: /**
052: * The unique instance of this class.
053: */
054: private static RefreshManager instance = null;
055: /**
056: * The hashtable keeping a mapping between the refreshID and
057: * the refresh Tasks.
058: */
059: private Hashtable refreshTable = null;
060: /**
061: * generator of task id .
062: */
063: private int idGenerator = 0;
064:
065: /**
066: * Creates a new instance of the RefreshManager.
067: */
068: private RefreshManager() {
069: refreshTable = new Hashtable();
070: }
071:
072: /**
073: * Returns the instance of RefreshManager.
074: * @return the instance of RefreshManager singleton
075: */
076: public static synchronized RefreshManager getInstance() {
077: if (instance == null)
078: instance = new RefreshManager();
079: return instance;
080: }
081:
082: /**
083: * Creates a new RefreshTask with a specific id, schedules it and
084: * keep the mapping between this newly created task and the id.
085: * @param request for which a refresh task must be created
086: * @param sipConnectionNotifier used to send
087: * the request
088: * @param sipRefreshListener the callback interface used listening for
089: * refresh event on this task
090: * @param sipClientConnection the connection to update
091: * @return the id of the newly created task
092: */
093: public int createRefreshTask(Request request,
094: SipConnectionNotifier sipConnectionNotifier,
095: SipRefreshListener sipRefreshListener,
096: SipClientConnection sipClientConnection) {
097: int taskId = ++idGenerator;
098: RefreshTask refreshTask = new RefreshTask(String
099: .valueOf(taskId), request, sipConnectionNotifier,
100: sipRefreshListener, sipClientConnection);
101: refreshTable.put(String.valueOf(taskId), refreshTask);
102: return taskId;
103: }
104:
105: /**
106: * Schedules the task whose id is given in parameter for the expires
107: * @param taskId - the id of the task to schedule
108: * @param expires - the expires time,so the delay until when the stack must
109: * schedule the task. If it is -1, it means that the expires has
110: * already been given when the task was created.
111: */
112: public void scheduleTask(String taskId, int expires) {
113: if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
114: Logging
115: .report(Logging.INFORMATION, LogChannels.LC_JSR180,
116: "schedule the next register in " + expires
117: + " sec");
118: }
119:
120: RefreshTask refreshTask = (RefreshTask) refreshTable
121: .get(taskId);
122: if (refreshTask == null)
123: return;
124: if (expires == -1)
125: return;
126: if (expires >= 0) {
127: // The timer to shcedule the tasks
128: Timer timer = new Timer();
129: // Once the task has been processed, it can be scheduled again
130: // so a new one is created
131: refreshTask = new RefreshTask(refreshTask.getTaskId(),
132: refreshTask.getRequest(), refreshTask
133: .getSipConnectionNotifier(), refreshTask
134: .getSipRefreshListener(), refreshTask
135: .getSipClientConnection());
136: refreshTable.put(taskId, refreshTask);
137: timer.schedule(refreshTask, expires * 1000);
138: }
139: }
140:
141: /**
142: * Return the task mapping the taskId
143: * @param taskId - the id of the task to retrieve
144: * @return the Refresh task mapping the taskId
145: */
146: public RefreshTask getTask(String taskId) {
147: return (RefreshTask) refreshTable.get(taskId);
148: }
149:
150: /**
151: * Removes a task
152: * @param taskId - the task id of the task to remove
153: */
154: public void removeTask(String taskId) {
155: refreshTable.remove(taskId);
156: }
157: }
|