blob: 59beac3f28aa72096f6a1304eae65b509729bcb9 [file]
/* $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_server_impl.c
* your custom implementation of perf_server.
* add your implementations of messages from the client here.
* this code is generated in stub form, and manually augmented.
*/
#include "apr_time.h" /* some apr must be included first */
#include "xmpl_perf_server_impl.h"
#include "etch_global.h"
#include "etch_arrayval.h"
#include "etch_binary_tdo.h"
#include "etchexcp.h"
#include "etch_url.h"
#include "etchlog.h"
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
char* ETCHSIMP = "SIMP";
/* generated signatures */
int destroy_perf_server_implex (perf_server_impl*);
perf_server_impl* init_perf_server_impl (perf_remote_client*, etch_destructor);
etch_int32* perf_impl_add (void* perfserver, etch_int32*, etch_int32*);
etch_int32* perf_impl_sum (void* perfserver, void* array);
void* perf_impl_report (void* perfserver, etch_int32*, etch_string*);
perf_point* perf_impl_dist (void* thisx, perf_point*, perf_point*);
etch_date* perf_impl_add2 (void* thisx, etch_date*, etch_int64*);
void* perf_impl_report2(void* thisx, etch_date*, etch_int32*, etch_string*);
int perf_objsession_notify (i_objsession*, etch_event*);
/* - - - - - - - -
* instantiation
* - - - - - - - -
*/
/**
* new_perf_server_impl()
* perf_server_impl constructor.
* add your custom initialization and virtual method overrides here.
*/
perf_server_impl* new_perf_server_impl (perf_remote_client* client)
{
perf_server_impl* serv /* allocate object and assign default virtuals */
= init_perf_server_impl (client, destroy_perf_server_implex);
i_perf_server* iserv = serv->perf_server_base;
serv->class_id = get_dynamic_classid_unique(&CLASSID_PERFSERVERBASE_IMPL);
/* * * add your custom construction/initialization here * * */
serv->t0 = etch_system_nanotime();
serv->exampleobj = etch_malloc(100,0);
/* end custom construction/initialization */
/* * * add your virtual method overrides here * * */
/* todo avoid using and initializing two objects maybe don't put in impl */
serv->add = iserv->add = perf_impl_add;
serv->sum = iserv->sum = perf_impl_sum;;
serv->report = iserv->report = perf_impl_report;
serv->dist = iserv->dist = perf_impl_dist;
serv->add2 = iserv->add2 = perf_impl_add2;
serv->report2 = iserv->report2 = perf_impl_report2;
/* end virtual method overrides */
serv->_session_notify = serv->iobjsession->_session_notify = perf_objsession_notify;
return serv;
}
/**
* destroy_perf_server_implex()
* destructor for any user allocated memory.
* this code is invoked by the private perf_server_impl destructor,
* via perf_server.destroyex(). add code here to destroy any memory you
* may have allocated for your custom perf_server implementation.
*/
int destroy_perf_server_implex (perf_server_impl* thisx)
{
/* * * add your custom destruction here * * */
etch_free(thisx->exampleobj);
/* end custom destruction */
return 0;
}
/* - - - - - - - - - - - - - - - -
* service method implementations
* - - - - - - - - - - - - - - - -
*/
/**
* perf_impl_add()
* execution of perf.add()
* @param x an etch_int32 retained by the message value factory.
* @param y an etch_int32 retained by the message value factory.
* @return an etch_int32 whose value is the sum of x and y values.
*/
etch_int32* perf_impl_add (perf_server_impl* thisx, etch_int32* x, etch_int32* y)
{
int is_argerr = 0;
etch_int32* resultobj = new_int32(0);
etchlog(ETCHSIMP, ETCHLOG_XDEBUG, "execute perf.add\n");
thisx->adds++;
ETCH_ASSERT(x && y);
is_argerr = x->is_null || y->is_null;
if (x->value == FAKEBADDATA_INT32 || y->value == FAKEBADDATA_INT32)
is_argerr = TRUE; /* artificial constant for negative test */
if (is_argerr)
etch_throw (resultobj, EXCPTYPE_ILLEGALARG, L"bad data", 0);
else
resultobj->value = x->value + y->value;
return resultobj;
}
/**
* perf_impl_sum()
* execution of perf.sum()
* @param a an etch_arrayvalue or etch_nativearray retained by the message's
* value factory.
* @return an etch_int32 whose value is the sum of the items in the array.
*/
etch_int32* perf_impl_sum (perf_server_impl* thisx, void* a)
{
int is_argerr = 0;
etch_int32* resultobj = new_int32(0);
etchlog(ETCHSIMP, ETCHLOG_XDEBUG, "execute perf.sum\n");
thisx->sums++;
ETCH_ASSERT(a);
do
{ etch_arrayvalue* av = normalize_etch_array(a, 1);
etch_iterator iterator;
if (is_argerr = (av == NULL || av->is_null)) break;
arrayvalue_set_iterator(av, &iterator);
while(iterator.has_next(&iterator))
{
etch_int32* thisitem = (etch_int32*) iterator.current_value;
if (!is_etch_int32(thisitem) || thisitem->value == FAKEBADDATA_INT32)
{ is_argerr = TRUE;
break;
}
resultobj->value += thisitem->value;
iterator.next(&iterator);
}
} while(0);
if (is_argerr) etch_throw (resultobj, EXCPTYPE_ILLEGALARG, NULL, 0);
#if(0)
etchlog(ETCHSIMP, ETCHLOG_INFO, "perf_impl_sum test exception\n");
etch_throw (resultobj, EXCPTYPE_ILLEGALARG, L"test exception", ETCHEXCP_COPYTEXT);
#endif
return resultobj;
}
/**
* perf_impl_report()
* execution of perf.report()
* @param code an integer object retained by the message value factory.
* @param x an etch_string retained by the message value factory.
* @return null on success, an exception object on failure.
*/
void* perf_impl_report (perf_server_impl* thisx, etch_int32* code, etch_string* x)
{
int is_argerr = 0;
void* resultobj = NULL;
etchlog(ETCHSIMP, ETCHLOG_XDEBUG, "execute perf.report\n");
thisx->reports++;
ETCH_ASSERT(code && x);
is_argerr = code->is_null || x->is_null;
/* artificial constants for negative tests */
if (code->value == FAKEBADDATA_INT32) is_argerr = TRUE;
if (0 == wcscmp(x->v.valw, FAKEBADDATA_STRING)) is_argerr = TRUE;
if (is_argerr)
resultobj = new_etch_exception(EXCPTYPE_ILLEGALARG, NULL, 0);
return resultobj;
}
/**
* perf_impl_dist()
* execution of perf.dist()
* @param p1 a perf_point retained by the message value factory.
* @param p2 a perf_point retained by the message value factory.
* @return a perf_point.
*/
perf_point* perf_impl_dist (perf_server_impl* thisx, perf_point* p1, perf_point* p2)
{
int is_argerr = 0;
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
etchlog(ETCHSIMP, ETCHLOG_XDEBUG, "execute perf.dist\n");
thisx->dists++;
ETCH_ASSERT(p1 && p2);
is_argerr = !is_perf_point(p1) || !is_perf_point(p2);
if (p1->x == FAKEBADDATA_INT32 || p1->y == FAKEBADDATA_INT32
|| p2->x == FAKEBADDATA_INT32 || p2->y == FAKEBADDATA_INT32)
is_argerr = TRUE; /* artificial constant for negative tests */
if (is_argerr)
return (perf_point*) etch_throw (new_perf_point(0,0),
EXCPTYPE_ILLEGALARG, NULL, 0);
x1 = p1->x; y1 = p1->y;
x2 = p2->x; y2 = p2->y;
return new_perf_point(x2 - x1, y2 - y1);
}
/**
* perf_impl_add2()
* execution of perf.add2()
* @param objdate an etch_date retained by the message value factory.
* @param objms an etch_int64 retained by the message value factory.
* @return an etch_date*.
*/
etch_date* perf_impl_add2 (perf_server_impl* thisx, etch_date* objdate, etch_int64* objms)
{
int is_argerr = 0;
etch_date* result_date = new_date();
etchlog(ETCHSIMP, ETCHLOG_XDEBUG, "execute perf.add2\n");
thisx->add2s++;
ETCH_ASSERT(objdate && objms);
is_argerr = objdate->is_null || objms->is_null;
if (objdate->value == FAKEBADDATA_DATE || objms->value == FAKEBADDATA_INT64)
is_argerr = TRUE; /* artificial constants for negative tests */
if (is_argerr)
etch_throw (result_date, EXCPTYPE_ILLEGALARG, NULL, 0);
else
result_date->value = objdate->value + (objms->value / 1000);
return result_date;
}
/**
* perf_impl_report2()
* execution of perf.report2()
* @param ts an etch_date retained by the message value factory.
* @param n an integer object retained by the message value factory.
* @param x an etch_string retained by the message value factory.
* @return null on success, an exception object on failure.
*/
void* perf_impl_report2 (perf_server_impl* thisx, etch_date* ts, etch_int32* n, etch_string* x)
{
int is_argerr = 0;
void* resultobj = NULL;
etchlog(ETCHSIMP, ETCHLOG_XDEBUG, "execute perf.report2\n");
thisx->report2s++;
ETCH_ASSERT(ts && n && x);
is_argerr = ts->is_null || n->is_null || x->is_null;
/* artificial constants for negative tests */
if (ts->value == FAKEBADDATA_DATE || n->value == FAKEBADDATA_INT32
|| (0 == wcscmp(x->v.valw, FAKEBADDATA_STRING))) is_argerr = TRUE;
if (is_argerr)
resultobj = new_etch_exception(EXCPTYPE_ILLEGALARG, NULL, 0);
return resultobj;
}
/* - - - - - - - - - - - - - - - - - - -
* session interface method overrides
* - - - - - - - - - - - - - - - - - - -
*/
int perf_objsession_notify (i_objsession* isession, etch_event* evt)
{
int result = -1, evtype = evt? evt->value: 0;
perf_server_impl* perfobj = (perf_server_impl*) isession->thisx;
if (ETCHEVT_SESSION_DOWN == evtype)
{
const int total
= perfobj->adds + perfobj->sums + perfobj->reports
+ perfobj->dists + perfobj->add2s + perfobj->report2s;
int64 t0 = perfobj->t0, t1 = etch_system_nanotime();
double dtime = (t1 - t0) / (double) 1000000000;
double drate = total / dtime;
char* mask
= "\nperf server %d down - adds %d sums %d reports %d dists %d "
"add2s %d report2s %d total %d %d time %7.3f rate %7.3f\n";
printf(mask, perfobj->perf_server_base->server_id,
perfobj->adds, perfobj->sums, perfobj->reports,
perfobj->dists, perfobj->add2s, perfobj->report2s,
total, dtime, drate);
result = 0;
}
ETCHOBJ_DESTROY(evt);
return result;
}