From f2ad6d315729a024c75870d6761c77cbee570f00 Mon Sep 17 00:00:00 2001 From: Heikki Levanto Date: Tue, 16 Dec 2008 14:30:12 +0100 Subject: [PATCH] Added a simple loadable example-module, with its own Makefile etc. --- .gitignore | 1 + example-module/Makefile | 9 +++ example-module/README | 12 ++++ example-module/config.xml | 21 +++++++ example-module/filter_myfilter.cpp | 110 ++++++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+) create mode 100644 example-module/Makefile create mode 100644 example-module/README create mode 100644 example-module/config.xml create mode 100644 example-module/filter_myfilter.cpp diff --git a/.gitignore b/.gitignore index 4c93b60..b5c2aba 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ lib bin ChangeLog build-stamp +*~ diff --git a/example-module/Makefile b/example-module/Makefile new file mode 100644 index 0000000..b966052 --- /dev/null +++ b/example-module/Makefile @@ -0,0 +1,9 @@ +CONFIG=../../yazpp/yazpp-config +SO=metaproxy_filter_myfilter.so +$(SO): filter_myfilter.cpp + $(CXX) -shared -nostdlib `$(CONFIG) --cflags` -I ../src $< -o $(SO) ../src/.libs/libmetaproxy.so + +clean: + rm $(SO) +run: $(SO) + ../src/metaproxy -c config.xml diff --git a/example-module/README b/example-module/README new file mode 100644 index 0000000..430d82d --- /dev/null +++ b/example-module/README @@ -0,0 +1,12 @@ +This is a very simplified example of a loadable metaproxy module + +There is a simple makefile, that does not depend (very much) on the +main metaproxy stuff. + +You can run the server with + + make run + +Then connect to it with a yaz-client localhost:9000. The module sees the +init request, and rejects it with a system error. + diff --git a/example-module/config.xml b/example-module/config.xml new file mode 100644 index 0000000..2b562e3 --- /dev/null +++ b/example-module/config.xml @@ -0,0 +1,21 @@ + + + . + + + + @:9000 + + + + + + + + hello + + + + + + diff --git a/example-module/filter_myfilter.cpp b/example-module/filter_myfilter.cpp new file mode 100644 index 0000000..4c8f82d --- /dev/null +++ b/example-module/filter_myfilter.cpp @@ -0,0 +1,110 @@ +/* This file is part of Metaproxy. + Copyright (C) 2008 Index Data + +Metaproxy is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include + +#include "config.hpp" +#include "filter.hpp" +#include "package.hpp" +#include "util.hpp" + +namespace mp = metaproxy_1; + +namespace metaproxy_1 { + namespace filter { + class Filter_myfilter: public mp::filter::Base { + public: + void process(mp::Package & package) const; + void configure(const xmlNode *ptr, bool test_only); + }; + } +} + +void mp::filter::Filter_myfilter::process(mp::Package & package) const +{ // See src/filter_backend_test.cpp for a more comprehensive + // example of a dummy Z-server + Z_GDU *gdu = package.request().get(); + Z_APDU *apdu_res = 0; + mp::odr odr; + + if (!gdu || gdu->which != Z_GDU_Z3950) + { + yaz_log(YLOG_LOG, "myfilter::process: Not a Z39.50 packet"); + package.move(); // Send on to other filters + return; + } + Z_APDU *apdu_req = gdu->u.z3950; + if (apdu_req->which == Z_APDU_initRequest) + { + yaz_log(YLOG_LOG, "myfilter::process: Init request"); + apdu_res= odr.create_initResponse( apdu_req, + YAZ_BIB1_PERMANENT_SYSTEM_ERROR, "Not implemented!"); + package.response() = apdu_res; + } + else + { + yaz_log(YLOG_LOG, "myfilter::process: Unknown request type"); + package.move(); // Send on to other filters + } +} + +void mp::filter::Filter_myfilter::configure(const xmlNode *ptr, bool test_only) +{ + yaz_log(YLOG_LOG, "myfilter::configure"); + for (ptr = ptr->children; ptr; ptr = ptr->next) + { + if (ptr->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((const char *) ptr->name, "logmsg")) + { + std::string msg = mp::xml::get_text(ptr); + yaz_log(YLOG_LOG, "myfilter::configure: %s", msg.c_str() ); + + } + else + { + throw mp::filter::FilterException("Bad element " + + std::string((const char *) ptr->name)); + } + } + + +} + +static mp::filter::Base* filter_creator() +{ + return new mp::filter::Filter_myfilter; +} + +extern "C" { + struct metaproxy_1_filter_struct metaproxy_1_filter_myfilter = { + 0, + "myfilter", + filter_creator + }; +} + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * c-file-style: "stroustrup" + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ -- 1.7.10.4