First go at Package logger
[metaproxy-moved-to-github.git] / src / package.cpp
1 /* This file is part of Metaproxy.
2    Copyright (C) 2005-2011 Index Data
3
4 Metaproxy is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19 #include "config.hpp"
20 #include <metaproxy/package.hpp>
21 #include <yaz/snprintf.h>
22 #include <yaz/log.h>
23
24 #include <sstream>
25
26 namespace mp = metaproxy_1;
27
28 namespace metaproxy_1 {
29     class Package::PackageLogger : boost::noncopyable {
30         friend class Package;
31         std::string str;
32     };
33 }
34
35 mp::Package::Package() 
36     : m_route_pos(0), p_logger(new PackageLogger)
37 {
38 }
39
40 mp::Package::~Package()
41 {
42     delete m_route_pos;
43 }
44
45 mp::Package::Package(mp::Session &session, const mp::Origin &origin) 
46     : m_session(session), m_origin(origin),
47       m_route_pos(0), p_logger(new PackageLogger)
48 {
49 }
50
51
52 mp::Package & mp::Package::copy_filter(const Package &p)
53 {
54     delete m_route_pos;
55     m_route_pos = p.m_route_pos->clone();
56     p_logger = p.p_logger;
57     return *this;
58 }
59
60
61 void mp::Package::move()
62 {
63     if (m_route_pos)
64     {
65         const filter::Base *next_filter = m_route_pos->move(0);
66         if (next_filter)
67             next_filter->process(*this);
68     }
69 }
70
71 void mp::Package::move(std::string route)
72 {
73     if (m_route_pos)
74     {
75         const char *r_cstr = route.length() ? route.c_str() : 0;
76         const filter::Base *next_filter = m_route_pos->move(r_cstr);
77         if (next_filter)
78             next_filter->process(*this);
79     }
80 }
81
82
83 mp::Session & mp::Package::session()
84 {
85     return m_session;
86 }
87
88 mp::Origin mp::Package::origin() const 
89 {
90     return m_origin;
91 }
92     
93 mp::Origin & mp::Package::origin()
94 {
95     return m_origin;
96 }
97
98 mp::Package & mp::Package::router(const mp::Router &router)
99 {
100     m_route_pos = router.createpos();
101     return *this;
102 }
103
104 yazpp_1::GDU &mp::Package::request()
105 {
106     return m_request_gdu;
107 }
108
109
110 yazpp_1::GDU &mp::Package::response()
111 {
112     return m_response_gdu;
113 }
114
115 mp::Session mp::Package::session() const
116 {
117     return m_session;
118 }
119
120 std::ostream& std::operator<<(std::ostream& os, const mp::Package& p)
121 {
122     os << p.origin() << " ";
123     os << p.session().id();
124     return os;
125 }
126
127 void mp::Package::log(const char *module, int level, const char *fmt, ...)
128 {
129     char buf[4096];
130     va_list ap;
131     va_start(ap, fmt);
132
133     buf[0] = ' ';
134     yaz_vsnprintf(buf + 1, sizeof(buf)-30, fmt, ap);
135
136     std::ostringstream os;
137
138     os << module << " " << *this << buf;
139
140     va_end(ap);
141     yaz_log(level, "%s", os.str().c_str());
142
143     p_logger->str += std::string(module) + std::string(buf) + std::string("\n");
144 }
145
146 void mp::Package::reset_log(std::string &res)
147 {
148     res = p_logger->str;
149     p_logger->str.clear();
150 }
151
152 /*
153  * Local variables:
154  * c-basic-offset: 4
155  * c-file-style: "Stroustrup"
156  * indent-tabs-mode: nil
157  * End:
158  * vim: shiftwidth=4 tabstop=8 expandtab
159  */
160