connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/registry/Registry.java
changeset 711 d97b8b6bce37
parent 708 ff775c1d2316
child 718 72c9852d35bb
--- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/registry/Registry.java	Fri Dec 18 10:19:18 2009 -0600
+++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/registry/Registry.java	Fri Dec 18 10:44:27 2009 -0600
@@ -44,6 +44,7 @@
 
 import com.nokia.carbide.remoteconnections.Messages;
 import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.AbstractConnection.ConnectionStatus;
 import com.nokia.carbide.remoteconnections.interfaces.IClientServiceSiteUI;
 import com.nokia.carbide.remoteconnections.interfaces.IConnectedService;
 import com.nokia.carbide.remoteconnections.interfaces.IConnectedServiceFactory;
@@ -54,6 +55,10 @@
 import com.nokia.carbide.remoteconnections.interfaces.IExtensionFilter;
 import com.nokia.carbide.remoteconnections.interfaces.IService;
 import com.nokia.carbide.remoteconnections.internal.api.IConnection2;
+import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatus;
+import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatus.EConnectionStatus;
+import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatusChangedListener;
+import com.nokia.carbide.remoteconnections.internal.ui.ConnectionUIUtils;
 import com.nokia.carbide.remoteconnections.ui.ClientServiceSiteUI;
 import com.nokia.cpp.internal.api.utils.core.Check;
 import com.nokia.cpp.internal.api.utils.core.ListenerList;
@@ -83,6 +88,7 @@
 	private List<IConnectedServiceFactory> connectedServiceFactories;
 	private ListenerList<IConnectionListener> connectionListeners;
 	private IConnection defaultConnection;
+	private Map<IConnection, IConnectionStatusChangedListener> connectionListenerMap;
 
 	public static Registry instance() {
 		return instance;
@@ -91,6 +97,7 @@
 	private Registry() {
 		// private because is singleton
 		connectionToConnectedServices = new HashMap<IConnection, List<IConnectedService>>();
+		connectionListenerMap = new HashMap<IConnection, IConnectionStatusChangedListener>();
 	}
 
 	public void loadExtensions() {
@@ -530,17 +537,59 @@
 		return defaultConnection;
 	}
 
-	public void disconnect(IConnection2 connection) {
+	public void disconnect(final IConnection2 connection) {
+		if (!connection.isDynamic())
+			return;
 		
-		// TODO transition to disconnected state and wait:
-		// if not in-use, remove and stop waiting
-		// if reconnected, stop waiting
-		
+		// transition to disconnected state and wait:
+		// 	if not in-use, remove and stop waiting
+		// 	if reconnected, stop waiting
+		if (connection.getStatus().getEConnectionStatus().equals(EConnectionStatus.IN_USE)) {
+			IConnectionStatus status = new ConnectionStatus(EConnectionStatus.IN_USE_DISCONNECTED, 
+						"connection has been disconnected while in use, please reconnect");
+			connection.setStatus(status);
+			IConnectionStatusChangedListener listener = new IConnectionStatusChangedListener() {
+				public void statusChanged(IConnectionStatus status) {
+					if (notInUse(status)) {
+						IConnectionStatusChangedListener listener = 
+							connectionListenerMap.remove(connection);
+						connection.removeStatusChangedListener(listener);
+						removeConnection(connection);
+					}
+				}
+
+				private boolean notInUse(IConnectionStatus status) {
+					EConnectionStatus eStatus = status.getEConnectionStatus();
+					return !eStatus.equals(EConnectionStatus.IN_USE) &&
+						!eStatus.equals(EConnectionStatus.IN_USE_DISCONNECTED);
+				}
+			};
+			connectionListenerMap.put(connection, listener);
+			connection.addStatusChangedListener(listener);
+		}
 	}
 
 	public boolean reconnect(IConnection2 connection) {
-		// TODO if not removed, transition out of disconnected state
+		if (!connection.isDynamic())
+			return false;
+		
+		// if not removed, transition out of disconnected state 
 		// return not removed
+		IConnectionStatusChangedListener listener = connectionListenerMap.remove(connection);
+		if (listener != null)
+			connection.removeStatusChangedListener(listener);
+		if (connectionToConnectedServices.containsKey(connection)) {
+			IConnectionStatus status;
+			if (ConnectionUIUtils.isSomeServiceInUse(connection)) {
+				status = new ConnectionStatus(EConnectionStatus.IN_USE, 
+						Messages.getString("ConnectionsView.InUseDesc")); //$NON-NLS-1$
+			}
+			else {
+				status = new ConnectionStatus(EConnectionStatus.NOT_READY, ""); //$NON-NLS-1$
+			}
+			connection.setStatus(status);
+			return true;
+		}
 		return false;
 	}
 }
\ No newline at end of file