From d9b2b5394df286a931eca29429c83cdd61868251 Mon Sep 17 00:00:00 2001 From: randomdan Date: Fri, 21 Jan 2011 13:56:10 +0000 Subject: Add wrappers and Jam for building with UUIDs from OSSP instead of Boost --- project2/Jamfile.jam | 7 ++- project2/cgi/cgiAppEngine.cpp | 14 +++--- project2/cgi/cgiAppEngine.h | 4 +- project2/sessionContainer.cpp | 2 +- project2/sessionContainer.h | 6 +-- project2/sessionXml.cpp | 23 +++++----- project2/sessionXml.h | 3 +- project2/uuid.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++ project2/uuid.h | 38 +++++++++++++++++ 9 files changed, 166 insertions(+), 30 deletions(-) create mode 100644 project2/uuid.cpp create mode 100644 project2/uuid.h diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 6ae5713..7959ee4 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -1,4 +1,5 @@ import package ; +import feature : feature ; alias libxmlpp : : : : "`pkg-config --cflags libxml++-2.6`" @@ -15,17 +16,21 @@ lib boost_filesystem : : boost_filesystem ; lib cgicc : : cgicc ; lib esmtp : : esmtp ; lib curl : : curl ; +lib osspuuid : : ossp-uuid++ ; + +feature uuid : boost ossp : propagated ; lib p2common : appEngine.cpp dataSource.cpp environment.cpp fileStarGlibIoChannel.cpp iHaveParameters.cpp iterate.cpp paramChecker.cpp presenter.cpp rawView.cpp dumpTask.cpp sourceObject.cpp task.cpp variables.cpp view.cpp xmlObjectLoader.cpp exceptions.cpp sessionClearTask.cpp session.cpp sessionSetTask.cpp commonObjects.cpp xmlPresenter.cpp - rowView.cpp rowSet.cpp rowUser.cpp rowProcessor.cpp + rowView.cpp rowSet.cpp rowUser.cpp rowProcessor.cpp uuid.cpp : ../libmisc//misc libxmlpp boost_filesystem + ossp:osspuuid ; lib p2xml : diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index f4a4fb0..12a30d7 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -7,13 +7,10 @@ #include "../xmlObjectLoader.h" #include "../iterate.h" #include -#include -#include #include "../sessionXml.h" -#include const std::string SESSIONID = "sessionID"; -typedef boost::uuids::uuid SIDKey; +typedef UUID SIDKey; typedef std::string SValue; SessionContainer * sessionsContainer = new SessionContainerXml(); @@ -21,12 +18,11 @@ SessionContainer * sessionsContainer = new SessionContainerXml(); CgiApplicationEngine::CgiApplicationEngine(const CgiEnvironment * e) : ApplicationEngine(), _env(e), - header(NULL), - sessionID(boost::uuids::nil_generator()()) + header(NULL) { BOOST_FOREACH(const cgicc::HTTPCookie c, e->getCookieList()) { if (c.getName() == SESSIONID) { - sessionID = boost::uuids::string_generator()(c.getValue()); + sessionID = c.getValue(); } } if (_env->getRequestMethod() == "POST") { @@ -57,7 +53,7 @@ CgiApplicationEngine::process() const delete prev; } if (!sessionID.is_nil()) { - header->setCookie(cgicc::HTTPCookie(SESSIONID, boost::lexical_cast(sessionID), "Session ID", + header->setCookie(cgicc::HTTPCookie(SESSIONID, sessionID.str(), "Session ID", _env->getServerName().substr(_env->getServerName().find(".")), 3600, "/", false)); } } @@ -124,7 +120,7 @@ CgiApplicationEngine::addAppData(const Presenter * p) const // Sessions variables if (!sessionID.is_nil()) { p->pushSub("session", "project2"); - p->addField("id", boost::lexical_cast(sessionID)); + p->addField("id", sessionID.str()); Session::Values session(sessionsContainer->GetSession(sessionID)->GetValuesCopy()); BOOST_FOREACH(Session::Values::value_type sv, session) { p->pushSub("var", "project2"); diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h index 7998648..abd4b9e 100644 --- a/project2/cgi/cgiAppEngine.h +++ b/project2/cgi/cgiAppEngine.h @@ -6,8 +6,8 @@ #include "../paramChecker.h" #include "../xmlPresenter.h" #include "../commonObjects.h" +#include "../uuid.h" #include -#include #include #include @@ -63,7 +63,7 @@ class CgiApplicationEngine : public ApplicationEngine { virtual Stage * run(); }; mutable Stage * currentStage; - mutable boost::uuids::uuid sessionID; + mutable UUID sessionID; }; #endif diff --git a/project2/sessionContainer.cpp b/project2/sessionContainer.cpp index 5a73e3b..9028515 100644 --- a/project2/sessionContainer.cpp +++ b/project2/sessionContainer.cpp @@ -9,7 +9,7 @@ SessionContainer::~SessionContainer() } SessionPtr -SessionContainer::GetSession(boost::uuids::uuid & id) +SessionContainer::GetSession(UUID & id) { SessionPtr s = getSession(id); s->ExpiryTime(time(NULL) + 3600); diff --git a/project2/sessionContainer.h b/project2/sessionContainer.h index 08ad0e9..6163200 100644 --- a/project2/sessionContainer.h +++ b/project2/sessionContainer.h @@ -1,7 +1,7 @@ #ifndef SESSIONCONTAINER_H #define SESSIONCONTAINER_H -#include +#include "uuid.h" #include "session.h" class SessionContainer { @@ -9,11 +9,11 @@ class SessionContainer { SessionContainer(); virtual ~SessionContainer() = 0; - SessionPtr GetSession(boost::uuids::uuid & sid); + SessionPtr GetSession(UUID & sid); virtual void CleanUp() { } protected: - virtual SessionPtr getSession(boost::uuids::uuid & sid) = 0; + virtual SessionPtr getSession(UUID & sid) = 0; }; #endif diff --git a/project2/sessionXml.cpp b/project2/sessionXml.cpp index 3b42924..9e78aec 100644 --- a/project2/sessionXml.cpp +++ b/project2/sessionXml.cpp @@ -1,17 +1,16 @@ #include "sessionXml.h" +#include "uuid.h" #include #include #include #include +#include #include -#include #include -#include -using namespace boost::uuids; class SessionXml : public Session { public: - SessionXml(boost::uuids::uuid & sid); + SessionXml(UUID & sid); SessionXml(const xmlpp::Element *); virtual ~SessionXml(); @@ -22,7 +21,7 @@ class SessionXml : public Session { time_t ExpiryTime() const; void ExpiryTime(time_t); - const uuid sessionID; + const UUID sessionID; private: Values vars; @@ -56,7 +55,7 @@ SessionContainerXml::CleanUp() doc = parser.get_document(); char xpath[200]; snprintf(xpath, 200, "/sessions/session[@id='%s' or @expires < %lu]", - boost::lexical_cast(currentSession->sessionID).c_str(), time(NULL)); + currentSession->sessionID.str().c_str(), time(NULL)); xmlpp::NodeSet sess = doc->get_root_node()->find(xpath); BOOST_FOREACH(xmlpp::Node * n, sess) { n->get_parent()->remove_child(n); @@ -67,7 +66,7 @@ SessionContainerXml::CleanUp() doc->create_root_node("sessions"); } xmlpp::Element * sess = doc->get_root_node()->add_child("session"); - sess->set_attribute("id", boost::lexical_cast(currentSession->sessionID)); + sess->set_attribute("id", currentSession->sessionID.str()); sess->set_attribute("expires", boost::lexical_cast(currentSession->expires)); BOOST_FOREACH(const SessionXml::Values::value_type & nvp, currentSession->vars) { xmlpp::Element * v = sess->add_child("var"); @@ -83,14 +82,14 @@ SessionContainerXml::CleanUp() } SessionPtr -SessionContainerXml::getSession(boost::uuids::uuid & sid) +SessionContainerXml::getSession(UUID & sid) { if (!currentSession || currentSession->sessionID != sid) { try { xmlpp::DomParser sessions(xmlFile); char xpath[200]; snprintf(xpath, 200, "/sessions/session[@id='%s' and @expires > %lu]", - boost::lexical_cast(sid).c_str(), time(NULL)); + sid.str().c_str(), time(NULL)); xmlpp::NodeSet sess = sessions.get_document()->get_root_node()->find(xpath); if (sess.size() == 1) { currentSession = new SessionXml(dynamic_cast(sess[0])); @@ -106,13 +105,13 @@ SessionContainerXml::getSession(boost::uuids::uuid & sid) return currentSession; } -SessionXml::SessionXml(boost::uuids::uuid & sid) : - sessionID(sid.is_nil() ? sid = boost::uuids::random_generator()() : sid) +SessionXml::SessionXml(UUID & sid) : + sessionID(sid.is_nil() ? sid = UUID::generate_random() : sid) { } SessionXml::SessionXml(const xmlpp::Element * p) : - sessionID(boost::lexical_cast(p->get_attribute_value("id"))), + sessionID(p->get_attribute_value("id")), expires(boost::lexical_cast(p->get_attribute_value("expires"))) { xmlpp::NodeSet xvars = p->find("var"); diff --git a/project2/sessionXml.h b/project2/sessionXml.h index f9d0059..8086990 100644 --- a/project2/sessionXml.h +++ b/project2/sessionXml.h @@ -3,7 +3,6 @@ #include "sessionContainer.h" #include -#include class SessionContainerXml : public SessionContainer { public: @@ -13,7 +12,7 @@ class SessionContainerXml : public SessionContainer { void CleanUp(); protected: - SessionPtr getSession(boost::uuids::uuid & sid); + SessionPtr getSession(UUID & sid); }; #endif diff --git a/project2/uuid.cpp b/project2/uuid.cpp new file mode 100644 index 0000000..03e851e --- /dev/null +++ b/project2/uuid.cpp @@ -0,0 +1,99 @@ +#include "uuid.h" + +#ifdef USINGBOOSTUUID +#include +#include +#include + +UUID::UUID() +{ + boost_uuid = boost::uuids::nil_generator()(); +} + +UUID::UUID(const std::string & str) +{ + boost_uuid = boost::lexical_cast(str); +} + +UUID +UUID::generate_random() +{ + UUID u; + u.boost_uuid = boost::uuids::random_generator()(); + return u; +} + +bool +UUID::is_nil() const +{ + return boost_uuid.is_nil(); +} + +std::string +UUID::str() const +{ + return boost::lexical_cast(boost_uuid); +} + +void +UUID::operator=(const std::string & str) +{ + boost_uuid = boost::lexical_cast(str); +} + +bool +UUID::operator!=(const UUID & other) const +{ + return boost_uuid != other.boost_uuid; +} + +#endif + +#ifdef USINGOSSPUUID + +UUID::UUID() +{ +} + +UUID::UUID(const std::string & str) +{ + ossp_uuid.import(str.c_str()); +} + +UUID +UUID::generate_random() +{ + UUID u; + u.ossp_uuid.make(UUID_MAKE_V5); + return u; +} + +bool +UUID::is_nil() const +{ + return ossp_uuid.isnil(); +} + +std::string +UUID::str() const +{ + char * s = ossp_uuid.string(); + std::string r(s); + free(s); + return r; +} + +void +UUID::operator=(const std::string & str) +{ + ossp_uuid.import(str.c_str()); +} + +bool +UUID::operator!=(const UUID & other) const +{ + return ossp_uuid != other.ossp_uuid; +} + +#endif + diff --git a/project2/uuid.h b/project2/uuid.h new file mode 100644 index 0000000..8cb22f3 --- /dev/null +++ b/project2/uuid.h @@ -0,0 +1,38 @@ +#ifndef UUID_H +#define UUID_H + +#include +#include + +#if BOOST_VERSION < 104200 +//#if 1 +# define USINGOSSPUUID +# include +#else +# define USINGBOOSTUUID +# include +#endif + +class UUID { + public: + UUID(); + UUID(const std::string &); + + static UUID generate_random(); + + bool operator!=(const UUID & other) const; + bool is_nil() const; + + void operator=(const std::string &); + std::string str() const; + + private: +#ifdef USINGBOOSTUUID + boost::uuids::uuid boost_uuid; +#endif +#ifdef USINGOSSPUUID + mutable uuid ossp_uuid; +#endif +}; + +#endif -- cgit v1.2.3