blob: 1cddd2de63c21248c9ee43c7ae41c5429c1bf4c5 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* xmpl_perf_client_stub.c
*/
#include "apr_time.h" /* some apr must be included first */
#include "xmpl_perf_client_stub.h"
#include "xmpl_perf_valufact.h"
#include "etch_svcobj_masks.h"
#include "xmpl_perf_client.h"
#include "etch_global.h"
#include "etch_url.h"
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
int destroy_my_client_stub (perf_client_stub*);
/* - - - - - - - - - - -
* stub helper methods
* - - - - - - - - - - -
*/
/* these are the possibly threaded client side implementations of calls to the
* service method logic in xxxx_client_impl. there is one such helper for each
* client-directed method in the service. each assembles and validates method
* parameters, invokes a call to the service logic, and transmits a result
* message if indicated. each conforms to the opaque_stubhelper signature:
* int stubhelper (void* stub, void* dsvc, void* obj, void* sender, void* msg);
* @param stub the invoking stub object
* @param dsvc delivery service - caller retains.
* @param obj the service methods user logic, caller retains.
* @param whofrom sender, caller relinquishes.
* @param msg - the message, caller relinquishes.
* @return 0 success, -1 failure of the message_put or send. success means that
* the mechanism was successful, not necessarily that the service method logic
* was successful. when the service method logic fails, the result object will
* wrap an exception.
*
* NOTE CAREFULLY: at this writing, each stub helper method asserts its expected
* parameters (halts execution on null), and otherwise always calls the implemented
* service method, which subsequently destroys whofrom and msg regardless of result.
* if this were changed to instead return some error indicator from the stub helper
* method on detection of a null parameter, the stub helper method would need to
* first destroy the whofrom and msg parameters to fulfill the stub helper method
* contract.
*/
/**
* perf_clientstub_run_nothing_
* NO CLIENT-DIRECTED METHODS ARE DECLARED BY THIS SERVICE.
* THIS IS AN EXAMPLE CLIENT_SIDE STUB HELPER FUNCTION.
*/
int perf_clientstub_run_nothing_ (etch_stub* stub, i_delivery_service* dsvc,
i_perf_client* client, etch_who* whofrom, etch_message* msg)
{
perf_value_factory_impl* pvi = NULL;
perf_value_factory* pvf = NULL;
perf_client_impl* impl = NULL;
/* objects specific to service.nothing_() */
etch_field* key_foo = NULL;
etch_int64* val_foo = NULL;
etch_field* key_bar = NULL;
etch_string* val_bar = NULL;
etch_int32* resultobj = NULL;
etchstub_validate_args (stub, dsvc, msg, client, &pvf, &pvi, &impl);
key_foo = NULL; /* = pvi->statics._mf_foo; */
key_bar = NULL; /* = pvi->statics._mf_bar; */
ETCH_ASSERT(key_foo && key_bar);
/* nullarg asserts are initial tests only: server impl
* will generate exceptions on nullargs in the real world */
val_foo = NULL; /* = (etch_int64*) message_get (msg, key_foo); */
val_bar = NULL; /* = (etch_string*) message_get (msg, key_bar); */
ETCH_ASSERT(val_foo && val_bar);
/* execute the service method */
resultobj = NULL; /* server->nothing_ (impl, val_foo, val_bar); */
ETCH_ASSERT(resultobj);
/* transmit reply back to sender */
return etchstub_send_reply (stub, dsvc, whofrom, msg, (void*) resultobj);
}
/* - - - - - - - - -
* constructors
* - - - - - - - - -
*/
/**
* new_perf_client_stub.
* called from perf_remote_server* perfhelper.new_remote_server().
* @param p client parameter bundle
*/
perf_client_stub* new_perf_client_stub (etch_client_factory* p)
{
perf_client_stub* mystub = NULL;
i_delivery_service* ids = p->dsvc;
i_perf_client* client = p->iclient;
ETCH_ASSERT(is_etch_ideliverysvc(ids));
ETCH_ASSERT(is_etch_client_base(client));
mystub = new_clientstub_init (client, sizeof(perf_client_stub),
destroy_my_client_stub, ids, p->qpool, p->fpool, p);
mystub->class_id = get_dynamic_classid_unique(&CLASSID_STUBCLIENT_PERF);
mystub->server_id = p->server_id;
/* initialize custom methods and data here */
mystub->my_example_obj = etch_malloc(128, 0); /* example custom alloc */
/* set stub helper methods */
/* - - - no client-directed methods declared in this service - - - */
return mystub;
}
/**
* destroy_my_client_stub()
* perf_client_stub user-allocated memory destructor.
* called back from private object destructor destroy_stub_object().
* if you explicitly allocate memory in the client stub object, destroy it here.
*/
int destroy_my_client_stub (perf_client_stub* mystub)
{
/* free custom memory allocations here */
etch_free(mystub->my_example_obj); /* free example alloc */
return 0;
}