| 
					
				 | 
			
			
				@@ -41,41 +41,33 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define MAX_RESOLVERS 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-typedef struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char *scheme; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_resolver_factory *factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} registered_resolver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static registered_resolver g_all_of_the_resolvers[MAX_RESOLVERS]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static grpc_resolver_factory *g_all_of_the_resolvers[MAX_RESOLVERS]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int g_number_of_resolvers = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static char *g_default_resolver_scheme; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static char *g_default_resolver_prefix; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_resolver_registry_init(const char *default_resolver_scheme) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_resolver_registry_init(const char *default_resolver_prefix) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   g_number_of_resolvers = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_default_resolver_scheme = gpr_strdup(default_resolver_scheme); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  g_default_resolver_prefix = gpr_strdup(default_resolver_prefix); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_resolver_registry_shutdown(void) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < g_number_of_resolvers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpr_free(g_all_of_the_resolvers[i].scheme); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_resolver_factory_unref(g_all_of_the_resolvers[i].factory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_resolver_factory_unref(g_all_of_the_resolvers[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_free(g_default_resolver_scheme); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_free(g_default_resolver_prefix); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_register_resolver_type(const char *scheme, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                 grpc_resolver_factory *factory) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_register_resolver_type(grpc_resolver_factory *factory) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < g_number_of_resolvers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(0 != strcmp(scheme, g_all_of_the_resolvers[i].scheme)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GPR_ASSERT(0 != strcmp(factory->vtable->scheme, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           g_all_of_the_resolvers[i]->vtable->scheme)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GPR_ASSERT(g_number_of_resolvers != MAX_RESOLVERS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_all_of_the_resolvers[g_number_of_resolvers].scheme = gpr_strdup(scheme); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_resolver_factory_ref(factory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_all_of_the_resolvers[g_number_of_resolvers].factory = factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_number_of_resolvers++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  g_all_of_the_resolvers[g_number_of_resolvers++] = factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static grpc_resolver_factory *lookup_factory(grpc_uri *uri) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -85,40 +77,57 @@ static grpc_resolver_factory *lookup_factory(grpc_uri *uri) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!uri) return NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < g_number_of_resolvers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (0 == strcmp(uri->scheme, g_all_of_the_resolvers[i].scheme)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return g_all_of_the_resolvers[i].factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (0 == strcmp(uri->scheme, g_all_of_the_resolvers[i]->vtable->scheme)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return g_all_of_the_resolvers[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-grpc_resolver *grpc_resolver_create( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const char *name, grpc_subchannel_factory *subchannel_factory) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_uri *uri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static grpc_resolver_factory *resolve_factory(const char *target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              grpc_uri **uri) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char *tmp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_resolver_factory *factory = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_resolver *resolver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  uri = grpc_uri_parse(name, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  factory = lookup_factory(uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (factory == NULL && g_default_resolver_scheme != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_uri_destroy(uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpr_asprintf(&tmp, "%s%s", g_default_resolver_scheme, name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    uri = grpc_uri_parse(tmp, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    factory = lookup_factory(uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (factory == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_uri_destroy(grpc_uri_parse(name, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_uri_destroy(grpc_uri_parse(tmp, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", name, tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(uri != NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *uri = grpc_uri_parse(target, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  factory = lookup_factory(*uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (factory == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (g_default_resolver_prefix != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_uri_destroy(*uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_asprintf(&tmp, "%s%s", g_default_resolver_prefix, target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      *uri = grpc_uri_parse(tmp, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      factory = lookup_factory(*uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (factory == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        grpc_uri_destroy(grpc_uri_parse(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        grpc_uri_destroy(grpc_uri_parse(tmp, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_uri_destroy(grpc_uri_parse(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "don't know how to resolve '%s'", target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpr_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else if (factory == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_uri_destroy(grpc_uri_parse(name, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpr_log(GPR_ERROR, "don't know how to resolve '%s'", name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  resolver = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+grpc_resolver *grpc_resolver_create( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const char *target, grpc_subchannel_factory *subchannel_factory) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_uri *uri = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_resolver_factory *factory = resolve_factory(target, &uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_resolver *resolver = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       grpc_resolver_factory_create_resolver(factory, uri, subchannel_factory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_uri_destroy(uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return resolver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+char *grpc_get_default_authority(const char *target) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_uri *uri = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_resolver_factory *factory = resolve_factory(target, &uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char *authority = grpc_resolver_factory_get_default_authority(factory, uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_uri_destroy(uri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return authority; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |