content: 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);
      }
      
  }
  