package edu.berkeley.cs.amplab.carat.android.protocol; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransportException; import android.content.Context; import android.util.Log; import edu.berkeley.cs.amplab.carat.thrift.CaratService; /** * Client for the Carat Protocol. * * @author Eemil Lagerspetz * */ public class ProtocolClient { public static final String TAG = "ProtocolClient"; public static final String SERVER_PROPERTIES = "caratserver.properties"; public static int SERVER_PORT = 0; public static String SERVER_ADDRESS = null; /** * FIXME: this needs to come from a factory, so that connections are not * kept open unnecessarily, and that they do not become stale, and that we * handle disconnections gracefully. * * @param c * @return * @throws NumberFormatException * @throws TTransportException */ public static CaratService.Client getInstance(Context c) throws NumberFormatException, TTransportException { if (SERVER_ADDRESS == null) { Properties properties = new Properties(); try { InputStream raw = c.getAssets().open(SERVER_PROPERTIES); if (raw != null) { properties.load(raw); if (properties.containsKey("PORT")) SERVER_PORT = Integer.parseInt(properties.getProperty( "PORT", "8080")); if (properties.containsKey("ADDRESS")) SERVER_ADDRESS = properties.getProperty("ADDRESS", "server.caratproject.com"); Log.d(TAG, "Set address=" + SERVER_ADDRESS + " port=" + SERVER_PORT); } else Log.e(TAG, "Could not open server property file!"); } catch (IOException e) { Log.e(TAG, "Could not open server property file: " + e.toString()); } } if (SERVER_ADDRESS == null || SERVER_PORT == 0) return null; TSocket soc = new TSocket(SERVER_ADDRESS, SERVER_PORT, 60000); TProtocol p = new TBinaryProtocol(soc, true, true); CaratService.Client instance = new CaratService.Client(p); if (soc != null && !soc.isOpen()) soc.open(); return instance; } public static CaratService.Client open(Context c) throws NumberFormatException, TTransportException { Log.d("ProtocolClient", "trying to get an instance of CaratProtocol."); return getInstance(c); } }