Author: damitha
Date: Wed Mar 4 07:11:16 2009
New Revision: 749928
URL: http://svn.apache.org/viewvc?rev=749928&view=rev
Log:
Currently notify to address is not currently serialized or deserialized in
messages. Fixing this.
Modified:
webservices/savan/trunk/c/samples/client/subscriber/subscriber.c
webservices/savan/trunk/c/samples/server/weather/weather.c
webservices/savan/trunk/c/samples/server/weather/weather.h
webservices/savan/trunk/c/samples/server/weather/weather_skeleton.c
webservices/savan/trunk/c/src/data/module.xml
webservices/savan/trunk/c/src/storage/registry/storage_mgr.c
webservices/savan/trunk/c/src/util/savan_util.c
Modified: webservices/savan/trunk/c/samples/client/subscriber/subscriber.c
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/samples/client/subscriber/subscriber.c?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/samples/client/subscriber/subscriber.c (original)
+++ webservices/savan/trunk/c/samples/client/subscriber/subscriber.c Wed Mar 4
07:11:16 2009
@@ -25,10 +25,16 @@
#include <savan_client.h>
#include <savan_constants.h>
-void init_event_source(axutil_env_t* env, axis2_char_t *home);
+static void event_source_handle_lifecycle(
+ axutil_env_t* env,
+ axis2_svc_client_t *svc_client,
+ axis2_char_t *address,
+ axis2_char_t *action);
axiom_node_t *
-build_om_payload_for_echo_svc(const axutil_env_t *env);
+build_om_payload_for_weather_svc(
+ const axutil_env_t *env,
+ axis2_char_t *node_name);
int main(int argc, char** argv)
{
@@ -50,9 +56,7 @@
printf("Starting Savan subscriber...\n");
client_home = AXIS2_GETENV("AXIS2C_HOME");
-
- /*init_event_source((axutil_env_t*)env, client_home);*/
-
+
/* Set end point reference of echo service */
address = "http://localhost:9090/axis2/services/weather";
if (argc > 1 )
@@ -110,71 +114,101 @@
/* Create a savan client */
savan_client = savan_client_create(env);
- printf("Select the action:\n"\
- "1 subscribe\n"\
- "2 renew\n"\
- "3 get status\n"\
- "4 unsubscribe\n"\
- "5 start weather event source\n"\
- "6 stop weather event source\n");
-
- scanf("%d", &action);
-
- if(1 == action) /* Send subscribe message */
- {
- status = savan_client_subscribe(savan_client, env, svc_client,
savan_options);
-
- if (status == AXIS2_SUCCESS)
+ while(AXIS2_TRUE)
+ {
+ printf("\nSelect the action:\n"\
+ "1 subscribe\n"\
+ "2 renew\n"\
+ "3 get status\n"\
+ "4 unsubscribe\n"\
+ "5 start weather event source\n"\
+ "6 stop weather event source\n"\
+ "7 quit\n\n");
+
+ scanf("%d", &action);
+
+ if(1 == action) /* Send subscribe message */
{
- printf("Subscribe successful\n");
- printf("Subscription ID: %s\n",
savan_client_get_sub_id(savan_client));
+ status = savan_client_subscribe(savan_client, env, svc_client,
savan_options);
+
+ if (status == AXIS2_SUCCESS)
+ {
+ printf("Subscribe successful\n");
+ printf("Subscription ID: %s\n",
savan_client_get_sub_id(savan_client));
+ }
+ else
+ {
+ printf("Subscription Failed\n");
+ exit(0);
+ }
}
- else
+ else if(2 == action)
{
- printf("Subscription Failed\n");
- exit(0);
+ printf("Renewing subscription...\n");
+ address = savan_client_get_sub_url(savan_client);
+ printf("address:%s\n", address);
+ endpoint_ref = axis2_options_get_to(options, env);
+ axis2_endpoint_ref_set_address(endpoint_ref, env, address);
+ /*axutil_hash_set(savan_options, SAVAN_OP_KEY_EXPIRES,
AXIS2_HASH_KEY_STRING, "2010-02-12T06:54Z");*/
+ axutil_hash_set(savan_options, SAVAN_OP_KEY_EXPIRES,
AXIS2_HASH_KEY_STRING, "2009-04-26T21:07:00.000-08:00");
+ /*axutil_hash_set(savan_options, SAVAN_OP_KEY_EXPIRES,
AXIS2_HASH_KEY_STRING, "P3Y6M4DT12H30M5S");*/
+ status = savan_client_renew(savan_client, env, svc_client,
savan_options);
+ if (status == AXIS2_SUCCESS)
+ {
+ printf("Renew successful\n");
+ }
}
- }
- else if(2 == action)
- {
- printf("Renewing subscription...\n");
- address = savan_client_get_sub_url(savan_client);
- printf("address:%s\n", address);
- endpoint_ref = axis2_options_get_to(options, env);
- axis2_endpoint_ref_set_address(endpoint_ref, env, address);
- /*axutil_hash_set(savan_options, SAVAN_OP_KEY_EXPIRES,
AXIS2_HASH_KEY_STRING, "2010-02-12T06:54Z");*/
- axutil_hash_set(savan_options, SAVAN_OP_KEY_EXPIRES,
AXIS2_HASH_KEY_STRING, "2009-04-26T21:07:00.000-08:00");
- /*axutil_hash_set(savan_options, SAVAN_OP_KEY_EXPIRES,
AXIS2_HASH_KEY_STRING, "P3Y6M4DT12H30M5S");*/
- status = savan_client_renew(savan_client, env, svc_client,
savan_options);
- if (status == AXIS2_SUCCESS)
+ else if(3 == action)
{
- printf("Renew successful\n");
+ printf("Getting status of subscription...\n");
+ address = savan_client_get_sub_url(savan_client);
+ endpoint_ref = axis2_options_get_to(options, env);
+ axis2_endpoint_ref_set_address(endpoint_ref, env, address);
+ axis2_svc_client_remove_all_headers(svc_client, env);
+ subs_status = savan_client_get_status(savan_client, env,
svc_client);
+ if (subs_status)
+ {
+ printf("Subscription expires on:%s\n", subs_status);
+ }
}
- }
- else if(3 == action)
- {
- printf("Getting status of subscription...\n");
- address = savan_client_get_sub_url(savan_client);
- endpoint_ref = axis2_options_get_to(options, env);
- axis2_endpoint_ref_set_address(endpoint_ref, env, address);
- axis2_svc_client_remove_all_headers(svc_client, env);
- subs_status = savan_client_get_status(savan_client, env, svc_client);
- if (subs_status)
+ else if(4 == action)
{
- printf("GetStatus successful\n");
+ printf("Unsubscribing...\n");
+ address = savan_client_get_sub_url(savan_client);
+ endpoint_ref = axis2_options_get_to(options, env);
+ axis2_endpoint_ref_set_address(endpoint_ref, env, address);
+ axis2_svc_client_remove_all_headers(svc_client, env);
+ status = savan_client_unsubscribe(savan_client, env, svc_client);
+ if (status == AXIS2_SUCCESS)
+ {
+ printf("Unsubscribe successful\n");
+ }
}
- }
- else if(4 == action)
- {
- printf("Unsubscribing...\n");
- address = savan_client_get_sub_url(savan_client);
- endpoint_ref = axis2_options_get_to(options, env);
- axis2_endpoint_ref_set_address(endpoint_ref, env, address);
- axis2_svc_client_remove_all_headers(svc_client, env);
- status = savan_client_unsubscribe(savan_client, env, svc_client);
- if (status == AXIS2_SUCCESS)
+ else if(5 == action)
+ {
+ axis2_options_set_action(options, env,
+ "http://ws.apache.org/axis2/c/savan/samples/weather/start");
+ endpoint_ref = axis2_options_get_to(options, env);
+ axis2_endpoint_ref_set_address(endpoint_ref, env, address);
+ axis2_svc_client_remove_all_headers(svc_client, env);
+ event_source_handle_lifecycle((axutil_env_t*)env, svc_client,
address, "start");
+ }
+ else if(6 == action)
{
- printf("Unsubscribe successful\n");
+ axis2_options_set_action(options, env,
+ "http://ws.apache.org/axis2/c/savan/samples/weather/stop");
+ endpoint_ref = axis2_options_get_to(options, env);
+ axis2_endpoint_ref_set_address(endpoint_ref, env, address);
+ axis2_svc_client_remove_all_headers(svc_client, env);
+ event_source_handle_lifecycle((axutil_env_t*)env, svc_client,
address, "stop");
+ }
+ else if(7 == action)
+ {
+ break;
+ }
+ else
+ {
+ break;
}
}
@@ -188,47 +222,18 @@
}
-void init_event_source(axutil_env_t* env, axis2_char_t *home)
+static void event_source_handle_lifecycle(
+ axutil_env_t* env,
+ axis2_svc_client_t *svc_client,
+ axis2_char_t *address,
+ axis2_char_t *action)
{
- const axis2_char_t *address = NULL;
- axis2_endpoint_ref_t* endpoint_ref = NULL;
- axis2_options_t *options = NULL;
- axis2_svc_client_t* svc_client = NULL;
axiom_node_t *ret_node = NULL;
axiom_node_t *payload = NULL;
- AXIS2_LOG_INFO(env->log, "Initializing event source...");
- printf("Initializing event source...");
-
- /* Set end point reference of echo service */
- address = "http://localhost:9090/axis2/services/weather";
-
- /* Create EPR with given address */
- endpoint_ref = axis2_endpoint_ref_create(env, address);
-
- /* Setup options */
- options = axis2_options_create(env);
- axis2_options_set_to(options, env, endpoint_ref);
- axis2_options_set_action(options, env,
- "http://ws.apache.org/axis2/c/savan/samples/weather/start");
-
- /* Create service client */
- svc_client = axis2_svc_client_create(env, home);
- if (!svc_client)
- {
- printf("Error creating service client\n");
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Client invoke failed: Error
code:"
- " %d :: %s", env->error->error_number,
- AXIS2_ERROR_GET_MESSAGE(env->error));
- }
+ AXIS2_LOG_INFO(env->log, "[savan] event_source_handle_lifecycle");
- /* Set service client options */
- axis2_svc_client_set_options(svc_client, env, options);
-
- /* Engage addressing module */
- axis2_svc_client_engage_module(svc_client, env, AXIS2_MODULE_ADDRESSING);
-
- payload = build_om_payload_for_echo_svc(env);
+ payload = build_om_payload_for_weather_svc(env, action);
/* Send request */
ret_node = axis2_svc_client_send_receive(svc_client, env, payload);
@@ -236,43 +241,33 @@
if(ret_node)
{
axis2_char_t *om_str = NULL;
+
om_str = axiom_node_to_string(ret_node, env);
if (om_str)
- printf("\nReceived OM : %s\n", om_str);
- printf("\nPublisher init successful\n");
+ {
+ printf("\n%s\n", om_str);
+ }
}
else
{
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke FAILED: Error
code:"
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invoke FAILED: Error code:"
" %d :: %s", env->error->error_number,
AXIS2_ERROR_GET_MESSAGE(env->error));
- printf("\nPublisher init failed\n");
+ printf("\nWeather event source call failed\n");
}
- if(svc_client)
- axis2_svc_client_free(svc_client, env);
}
-
-/* build SOAP request message content using OM */
axiom_node_t *
-build_om_payload_for_echo_svc(const axutil_env_t *env)
+build_om_payload_for_weather_svc(
+ const axutil_env_t *env,
+ axis2_char_t *node_name)
{
- axiom_node_t *echo_om_node = NULL;
- axiom_element_t* echo_om_ele = NULL;
- axiom_node_t* text_om_node = NULL;
- axiom_element_t * text_om_ele = NULL;
- axiom_namespace_t *ns1 = NULL;
- axis2_char_t *om_str = NULL;
-
- ns1 = axiom_namespace_create(env, "http://ws.apache.org/axis2/c/samples",
"ns1");
- echo_om_ele = axiom_element_create(env, NULL, "echoString", ns1,
&echo_om_node);
- text_om_ele = axiom_element_create(env, echo_om_node, "text", NULL,
&text_om_node);
- axiom_element_set_text(text_om_ele, env, "echo5", text_om_node);
+ axiom_node_t *om_node = NULL;
+ axiom_element_t* om_ele = NULL;
+ axiom_namespace_t *ns = NULL;
- om_str = axiom_node_to_string(echo_om_node, env);
- if (om_str)
- {
- AXIS2_FREE(env->allocator, om_str);
- om_str = NULL;
- }
- return echo_om_node;
+ ns = axiom_namespace_create(env,
"http://ws.apache.org/axis2/c/savan/samples/weather", "ns");
+ om_ele = axiom_element_create(env, NULL, node_name, ns, &om_node);
+
+ return om_node;
}
+
Modified: webservices/savan/trunk/c/samples/server/weather/weather.c
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/samples/server/weather/weather.c?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/samples/server/weather/weather.c (original)
+++ webservices/savan/trunk/c/samples/server/weather/weather.c Wed Mar 4
07:11:16 2009
@@ -21,40 +21,55 @@
#include "weather.h"
axiom_node_t *
-build_om_programatically(const axutil_env_t *env, axis2_char_t *text);
+build_om_programatically(
+ const axutil_env_t *env,
+ axis2_char_t *text);
axiom_node_t *
-axis2_weather_start(const axutil_env_t *env, axiom_node_t *node)
+axis2_weather_start(
+ const axutil_env_t *env,
+ axiom_node_t *node)
{
axiom_node_t *ret_node = NULL;
- printf("Weather service start called.\n");
+ ret_node = build_om_programatically(env, "Weather event source started
successfully");
- AXIS2_ENV_CHECK(env, NULL);
+ return ret_node;
+}
- ret_node = build_om_programatically(env, "Publisher started");
+axiom_node_t *
+axis2_weather_stop(
+ const axutil_env_t *env,
+ axiom_node_t *node)
+{
+ axiom_node_t *ret_node = NULL;
+
+ ret_node = build_om_programatically(env, "Weather event source stopped
successfully");
return ret_node;
}
+
/* Builds the response content */
axiom_node_t *
-build_om_programatically(const axutil_env_t *env, axis2_char_t *text)
+build_om_programatically(
+ const axutil_env_t *env,
+ axis2_char_t *text)
{
- axiom_node_t *echo_om_node = NULL;
- axiom_element_t* echo_om_ele = NULL;
+ axiom_node_t *om_node = NULL;
+ axiom_element_t* om_ele = NULL;
axiom_node_t* text_om_node = NULL;
axiom_element_t * text_om_ele = NULL;
- axiom_namespace_t *ns1 = NULL;
+ axiom_namespace_t *ns = NULL;
- ns1 = axiom_namespace_create (env, "http://ws.apache.org/axis2/c/samples",
"ns1");
+ ns = axiom_namespace_create (env,
"http://ws.apache.org/axis2/c/savan/samples/weather", "ns");
- echo_om_ele = axiom_element_create(env, NULL, "echoString", ns1,
&echo_om_node);
+ om_ele = axiom_element_create(env, NULL, "weather", ns, &om_node);
- text_om_ele = axiom_element_create(env, echo_om_node, "text", NULL,
&text_om_node);
+ text_om_ele = axiom_element_create(env, om_node, "text", NULL,
&text_om_node);
axiom_element_set_text(text_om_ele, env, text, text_om_node);
- return echo_om_node;
+ return om_node;
}
Modified: webservices/savan/trunk/c/samples/server/weather/weather.h
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/samples/server/weather/weather.h?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/samples/server/weather/weather.h (original)
+++ webservices/savan/trunk/c/samples/server/weather/weather.h Wed Mar 4
07:11:16 2009
@@ -19,6 +19,14 @@
#include <axiom_node.h>
-axiom_node_t *axis2_weather_start(const axutil_env_t *env, axiom_node_t *node);
+axiom_node_t *
+axis2_weather_start(
+ const axutil_env_t *env,
+ axiom_node_t *node);
+
+axiom_node_t *
+axis2_weather_stop(
+ const axutil_env_t *env,
+ axiom_node_t *node);
#endif /* PUBLISHER_H*/
Modified: webservices/savan/trunk/c/samples/server/weather/weather_skeleton.c
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/samples/server/weather/weather_skeleton.c?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/samples/server/weather/weather_skeleton.c
(original)
+++ webservices/savan/trunk/c/samples/server/weather/weather_skeleton.c Wed Mar
4 07:11:16 2009
@@ -131,7 +131,7 @@
axis2_conf_t *conf)
{
weather_init(svc_skeleton, env);
- start_weather_thread(env, conf);
+ /*start_weather_thread(env, conf); */
return AXIS2_SUCCESS;
}
@@ -155,6 +155,7 @@
*/
if (node)
{
+ AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "node:%s",
axiom_node_to_string(node, env));
if (axiom_node_get_node_type(node, env) == AXIOM_ELEMENT)
{
axiom_element_t *element = NULL;
@@ -164,15 +165,18 @@
{
axis2_char_t *op_name =
axiom_element_get_localname(element, env);
+ AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "op_name:%s", op_name);
if (op_name)
{
if (axutil_strcmp(op_name, "start") == 0)
{
start_weather_thread(env, conf);
+ return axis2_weather_start(env, node);
}
if (axutil_strcmp(op_name, "stop") == 0)
{
stop_weather_thread(env, conf);
+ return axis2_weather_stop(env, node);
}
}
}
@@ -222,7 +226,7 @@
param = axis2_svc_get_param(svc, env, WEATHER_STATUS);
if(param)
{
- axutil_param_set_value(param, env, AXIS2_VALUE_FALSE);
+ axutil_param_set_value(param, env, axutil_strdup(env,
AXIS2_VALUE_FALSE));
}
}
@@ -237,9 +241,9 @@
axiom_node_t *error_node = NULL;
axiom_node_t* text_node = NULL;
axiom_element_t *error_ele = NULL;
- error_ele = axiom_element_create(env, node, "TestServiceError", NULL,
+ error_ele = axiom_element_create(env, node, "WeatherServiceError", NULL,
&error_node);
- axiom_element_set_text(error_ele, env, "Test service failed ",
+ axiom_element_set_text(error_ele, env, "Weather service failed ",
text_node);
return error_node;
}
@@ -288,14 +292,14 @@
env = axutil_init_thread_env(main_env);
svc = axis2_conf_get_svc(conf, env, WEATHER);
- param = axutil_param_create(env, WEATHER_STATUS, AXIS2_VALUE_TRUE);
+ param = axutil_param_create(env, WEATHER_STATUS, axutil_strdup(env,
AXIS2_VALUE_TRUE));
if(!param)
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
axis2_svc_add_param(svc, env, param);
- while(axutil_strcmp(value, AXIS2_VALUE_TRUE))
+ while(!axutil_strcmp(value, AXIS2_VALUE_TRUE))
{
AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan] Inside while loop");
{
@@ -309,12 +313,13 @@
axiom_element_set_text(test_elem1, env, "sunny day",
test_node1);
- /*savan_publishing_client_publish(pub_client, env, test_node,
topic);*/
+ savan_publishing_client_publish(pub_client, env, test_node, NULL);
savan_publishing_client_free(pub_client, env);
param = axis2_svc_get_param(svc, env, WEATHER_STATUS);
if(param)
{
value = axutil_param_get_value(param, env);
+ AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan] value:%s",
value);
}
}
AXIS2_SLEEP(5);
Modified: webservices/savan/trunk/c/src/data/module.xml
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/data/module.xml?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/src/data/module.xml (original)
+++ webservices/savan/trunk/c/src/data/module.xml Wed Mar 4 07:11:16 2009
@@ -2,9 +2,9 @@
<!-- Resource parameters -->
<!-- savan_storage could be one of inmemory, sqlite and service-->
<parameter name="savan_resource" locked="false">/tmp/savan_db</parameter>
- <!--parameter name="savan_resource"
locked="false">http://localhost:9762/registry</parameter-->
- <!--parameter name="username" locked="false">admin</parameter-->
- <!--parameter name="password" locked="false">admin</parameter-->
+ <!--parameter name="savan_resource"
locked="false">http://localhost:9762/registry</parameter>
+ <parameter name="username" locked="false">admin</parameter>
+ <parameter name="password" locked="false">admin</parameter-->
<parameter name="savan_filter_template_path"
locked="false">/axis2c/deploy/modules/savan/template.xsl</parameter>
<inflow>
<handler name="SavanInHandler" class="mod_savan">
Modified: webservices/savan/trunk/c/src/storage/registry/storage_mgr.c
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/storage/registry/storage_mgr.c?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/src/storage/registry/storage_mgr.c (original)
+++ webservices/savan/trunk/c/src/storage/registry/storage_mgr.c Wed Mar 4
07:11:16 2009
@@ -32,7 +32,7 @@
#define ELEM_NAME_SUBSCRIPTION "subscription"
#define ELEM_NAME_ENDPOINT "endpoint"
#define ELEM_NAME_ADDRESS "address"
-#define ATTR_NAME_URL "url"
+#define ATTR_NAME_URL "uri"
#define EPR_TYPE "application/vnd.epr"
#define TOPIC_INDEX_PARENT_PATH "/eventing/index"
#define SUBSCRIPTION_COLLECTION_NAME "system.subscriptions"
@@ -707,7 +707,8 @@
axis2_char_t *notifyto = NULL;
char *content = NULL;
- AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan]
Entry:savan_msg_recv_handle_sub_request");
+ AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI,
+ "[savan] Entry:savan_registry_storage_mgr_serialize_endpoint");
/* Format of the message is as
* <subscription><syn:endpoint
xmlns:syn="http://ws.apache.org/ns/synapse"><syn:address uri=
@@ -732,6 +733,8 @@
axiom_element_add_attribute(addr_elem, env, url_attr, addr_node);
content = (char *) axiom_node_to_string(subs_node, env);
+ AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI,
+ "[savan] Exit:savan_registry_storage_mgr_serialize_endpoint");
return content;
}
Modified: webservices/savan/trunk/c/src/util/savan_util.c
URL:
http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/util/savan_util.c?rev=749928&r1=749927&r2=749928&view=diff
==============================================================================
--- webservices/savan/trunk/c/src/util/savan_util.c (original)
+++ webservices/savan/trunk/c/src/util/savan_util.c Wed Mar 4 07:11:16 2009
@@ -604,7 +604,7 @@
{
/* TODO: decide how to set expiry time */
- return NULL;
+ return "*";
}
axis2_char_t * AXIS2_CALL
@@ -841,7 +841,7 @@
axutil_qname_free(qname, env);
if(notify_elem)
{
- qname = axutil_qname_create(env, ELEM_NAME_NOTIFYTO,
EVENTING_NAMESPACE, NULL);
+ qname = axutil_qname_create(env, ELEM_NAME_ADDR,
AXIS2_WSA_NAMESPACE_SUBMISSION, NULL);
address_elem =
axiom_element_get_first_child_with_qname(notify_elem, env, qname,
notify_node, &address_node);
axutil_qname_free(qname, env);