| /* $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; | |
| } | |