/*

*Copyright2004,2005TheApacheSoftwareFoundation.

*

*LicensedundertheApacheLicense,Version2.0(the"License");

*youmaynotusethisfileexceptincompliancewiththeLicense.

*YoumayobtainacopyoftheLicenseat

*

*http://www.apache.org/licenses/LICENSE-2.0

*

*Unlessrequiredbyapplicablelaworagreedtoinwriting,software

*distributedundertheLicenseisdistributedonan"ASIS"BASIS,

*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.

*SeetheLicenseforthespecificlanguagegoverningpermissionsand

*limitationsundertheLicense.

*/


#include<axis2_svc_skeleton.h>

#include<axutil_log_default.h>

#include<axutil_error_default.h>

#include<axutil_array_list.h>

#include<axiom_text.h>

#include<axiom_node.h>

#include<axiom_element.h>

#include<stdio.h>



axiom_node_t*axis2_hello_greet(constaxutil_env_t*env,

axiom_node_t*node);



intAXIS2_CALL

hello_free(axis2_svc_skeleton_t*svc_skeleton,

constaxutil_env_t*env);



axiom_node_t*AXIS2_CALL

hello_invoke(axis2_svc_skeleton_t*svc_skeleton,

constaxutil_env_t*env,

axiom_node_t*node,

axis2_msg_ctx_t*msg_ctx);





intAXIS2_CALL

hello_init(axis2_svc_skeleton_t*svc_skeleton,

constaxutil_env_t*env);



axiom_node_t*AXIS2_CALL

hello_on_fault(axis2_svc_skeleton_t*svc_skeli,

constaxutil_env_t*env,axiom_node_t*node);





axiom_node_t*

build_greeting_response(constaxutil_env_t*env,

axis2_char_t*greeting);



axiom_node_t*

axis2_hello_greet(constaxutil_env_t*env,axiom_node_t*node)

{

axiom_node_t*client_greeting_node=NULL;

axiom_node_t*return_node=NULL;



AXIS2_ENV_CHECK(env,NULL);



if(node)

{

client_greeting_node=axiom_node_get_first_child(node,env);

if(client_greeting_node&&

axiom_node_get_node_type(client_greeting_node,env)==AXIOM_TEXT)

{

axiom_text_t*greeting=(axiom_text_t*)axiom_node_get_data_element(client_greeting_node,env);

if(greeting&&axiom_text_get_value(greeting,env))

{

constaxis2_char_t*greeting_str=axiom_text_get_value(greeting,env);

printf("Clientgreetedsaying\"%s\"\n",greeting_str);

return_node=build_greeting_response(env,"HelloClient!");

}

}

}

else

{

AXIS2_ERROR_SET(env->error,AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,AXIS2_FAILURE);

printf("ERROR:invalidXMLinrequest\n");

return_node=build_greeting_response(env,"Client!Whoareyou?");

}



returnreturn_node;

}



axiom_node_t*

build_greeting_response(constaxutil_env_t*env,axis2_char_t*greeting)

{

axiom_node_t*greeting_om_node=NULL;

axiom_element_t*greeting_om_ele=NULL;



greeting_om_ele=axiom_element_create(env,NULL,"greetResponse",NULL,&greeting_om_node);



axiom_element_set_text(greeting_om_ele,env,greeting,greeting_om_node);



returngreeting_om_node;

}



staticconstaxis2_svc_skeleton_ops_thello_svc_skeleton_ops_var={

hello_init,

hello_invoke,

hello_on_fault,

hello_free

};



axis2_svc_skeleton_t*

axis2_hello_create(constaxutil_env_t*env)

{

axis2_svc_skeleton_t*svc_skeleton=NULL;

svc_skeleton=AXIS2_MALLOC(env->allocator,

sizeof(axis2_svc_skeleton_t));



svc_skeleton->ops=&hello_svc_skeleton_ops_var;



svc_skeleton->func_array=NULL;



returnsvc_skeleton;

}



intAXIS2_CALL

hello_init(axis2_svc_skeleton_t*svc_skeleton,

constaxutil_env_t*env)

{

svc_skeleton->func_array=axutil_array_list_create(env,0);

axutil_array_list_add(svc_skeleton->func_array,env,"helloString");

returnAXIS2_SUCCESS;

}



axiom_node_t*AXIS2_CALL

hello_invoke(axis2_svc_skeleton_t*svc_skeleton,

constaxutil_env_t*env,

axiom_node_t*node,

axis2_msg_ctx_t*msg_ctx)

{

returnaxis2_hello_greet(env,node);

}



axiom_node_t*AXIS2_CALL

hello_on_fault(axis2_svc_skeleton_t*svc_skeli,

constaxutil_env_t*env,axiom_node_t*node)

{

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,"EchoServiceError",NULL,

&error_node);

axiom_element_set_text(error_ele,env,"Echoservicefailed",

text_node);

returnerror_node;

}



intAXIS2_CALL

hello_free(axis2_svc_skeleton_t*svc_skeleton,

constaxutil_env_t*env)

{

if(svc_skeleton->func_array)

{

axutil_array_list_free(svc_skeleton->func_array,env);

svc_skeleton->func_array=NULL;

}



if(svc_skeleton)

{

AXIS2_FREE(env->allocator,svc_skeleton);

svc_skeleton=NULL;

}



returnAXIS2_SUCCESS;

}





AXIS2_EXPORTint

axis2_get_instance(axis2_svc_skeleton_t**inst,

constaxutil_env_t*env)

{

*inst=axis2_hello_create(env);

if(!(*inst))

{

returnAXIS2_FAILURE;

}



returnAXIS2_SUCCESS;

}



AXIS2_EXPORTint

axis2_remove_instance(axis2_svc_skeleton_t*inst,

constaxutil_env_t*env)

{

axis2_status_tstatus=AXIS2_FAILURE;

if(inst)

{

status=AXIS2_SVC_SKELETON_FREE(inst,env);

}

returnstatus;

}