blob: 2ecf94ad3d60e07725f1e2ae80005304c84b77ce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1997, 2008 by ProSyst Software GmbH
* http://www.prosyst.com
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ProSyst Software GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.io.impl;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import javax.microedition.io.Connection;
import org.eclipse.equinox.internal.io.ConnectionListener;
import org.eclipse.equinox.internal.io.ConnectionNotifier;
/**
* @author Pavlin Dobrev
* @version 1.0
*/
class ConnectionNotifierImpl implements ConnectionNotifier, Connection {
private Vector list;
String scheme;
int mode;
boolean timeouts;
String url;
String filter;
boolean notified = false;
Object context;
ConnectionNotifierImpl(String scheme, String url, int mode, boolean timeouts, String filter) {
list = new Vector(3, 5);
this.scheme = scheme;
this.url = url;
this.mode = mode;
this.timeouts = timeouts;
this.filter = filter;
SecurityManager sm = System.getSecurityManager();
if (sm != null)
context = System.getSecurityManager().getSecurityContext();
}
public void addConnectionListener(ConnectionListener l) {
long timeStart = 0;
if (ConnectorServiceImpl.hasDebug) {
ConnectorServiceImpl.debug(16050, l.getClass().getName(), null);
timeStart = System.currentTimeMillis();
}
try {
synchronized (list) {
if (!notified) {
if (!list.contains(l))
list.addElement(l);
return;
}
}
Connection c = ConnectorServiceImpl.getConnection(filter, url, mode, timeouts, false);
if (c != null)
l.notify(url, ConnectionListener.CONNECTION_CREATED, c);
} catch (Exception exc) {
} finally {
if (ConnectorServiceImpl.hasDebug) {
ConnectorServiceImpl.debug(16051, String.valueOf(System.currentTimeMillis() - timeStart), null);
}
}
}
public void removeConnectionListener(ConnectionListener l) {
if (ConnectorServiceImpl.hasDebug) {
ConnectorServiceImpl.debug(16052, l.getClass().getName(), null);
}
list.removeElement(l);
}
boolean hasListeners() {
return !list.isEmpty();
}
void notifyCreated(Connection conn) {
notify(ConnectionListener.CONNECTION_CREATED, conn);
}
private void notify(int eventType, Connection conn) {
if (eventType != ConnectionListener.CONNECTION_CREATED && eventType != ConnectionListener.CONNECTION_CLOSED) {
return;
}
synchronized (list) {
if (notified)
return;
notified = true;
}
ConnectionFactoryListener.removeConnectionNotifier(url);
for (Enumeration en = list.elements(); en.hasMoreElements();) {
ConnectionListener l = (ConnectionListener) en.nextElement();
l.notify(url, eventType, conn);
}
}
public void close() throws IOException {
if (ConnectorServiceImpl.hasDebug) {
ConnectorServiceImpl.debug(16053, url, null);
}
synchronized (list) {
if (notified)
return;
notified = true;
}
ConnectionFactoryListener.removeConnectionNotifier(url);
}
}