package org.bbssh.model; import java.io.EOFException; import java.util.Vector; import net.rim.device.api.synchronization.SyncObject; import org.bbssh.io.SyncBuffer; import org.bbssh.terminal.VT320; import org.bbssh.util.Tools; public class ConnectionManager extends DefaultSyncCollection { private static ConnectionManager me; public static final long CONNECTIONS_GUID = 0x22efb83d1a41163bL; // org.bbssh.model.ConnectionManager private ConnectionManager() { } public void initialize() { loadData(); } public synchronized static ConnectionManager getInstance() { if (me == null) { me = new ConnectionManager(); } return me; } public synchronized Vector getConnections() { return getDataVector(); } /** * Exposing the actual serialization of connection properties so that settingsmanager can include an embedded set of * connection properties that represent the default new session values. * * @param prop * @param buffer */ public void serializeConnectionProperties(ConnectionProperties prop, SyncBuffer buffer) { FontSettings font = prop.getFontSettings(); // BEGIN VERSION 0 FIELDS buffer.writeField(prop.getName()); buffer.writeField(prop.getHost()); buffer.writeField(prop.getUsername()); buffer.writeField(prop.getPassword()); buffer.writeField(prop.getKeyId()); buffer.writeField(prop.getKeepAliveTime()); buffer.writeField(prop.getTermType()); buffer.writeField(prop.getTerminalRows()); buffer.writeField(prop.getTerminalCols()); buffer.writeField(prop.getSessionType()); buffer.writeField(prop.getConnectionType()); buffer.writeField(prop.isPollingIO()); buffer.writeField(prop.getHttpProxyHost()); buffer.writeField(prop.getHttpProxyMode()); buffer.writeField(prop.getBackgroundColorIndex()); buffer.writeField(prop.getForegroundColorIndex()); buffer.writeField(prop.getDefaultInputMode()); buffer.writeField(prop.getAutorunMacroName()); buffer.writeField(font.getFontId()); buffer.writeField(font.getFontType()); buffer.writeField(font.getFontSize()); // VERSION 1 FIELDS // available boolean. buffer.writeField(false); // 2 buffer.writeField(prop.getKeepSizeOnVirtualKeyboardDisplay()); // 3 buffer.writeField(prop.getUseWifiIfAvailable()); // 4 buffer.writeField(prop.getBESTimeout()); // 5 buffer.writeField(prop.getScrollbackLines()); // 6 buffer.writeField(prop.getAltPrefixesMeta()); // 7 buffer.writeField(prop.getFunctionKeyMode()); // 8 - no new fields, but we have some modified reading of colors. } protected boolean convertImpl(SyncObject object, SyncBuffer buffer, int version) { if (!(object instanceof ConnectionProperties)) return false; serializeConnectionProperties((ConnectionProperties) object, buffer); return true; } public ConnectionProperties deserializeConnectionProperties(SyncBuffer buffer, int version) { ConnectionProperties prop = new ConnectionProperties(false); try { prop.setName(buffer.readNextStringField()); prop.setHost(buffer.readNextStringField()); prop.setUsername(buffer.readNextStringField()); prop.setPassword(buffer.readNextStringField()); prop.setKeyId(buffer.readNextIntField()); prop.setKeepAliveTime(buffer.readNextIntField()); prop.setTermType(buffer.readNextStringField()); prop.setTerminalRows(buffer.readNextShortField()); prop.setTerminalCols(buffer.readNextShortField()); prop.setSessionType(buffer.readNextByteField()); prop.setConnectionType(buffer.readNextByteField()); prop.setPollingIO(buffer.readNextBooleanField()); prop.setHttpProxyHost(buffer.readNextStringField()); prop.setHttpProxyMode(buffer.readNextByteField()); if (version >= 8) { prop.setBackgroundColorIndex(buffer.readNextIntField()); prop.setForegroundColorIndex(buffer.readNextIntField()); } else { // In version 8 and prior, color was an actual color value. We've changed it to an index into the color // table. We'll set up some reasonable defaults. The only problem here is if someone had a color value // of 1-7 and meant to have a very dark shade of blue ;) int bg = Tools.convertColorToANSITable(buffer.readNextIntField(), 0); int fg = Tools.convertColorToANSITable(buffer.readNextIntField(), 7); if (fg == bg) { bg = 0; fg = 7; } prop.setBackgroundColorIndex(bg); prop.setForegroundColorIndex(fg); } prop.setDefaultInputMode(buffer.readNextByteField()); prop.setAutorunMacroName(buffer.readNextStringField()); byte id = buffer.readNextByteField(); byte type = buffer.readNextByteField(); byte size = buffer.readNextByteField(); prop.setFontSettings(new FontSettings(type, id, size)); if (version >= 1) { // available boolean field buffer.readNextBooleanField(); } if (version >= 2) { prop.setKeepSizeOnVirtualKeyboardDisplay(buffer.readNextBooleanField()); } if (version >= 3) { prop.setUseWifiIfAvailable(buffer.readNextBooleanField()); } if (version >= 4) { prop.setBESTimeout(buffer.readNextIntField()); } if (version >= 5) { prop.setScrollbackLines(buffer.readNextShortField()); } if (version >= 6) { prop.setAltPrefixesMeta(buffer.readNextBooleanField()); } if (version >= 7) { prop.setFunctionKeyMode(buffer.readNextByteField()); } else { prop.setFunctionKeyMode(VT320.FK_LINUX); } // reserved: version > 8 modifies the color value loaded. next up: 9 } catch (EOFException e) { prop = null; } return prop; } protected SyncObject convertImpl(SyncBuffer buffer, int version, int UID, boolean syncDirty) { ConnectionProperties prop = deserializeConnectionProperties(buffer, version); prop.setSyncStateDirty(syncDirty); prop.setUID(UID); return prop; } public String getSyncName() { return "BBSSH Saved Connections"; } public int getSyncVersion() { return 8; } public long getPersistentStoreId() { return CONNECTIONS_GUID; } public ConnectionProperties getConnectionPropertiesById(String shortcutID) { int id; try { id = Integer.parseInt(shortcutID); } catch (NumberFormatException e) { return null; } // @todo let's just keep a hashtable of these referenced by ID.. Vector v = getConnections(); for (int x = v.size() - 1; x >= 0; x--) { ConnectionProperties p = (ConnectionProperties) v.elementAt(x); if (p == null) // just to be safe. continue; if (p.getUID() == id) { return p; } } return null; } public boolean isSecureStoreRequired() { return true; } }