/*
 * Create a service descriptor from an array of methods.
 */
int NaClSrpcServiceHandlerCtor(NaClSrpcService* service,
                               const NaClSrpcHandlerDesc* handler_desc) {
  char*       service_str;
  nacl_abi_size_t  str_length;
  NaClSrpcMethodDesc* methods = NULL;
  uint32_t method_count = 0;

  /* Initialize the struct, so that failures can be cleaned up properly. */
  service->service_string = NULL;
  service->service_string_length = 0;
  service->rpc_descr = NULL;
  service->rpc_count = 0;
  /* Add the service_discovery method to the table. */
  methods = BuildMethods(handler_desc, &method_count);
  if (NULL == methods) {
    goto cleanup;
  }
  service_str = BuildSDString(methods, method_count, &str_length);
  if (NULL == service_str) {
    goto cleanup;
  }
  service->service_string = service_str;
  service->service_string_length = str_length;
  service->rpc_descr = methods;
  service->rpc_count = method_count;
  return 1;
 cleanup:
  FreeMethods(methods, method_count);
  return 0;
}
/*
 * Create a service descriptor from an array of methods.
 */
int NaClSrpcServiceHandlerCtor(NaClSrpcService* service,
                               const NaClSrpcHandlerDesc* handler_desc) {
  char*       service_str;
  nacl_abi_size_t  str_length;
  NaClSrpcMethodDesc* methods;
  uint32_t method_count;

  /* Add the service_discovery method to the table. */
  methods = BuildMethods(handler_desc, &method_count);
  if (NULL == methods) {
    return 0;
  }
  service_str = BuildSDString(methods, method_count, &str_length);
  if (NULL == service_str) {
    /* BUG: leaks methods */
    return 0;
  }
  service->service_string = service_str;
  service->service_string_length = str_length;
  service->rpc_descr = methods;
  service->rpc_count = method_count;
  return 1;
}