# HG changeset patch # User Chad Peckham # Date 1265926053 21600 # Node ID e90e6ea445290da6931e95b88fced6bb7f4905fb # Parent 949823a0e5df809f62ebd00dc467d9f989822684 PnP development for switching USB personalities. Bug 10604. diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/.classpath --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/.classpath Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/.classpath Thu Feb 11 16:07:33 2010 -0600 @@ -1,7 +1,7 @@ - + diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/.settings/.api_filters --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/.settings/.api_filters Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/.settings/.api_filters Thu Feb 11 16:07:33 2010 -0600 @@ -1,5 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8,6 +78,22 @@ + + + + + + + + + + + + + + + + @@ -16,4 +102,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/META-INF/MANIFEST.MF --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/META-INF/MANIFEST.MF Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/META-INF/MANIFEST.MF Thu Feb 11 16:07:33 2010 -0600 @@ -18,3 +18,5 @@ pccsPlugin.jar Export-Package: com.nokia.carbide.remoteconnections.discovery.pccs.agent, com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative +Import-Package: com.nokia.cpp.internal.api.utils.core, + com.nokia.cpp.internal.api.utils.ui diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/jna/src/src-full.zip Binary file connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/jna/src/src-full.zip has changed diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/Activator.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/Activator.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/Activator.java Thu Feb 11 16:07:33 2010 -0600 @@ -17,13 +17,17 @@ package com.nokia.carbide.remoteconnections.discovery.pccs; import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Plugin; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; +import com.nokia.cpp.internal.api.utils.core.Logging; + /** * The activator class controls the plug-in life cycle */ -public class Activator extends Plugin { +public class Activator extends AbstractUIPlugin { // The plug-in ID public static final String PLUGIN_ID = "com.nokia.carbide.remoteConnections.discovery.pccs"; //$NON-NLS-1$ @@ -85,4 +89,15 @@ return PCSuiteWikiLocation; } } + public static void logError(Throwable t) { + Logging.log(plugin, Logging.newSimpleStatus(0, t)); + } + + public static void logMessage(String message, int type) { + Logging.log(plugin, Logging.newStatus(plugin, type, message)); + } + + public static void setHelp(Control control, String id) { + PlatformUI.getWorkbench().getHelpSystem().setHelp(control, PLUGIN_ID + id); //$NON-NLS-1$ + } } diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/Messages.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/Messages.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/Messages.java Thu Feb 11 16:07:33 2010 -0600 @@ -25,12 +25,23 @@ public static String Activator_PCSuite_Location; public static String ConnAPILibrary_PCCS_Not_Found_Error; public static String ConnAPILibrary_PCSuite_Not_Found_Error; + public static String GUID_0; + public static String PCCSConnection_Bad_Personality_DontSwitch_Warning1; + public static String PCCSConnection_Bad_Personality_DontSwitch_Warning2; + public static String PCCSConnection_DontAsk_CheckText; + public static String PCCSConnection_Generic_Personality_Description; public static String PCCSConnection_PCCS_CONAOpenDM_Error; public static String PCCSConnection_PCCS_CONARegisterNotifyCallback_Error; public static String PCCSConnection_PCCS_CONARegisterNotifyCallback_Pointer_Error; public static String PCCSConnection_PCCS_Not_Enough_Memory_Error; public static String PCCSConnection_PCCS_Version_Error; public static String PCCSConnection_PCSuite_Version_Error; + public static String PCCSConnection_Personality_Switch_Error; + public static String PCCSConnection_Switch_Message_Title; + public static String PCCSConnection_Switch_Message1; + public static String PCCSConnection_Switch_Message3; + public static String PCCSConnection_Switch_Message4; + public static String PCCSConnection_Swtich_Message2; public static String PCCSDiscoveryAgent_PCCS_Not_Found_Error; public static String PCCSDiscoveryAgent_PCCS_Version_Error; public static String PCCSDiscoveryAgent_PCSuite_Not_Found_Error; diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/agent/PCCSDiscoveryAgent.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/agent/PCCSDiscoveryAgent.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/agent/PCCSDiscoveryAgent.java Thu Feb 11 16:07:33 2010 -0600 @@ -18,6 +18,7 @@ import java.net.MalformedURLException; import java.net.URL; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -26,8 +27,7 @@ import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator; import com.nokia.carbide.remoteconnections.discovery.pccs.Activator; import com.nokia.carbide.remoteconnections.discovery.pccs.Messages; -import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.DeviceConnectionInfo; -import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.DeviceInfo; +import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.DeviceConnection; import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.PCCSConnection; import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.PCCSConnection.DeviceEventListener; import com.nokia.carbide.remoteconnections.interfaces.IConnection; @@ -123,7 +123,7 @@ case DEVICE_REMOVED: case DEVICE_UPDATED_ADDEDCONNECTION: case DEVICE_UPDATED_REMOVEDCONNECTION: - updateConnections(pccsConnection.getDeviceList()); + updateConnections(pccsConnection.getGoodConnectionList()); break; case DEVICE_UPDATED_RENAMED: // TODO what to do when device is renamed? @@ -145,7 +145,7 @@ saveLoadStatus(ce); throw ce; // rethrow } - updateConnections(pccsConnection.getDeviceList()); + updateConnections(pccsConnection.getGoodConnectionList()); pccsConnection.addEventListenter(this); } @@ -186,86 +186,83 @@ } /** - * Creates a new PCCS USB connection - * @param deviceInfo - device information of the PCCS USB connection + * Creates a new PCCS connection + * @param deviceConn - device/connection information from PCCS */ - protected void createConnection(DeviceInfo deviceInfo, DeviceConnectionInfo connectionInfo) { - if (connections.get(deviceInfo) == null) { - // TODO: currently only handles USB - if (connectionInfo.media.equals("usb")) { //$NON-NLS-1$ - IConnectionType connectionType = - RemoteConnectionsActivator.getConnectionTypeProvider().getConnectionType(USB_CONNECTION_TYPE); - if (connectionType != null) { - IConnectionFactory factory = connectionType.getConnectionFactory(); - Map settings = factory.getSettingsFromUI(); - settings.put(PORT_SETTING, connectionInfo.comPort); - IConnection connection = factory.createConnection(settings); - if (connection instanceof IConnection2) { - IConnection2 connection2 = (IConnection2) connection; - connection2.setIdentifier(createUniqueId(deviceInfo)); - connection2.setDisplayName(deviceInfo.friendlyName); - connection2.setDynamic(true); - String key = getKey(deviceInfo, connectionInfo); - connections.put(key, connection2); - manager.addConnection(connection2); + protected void createConnection(DeviceConnection deviceConn) { + if (connections.get(getKey(deviceConn)) == null) { + // TODO: currently only handles USB & Serial + if (deviceConn.media.equals("usb")) { //$NON-NLS-1$ + if (deviceConn.mode.equals("serial")) { //$NON-NLS-1$ + IConnectionType connectionType = + RemoteConnectionsActivator.getConnectionTypeProvider().getConnectionType(USB_CONNECTION_TYPE); + if (connectionType != null) { + IConnectionFactory factory = connectionType.getConnectionFactory(); + Map settings = factory.getSettingsFromUI(); + settings.put(PORT_SETTING, deviceConn.port); + IConnection connection = factory.createConnection(settings); + if (connection instanceof IConnection2) { + IConnection2 connection2 = (IConnection2) connection; + connection2.setIdentifier(createUniqueId(deviceConn)); + connection2.setDisplayName(deviceConn.friendlyName); + connection2.setDynamic(true); + String key = getKey(deviceConn); + connections.put(key, connection2); + manager.addConnection(connection2); + } + else { + RemoteConnectionsActivator.log("Could not create dynamic serial connection", null); + } } else { - RemoteConnectionsActivator.log("Could not create dynamic serial connection", null); + RemoteConnectionsActivator.log("USB connection type extension not found", null); } } - else { - RemoteConnectionsActivator.log("USB connection type extension not found", null); - } } } } - private String createUniqueId(DeviceInfo deviceInfo) { - return getClass().getSimpleName() + ": " + deviceInfo.friendlyName; //$NON-NLS-1$ - } - /** - * Return a string key based on the device and connection information - * @param deviceInfo - device information - * @param connectionInfo - device connection information + * Create a unique ID based on this device/connection + * @param conn - device/connection information from PCCS * @return */ - protected String getKey(DeviceInfo deviceInfo, DeviceConnectionInfo connectionInfo) { - String key = deviceInfo.friendlyName + deviceInfo.serialNumber + connectionInfo.address; - return key; + private String createUniqueId(DeviceConnection conn) { + return getClass().getSimpleName() + ": " + conn.friendlyName; //$NON-NLS-1$ } /** - * Update existing PCCS USB connections - * @param deviceInfoList - list of device information for current PCCS USB connections + * Return a string key based on the device and connection information + * @param conn - device/connection information + * @return */ - protected void updateConnections(DeviceInfo[] deviceInfoList) { + protected String getKey(DeviceConnection conn) { + String key = conn.friendlyName + conn.serialNumber + conn.address; + return key; + } + /** + * Update existing PCCS connections + * @param connList - the Device/Connection list from PCCS + */ + protected void updateConnections(Collection connList) { disconnectAll(); - if (deviceInfoList != null) { + if (connList != null && !connList.isEmpty()) { if (connections.isEmpty()) { // no existing connections, so create new ones - for (DeviceInfo deviceInfo : deviceInfoList) { - for (DeviceConnectionInfo connectionInfo : deviceInfo.connections) { - createConnection(deviceInfo, connectionInfo); - } + for (DeviceConnection deviceConn : connList) { + createConnection(deviceConn); } } else { - for (DeviceInfo deviceInfo : deviceInfoList) { - for (DeviceConnectionInfo connectionInfo : deviceInfo.connections) { - String key = getKey(deviceInfo, connectionInfo); - IConnection2 connection = connections.get(key); - if (connection == null) { - // no existing connection for the device found, must be new connection - createConnection(deviceInfo, connectionInfo); - } - else { - // existing connection for the device found, try to reconnect - if (!manager.reconnect(connection)) { - // reconnect failed, probably because the connection is not in use - // so just create a new one - manager.addConnection(connection); - } + for (DeviceConnection deviceConn : connList) { + String key = getKey(deviceConn); + IConnection2 connection = connections.get(key); + if (connection == null) { + // no existing connection for the device found, must be new connection + createConnection(deviceConn); + } else { + if (!manager.reconnect(connection)) { + manager.addConnection(connection); } } } @@ -296,5 +293,4 @@ return loadStatus; } - } diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/messages.properties --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/messages.properties Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/messages.properties Thu Feb 11 16:07:33 2010 -0600 @@ -3,12 +3,23 @@ Activator_PCSuite_Location=http://s60wiki.nokia.com/S60Wiki/Device_Discovery ConnAPILibrary_PCCS_Not_Found_Error=Agent could not find a PC Connectivity Solution (PCCS) installation. For more information go to: ConnAPILibrary_PCSuite_Not_Found_Error=Agent could not find a PC Suite installation. To install PC Suite, go to: +GUID_0=Wrong array size \! +PCCSConnection_Bad_Personality_DontSwitch_Warning1=The "{0}" device is currently in "{1}" USB personality, which is not compatible with on-device debugging. +PCCSConnection_Bad_Personality_DontSwitch_Warning2=Switch to "{2}" personality in order to do debugging. +PCCSConnection_DontAsk_CheckText=Don't ask again +PCCSConnection_Generic_Personality_Description=Personality \#{0} PCCSConnection_PCCS_CONAOpenDM_Error=PCCS CONAOpenDM API returned error on initialization %x PCCSConnection_PCCS_CONARegisterNotifyCallback_Error=PCCS CONARegisterNotifyCallback API returned error %x PCCSConnection_PCCS_CONARegisterNotifyCallback_Pointer_Error=PCCS CONARegisterNotifyCallback API contained an invalid function pointer PCCSConnection_PCCS_Not_Enough_Memory_Error=Not enough memory to open the PCCS Device Management connection PCCSConnection_PCCS_Version_Error=The requested PC Connectivity Solution DMAPI version (3.4) is not installed on this machine. To install a later version go to: PCCSConnection_PCSuite_Version_Error=The current PC Suite intallation does not support the required level of API for this agent. To install a later version go to: +PCCSConnection_Personality_Switch_Error=Connected device "{0}" does not support getting/setting the USB personality from the current personality. +PCCSConnection_Switch_Message_Title=Switch Device USB Personality +PCCSConnection_Switch_Message1=The "{0}" device is currently in "{1}" USB personality, which is not compatible with on-device debugging. +PCCSConnection_Switch_Message3=Click Yes to switch to the latter personality and create a remote connection.\nClick No to leave the device in the current personality and +PCCSConnection_Switch_Message4=not create a connection.\n\nTo not see this reminder again, check the "Don''t ask again" box. +PCCSConnection_Swtich_Message2=This device supports the "{2}" debugging compatible personality.\n\n PCCSDiscoveryAgent_PCCS_Not_Found_Error=Agent could not find the PC Connectivity Solution (PCCS) installation. PCCSDiscoveryAgent_PCCS_Version_Error=Agent requires a later version of the PC Connectivity Solution (PCCS) installed. PCCSDiscoveryAgent_PCSuite_Not_Found_Error=Agent could not find a PC Suite installation. diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/APIHANDLE.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/APIHANDLE.java Thu Feb 11 16:07:33 2010 -0600 @@ -0,0 +1,61 @@ +/** +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; + +import com.sun.jna.FromNativeContext; +import com.sun.jna.Pointer; +import com.sun.jna.PointerType; + +/** + * Opaque API Handle used in most native APIs + * + */ +public class APIHANDLE extends PointerType { + // Constant value representing an invalid HANDLE. + public static APIHANDLE INVALID_HANDLE_VALUE = new APIHANDLE(Pointer.createConstant((long)-1)); + private boolean immutable; + + public APIHANDLE() { + } + + /** + * @param p + */ + public APIHANDLE(Pointer p) { + setPointer(p); + immutable = true; + } + + /** + * Override to the appropriate object for INVALID_HANDLE_VALUE. + */ + @Override + public Object fromNative(Object nativeValue, FromNativeContext context) { + Object o = super.fromNative(nativeValue, context); + if (INVALID_HANDLE_VALUE.equals(o)) + return INVALID_HANDLE_VALUE; + return o; + } + + @Override + public void setPointer(Pointer p) { + if (immutable) + throw new UnsupportedOperationException("immutable reference"); //$NON-NLS-1$ + super.setPointer(p); + } + +} diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/CONAPI_MEDIA.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/CONAPI_MEDIA.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/CONAPI_MEDIA.java Thu Feb 11 16:07:33 2010 -0600 @@ -16,6 +16,7 @@ */ package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; +import com.sun.jna.Pointer; import com.sun.jna.Structure; /** @@ -46,6 +47,9 @@ public CONAPI_MEDIA() { super(); } + public CONAPI_MEDIA(Pointer p) { + super(p); + } /** * @param dwSize Must be sizeof(CONAPI_MEDIA)
* @param dwMedia Media type
@@ -67,12 +71,29 @@ this.dwMediaData = dwMediaData; this.pstrID = pstrID; } - protected ByReference newByReference() { return new ByReference(); } - protected ByValue newByValue() { return new ByValue(); } - protected CONAPI_MEDIA newInstance() { return new CONAPI_MEDIA(); } + protected ByReference newByReference() { + ByReference s = new ByReference(); + s.useMemory(getPointer()); + write(); + s.read(); + return s; + } + protected ByValue newByValue() { + ByValue s = new ByValue(); + s.useMemory(getPointer()); + write(); + s.read(); + return s; + } + protected CONAPI_MEDIA newInstance() { + CONAPI_MEDIA s = new CONAPI_MEDIA(); + s.useMemory(getPointer()); + write(); + s.read(); + return s; + } public static CONAPI_MEDIA[] newArray(int arrayLength) { - return null; -// return com.ochafik.lang.jnaerator.runtime.Structure.newArray(CONAPI_MEDIA.class, arrayLength); + return (CONAPI_MEDIA[]) new CONAPI_MEDIA().toArray(arrayLength); } public static class ByReference extends CONAPI_MEDIA implements com.sun.jna.Structure.ByReference {} public static class ByValue extends CONAPI_MEDIA implements com.sun.jna.Structure.ByValue {} diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/CONAPI_MEDIA_INFO.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/CONAPI_MEDIA_INFO.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/CONAPI_MEDIA_INFO.java Thu Feb 11 16:07:33 2010 -0600 @@ -16,10 +16,7 @@ */ package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; -import com.sun.jna.NativeLong; -import com.sun.jna.Pointer; import com.sun.jna.Structure; -import com.sun.jna.TypeMapper; import com.sun.jna.ptr.ShortByReference; /** diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/ConnAPILibrary.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/ConnAPILibrary.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/ConnAPILibrary.java Thu Feb 11 16:07:33 2010 -0600 @@ -25,9 +25,9 @@ import com.nokia.carbide.remoteconnections.discovery.pccs.Activator; import com.nokia.carbide.remoteconnections.discovery.pccs.Messages; -import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.CONAPI_MEDIA.ByReference; +//import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.CONAPI_MEDIA.ByReference; import com.sun.jna.Native; -import com.sun.jna.Pointer; +import com.sun.jna.WString; import com.sun.jna.ptr.IntByReference; public class ConnAPILibrary implements IConnAPILibrary { @@ -66,6 +66,8 @@ } } + // these calls are here just to satisfy the interface + // the real calls are marshalled through jna to the native library public int CFAPI_Initialize(int dwAPIVersion, IntByReference pdwParam) { // TODO Auto-generated method stub return 0; @@ -76,7 +78,7 @@ return 0; } - public int CONACloseDM(DMHANDLE mHDMHandle) { + public int CONACloseDM(APIHANDLE mHDMHandle) { // TODO Auto-generated method stub return 0; } @@ -86,23 +88,23 @@ return 0; } - public int CONAGetDeviceCount(DMHANDLE hDMHandle, IntByReference pdwCount) { + public int CONAGetDeviceCount(APIHANDLE hDMHandle, IntByReference pdwCount) { // TODO Auto-generated method stub return 0; } - public int CONAGetDevices(DMHANDLE hDMHandle, IntByReference pdwCount, + public int CONAGetDevices(APIHANDLE hDMHandle, IntByReference pdwCount, CONAPI_DEVICE[] pDevices) { // TODO Auto-generated method stub return 0; } - public int CONAOpenDM(LPDMHANDLE mHDMHandle) { + public int CONAOpenDM(LPAPIHANDLE mHDMHandle) { // TODO Auto-generated method stub return 0; } - public int CONARegisterNotifyCallback(DMHANDLE hDMHandle, int dwState, + public int CONARegisterNotifyCallback(APIHANDLE hDMHandle, int dwState, IConnAPIDeviceCallback pfnNotify) { // TODO Auto-generated method stub return 0; @@ -123,34 +125,33 @@ return 0; } - public int CONACloseMM(MCHANDLE hMCHandle) { + public int CONACloseMM(APIHANDLE hMCHandle) { // TODO Auto-generated method stub return 0; } - public int CONAMMFreeMediaStructures(int dwCountOfMedia, - CONAPI_MEDIA[] pMedia) { + public int CONAMMFreeMediaStructures(int dwCountOfMedia, CONAPI_MEDIA[] pMedia) { // TODO Auto-generated method stub return 0; } - public int CONAMMGetMedia(MCHANDLE hMCHandle, IntBuffer pdwCountOfMedia, - ByReference[] ppMedia) { + public int CONAMMGetMedia(APIHANDLE hMCHandle, IntBuffer pdwCountOfMedia, + CONAPI_MEDIA.ByReference[] ppMedia) { // TODO Auto-generated method stub return 0; } - public int CONAMMSetMedia(MCHANDLE hMCHandle, CONAPI_MEDIA[] pMedia) { + public int CONAMMSetMedia(APIHANDLE hMCHandle, CONAPI_MEDIA[] pMedia) { // TODO Auto-generated method stub return 0; } - public int CONAOpenMM(LPMCHANDLE phMCHandle, int dwValue) { + public int CONAOpenMM(LPAPIHANDLE phMCHandle, int dwValue) { // TODO Auto-generated method stub return 0; } - public int CONARegisterMMNotifyCallback(MCHANDLE hMCHandle, int dwState, + public int CONARegisterMMNotifyCallback(APIHANDLE hMCHandle, int dwState, IConnAPIMediaCallback pfnNotify) { // TODO Auto-generated method stub return 0; @@ -166,7 +167,7 @@ return 0; } - public int MCAPI_GetMediaInfo(MCHANDLE hMCHandle, ShortBuffer pstrMediaID, + public int MCAPI_GetMediaInfo(APIHANDLE hMCHandle, ShortBuffer pstrMediaID, CONAPI_MEDIA_INFO[] pMediaInfo) { // TODO Auto-generated method stub return 0; @@ -182,7 +183,7 @@ return 0; } - public int UPAPI_CloseUSBPersonality(UPHANDLE hUPHandle) { + public int UPAPI_CloseUSBPersonality(APIHANDLE hUPHandle) { // TODO Auto-generated method stub return 0; } @@ -200,7 +201,7 @@ } public int UPAPI_FreeStringDescriptor( - UP_STRING_DESCRIPTOR[] pStringDescriptor) { + UP_STRING_DESCRIPTOR pStringDescriptor) { // TODO Auto-generated method stub return 0; } @@ -210,23 +211,23 @@ return 0; } - public int UPAPI_GetConfigurationDescriptor(UPHANDLE hUPHandle, - ShortBuffer pstrDeviceId, + public int UPAPI_GetConfigurationDescriptor(APIHANDLE hUPHandle, + WString pstrDeviceId, UP_CONFIGURATION_DESCRIPTOR[] pConfigurationDescriptor) { // TODO Auto-generated method stub return 0; } - public int UPAPI_GetPersonalityDescriptors(UPHANDLE hUPHandle, - ShortBuffer pstrDeviceId, + public int UPAPI_GetPersonalityDescriptors(APIHANDLE hUPHandle, + WString pstrDeviceId, UP_PERSONALITY_DESCRIPTORS[] pPersonalityDescriptors) { // TODO Auto-generated method stub return 0; } - public int UPAPI_GetStringDescriptor(UPHANDLE hUPHandle, - ShortBuffer pstrDeviceId, int dwDescriptorIndex, int dwLanguageID, - UP_STRING_DESCRIPTOR[] pStringDescriptor) { + public int UPAPI_GetStringDescriptor(APIHANDLE hUPHandle, + WString pstrDeviceId, int dwDescriptorIndex, int dwLanguageID, + UP_STRING_DESCRIPTOR pStringDescriptor) { // TODO Auto-generated method stub return 0; } @@ -236,32 +237,32 @@ return 0; } - public int UPAPI_OpenUSBPersonality(int dwVendorId, LPUPHANDLE phUPHandle) { + public int UPAPI_OpenUSBPersonality(int dwVendorId, LPAPIHANDLE phUPHandle) { // TODO Auto-generated method stub return 0; } - public int UPAPI_QueryDeviceCount(UPHANDLE hUPHandle, + public int UPAPI_QueryDeviceCount(APIHANDLE hUPHandle, IntBuffer pdwDeviceCount) { // TODO Auto-generated method stub return 0; } - public int UPAPI_QueryDevices(Pointer hUPHandle, IntBuffer pdwDeviceCount, + public int UPAPI_QueryDevices(APIHANDLE hUPHandle, IntBuffer pdwDeviceCount, UP_DEVICE_DESCRIPTOR[] pDeviceDescriptor) { // TODO Auto-generated method stub return 0; } - public int UPAPI_SendCommandToDevice(UPHANDLE hUPHandle, - ShortBuffer pstrDeviceId, int dwDataDirection, + public int UPAPI_SendCommandToDevice(APIHANDLE hUPHandle, + WString pstrDeviceId, int dwDataDirection, UP_DATA_BUFFER[] pDataBuffer) { // TODO Auto-generated method stub return 0; } - public int UPAPI_SetPersonality(UPHANDLE hUPHandle, - ShortBuffer pstrDeviceId, int dwPersonalityCode) { + public int UPAPI_SetPersonality(APIHANDLE hUPHandle, + WString pstrDeviceId, int dwPersonalityCode) { // TODO Auto-generated method stub return 0; } diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/DeviceConnection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/DeviceConnection.java Thu Feb 11 16:07:33 2010 -0600 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; + +/** + * Connection information for a device used by agent to create connections + */ +public class DeviceConnection { + + public String media; // "usb", "bluetooth", etc. + public String mode; // "serial", "rndis", etc. + public String friendlyName; + public String serialNumber; + public String port; // COM port, IP address + public String address; // from DMAPI +} diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/DeviceConnectionInfo.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/DeviceConnectionInfo.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/DeviceConnectionInfo.java Thu Feb 11 16:07:33 2010 -0600 @@ -23,7 +23,8 @@ public String deviceName; public String address; public int state; - public String comPort; + public String port; // may be serial port or IP address + public String mode; // "serial" or "rndis" or etc. /** * */ diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/GUID.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/GUID.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/GUID.java Thu Feb 11 16:07:33 2010 -0600 @@ -16,6 +16,7 @@ */ package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; +import com.nokia.carbide.remoteconnections.discovery.pccs.Messages; import com.sun.jna.NativeLong; import com.sun.jna.Structure; @@ -39,7 +40,7 @@ this.Data2 = Data2; this.Data3 = Data3; if (Data4.length != this.Data4.length) - throw new java.lang.IllegalArgumentException("Wrong array size !"); + throw new java.lang.IllegalArgumentException(Messages.GUID_0); this.Data4 = Data4; } protected ByReference newByReference() { return new ByReference(); } diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/IConnAPILibrary.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/IConnAPILibrary.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/IConnAPILibrary.java Thu Feb 11 16:07:33 2010 -0600 @@ -19,10 +19,7 @@ import java.nio.IntBuffer; import java.nio.ShortBuffer; -import org.eclipse.core.runtime.CoreException; - -import com.sun.jna.Callback; -import com.sun.jna.Native; +import com.sun.jna.WString; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; @@ -39,12 +36,12 @@ int DMAPI_Initialize(int dwAPIVersion, IntByReference pdwParam); int DMAPI_Terminate(IntByReference pdwParam); int DMAPI_GetAPIVersion(); - int CONAOpenDM(LPDMHANDLE mHDMHandle); - int CONACloseDM(DMHANDLE mHDMHandle); - int CONAGetDeviceCount(DMHANDLE hDMHandle, IntByReference pdwCount); - int CONAGetDevices(DMHANDLE hDMHandle, IntByReference pdwCount, CONAPI_DEVICE[] pDevices ); + int CONAOpenDM(LPAPIHANDLE mHDMHandle); + int CONACloseDM(APIHANDLE mHDMHandle); + int CONAGetDeviceCount(APIHANDLE hDMHandle, IntByReference pdwCount); + int CONAGetDevices(APIHANDLE hDMHandle, IntByReference pdwCount, CONAPI_DEVICE[] pDevices ); int CONAFreeDeviceStructure( int dwCount, CONAPI_DEVICE[] pDevices ); - int CONARegisterNotifyCallback(DMHANDLE hDMHandle, int dwState, IConnAPIDeviceCallback pfnNotify); + int CONARegisterNotifyCallback(APIHANDLE hDMHandle, int dwState, IConnAPIDeviceCallback pfnNotify); // CFAPI Common APIs int CFAPI_Initialize(int dwAPIVersion, IntByReference pdwParam); @@ -59,14 +56,14 @@ int MCAPI_Initialize(int dwAPIVersion, IntBuffer pdwParam); int MCAPI_Terminate(IntBuffer pdwParam); int MCAPI_GetAPIVersion(); - int CONAOpenMM(LPMCHANDLE phMCHandle, int dwValue); - int CONACloseMM(MCHANDLE hMCHandle); - int CONAMMGetMedia(MCHANDLE hMCHandle, IntBuffer pdwCountOfMedia, CONAPI_MEDIA.ByReference ppMedia[]); //TODO: c++ - CONAPI_MEDIA** ppMedia - int CONAMMSetMedia(MCHANDLE hMCHandle, CONAPI_MEDIA[] pMedia); + int CONAOpenMM(LPAPIHANDLE phMCHandle, int dwValue); + int CONACloseMM(APIHANDLE hMCHandle); + int CONAMMGetMedia(APIHANDLE hMCHandle, IntBuffer pdwCountOfMedia, CONAPI_MEDIA.ByReference[] ppMedia); //TODO: c++ - CONAPI_MEDIA** ppMedia + int CONAMMSetMedia(APIHANDLE hMCHandle, CONAPI_MEDIA[] pMedia); int CONAMMFreeMediaStructures(int dwCountOfMedia, CONAPI_MEDIA[] pMedia); - int MCAPI_GetMediaInfo(MCHANDLE hMCHandle, ShortBuffer pstrMediaID, CONAPI_MEDIA_INFO[] pMediaInfo); + int MCAPI_GetMediaInfo(APIHANDLE hMCHandle, ShortBuffer pstrMediaID, CONAPI_MEDIA_INFO[] pMediaInfo); int MCAPI_FreeMediaInfo(CONAPI_MEDIA_INFO[] pMediaInfo); - int CONARegisterMMNotifyCallback(MCHANDLE hMCHandle, int dwState, IConnAPIMediaCallback pfnNotify); + int CONARegisterMMNotifyCallback(APIHANDLE hMCHandle, int dwState, IConnAPIMediaCallback pfnNotify); // UPAPI USB Personality @@ -74,18 +71,18 @@ int UPAPI_Initialize(int dwAPIVersion, IntBuffer pdwParam); int UPAPI_Terminate(IntBuffer pdwParam); int UPAPI_GetAPIVersion(); - int UPAPI_OpenUSBPersonality(int dwVendorId, LPUPHANDLE phUPHandle); - int UPAPI_CloseUSBPersonality(UPHANDLE hUPHandle); - int UPAPI_QueryDeviceCount(UPHANDLE hUPHandle, IntBuffer pdwDeviceCount); - int UPAPI_QueryDevices(com.sun.jna.Pointer hUPHandle, IntBuffer pdwDeviceCount, UP_DEVICE_DESCRIPTOR[] pDeviceDescriptor); + int UPAPI_OpenUSBPersonality(int dwVendorId, LPAPIHANDLE phUPHandle); + int UPAPI_CloseUSBPersonality(APIHANDLE hUPHandle); + int UPAPI_QueryDeviceCount(APIHANDLE hUPHandle, IntBuffer pdwDeviceCount); + int UPAPI_QueryDevices(APIHANDLE hUPHandle, IntBuffer pdwDeviceCount, UP_DEVICE_DESCRIPTOR[] pDeviceDescriptor); int UPAPI_FreeDeviceDescriptor(int dwDeviceCount, UP_DEVICE_DESCRIPTOR[] pDeviceDescriptor); - int UPAPI_GetConfigurationDescriptor(UPHANDLE hUPHandle, ShortBuffer pstrDeviceId, UP_CONFIGURATION_DESCRIPTOR[] pConfigurationDescriptor); - int UPAPI_GetStringDescriptor(UPHANDLE hUPHandle, ShortBuffer pstrDeviceId, int dwDescriptorIndex, int dwLanguageID, UP_STRING_DESCRIPTOR[] pStringDescriptor); - int UPAPI_FreeStringDescriptor(UP_STRING_DESCRIPTOR[] pStringDescriptor); - int UPAPI_GetPersonalityDescriptors(UPHANDLE hUPHandle, ShortBuffer pstrDeviceId, UP_PERSONALITY_DESCRIPTORS[] pPersonalityDescriptors); + int UPAPI_GetConfigurationDescriptor(APIHANDLE hUPHandle, WString pstrDeviceId, UP_CONFIGURATION_DESCRIPTOR[] pConfigurationDescriptor); + int UPAPI_GetStringDescriptor(APIHANDLE hUPHandle, WString pstrDeviceId, int dwDescriptorIndex, int dwLanguageID, UP_STRING_DESCRIPTOR pStringDescriptor); + int UPAPI_FreeStringDescriptor(UP_STRING_DESCRIPTOR pStringDescriptor); + int UPAPI_GetPersonalityDescriptors(APIHANDLE hUPHandle, WString pstrDeviceId, UP_PERSONALITY_DESCRIPTORS[] pPersonalityDescriptors); int UPAPI_FreePersonalityDescriptors(UP_PERSONALITY_DESCRIPTORS[] pPersonalityDescriptors); - int UPAPI_SetPersonality(UPHANDLE hUPHandle, ShortBuffer pstrDeviceId, int dwPersonalityCode); - int UPAPI_SendCommandToDevice(UPHANDLE hUPHandle, ShortBuffer pstrDeviceId, int dwDataDirection, UP_DATA_BUFFER[] pDataBuffer); + int UPAPI_SetPersonality(APIHANDLE hUPHandle, WString pstrDeviceId, int dwPersonalityCode); + int UPAPI_SendCommandToDevice(APIHANDLE hUPHandle, WString pstrDeviceId, int dwDataDirection, UP_DATA_BUFFER[] pDataBuffer); } diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/LPAPIHANDLE.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/LPAPIHANDLE.java Thu Feb 11 16:07:33 2010 -0600 @@ -0,0 +1,56 @@ +/** +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; + +import com.sun.jna.Pointer; +import com.sun.jna.ptr.ByReference; + +/** + * Opaque Pointer to API Handle used in some native APIs + * + */ +public class LPAPIHANDLE extends ByReference { + + public LPAPIHANDLE() { + this(null); + } + public LPAPIHANDLE(APIHANDLE h) { + super(Pointer.SIZE); + setValue(h); + } + public void setValue(APIHANDLE h) { + getPointer().setPointer(0, h != null ? h.getPointer() : null); + } + public APIHANDLE getValue() { + Pointer p = getPointer().getPointer(0); + if (p == null) + return null; + if (APIHANDLE.INVALID_HANDLE_VALUE.getPointer().equals(p)) + return APIHANDLE.INVALID_HANDLE_VALUE; + APIHANDLE h = new APIHANDLE(); + h.setPointer(p); + return h; + } + /** + * @param dataSize + */ + public LPAPIHANDLE(int dataSize) { + super(dataSize); + // TODO Auto-generated constructor stub + } + +} diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/MCAPIDefinitions.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/MCAPIDefinitions.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/MCAPIDefinitions.java Thu Feb 11 16:07:33 2010 -0600 @@ -16,8 +16,6 @@ */ package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; -import com.sun.jna.Structure; - public class MCAPIDefinitions { //========================================================= // Media Control API versions diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/PCCSConnection.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/PCCSConnection.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/PCCSConnection.java Thu Feb 11 16:07:33 2010 -0600 @@ -16,28 +16,42 @@ */ package com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative; +import java.nio.IntBuffer; +import java.text.MessageFormat; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; +import java.util.Map; import org.eclipse.cdt.utils.WindowsRegistry; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.swt.widgets.Display; +import org.osgi.service.prefs.BackingStoreException; import com.nokia.carbide.remoteconnections.discovery.pccs.Activator; import com.nokia.carbide.remoteconnections.discovery.pccs.Messages; import com.nokia.carbide.remoteconnections.discovery.pccs.pccsnative.IConnAPILibrary.IConnAPIDeviceCallback; +import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils; +import com.sun.jna.Pointer; +import com.sun.jna.WString; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.ShortByReference; public class PCCSConnection { + private static final String NOT_KNOWN = "not known"; //$NON-NLS-1$ // used for all string structure elements that come back from PCCS as null private boolean DEBUG = false; + private boolean SWITCH_TO_RNDIS = false; // false for 2.x, true for 3.x + private String DONT_ASK_AGAIN_KEY = "DontAskAgain"; //$NON-NLS-1$ /** - * @author chpeckha * */ public class DeviceNotificationCallback implements IConnAPIDeviceCallback { @@ -54,11 +68,10 @@ // everything else will be null (according to the PCCS docs) // TODO: bug in PCCS API: if (DEBUG) System.out.printf("DeviceNotificationCallback %x %s\n", dwStatus, (pstrSerialNumber == null ? "serNum: null" : pstrSerialNumber.getPointer().getString(0, true))); //$NON-NLS-1$ //$NON-NLS-2$ - String serialNumber = "unknown device"; //$NON-NLS-1$ + String serialNumber = NOT_KNOWN; if (pstrSerialNumber != null) { serialNumber = pstrSerialNumber.getPointer().getString(0, true); } - if (DEBUG) System.out.printf("DeviceNotificationCallback %x %s\n", dwStatus, serialNumber); //$NON-NLS-1$ DeviceEventListener.DeviceEvent eventType = DeviceEventListener.DeviceEvent.DEVICE_LIST_UPDATED; // decode dwStatus per PCCS docs @@ -99,13 +112,25 @@ private static final Collection listeners = new LinkedList(); private IConnAPILibrary library; - private LPDMHANDLE dmHandle = new LPDMHANDLE(); private DeviceNotificationCallback pfnCallback = new DeviceNotificationCallback(); public static final int PCCS_NOT_FOUND = 1; public static final int PCCS_WRONG_VERSION = 2; - private LPMCHANDLE mcHandle = new LPMCHANDLE(); + private APIHANDLE dmHandle = APIHANDLE.INVALID_HANDLE_VALUE; + private APIHANDLE mcHandle = APIHANDLE.INVALID_HANDLE_VALUE; + private APIHANDLE upHandle = APIHANDLE.INVALID_HANDLE_VALUE; + private void storeDontAskAgain() { + Activator.getDefault().getPreferenceStore().setValue(DONT_ASK_AGAIN_KEY, true); + try { + new InstanceScope().getNode(Activator.PLUGIN_ID).flush(); + } catch (BackingStoreException e) { + Activator.logError(e); + } + } + private boolean dontAskAgain() { + return Activator.getDefault().getPreferenceStore().getBoolean(DONT_ASK_AGAIN_KEY); + } /** * */ @@ -116,10 +141,23 @@ if (library == null) { library = ConnAPILibrary.getInstance(); } + // this uses the MCAPI only to enable required media + ensureMediaEnabled(); + + // load DMAPI loadDMAPI(); -// loadMCAPI(); TODO: not tested yet } + private void ensureMediaEnabled() throws CoreException { + // open the MCAPI + loadMCAPI(); + // TODO: + // get media + // enable media + // close MCAPI + closeMCAPI(); + } + /** * Initializes the Device Management API (DMAPI) for use. * @@ -151,8 +189,10 @@ // } // open a DM handle - dmHandle.setValue(DMHANDLE.INVALID_HANDLE_VALUE); - dwResult = library.CONAOpenDM(dmHandle); + dmHandle = APIHANDLE.INVALID_HANDLE_VALUE; + LPAPIHANDLE pHandle = new LPAPIHANDLE(); + dwResult = library.CONAOpenDM(pHandle); + if (dwResult != PCCSErrors.CONA_OK) { library.DMAPI_Terminate(null); String msg = String.format(Messages.PCCSConnection_PCCS_CONAOpenDM_Error, dwResult); @@ -160,15 +200,17 @@ msg = Messages.PCCSConnection_PCCS_Not_Enough_Memory_Error; } throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, dwResult, msg, null)); + } else { + dmHandle = pHandle.getValue(); } // register a call back - dwResult = library.CONARegisterNotifyCallback(dmHandle.getValue(), PCCSTypeDefinitions.API_REGISTER, pfnCallback); + dwResult = library.CONARegisterNotifyCallback(dmHandle, PCCSTypeDefinitions.API_REGISTER, pfnCallback); if (dwResult != PCCSErrors.CONA_OK) { // System.out.printf("CONAOpenDM returned: %x\n", dwResult); library.DMAPI_Terminate(null); - library.CONACloseDM(dmHandle.getValue()); - dmHandle.setValue(DMHANDLE.INVALID_HANDLE_VALUE); + library.CONACloseDM(dmHandle); + dmHandle = APIHANDLE.INVALID_HANDLE_VALUE; String msg = String.format(Messages.PCCSConnection_PCCS_CONARegisterNotifyCallback_Error, dwResult); if (dwResult == PCCSErrors.ECONA_INVALID_POINTER) { @@ -194,24 +236,60 @@ } throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, PCCS_WRONG_VERSION, msg, null)); } - dwResult = library.CONAOpenMM(mcHandle, 0); + LPAPIHANDLE pHandle = new LPAPIHANDLE(); + dwResult = library.CONAOpenMM(pHandle, 0); if (dwResult != PCCSErrors.CONA_OK) { library.MCAPI_Terminate(null); - String msg = String.format("PCCS CONAOpenMM API returned error on initialization %x", dwResult); + String msg = String.format("PCCS CONAOpenMM API returned error on initialization %x", dwResult); //$NON-NLS-1$ if (dwResult == PCCSErrors.ECONA_NOT_ENOUGH_MEMORY) { msg = Messages.PCCSConnection_PCCS_Not_Enough_Memory_Error; } throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, dwResult, msg, null)); + } else { + mcHandle = pHandle.getValue(); } } + private void loadUPAPI() throws CoreException { + int dwResult = PCCSErrors.CONA_OK; + dwResult = library.UPAPI_Initialize(UPAPIDefinitions.UPAPI_VERSION_10, null); + if (dwResult != PCCSErrors.CONA_OK) { + library.UPAPI_Terminate(null); + String msg; + msg = String.format("PCCS UPAPI_Initialize API returned error on initialization %x", dwResult); //$NON-NLS-1$ + if (DEBUG) System.out.println(msg); + if (Activator.isSymSEELayout()) { + if (dwResult == PCCSErrors.ECONA_UNSUPPORTED_API_VERSION) { + msg = Messages.PCCSConnection_PCCS_Version_Error + Activator.getLoadErrorURL(); + } + } else { + msg = Messages.PCCSConnection_PCSuite_Version_Error + Activator.getLoadErrorURL(); + } + throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, PCCS_WRONG_VERSION, msg, null)); + } + LPAPIHANDLE pHandle = new LPAPIHANDLE(); + dwResult = library.UPAPI_OpenUSBPersonality(0, pHandle); + if (dwResult != PCCSErrors.CONA_OK) { + library.UPAPI_Terminate(null); + String msg = String.format("PCCS OpenUSBPersonality API returned error on initialization %x", dwResult); //$NON-NLS-1$ + if (DEBUG) System.out.println(msg); + if (dwResult == PCCSErrors.ECONA_NOT_ENOUGH_MEMORY) { + msg = Messages.PCCSConnection_PCCS_Not_Enough_Memory_Error; + } + throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, dwResult, msg, null)); + } else { + upHandle = pHandle.getValue(); + } + if (DEBUG) System.out.println("\n-----loadUPAPI"); //$NON-NLS-1$ + + } public void close() throws CoreException { if (library == null) return; - -// closeMCAPI(); TODO: not tested yet - closeDMAPI(); + + // DMAPI should only one be open + closeDMAPI(); } /** @@ -220,12 +298,12 @@ */ private void closeDMAPI() throws CoreException { int dwResult = PCCSErrors.CONA_OK; - if (dmHandle.getValue() != DMHANDLE.INVALID_HANDLE_VALUE) { + if (!APIHANDLE.INVALID_HANDLE_VALUE.equals(dmHandle)) { // unregister callback - dwResult = library.CONARegisterNotifyCallback(dmHandle.getValue(), PCCSTypeDefinitions.API_UNREGISTER, pfnCallback); + dwResult = library.CONARegisterNotifyCallback(dmHandle, PCCSTypeDefinitions.API_UNREGISTER, pfnCallback); // close DM connection - dwResult = library.CONACloseDM(dmHandle.getValue()); - dmHandle.setValue(DMHANDLE.INVALID_HANDLE_VALUE); + dwResult = library.CONACloseDM(dmHandle); + dmHandle = APIHANDLE.INVALID_HANDLE_VALUE; // Terminate Common Functions API // dwResult = library.CFAPI_Terminate(null); unnecessary // Terminate Device management API @@ -235,17 +313,543 @@ private void closeMCAPI() { int dwResult = PCCSErrors.CONA_OK; - if (mcHandle.getValue() != MCHANDLE.INVALID_HANDLE_VALUE) { + if (!APIHANDLE.INVALID_HANDLE_VALUE.equals(mcHandle)) { // close DM connection - dwResult = library.CONACloseDM(mcHandle.getValue()); - mcHandle.setValue(MCHANDLE.INVALID_HANDLE_VALUE); + dwResult = library.CONACloseDM(mcHandle); + mcHandle = APIHANDLE.INVALID_HANDLE_VALUE; // Terminate Device management API dwResult = library.MCAPI_Terminate(null); } } + + private void closeUPAPI() { + int dwResult = PCCSErrors.CONA_OK; + if (!APIHANDLE.INVALID_HANDLE_VALUE.equals(upHandle)) { +// if (upHandle.getValue() != APIHANDLE.INVALID_HANDLE_VALUE) { + // close DM connection + dwResult = library.UPAPI_CloseUSBPersonality(upHandle); + if (dwResult != PCCSErrors.CONA_OK) { + if (DEBUG) System.out.printf("UPAPI_CloseUSBPersonality dwResult = %x\n", dwResult); //$NON-NLS-1$ + } + upHandle = APIHANDLE.INVALID_HANDLE_VALUE; + // Terminate Device management API + dwResult = library.UPAPI_Terminate(null); + if (dwResult != PCCSErrors.CONA_OK) { + if (DEBUG) System.out.printf("UPAPI_Terminate dwResult = %x\n", dwResult); //$NON-NLS-1$ + } + } + if (DEBUG) System.out.println("closeUPAPI----\n"); //$NON-NLS-1$ + } + + public void getMediaList() { + if (!APIHANDLE.INVALID_HANDLE_VALUE.equals(mcHandle)) { + IntBuffer pdwCount = IntBuffer.allocate(1); + + CONAPI_MEDIA.ByReference[] ppMedia = (CONAPI_MEDIA.ByReference[])new CONAPI_MEDIA.ByReference().toArray(10); + + int dwResult = library.CONAMMGetMedia(mcHandle, pdwCount, ppMedia); + if (DEBUG) System.out.printf("dwResult = %x\tpdwCount = %d\n", dwResult, pdwCount.get(0)); //$NON-NLS-1$ + int size = pdwCount.get(0); + CONAPI_MEDIA[] pMedia = CONAPI_MEDIA.newArray(10); + Pointer p0 = ppMedia[0].getPointer().getPointer(0); + Pointer p1 = ppMedia[1].getPointer().getPointer(0); + CONAPI_MEDIA media0 = ppMedia[0].newInstance(); + CONAPI_MEDIA media1 = ppMedia[1].newInstance(); + if (dwResult == PCCSErrors.CONA_OK) { + for (int i = 0; i < size; i++) { + // if (DEBUG) { + // System.out.printf("dwSize=%d\tdwMedia=%x\tpstrDescription=%s\n", + // media.dwMedia, + // media.dwMedia, + // (media.pstrDescription == null) ? "null" : media.pstrDescription.getPointer().getString(0, true)); + // System.out.printf("dwState=%d\tdwOptions=%x\tdwMediaData=%d\tpstrID=%s\n", + // media.dwState, + // media.dwOptions, + // media.dwMediaData, + // (media.pstrID == null) ? "null" : media.pstrID.getPointer().getString(0, true)); + // } + // + } + dwResult = library.CONAMMFreeMediaStructures(size, pMedia); + if (dwResult != PCCSErrors.CONA_OK) { + if (DEBUG) System.out.printf("CONAMMFreeMediaStructures = %x\n", dwResult); //$NON-NLS-1$ + } + } + } + } + /** + * All devices detected are gotten here - BT, USB, etc. + * No checking of a valid connection is done here + * + * @return DeviceInfo[] - null if no devices connected + */ + private DeviceInfo[] getCompleteDeviceList() { + DeviceInfo[] deviceInfo = null; + + IntByReference pdwCount = new IntByReference(0); + int dwResult = library.CONAGetDeviceCount(dmHandle, pdwCount); + if (DEBUG) System.out.printf("CONAGetDeviceCount: %x number of devices: %d\n", dwResult, pdwCount.getValue()); //$NON-NLS-1$ + if (dwResult != PCCSErrors.CONA_OK) + return deviceInfo; + + int deviceCount = pdwCount.getValue(); + if (deviceCount > 0) { + + CONAPI_DEVICE[] pDevices = (CONAPI_DEVICE[])new CONAPI_DEVICE().toArray(deviceCount); + dwResult = library.CONAGetDevices(dmHandle, pdwCount, pDevices); + if (DEBUG) System.out.printf("CONAGetDevices: %x number of devices: %d\n", dwResult, deviceCount); //$NON-NLS-1$ + if (dwResult != PCCSErrors.CONA_OK) { + return deviceInfo; + } + + // Extract device information and connection info + deviceInfo = new DeviceInfo[deviceCount]; + CONAPI_DEVICE[] devices = pDevices; + for (int i = 0; i < deviceCount; i++) { + deviceInfo[i] = new DeviceInfo(); + if (devices[i].pstrSerialNumber != null) { + deviceInfo[i].serialNumber = devices[i].pstrSerialNumber.getPointer().getString(0, true); + } else { + // TODO: docs say if ser num == null --> device unsupported, but this is a bug in PCCS + deviceInfo[i].serialNumber = NOT_KNOWN; //$NON-NLS-1$ + } + if (devices[i].pstrFriendlyName != null) { + deviceInfo[i].friendlyName = devices[i].pstrFriendlyName.getPointer().getString(0, true); + } else { + deviceInfo[i].friendlyName = NOT_KNOWN; //$NON-NLS-1$ + } + if (devices[i].pstrModel != null) { + deviceInfo[i].model = devices[i].pstrModel.getPointer().getString(0, true); + } else { + deviceInfo[i].model = NOT_KNOWN; //$NON-NLS-1$ + } + if (devices[i].pstrManufacturer != null) { + deviceInfo[i].mfr = devices[i].pstrManufacturer.getPointer().getString(0, true); + } else { + deviceInfo[i].mfr = NOT_KNOWN; //$NON-NLS-1$ + } + int numConnections = deviceInfo[i].numberOfConnections = devices[i].dwNumberOfItems; + + CONAPI_CONNECTION_INFO[] conn = null; + if (numConnections > 0) + conn = (CONAPI_CONNECTION_INFO[])devices[i].pItems.toArray(numConnections); + + for (int j = 0; j < numConnections; j++) { + + DeviceConnectionInfo connInfo = new DeviceConnectionInfo(); + connInfo.deviceID = conn[j].dwDeviceID; + switch(conn[j].dwMedia){ + case PCCSTypeDefinitions.API_MEDIA_BLUETOOTH: + connInfo.media = "bluetooth"; //$NON-NLS-1$ + break; + case PCCSTypeDefinitions.API_MEDIA_IRDA: + connInfo.media = "irda"; //$NON-NLS-1$ + break; + case PCCSTypeDefinitions.API_MEDIA_SERIAL: + connInfo.media = "serial-ca42"; //$NON-NLS-1$ + break; + default: + case PCCSTypeDefinitions.API_MEDIA_USB: + connInfo.media = "usb"; //$NON-NLS-1$ + break; + } + // fill-in friendly name with device name if the former was null + if (conn[j].pstrDeviceName != null) { + connInfo.deviceName = conn[j].pstrDeviceName.getPointer().getString(0,true); + if (deviceInfo[i].friendlyName.equals(NOT_KNOWN)) { //$NON-NLS-1$ + deviceInfo[i].friendlyName = connInfo.deviceName; + } + } else { + connInfo.deviceName = NOT_KNOWN; //$NON-NLS-1$ + } + + // if the address is not known, this is serious - we may weed out this connection later + if (conn[j].pstrAddress != null) { + connInfo.address = conn[j].pstrAddress.getPointer().getString(0, true); + } else { + connInfo.address = NOT_KNOWN; // $NON-NLS-1$ + } + connInfo.state = conn[j].dwState; + deviceInfo[i].connections.add(connInfo); + } + } + dwResult = library.CONAFreeDeviceStructure(deviceCount, pDevices); + } + + return deviceInfo; + } + + public synchronized Collection getGoodConnectionList() throws CoreException { + DeviceInfo[] deviceList = getCompleteDeviceList(); + Collection goodConnections = new ArrayList(); + + if (deviceList == null) + return goodConnections; + + try { + loadUPAPI(); + } catch (CoreException e) { + Activator.logError(e); + return goodConnections; + } + boolean upapiOpen = true; + Collection personalityList = getAllDeviceUSBPersonalities(); + // sometimes on a phone connected to USB, this is failing at least a couple of times + // so retry a number of times + // if there are no USB connections, this failure is expected + if (personalityList == null || personalityList.size() == 0) { + if (DEBUG) System.out.printf("Error 1 getting USB personalities\n"); //$NON-NLS-1$ + closeUPAPI(); + upapiOpen = false; + for (int i = 2; i < 6; i++) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + try { + loadUPAPI(); + upapiOpen = true; + } catch (CoreException e) { + Activator.logError(e); + } + if (upapiOpen) + personalityList = getAllDeviceUSBPersonalities(); + if (personalityList == null || personalityList.size() == 0) { + if (DEBUG) System.out.printf("Error %d getting USB personalities\n", i); //$NON-NLS-1$ + closeUPAPI(); + upapiOpen = false; + } else { + break; + } + } + } + // if we failed getting the USB personalities above - UPAPI will be closed + // so reopen it + // else we finally got the USB personalities, UPAPI is still open + if (!upapiOpen) { + loadUPAPI(); + upapiOpen = true; + } + + // go through each connected device and check for good connection modes (e.g. USB in debuggable mode) + if (DEBUG) System.out.printf("getGoodConnectionList: sizeof deviceList: %d\n", deviceList.length); //$NON-NLS-1$ + for (DeviceInfo device : deviceList) { + Collection connectionList = device.connections; + if (DEBUG) System.out.printf("getGoodConnectionList: sizeof connectionList: %d\n", connectionList.size()); //$NON-NLS-1$ + for (DeviceConnectionInfo connInfo : connectionList) { + if (DEBUG) { + System.out.printf("getGoodConnectionList: name: %s media: %s\n", device.friendlyName, connInfo.media); //$NON-NLS-1$ + } + if (connInfo.media.equals("usb")) { //$NON-NLS-1$ + DeviceUSBPersonalityInfo personality = findPersonality(device.serialNumber, connInfo.address, personalityList); + if (personality == null) { + if (DEBUG) System.out.println("getGoodConnectionList: personality not found, continue"); //$NON-NLS-1$ + String msg = MessageFormat.format(Messages.PCCSConnection_Personality_Switch_Error, + device.friendlyName); + Activator.logMessage(msg, IStatus.ERROR); + continue; + } + if (isGoodUSBPersonality(device, connInfo, personality)) { + // if current mode was bad, and we switched, then we'll pick it up at next notification + // if current mode is still bad, don't put into good list + // if current mode is good, store it to good list + DeviceConnection newConnection = new DeviceConnection(); + newConnection.friendlyName = device.friendlyName; + if (!device.serialNumber.equals(NOT_KNOWN)) + newConnection.serialNumber = device.serialNumber; + else if (!personality.serialNumber.equals(NOT_KNOWN)) + newConnection.serialNumber = personality.serialNumber; + else + newConnection.serialNumber = NOT_KNOWN; + + newConnection.media = connInfo.media; + newConnection.port = connInfo.port; // port may be IP address or COM Port depending on personality + newConnection.mode = connInfo.mode; + newConnection.address = connInfo.address; + if (!newConnection.friendlyName.equals(NOT_KNOWN) && !newConnection.address.equals(NOT_KNOWN)) + goodConnections.add(newConnection); + } + } else if (connInfo.media.equals("bluetooth")) { //$NON-NLS-1$ + // TODO: Bluetooth - not supported yet + } else { + // TODO: what else? + } + } + } + if (upapiOpen) + closeUPAPI(); + + return goodConnections; + } + /** + * Find a matching device in the personality list (all USB devices).

+ * Might have to use a combination of the serial number and device ID to match with ID's from personality. + * + * @param serialNumber - serial number from connectivity API + * @param address - this contains the device ID from the connectivity API + * @param personalityList - all USB-connected devices + * @return - null if no personality found + */ + private DeviceUSBPersonalityInfo findPersonality(String serialNumber, String address, Collection personalityList) { + + if (DEBUG) System.out.println("findPersonality: start"); //$NON-NLS-1$ + if (personalityList == null || personalityList.isEmpty()) + return null; + + for (DeviceUSBPersonalityInfo personality : personalityList) { + if (DEBUG) { + System.out.printf("findPersonality: serialNums: %s\t%s\n", serialNumber, personality.serialNumber); //$NON-NLS-1$ + System.out.printf("findPersonality: address: %s\tdeviceID: %s\n", address, personality.deviceID); //$NON-NLS-1$ + } + if (!serialNumber.equals(NOT_KNOWN) && !personality.serialNumber.equals(NOT_KNOWN)) { + // serial number not null from both DMAPI and UPAPI + if (serialNumber.equals(personality.serialNumber)) { + if (DEBUG) System.out.println("findPersonality: serialNums match"); //$NON-NLS-1$ + return personality; + } else if (new String(serialNumber+"0").equals(personality.serialNumber)) { //$NON-NLS-1$ + if (DEBUG) System.out.println("findPersonality: serialNums match (by appending '0' to DMAPI)"); //$NON-NLS-1$ + return personality; + } + } + // cannot use serial numbers! try using device IDs + if (!address.equals(NOT_KNOWN) && !personality.deviceID.equals(NOT_KNOWN)) { + // compare Device IDs + String id = address.substring(address.indexOf('\\'), address.lastIndexOf('\\')); + if (personality.deviceID.contains(id)) { + if (DEBUG) System.out.println("findPersonality: address matches deviceID"); //$NON-NLS-1$ + return personality; + } + } + } + if (DEBUG) System.out.println("findPersonality end return null"); //$NON-NLS-1$ + return null; + } + + /** + * This will do a switch if the user wants us to. + * + * @param device - USB-connected device + * @param connInfo - connection information for this USB-connected device + * @param personalities - USB personalities of all devices (not just this one) + * @return true - iff we're in a 'good' USB personality already + * if we have to switch, the device will disconnect and reconnect in the other personality + * + * Only 'good' personalities are: + * PC Suite - Serial + * OVI Suite - Serial + * RNDIS - TCP/IP - currently unsupported + */ + private boolean isGoodUSBPersonality(DeviceInfo device, + DeviceConnectionInfo connInfo, + DeviceUSBPersonalityInfo personality) { + + if (DEBUG) System.out.printf("isGoodUSBPersonality: current personality: %d %s\n", personality.currentPersonalityCode, personality.currentPersonalityDescription); //$NON-NLS-1$ + // currently assume that mode is always 'serial' + if (personality.currentPersonalityCode == UPAPIDefinitions.UPAPI_PERSONALITY_CODE_PC_SUITE || + personality.currentPersonalityCode == UPAPIDefinitions.UPAPI_PERSONALITY_CODE_OVI_SUITE) { + connInfo.mode = "serial"; //$NON-NLS-1$ + connInfo.port = getUSBComPort(connInfo.address); + // good personality + return true; + } + + // bad personality - switch? if dontAskAgain is true - return bad personality + int goodCode = UPAPIDefinitions.UPAPI_PERSONALITY_CODE_PC_SUITE; + if (personality.supportedPersonalities.containsKey(new Integer(UPAPIDefinitions.UPAPI_PERSONALITY_CODE_OVI_SUITE))) { + goodCode = UPAPIDefinitions.UPAPI_PERSONALITY_CODE_OVI_SUITE; + } + String goodDesc = personality.supportedPersonalities.get(new Integer(goodCode)); + + if (dontAskAgain()) { + if (DEBUG) System.out.println("isGoodUSBPersonality: dont ask = true, return false"); //$NON-NLS-1$ + String fmt = Messages.PCCSConnection_Bad_Personality_DontSwitch_Warning1 + + Messages.PCCSConnection_Bad_Personality_DontSwitch_Warning2; + String message = MessageFormat.format(fmt, device.friendlyName, personality.currentPersonalityDescription, goodDesc); + Activator.logMessage(message, IStatus.WARNING); + return false; + } + + // ask to switch + askToSwitchPersonality(device, personality, goodCode, goodDesc); + + // was bad personality - if we switched, it will be good next notification + if (DEBUG) System.out.println("isGoodUSBPersonality: return false"); //$NON-NLS-1$ + return false; + } + private void askToSwitchPersonality(DeviceInfo device, + DeviceUSBPersonalityInfo personality, int goodCode, String goodDesc) { + + // ask the user and switch + String fmt = Messages.PCCSConnection_Switch_Message1 + + Messages.PCCSConnection_Swtich_Message2 + + Messages.PCCSConnection_Switch_Message3 + + Messages.PCCSConnection_Switch_Message4; + String message = MessageFormat.format(fmt, + device.friendlyName, + personality.currentPersonalityDescription, + goodDesc); + + MessageDialogWithToggle dlg = MessageDialogWithToggle.openYesNoQuestion( + WorkbenchUtils.getSafeShell(), + Messages.PCCSConnection_Switch_Message_Title, + message, + Messages.PCCSConnection_DontAsk_CheckText, + false, + null, + null); + boolean dontAskAgain = dlg.getToggleState(); + boolean doSwitch = (dlg.getReturnCode() == IDialogConstants.YES_ID); + + if (doSwitch) { + WString pstrDeviceId = new WString(personality.deviceID); + int dwResult = library.UPAPI_SetPersonality(upHandle, pstrDeviceId, goodCode); + if (dwResult != PCCSErrors.CONA_OK) { + if (DEBUG) + System.out.printf("UPAPI_SetPersonality failed: %x\n", dwResult); //$NON-NLS-1$ + } + } + // store don't ask again only if selected + if (dontAskAgain) + storeDontAskAgain(); + } + + /** + * This function assumes the UPAPI has already been loaded by the caller + * @return - list of personalities + */ + private Collection getAllDeviceUSBPersonalities() { + Collection p = new ArrayList(); + boolean apiError = false; + // how many USB devices are connected + IntBuffer pdwDeviceCount = IntBuffer.allocate(1); + int dwResult = library.UPAPI_QueryDeviceCount(upHandle, pdwDeviceCount); + if (dwResult == PCCSErrors.CONA_OK) { + int dwDeviceCount = pdwDeviceCount.get(0); + if (DEBUG) System.out.printf("UPAPI_QueryDeviceCount: dwDeviceCount: %d\n", dwDeviceCount); //$NON-NLS-1$ + if (dwDeviceCount > 0) { + UP_DEVICE_DESCRIPTOR[] pDeviceDescriptor = (UP_DEVICE_DESCRIPTOR[])new UP_DEVICE_DESCRIPTOR().toArray(dwDeviceCount); + + // get the descriptor for all USB device + dwResult = library.UPAPI_QueryDevices(upHandle, pdwDeviceCount, pDeviceDescriptor); + if (dwResult == PCCSErrors.CONA_OK) { + if (DEBUG) System.out.printf("UPAPI_QueryDevices dwDeviceCount: %d\n", dwDeviceCount); //$NON-NLS-1$ + + UP_DEVICE_DESCRIPTOR[] devices = pDeviceDescriptor; + // + for (int i = 0; i < dwDeviceCount; i++) { + // save important device descriptor information for each device + DeviceUSBPersonalityInfo deviceInfo = new DeviceUSBPersonalityInfo(); + + // device ID is very important to get personalities and for matching with + // the connectivity API + if (devices[i].pstrDeviceID != null) { + deviceInfo.deviceID = devices[i].pstrDeviceID.getPointer().getString(0, true); + } else { + deviceInfo.deviceID = NOT_KNOWN; + } + // nice to have, but maybe null on some devices + if (devices[i].pstrSerialNumber != null) { + deviceInfo.serialNumber = devices[i].pstrSerialNumber.getPointer().getString(0, true); + } else { + deviceInfo.serialNumber = NOT_KNOWN; + } + // now get the personality descriptor for this device + apiError = getPersonalityDescriptors(p, apiError, deviceInfo); + } + if (DEBUG) System.out.println("getAllDeviceUSBPersonalities all devices read"); //$NON-NLS-1$ + } else { + apiError = true; + if (DEBUG) + System.out.printf("UPAPI_QueryDevices dwResult = %x\n", dwResult); //$NON-NLS-1$ + } + dwResult = library.UPAPI_FreeDeviceDescriptor(dwDeviceCount, pDeviceDescriptor); + } else { + if (DEBUG) System.out.println("getAllDeviceUSBPersonalities no devices"); //$NON-NLS-1$ + } + } else { + apiError = true; + if (DEBUG) + System.out.printf("UPAPI_QueryDeviceCount dwResult = %x\n", dwResult); //$NON-NLS-1$ + } + if (DEBUG) System.out.printf("getAllDeviceUSBPersonalities return p size : %s\n", p.size()); //$NON-NLS-1$ + return p; + } + private boolean getPersonalityDescriptors( + Collection p, boolean apiError, + DeviceUSBPersonalityInfo deviceInfo) { + int dwResult; + + // make device ID a wide string so JNA marshals it appropriately + WString pid = new WString(deviceInfo.deviceID); + UP_PERSONALITY_DESCRIPTORS[] persDesc = (UP_PERSONALITY_DESCRIPTORS[])new UP_PERSONALITY_DESCRIPTORS().toArray(1); + persDesc[0].dwSize = 12; // important - won't work without this + dwResult = library.UPAPI_GetPersonalityDescriptors(upHandle, pid, persDesc); + if (dwResult == PCCSErrors.CONA_OK) { + // store personality information + deviceInfo.currentPersonalityCode = (persDesc[0].bCurrentPersonality & 0xff); + + // get num of supported personalities + int numPers = (persDesc[0].bNumOfPersonalities & 0xff); + if (DEBUG) System.out.printf("UPAPI_GetPersonalityDescriptors numPers = %d\n", numPers); //$NON-NLS-1$ + + // get all the supported personalities for this device + apiError = getSupportedPersonalities(apiError, deviceInfo, pid, persDesc, numPers); + } else { + apiError = true; + if (DEBUG) + System.out.printf("UPAPI_GetPersonalityDescriptors dwResult = %x\n", dwResult); //$NON-NLS-1$ + } + dwResult = library.UPAPI_FreePersonalityDescriptors(persDesc); + if (apiError == false) { + if (DEBUG) System.out.println("getAllDeviceUSBPersonalities deviceInfo added"); //$NON-NLS-1$ + p.add(deviceInfo); + } + return apiError; + } + private boolean getSupportedPersonalities(boolean apiError, + DeviceUSBPersonalityInfo deviceInfo, WString pid, + UP_PERSONALITY_DESCRIPTORS[] persDesc, int numPers) { + int dwResult; + UP_PERSONALITY[] pSupportedPersonality = null; + if (numPers > 0) { + pSupportedPersonality = (UP_PERSONALITY[])persDesc[0].pPersonalities.toArray(numPers); + deviceInfo.supportedPersonalities = new HashMap(); + } + // now get the string descriptor for each supported personality + for (int j = 0; j < numPers; j++) { + Integer code = new Integer(pSupportedPersonality[j].bPersonalityCode); + int stringIndex = (pSupportedPersonality[j].bPersonalityIndex & 0xff); + UP_STRING_DESCRIPTOR pStringDescriptor = new UP_STRING_DESCRIPTOR(); + String desc = NOT_KNOWN; + pStringDescriptor.dwSize = 12; // this is important + dwResult = library.UPAPI_GetStringDescriptor(upHandle, pid, stringIndex, 0, pStringDescriptor); + if (dwResult == PCCSErrors.CONA_OK) { + if (pStringDescriptor.pstrDescription != null) { + desc = pStringDescriptor.pstrDescription.getPointer().getString(0, true); + } + if (DEBUG) System.out.printf("UPAPI_GetStringDescriptor code: %d, desc: %s\n", code.intValue(), desc); //$NON-NLS-1$ + dwResult = library.UPAPI_FreeStringDescriptor(pStringDescriptor); + } else { + apiError = true; + if (DEBUG) + System.out.printf("UPAPI_GetStringDescriptor dwResult = %x\n", dwResult); //$NON-NLS-1$ + } + if (apiError == false) + deviceInfo.supportedPersonalities.put(code, desc); + } + if (deviceInfo.supportedPersonalities.isEmpty()) { + deviceInfo.currentPersonalityDescription = MessageFormat.format(Messages.PCCSConnection_Generic_Personality_Description, Integer.toString(deviceInfo.currentPersonalityCode)); + } else { + deviceInfo.currentPersonalityDescription = deviceInfo.supportedPersonalities.get(new Integer(deviceInfo.currentPersonalityCode)); + } + if (DEBUG) System.out.printf("current Desc found: %s\n", deviceInfo.currentPersonalityDescription); //$NON-NLS-1$ + return apiError; + } + /** * @return null if no device found. * @throws CoreException + * @deprecated Use {@link #getGoodConnectionList()} instead. */ public DeviceInfo[] getDeviceList() throws CoreException { @@ -253,7 +857,7 @@ int dwResult = PCCSErrors.CONA_OK; IntByReference pdwCount = new IntByReference(0); - dwResult = library.CONAGetDeviceCount(dmHandle.getValue(), pdwCount); + dwResult = library.CONAGetDeviceCount(dmHandle, pdwCount); if (DEBUG) System.out.printf("CONAGetDeviceCount: %x number of devices: %d\n", dwResult, pdwCount.getValue()); //$NON-NLS-1$ int deviceCnt = pdwCount.getValue(); @@ -262,7 +866,7 @@ // array of structs in contiguous memory required ! CONAPI_DEVICE[] pDevices = (CONAPI_DEVICE[])new CONAPI_DEVICE().toArray(deviceCnt); - dwResult = library.CONAGetDevices(dmHandle.getValue(), pdwCount, pDevices); + dwResult = library.CONAGetDevices(dmHandle, pdwCount, pDevices); if (DEBUG) System.out.printf("CONAGetDevices: %x number of devices: %d\n", dwResult, deviceCnt); //$NON-NLS-1$ if (dwResult == PCCSErrors.CONA_OK) { @@ -276,22 +880,22 @@ deviceInfo[i].serialNumber = devices[i].pstrSerialNumber.getPointer().getString(0, true); } else { // TODO: docs say if ser num == null --> device unsupported, but this is a bug in PCCS - deviceInfo[i].serialNumber = "not known"; //$NON-NLS-1$ + deviceInfo[i].serialNumber = NOT_KNOWN; //$NON-NLS-1$ } if (devices[i].pstrFriendlyName != null) { deviceInfo[i].friendlyName = devices[i].pstrFriendlyName.getPointer().getString(0, true); } else { - deviceInfo[i].friendlyName = "not known"; //$NON-NLS-1$ + deviceInfo[i].friendlyName = NOT_KNOWN; //$NON-NLS-1$ } if (devices[i].pstrModel != null) { deviceInfo[i].model = devices[i].pstrModel.getPointer().getString(0, true); } else { - deviceInfo[i].model = "not known"; //$NON-NLS-1$ + deviceInfo[i].model = NOT_KNOWN; //$NON-NLS-1$ } if (devices[i].pstrManufacturer != null) { deviceInfo[i].mfr = devices[i].pstrManufacturer.getPointer().getString(0, true); } else { - deviceInfo[i].mfr = "not known"; //$NON-NLS-1$ + deviceInfo[i].mfr = NOT_KNOWN; //$NON-NLS-1$ } int numItems = deviceInfo[i].numberOfConnections = devices[i].dwNumberOfItems; @@ -318,36 +922,36 @@ } if (conn[j].pstrDeviceName != null) { connInfo.deviceName = conn[j].pstrDeviceName.getPointer().getString(0,true); - if (deviceInfo[i].friendlyName.equals("not known")) { //$NON-NLS-1$ + if (deviceInfo[i].friendlyName.equals(NOT_KNOWN)) { //$NON-NLS-1$ // use device name as friendly name (latter was null) deviceInfo[i].friendlyName = connInfo.deviceName; } } else { - connInfo.deviceName = "not known"; //$NON-NLS-1$ + connInfo.deviceName = NOT_KNOWN; //$NON-NLS-1$ } // Bomb if friendly name is not known or address is not known // since these are essential to a connection - if (conn[j].pstrAddress == null || deviceInfo[i].friendlyName.equals("not known")) //$NON-NLS-1$ + if (conn[j].pstrAddress == null || deviceInfo[i].friendlyName.equals(NOT_KNOWN)) //$NON-NLS-1$ continue; connInfo.address = conn[j].pstrAddress.getPointer().getString(0, true); connInfo.state = conn[j].dwState; if (connInfo.media.equals("usb")) { //$NON-NLS-1$ - if (isGoodUSBState(connInfo.state)){ - connInfo.comPort = getUSBComPort(connInfo.address); + if (checkUSBMode(deviceInfo[i], connInfo)){ + connInfo.port = getUSBComPort(connInfo.address); } else { // don't store - not in good USB personality mode continue; } } else if (connInfo.media.equals("bluetooth")) { //$NON-NLS-1$ // TODO: implement BT - connInfo.comPort = getBTComPort(connInfo.address); + connInfo.port = getBTComPort(connInfo.address); } else { // IRDA and Serial(CA42) probably will not come here anyway - connInfo.comPort = null; + connInfo.port = null; } - if (connInfo.comPort != null) + if (connInfo.port != null) deviceInfo[i].connections.add(connInfo); } } @@ -358,22 +962,17 @@ return deviceInfo; } - private boolean isGoodUSBState(int state) { - // This test is necessary since we're seeing - // on some devices PCSuite mode not set BUT PCSuite trusted flag is set - // OR PCSuite mode on device is selected BUT only Paired flag is set - // good if: - // in PCSuite mode - // OR is Paired - // OR is PCSuite trusted - // TODO: use UPAPI here instead - if (DMAPIDefinitions.CONAPI_IS_IN_PCSUITE_MODE(state)) - return true; - else if (DMAPIDefinitions.CONAPI_IS_DEVICE_PAIRED(state)) - return true; - else if (DMAPIDefinitions.CONAPI_IS_PCSUITE_TRUSTED(state)) - return true; - return false; + /** + * + * @param deviceInfo + * @param connInfo + * @return + * + * @deprecated not used anymore + */ + private boolean checkUSBMode(DeviceInfo deviceInfo, + DeviceConnectionInfo connInfo) { + return true; } private String getBTComPort(String address) { @@ -441,4 +1040,17 @@ } public void onDeviceEvent(DeviceEvent eventType, String serialNumber); } + /** + * Class to hold USB personality information from UPAPI per Device + */ + private class DeviceUSBPersonalityInfo { + String deviceID; // from device descriptor + String serialNumber; // from device descriptor + int currentPersonalityCode; // from personality descriptor + String currentPersonalityDescription; // from list of supported personalities + // list of supported personalities + // int = personality code + // string = personality description for code from device + Map supportedPersonalities; + } } diff -r 949823a0e5df -r e90e6ea44529 connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/UPAPIDefinitions.java --- a/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/UPAPIDefinitions.java Thu Feb 11 15:09:23 2010 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections.discovery.pccs/src/com/nokia/carbide/remoteconnections/discovery/pccs/pccsnative/UPAPIDefinitions.java Thu Feb 11 16:07:33 2010 -0600 @@ -31,6 +31,7 @@ public static final int UPAPI_PERSONALITY_CODE_PICTURE_TRANSFER =0x03; public static final int UPAPI_PERSONALITY_CODE_MEDIA_TRANSFER =0x04; public static final int UPAPI_PERSONALITY_CODE_COMBINED =0x05; + public static final int UPAPI_PERSONALITY_CODE_OVI_SUITE =UPAPI_PERSONALITY_CODE_COMBINED; public static final int UPAPI_PERSONALITY_CODE_PC_TO_WEB =0x06; // not from documentation - from email only