blob: 7bd84bbda1aa237b3cad0f533e74d7bd35afe348 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2004-2006 Intel Corp. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of Intel Corp. nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
/**
* @author Anas Nashif
* @author Liang Hou
* Contributions from:
* @author Sumeet Kukreja, Dell Inc.
*/
#ifdef HAVE_CONFIG_H
#include "wsman_config.h"
#endif
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "u/libu.h"
#include "wsman-xml-api.h"
#include "wsman-soap.h"
#include "wsman-xml.h"
#include "wsman-client-api.h"
#include "wsman-xml-serializer.h"
#include "wsman-soap-envelope.h"
#include "wsman-soap-message.h"
#include "sfcc-interface.h"
#include "cim_data.h"
static void
CimResource_destroy(CimClientInfo *cimclient)
{
if (!cimclient)
return;
if (cimclient->resource_uri)
u_free(cimclient->resource_uri);
if (cimclient->method)
u_free(cimclient->method);
if (cimclient->requested_class)
u_free(cimclient->requested_class);
if (cimclient->method_args) {
/* NOTE: clean up is performed with call to wsman_free_method_hnode() and hash_free() */
hash_free(cimclient->method_args);
}
if (cimclient->selectors) {
hash_free(cimclient->selectors);
debug("selectors destroyed");
}
if (cimclient->username)
u_free(cimclient->username);
if (cimclient->password)
u_free(cimclient->password);
cim_release_client(cimclient);
u_free(cimclient);
debug("cimclient destroyed");
return;
}
static CimClientInfo*
CimResource_Init(WsContextH cntx, char *username, char *password)
{
char *_tmp = NULL;
char *resource_uri = NULL;
char *show_extensions;
char *exclude_nil_properties;
CimClientInfo *cimclient= (CimClientInfo *)u_zalloc(sizeof(CimClientInfo));
if(!cimclient){
return NULL;
}
WsmanStatus status;
wsman_status_init(&status);
resource_uri = wsman_get_resource_uri(cntx, NULL);
debug ("username: %s, password: %s", username, (password)?"XXXXX":"Not Set" );
debug("Connecting using sfcc %s frontend", get_cim_client_frontend());
cimclient->cc = (void *)cim_connect_to_cimom(get_cim_host(),
get_cim_port(), username, password , get_cim_client_frontend(), &status);
if (!cimclient->cc) {
CimResource_destroy(cimclient);
u_free(status.fault_msg);
return NULL;
}
cimclient->cntx = cntx;
cimclient->namespaces = get_vendor_namespaces();
cimclient->selectors = wsman_get_selector_list(cntx, NULL);
cimclient->requested_class = wsman_get_class_name(cntx);
cimclient->method = wsman_get_method_name(cntx);
if(username) {
cimclient->username = u_strdup(username);
}
if(password) {
cimclient->password = u_strdup(password);
}
if (cimclient->selectors) {
_tmp = cim_get_namespace_selector(cimclient->selectors);
}
if (_tmp) {
cimclient->cim_namespace = _tmp;
} else {
cimclient->cim_namespace = get_cim_namespace();
}
if(resource_uri) {
cimclient->resource_uri = u_strdup(resource_uri);
cimclient->method_args = wsman_get_method_args(cntx, resource_uri );
}
show_extensions = wsman_get_option_set(cntx, NULL, WSMB_SHOW_EXTENSION );
if (show_extensions && strcmp(show_extensions, "true") == 0) {
cimclient->flags |= FLAG_CIM_EXTENSIONS;
}
exclude_nil_properties = wsman_get_option_set(cntx, NULL, WSMB_EXCLUDE_NIL_PROPS);
if (exclude_nil_properties && strcmp(exclude_nil_properties, "true") == 0) {
cimclient->flags |= FLAG_CIM_SCHEMA_OPT;
}
if (get_omit_schema_optional() == 1) {
cimclient->flags |= FLAG_CIM_SCHEMA_OPT;
}
u_free(show_extensions);
u_free(status.fault_msg);
return cimclient;
}
static int
verify_class_namespace(CimClientInfo *client)
{
hscan_t hs;
hnode_t *hn;
int rv = 0;
if(!client){
return 0;
}
if (client->resource_uri && (strcmp( client->resource_uri, CIM_ALL_AVAILABLE_CLASSES ) ==0) ) {
return 1;
}
if ( client->resource_uri && (strstr( client->resource_uri, XML_NS_CIM_INTRINSIC ) != NULL )) {
return 1;
}
/* Ok if class schema is CIM, uri starts with XML_NS_CIM_CLASS
* and method is not 'Create' (CIM_ is abstract, cannot be created)
*/
if (client->requested_class && client->resource_uri && client->method
&& (strncmp(client->requested_class, "CIM_", 4) == 0 )
&& (strstr(client->resource_uri , XML_NS_CIM_CLASS) == client->resource_uri )
&& (strcmp(client->method, TRANSFER_CREATE) != 0)) {
return 1;
}
if (client->requested_class && client->namespaces && client->resource_uri) {
hash_scan_begin(&hs, client->namespaces);
while ((hn = hash_scan_next(&hs))) {
if ( ( strstr(client->requested_class,
(char*) hnode_getkey(hn)) != NULL) &&
(strstr(client->resource_uri ,
(char*) hnode_get(hn) ) != NULL) ) {
rv = 1;
break;
}
}
}
return rv;
}
int
CimResource_Delete_EP( SoapOpH op,
void* appData,
void *opaqueData )
{
WsmanStatus status;
CimClientInfo *cimclient = NULL;
SoapH soap = soap_get_op_soap(op);
WsmanMessage *msg = wsman_get_msg_from_op(op);
WsXmlDocH in_doc = NULL;
WsXmlDocH doc = NULL;
WsContextH cntx;
debug( "Delete Endpoint Called");
wsman_status_init(&status);
in_doc = soap_get_op_doc(op, 1);
cntx = ws_create_ep_context(soap, in_doc);
if (!msg) {
status.fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status.fault_detail_code=0;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
msg->auth_data.username,
msg->auth_data.password );
if (!cimclient) {
status.fault_code = WSA_ENDPOINT_UNAVAILABLE;
status.fault_detail_code = 0;
goto cleanup;
}
if (!verify_class_namespace(cimclient) ) {
status.fault_code = WSA_DESTINATION_UNREACHABLE;
status.fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
} else if ( (doc = wsman_create_response_envelope( in_doc, NULL)) ) {
if (strstr(cimclient->resource_uri , XML_NS_CIM_CLASS ) != NULL) {
cim_delete_instance_from_enum(cimclient, &status);
} else {
debug("no base class, getting instance directly with getInstance");
cim_delete_instance(cimclient, &status);
}
}
cleanup:
if (wsman_check_status(&status) != 0) {
ws_xml_destroy_doc(doc);
doc = wsman_generate_fault( soap_get_op_doc(op, 1),
status.fault_code, status.fault_detail_code, status.fault_msg);
}
if (doc) {
soap_set_op_doc(op, doc, 0);
} else {
error("Invalid doc");
}
CimResource_destroy(cimclient);
ws_destroy_context(cntx);
u_free(status.fault_msg);
return 0;
}
int
CimResource_Get_EP( SoapOpH op,
void* appData,
void *opaqueData )
{
WsXmlDocH doc = NULL;
WsmanStatus status;
CimClientInfo *cimclient = NULL;
char *fragstr = NULL;
WsmanMessage *msg = wsman_get_msg_from_op(op);
SoapH soap = soap_get_op_soap(op);
WsXmlDocH in_doc = soap_get_op_doc(op, 1);
WsContextH cntx = ws_create_ep_context(soap, in_doc);
wsman_status_init(&status);
if (!msg) {
status.fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status.fault_detail_code=0;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
msg->auth_data.username,
msg->auth_data.password );
if (!cimclient) {
status.fault_code = WSA_ENDPOINT_UNAVAILABLE;
status.fault_detail_code = 0;
goto cleanup;
}
if (!verify_class_namespace(cimclient) ) {
status.fault_code = WSA_DESTINATION_UNREACHABLE;
status.fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
} else {
if ( (doc = wsman_create_response_envelope( in_doc, NULL)) ) {
WsXmlNodeH body = ws_xml_get_soap_body(doc);
fragstr = wsman_get_fragment_string(cntx, in_doc);
if(fragstr)
body = ws_xml_add_child(body, XML_NS_WS_MAN, WSM_XML_FRAGMENT,
NULL);
if (strstr(cimclient->resource_uri , XML_NS_CIM_CLASS ) != NULL) {
cim_get_instance_from_enum(cimclient, cntx, body, fragstr, &status);
} else {
debug("no base class, getting instance directly with getInstance");
cim_get_instance(cimclient, cntx, body, fragstr, &status);
}
}
}
cleanup:
if (wsman_check_status(&status) != 0) {
ws_xml_destroy_doc(doc);
doc = wsman_generate_fault( soap_get_op_doc(op, 1),
status.fault_code, status.fault_detail_code, status.fault_msg);
}
if ( doc ) {
soap_set_op_doc(op, doc, 0);
} else {
debug( "Invalid doc" );
}
CimResource_destroy(cimclient);
ws_destroy_context(cntx);
u_free(status.fault_msg);
return 0;
}
int
CimResource_Custom_EP( SoapOpH op,
void* appData,
void *opaqueData )
{
debug( "Custom Method Endpoint Called");
WsXmlDocH doc = NULL, in_doc = NULL;
CimClientInfo *cimclient = NULL;
WsmanStatus status;
WsmanMessage *msg = NULL;
char *action;
WsContextH cntx;
wsman_status_init(&status);
in_doc = soap_get_op_doc(op, 1);
cntx = ws_create_ep_context(soap_get_op_soap(op), in_doc);
msg = wsman_get_msg_from_op(op);
action = wsman_get_action(cntx, in_doc );
if (!msg) {
status.fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status.fault_detail_code=0;
goto cleanup;
}
cimclient = CimResource_Init(cntx, msg->auth_data.username,
msg->auth_data.password);
if (!cimclient) {
status.fault_code = WSA_ENDPOINT_UNAVAILABLE;
status.fault_detail_code = 0;
goto cleanup;
}
if (action && cimclient->resource_uri &&
!strstr(action, cimclient->resource_uri)) {
status.fault_code = WSA_ACTION_NOT_SUPPORTED;
status.fault_detail_code = OWSMAN_NO_DETAILS;
debug("action not supported");
goto cleanup;
}
if (!verify_class_namespace(cimclient) ) {
status.fault_code = WSA_DESTINATION_UNREACHABLE;
status.fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
} else {
if ((doc = wsman_create_response_envelope( in_doc, NULL))) {
WsXmlNodeH body = ws_xml_get_soap_body(doc);
cim_invoke_method(cimclient, cntx, body, &status);
}
}
cleanup:
if (wsman_check_status(&status) != 0) {
ws_xml_destroy_doc(doc);
doc = wsman_generate_fault( in_doc,
status.fault_code, status.fault_detail_code, status.fault_msg);
}
if (doc) {
soap_set_op_doc(op, doc, 0);
} else {
error("Invalid doc");
}
ws_destroy_context(cntx);
CimResource_destroy(cimclient);
u_free(status.fault_msg);
return 0;
}
int
CimResource_Enumerate_EP( WsContextH cntx,
WsEnumerateInfo* enumInfo,
WsmanStatus *status,
void *opaqueData)
{
debug("CIM Enumeration");
WsXmlDocH doc;
int retval = 0;
CimClientInfo *cimclient = NULL;
if (!enumInfo) {
status->fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status->fault_detail_code = 0;
retval = 1;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
enumInfo->auth_data.username,
enumInfo->auth_data.password );
if (!cimclient) {
status->fault_code = WSA_ENDPOINT_UNAVAILABLE;
status->fault_detail_code = 0;
retval = 1;
goto cleanup;
}
if (!verify_class_namespace(cimclient)) {
error("resource uri namespace mismatch");
status->fault_code = WSA_DESTINATION_UNREACHABLE;
status->fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
retval = 1;
goto cleanup;
}
if (!wsman_parse_enum_request(cntx, enumInfo, status)) {
retval = 1;
goto cleanup;
}
cim_enum_instances(cimclient, enumInfo, status);
if (status && status->fault_code != 0) {
retval = 1;
goto cleanup;
}
if (enumInfo->flags & WSMAN_ENUMINFO_OPT) {
doc = wsman_create_response_envelope( cntx->indoc , NULL);
WsXmlNodeH node = ws_xml_add_child(ws_xml_get_soap_body(doc),
XML_NS_ENUMERATION, WSENUM_ENUMERATE_RESP , NULL);
cim_get_enum_items(cimclient, cntx, node,
enumInfo, XML_NS_WS_MAN, enumInfo->maxItems,
enumInfo->maxsize);
int index2 = enumInfo->index + 1;
if (enumInfo->totalItems == 0 ||index2 == enumInfo->totalItems) {
cim_release_enum_context(enumInfo);
CimResource_destroy(cimclient);
return retval;
}
}
cleanup:
/* the cimclient is stored inside the enumInfo and kept in-memory
* during the Pull_EP requests until the final Release_EP call.
*
* Only destroy it here in case of error
*
*/
if (retval && cimclient) {
CimResource_destroy(cimclient);
}
else if(cimclient && cimclient->selectors) {
hash_free(cimclient->selectors);
cimclient->selectors = NULL;
debug("selectors destroyed");
}
return retval;
}
int
CimResource_Release_EP( WsContextH cntx,
WsEnumerateInfo* enumInfo,
WsmanStatus *status,
void *opaqueData)
{
debug( "Release Endpoint Called");
if(enumInfo->flags & WSMAN_ENUMINFO_CIM_CONTEXT_CLEANUP)
return 0;
CimClientInfo * cimclient = cim_getclient_from_enum_context(enumInfo);
cim_release_enum_context(enumInfo);
if (cimclient) {
CimResource_destroy(cimclient);
}
return 0;
}
int
CimResource_Pull_EP( WsContextH cntx,
WsEnumerateInfo* enumInfo,
WsmanStatus *status,
void *opaqueData)
{
WsXmlDocH doc = NULL;
CimClientInfo *cimclient = NULL;
WsXmlNodeH body, pullnode;
int maxelements;
unsigned long maxsize;
debug( "Pull Endpoint Called");
if (!enumInfo) {
status->fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status->fault_detail_code=0;
doc = wsman_generate_fault( cntx->indoc, status->fault_code,
status->fault_detail_code, NULL);
goto cleanup;
}
cimclient = cim_getclient_from_enum_context(enumInfo);
if (!cimclient) {
status->fault_code = WSA_ENDPOINT_UNAVAILABLE;
status->fault_detail_code = 0;
doc = wsman_generate_fault( cntx->indoc, status->fault_code,
status->fault_detail_code, NULL);
goto cleanup;
}
cimclient->cntx = cntx;
if (!verify_class_namespace(cimclient) ) {
status->fault_code = WSA_DESTINATION_UNREACHABLE;
status->fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
doc = wsman_generate_fault( cntx->indoc, status->fault_code,
status->fault_detail_code, NULL);
goto cleanup;
}
doc = wsman_create_response_envelope( cntx->indoc, NULL);
body = ws_xml_get_soap_body(doc);
pullnode = ws_xml_add_child(body, XML_NS_ENUMERATION,
WSENUM_PULL_RESP, NULL);
maxelements= wsman_get_max_elements(cntx, NULL);
maxsize = wsman_get_max_envelope_size(cntx, NULL);
if(maxsize == 0) {
body = ws_xml_get_soap_body(cntx->indoc);
body = ws_xml_get_child(body, 0, XML_NS_ENUMERATION, WSENUM_PULL);
maxsize = ws_deserialize_uint32(NULL, body,
0, XML_NS_ENUMERATION,
WSENUM_MAX_CHARACTERS);
}
cim_get_enum_items(cimclient, cntx, pullnode,
enumInfo, XML_NS_ENUMERATION, maxelements, maxsize);
cleanup:
if ( enumInfo->totalItems == 0 ||
( enumInfo->index + 1 ) == enumInfo->totalItems) {
cim_release_enum_context(enumInfo);
if (cimclient) {
CimResource_destroy(cimclient);
}
enumInfo->flags |= WSMAN_ENUMINFO_CIM_CONTEXT_CLEANUP;
}
ws_destroy_context(cntx);
return 0;
}
int
CimResource_Create_EP( SoapOpH op,
void* appData,
void *opaqueData )
{
WsXmlDocH doc = NULL;
CimClientInfo *cimclient = NULL;
WsmanStatus status;
char *fragstr = NULL;
SoapH soap = soap_get_op_soap(op);
WsContextH cntx = ws_create_ep_context(soap, soap_get_op_doc(op, 1));
WsmanMessage *msg = wsman_get_msg_from_op(op);
debug( "Create Endpoint Called");
wsman_status_init(&status);
if (!msg) {
status.fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status.fault_detail_code=0;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
msg->auth_data.username, msg->auth_data.password );
if (!cimclient) {
status.fault_code = WSA_ENDPOINT_UNAVAILABLE;
status.fault_detail_code = 0;
goto cleanup;
}
if (!verify_class_namespace(cimclient) ) {
status.fault_code = WSA_DESTINATION_UNREACHABLE;
status.fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
goto cleanup;
}
if ((doc = wsman_create_response_envelope( soap_get_op_doc(op, 1), NULL))) {
WsXmlNodeH body = ws_xml_get_soap_body(doc);
WsXmlNodeH in_body = ws_xml_get_soap_body(soap_get_op_doc(op, 1));
if (!ws_xml_get_child(in_body, 0, NULL, NULL)) {
status.fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status.fault_detail_code = 0;
} else {
char *xsd = u_strdup_printf("%s.xsd", cimclient->resource_uri);
fragstr = wsman_get_fragment_string(cntx, cntx->indoc);
if(fragstr) {
if(ws_xml_get_child(in_body, 0, XML_NS_WS_MAN, WSM_XML_FRAGMENT))
cim_create_instance(cimclient, cntx, in_body, body, fragstr, &status);
}
else {
if (ws_xml_get_child(in_body, 0, cimclient->resource_uri, cimclient->requested_class)) {
cim_create_instance(cimclient, cntx , in_body, body, NULL, &status);
} else if (ws_xml_get_child(in_body, 0, xsd, cimclient->requested_class)) {
cim_create_instance(cimclient, cntx , in_body, body, NULL, &status);
} else {
status.fault_code = WXF_INVALID_REPRESENTATION;
status.fault_detail_code = WSMAN_DETAIL_INVALID_NAMESPACE;
}
}
u_free(xsd);
}
}
cleanup:
if (wsman_check_status(&status) != 0) {
ws_xml_destroy_doc(doc);
doc = wsman_generate_fault( soap_get_op_doc(op, 1),
status.fault_code, status.fault_detail_code, status.fault_msg);
}
if ( doc ) {
soap_set_op_doc(op, doc, 0);
} else {
debug( "Invalid doc" );
}
CimResource_destroy(cimclient);
ws_destroy_context(cntx);
u_free(status.fault_msg);
return 0;
}
int
CimResource_Put_EP( SoapOpH op,
void* appData,
void *opaqueData )
{
debug( "Put Endpoint Called");
WsXmlDocH doc = NULL;
CimClientInfo *cimclient = NULL;
WsmanStatus status;
WsmanMessage *msg;
char *fragstr;
SoapH soap = soap_get_op_soap(op);
WsContextH cntx = ws_create_ep_context(soap, soap_get_op_doc(op, 1));
WsXmlDocH indoc = soap_get_op_doc(op, 1);
wsman_status_init(&status);
msg = wsman_get_msg_from_op(op);
if (!msg) {
status.fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status.fault_detail_code=0;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
msg->auth_data.username, msg->auth_data.password );
if (!cimclient) {
status.fault_code = WSA_ENDPOINT_UNAVAILABLE;
status.fault_detail_code = 0;
goto cleanup;
}
if (!verify_class_namespace(cimclient) ) {
status.fault_code = WSA_DESTINATION_UNREACHABLE;
status.fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
}
if ((doc = wsman_create_response_envelope( indoc, NULL))) {
WsXmlNodeH body = ws_xml_get_soap_body(doc);
WsXmlNodeH in_body = ws_xml_get_soap_body(indoc);
fragstr = wsman_get_fragment_string(cntx, indoc);
if(fragstr)
body = ws_xml_add_child(body, XML_NS_WS_MAN, WSM_XML_FRAGMENT,
NULL);
if (ws_xml_get_child(in_body, 0, NULL, NULL)) {
cim_put_instance(cimclient, cntx , in_body, body, fragstr, &status);
} else {
status.fault_code = WXF_INVALID_REPRESENTATION;
status.fault_detail_code = WSMAN_DETAIL_MISSING_VALUES;
}
}
cleanup:
if (wsman_check_status(&status) != 0) {
ws_xml_destroy_doc(doc);
doc = wsman_generate_fault( indoc,
status.fault_code, status.fault_detail_code, status.fault_msg);
}
if ( doc ) {
soap_set_op_doc(op, doc, 0);
} else {
debug( "Invalid doc" );
}
CimResource_destroy(cimclient);
ws_destroy_context(cntx);
u_free(status.fault_msg);
return 0;
}
#ifdef ENABLE_EVENTING_SUPPORT
int
CimResource_EventPoll_EP(WsEventThreadContextH cntx)
{
int retval = 0;
return retval;
}
int
CimResource_Subscribe_EP(WsContextH cntx,
WsSubscribeInfo* subsInfo,
WsmanStatus *status,
void *opaqueData)
{
debug("CIM Subscription");
int retval = 0;
CimClientInfo *cimclient = NULL;
CMPIInstance *instance = NULL;
CMPIObjectPath *indicationfilter = NULL;
CMPIObjectPath *indicationhandler = NULL;
CMPIObjectPath *indicationsubscription = NULL;
if (!subsInfo) {
status->fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status->fault_detail_code=0;
retval = 1;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
subsInfo->auth_data.username,
subsInfo->auth_data.password );
if (!cimclient) {
status->fault_code = WSA_ENDPOINT_UNAVAILABLE;
status->fault_detail_code = 0;
retval = 1;
goto cleanup;
}
if (!verify_class_namespace(cimclient)) {
error("resource uri namespace mismatch");
status->fault_code = WSA_DESTINATION_UNREACHABLE;
status->fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
retval = 1;
goto cleanup;
}
// to do here: create indication filter here and something else necessary
subsInfo->eventpoll= CimResource_EventPoll_EP;
subsInfo->cancel = CimResource_SubscriptionCancel_EP;
subsInfo->vendor_namespaces = cimclient->namespaces;
subsInfo->cim_namespace = u_strdup(cimclient->cim_namespace);
if(subsInfo->flags & WSMAN_SUBSCRIPTION_SELECTORSET) { //Subscribe to an Indication filter instance
indicationfilter = cim_get_indicationfilter_objectpath_from_selectors(cimclient, cntx, status);
if(indicationfilter)
subsInfo->existingfilterOP = CMClone(indicationfilter, NULL);
else {
status->fault_code = WSA_DESTINATION_UNREACHABLE;
status->fault_detail_code = WSMAN_DETAIL_INVALID_RESOURCEURI;
}
debug("subscribe to an existing filter");
}
else {
indicationfilter = cim_create_indication_filter(cimclient, subsInfo, status);
}
if(status->fault_code ) {
retval = 1;
goto cleanup;
}
indicationhandler = cim_create_indication_handler(cimclient, subsInfo, status);
if(status->fault_code) {
retval = 1;
goto cleanup;
}
cim_create_indication_subscription(cimclient, subsInfo,
indicationfilter, indicationhandler, status);
if(status->fault_code)
retval = 1;
cleanup:
if(instance)
CMRelease(instance);
if(indicationfilter)
CMRelease(indicationfilter);
if(indicationhandler)
CMRelease(indicationhandler);
if(indicationsubscription)
CMRelease(indicationsubscription);
CimResource_destroy(cimclient);
return retval;
}
int CimResource_Renew_EP(WsContextH cntx,
WsSubscribeInfo* subsInfo,
WsmanStatus *status,
void *opaqueData)
{
debug("CIM Renew");
int retval = 0;
CimClientInfo *cimclient = NULL;
if (!subsInfo) {
status->fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status->fault_detail_code=0;
retval = 1;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
subsInfo->auth_data.username,
subsInfo->auth_data.password );
if (!cimclient) {
status->fault_code = WSA_ENDPOINT_UNAVAILABLE;
status->fault_detail_code = 0;
retval = 1;
goto cleanup;
}
cim_update_indication_subscription(cimclient, subsInfo, status);
if(status->fault_code)
retval = 1;
CimResource_destroy(cimclient);
cleanup:
return retval;
}
int CimResource_UnSubscribe_EP(WsContextH cntx,
WsSubscribeInfo* subsInfo,
WsmanStatus *status,
void *opaqueData)
{
debug("CIM UnSubscribe");
int retval = 0;
CimClientInfo *cimclient = NULL;
if (!subsInfo) {
status->fault_code = WSMAN_SCHEMA_VALIDATION_ERROR;
status->fault_detail_code=0;
retval = 1;
goto cleanup;
}
cimclient = CimResource_Init(cntx,
subsInfo->auth_data.username,
subsInfo->auth_data.password );
if (!cimclient) {
status->fault_code = WSA_ENDPOINT_UNAVAILABLE;
status->fault_detail_code = 0;
retval = 1;
goto cleanup;
}
cim_delete_indication_subscription(cimclient, subsInfo, status);
if(status->fault_code)
retval = 1;
CimResource_destroy(cimclient);
cleanup:
return retval;
}
int CimResource_SubscriptionCancel_EP(WsEventThreadContextH cntx)
{
WsmanStatus status;
return CimResource_UnSubscribe_EP(cntx->soap->cntx, cntx->subsInfo, &status, NULL);
}
#endif