diff --git a/.cproject b/.cproject
index 234cdba..75372de 100644
--- a/.cproject
+++ b/.cproject
@@ -55,14 +55,7 @@
-
- make
- cliever
- true
- true
- true
-
-
+
make
clean
@@ -70,17 +63,8 @@
true
true
-
- make
-
- distclean
- true
- true
- true
-
make
-
all
true
true
@@ -88,7 +72,6 @@
make
-
tests
true
true
@@ -96,12 +79,33 @@
make
-
clean
true
true
true
+
+ make
+
+ cliever
+ true
+ true
+ true
+
+
+ make
+ clean
+ true
+ true
+ true
+
+
+ make
+ distclean
+ true
+ true
+ true
+
diff --git a/ACTK1_3_2/Makefile b/ACTK1_3_2/Makefile
new file mode 100644
index 0000000..33af21d
--- /dev/null
+++ b/ACTK1_3_2/Makefile
@@ -0,0 +1,121 @@
+##################################################
+# Makefile for building lib and main test routine#
+##################################################
+# operating system
+SYSTEM = $(shell uname -s)
+
+CXX = g++
+CC = gcc
+
+#SHARED_CXXFLAGS += -O2
+SHARED_CXXFLAGS += -g
+
+CXXFLAGS = $(SHARED_CXXFLAGS) -Wall -Wpointer-arith -Wcast-qual -D_REENTRANT -fPIC
+CPPFLAGS = -fPIC -D_GNU_SOURCE
+CXXFLAGS += -D_GNU_SOURCE -O0
+
+#XERCES_HOME = /usr/local/xerces-c-src_2_7_0
+#XERCES_LIB_DIR = ${XERCES_HOME}/lib
+#XERCES_LIB = xerces-c2_7_0
+
+#XALAN_HOME = /usr/local/xalan-c_1_10_0
+#XALAN_LIB_DIR = $(XALAN_HOME)/lib
+
+include xml-deps.mk
+
+##### Set this to the location of the library to be produced
+
+BUILD_LIB_DIR = lib
+BUILD_OBJ_DIR = build
+
+###### Include Paths
+
+INCLUDE_DIR = -I . -I $(XERCES_INC_DIR) -I $(XALAN_INC_DIR)
+
+build_obj_dir = $(BUILD_OBJ_DIR)
+
+src_dirs_cpp = se se/secDNS common session xml
+src_dirs_c = config
+srcs_all = $(foreach dir,$(src_dirs_cpp),$(wildcard $(dir)/*.cpp))
+srcs_all += $(foreach dir,$(src_dirs_c),$(wildcard $(dir)/*.c))
+
+srcs = $(filter-out %Test.cpp,$(srcs_all))
+objs = $(foreach file,$(srcs),$(build_obj_dir)/$(basename $(notdir $(file))).o)
+test_srcs = $(filter %Test.cpp,$(srcs_all))
+test_objs = $(foreach file,$(test_srcs),$(build_obj_dir)/$(basename $(notdir $(file))).o)
+test_execs = $(subst .o,,$(test_objs))
+
+calc_deps = \
+ $(CC) -MT '$(build_obj_dir)/$(basename $(notdir $@)).o $@' -MF $@ -MM $(CPPFLAGS) $(INCLUDE_DIR) $<
+
+all: dirs $(objs) $(BUILD_LIB_DIR)/libAusRegEPPTK.so
+
+%.d: %.c
+ $(calc_deps)
+%.d: %.cpp
+ $(calc_deps)
+include $(foreach name,$(srcs_all),$(basename $(name)).d)
+
+vpath %.cpp ./ \
+ ./se\
+ ./se/secDNS\
+ ./xml\
+ ./common\
+ ./session\
+
+vpath %.c ./config
+
+vpath %.o ../build
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .c
+
+$(BUILD_OBJ_DIR)/%.o: %.cpp
+ $(CXX) $(CXXFLAGS) -c -o $@ $(INCLUDE_DIR) $<
+
+$(BUILD_OBJ_DIR)/%.o: %.c
+ $(CC) $(CPPFLAGS) -c -o $@ $(INCLUDE_DIR) $<
+
+
+LDFLAGS_TESTS = -L$(BUILD_LIB_DIR) -lAusRegEPPTK \
+ -L$(XALAN_LIB_DIR) -lxalan-c -lxalanMsg\
+ -L$(XERCES_LIB_DIR) -lxerces-c \
+ -lssl \
+ -lrt
+
+$(BUILD_OBJ_DIR)/%: $(BUILD_OBJ_DIR)/%.o
+ $(CXX) $(LDFLAGS_TESTS) -o $@ $<
+
+.PHONY: doc clean dclean
+####### Build rules
+
+#libAusreg_EPP_toolkit.a: $(OBJECTS)
+# $(LIB_ARCHIVER) $(LIB_FLAGS) $(BUILD_LIB_DIR)/$@ $^
+
+
+.PHONY: tests
+tests: all $(test_execs)
+
+
+.PHONY: dirs
+dirs:
+ -mkdir -p $(BUILD_LIB_DIR)
+ -mkdir -p $(BUILD_OBJ_DIR)
+
+libAusRegEPPTK.so:
+$(BUILD_LIB_DIR)/libAusRegEPPTK.so: $(objs)
+ $(CXX) $(LDFLAGS) $(SHARED_CXXFLAGS) -shared $^ -o $@
+
+doc:
+ doxygen etc/Doxyfile
+
+clean:
+ $(RM) $(objs) $(BUILD_LIB_DIR)/libAusRegEPPTK.so *~
+ $(RM) -r $(BUILD_OBJ_DIR)
+ $(RM) -r $(BUILD_LIB_DIR)
+
+dclean:
+ $(MAKE) clean
+ $(RM) */*.d
+
diff --git a/ACTK1_3_2/common/AutoMutex.hpp b/ACTK1_3_2/common/AutoMutex.hpp
new file mode 100644
index 0000000..2a684e2
--- /dev/null
+++ b/ACTK1_3_2/common/AutoMutex.hpp
@@ -0,0 +1,29 @@
+#ifndef __AUTO_MUTEX_HPP
+#define __AUTO_MUTEX_HPP
+
+#include
+
+/**
+ * Wrapper to ensure mutex lock/unlock matching in the presence of exceptions.
+ */
+class AutoMutex
+{
+public:
+ AutoMutex(pthread_mutex_t* mutex)
+ : mtx(mutex)
+ {
+ // XXX errors
+ pthread_mutex_lock(mtx);
+ }
+
+ ~AutoMutex()
+ {
+ // XXX errors
+ pthread_mutex_unlock(mtx);
+ }
+
+private:
+ pthread_mutex_t* mtx;
+};
+#endif // __AUTO_MUTEX_HPP
+
diff --git a/ACTK1_3_2/common/ConfigurationError.hpp b/ACTK1_3_2/common/ConfigurationError.hpp
new file mode 100644
index 0000000..99b4186
--- /dev/null
+++ b/ACTK1_3_2/common/ConfigurationError.hpp
@@ -0,0 +1,17 @@
+#ifndef __CONFIGURATION_ERROR_HPP
+#define __CONFIGURATION_ERROR_HPP
+
+#include "common/EPPException.hpp"
+
+class ConfigurationError : public EPPException
+{
+public:
+ ConfigurationError (const std::string &msg)
+ : EPPException (msg) {};
+
+ ConfigurationError (const EPPException &other)
+ : EPPException (other.getMessage()) {};
+ EPP_EXCEPTION(ConfigurationError);
+};
+
+#endif // __CONFIGURATION_ERROR_HPP
diff --git a/ACTK1_3_2/common/Constants.cpp b/ACTK1_3_2/common/Constants.cpp
new file mode 100644
index 0000000..d1d7a50
--- /dev/null
+++ b/ACTK1_3_2/common/Constants.cpp
@@ -0,0 +1,7 @@
+#include "common/Constants.hpp"
+
+bool Constants::useObjectPrefixes(true);
+bool Constants::useRealTime(false);
+bool Constants::isValidating(true);
+const std::string Constants::DEFAULT_LANG("en");
+
diff --git a/ACTK1_3_2/common/Constants.d b/ACTK1_3_2/common/Constants.d
new file mode 100644
index 0000000..a348cd6
--- /dev/null
+++ b/ACTK1_3_2/common/Constants.d
@@ -0,0 +1,2 @@
+build/Constants.o common/Constants.d: common/Constants.cpp \
+ common/Constants.hpp
diff --git a/ACTK1_3_2/common/Constants.hpp b/ACTK1_3_2/common/Constants.hpp
new file mode 100644
index 0000000..b96e2e6
--- /dev/null
+++ b/ACTK1_3_2/common/Constants.hpp
@@ -0,0 +1,13 @@
+#ifndef __CONSTANTS_HPP
+#define __CONSTANTS_HPP
+
+#include
+
+class Constants
+{
+public:
+ static bool useObjectPrefixes, useRealTime, isValidating;
+ static const std::string DEFAULT_LANG;
+};
+
+#endif // __CONSTANTS_HPP
diff --git a/ACTK1_3_2/common/Deprecated.hpp b/ACTK1_3_2/common/Deprecated.hpp
new file mode 100644
index 0000000..2b25923
--- /dev/null
+++ b/ACTK1_3_2/common/Deprecated.hpp
@@ -0,0 +1,22 @@
+#ifndef DEPRECATED_HPP_
+#define DEPRECATED_HPP_
+
+/*
+ * Platform independent way of deprecating methods, as referenced from
+ * http://stackoverflow.com/questions/295120/c-mark-as-deprecated.
+ */
+
+#ifdef __GNUC__
+/* Deprecating classes and constructors by using this attribute may have some
+ * issues in versions older than 4.5.0, as reported in this gcc bug
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43797
+ */
+#define DEPRECATED(func) func __attribute__ ((deprecated))
+#elif defined(_MSC_VER)
+#define DEPRECATED(func) __declspec(deprecated) func
+#else
+#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
+#define DEPRECATED(func) func
+#endif
+
+#endif /* DEPRECATED_HPP_ */
diff --git a/ACTK1_3_2/common/EPPException.hpp b/ACTK1_3_2/common/EPPException.hpp
new file mode 100644
index 0000000..f0bcc28
--- /dev/null
+++ b/ACTK1_3_2/common/EPPException.hpp
@@ -0,0 +1,54 @@
+#ifndef __EPP_EXCEPTION_H
+#define __EPP_EXCEPTION_H
+
+#include
+#include
+#include
+
+#include
+
+#define EPP_EXCEPTION(className) virtual EPPException* clone() const { return new className (*this); }
+
+/**
+ * Root exception class for exception reporting within the EPP toolkit.
+ */
+class EPPException
+{
+public:
+
+ // constructor.
+ EPPException(const std::string& message)
+ : msg(message), cause(NULL)
+ { }
+
+ // copy constructor.
+ EPPException(const EPPException& other)
+ : msg(other.msg)
+ {
+ if (other.cause) cause = other.cause->clone();
+ else cause = NULL;
+ }
+
+ virtual ~EPPException() { if (cause) delete cause; }
+
+ const std::string getMessage() const
+ {
+ return msg + (cause != NULL ? "\nCaused by\n" + cause->getMessage() : "");
+ }
+
+ /// Indicate that this exception was caused by another exception.
+ virtual void causedBy(const EPPException& ex)
+ {
+ cause = ex.clone();
+ }
+
+ EPPException* getCause() const { return cause; }
+ EPP_EXCEPTION(EPPException);
+
+private:
+
+ std::string msg;
+ EPPException* cause;
+};
+
+#endif //__EPP_EXCEPTION_H
diff --git a/ACTK1_3_2/common/EPPExceptionTest.cpp b/ACTK1_3_2/common/EPPExceptionTest.cpp
new file mode 100644
index 0000000..c77550e
--- /dev/null
+++ b/ACTK1_3_2/common/EPPExceptionTest.cpp
@@ -0,0 +1,14 @@
+#include "common/EPPException.hpp"
+#include "common/Test.hpp"
+
+#include
+
+using namespace std;
+
+int main(int argc, char* argv[])
+{
+ EPPException a("whoops");
+ EPPException b("there was a problem");
+ a.causedBy(b);
+ ASSERT_EQ(a.getMessage(), "whoops\nCaused by\nthere was a problem");
+}
diff --git a/ACTK1_3_2/common/EPPExceptionTest.d b/ACTK1_3_2/common/EPPExceptionTest.d
new file mode 100644
index 0000000..905686d
--- /dev/null
+++ b/ACTK1_3_2/common/EPPExceptionTest.d
@@ -0,0 +1,2 @@
+build/EPPExceptionTest.o common/EPPExceptionTest.d: \
+ common/EPPExceptionTest.cpp common/EPPException.hpp common/Test.hpp
diff --git a/ACTK1_3_2/common/ErrorPkg.cpp b/ACTK1_3_2/common/ErrorPkg.cpp
new file mode 100644
index 0000000..22dadb1
--- /dev/null
+++ b/ACTK1_3_2/common/ErrorPkg.cpp
@@ -0,0 +1,104 @@
+#include "common/ErrorPkg.hpp"
+#include "common/Logger.hpp"
+#include "common/StringUtils.hpp"
+#include "common/SystemProperties.hpp"
+
+#include
+
+#include
+#include
+
+using namespace std;
+
+Properties ErrorPkg::properties;
+static std::string pname;
+
+
+void ErrorPkg::init() throw (PropertyConfigException)
+{
+ pname = "com.ausregistry.cpptoolkit";
+ try
+ {
+ string msgsFile = SystemProperties::getProperty("epp.client.messages.file");
+ Logger::getLogger(pname + ".debug")->fine("Using message file: " + msgsFile);
+
+ Logger::getLogger(pname + ".debug")->fine("Loading messages file: " + msgsFile);
+ properties.load(msgsFile);
+ }
+ catch (PropertyNotFoundException& e)
+ {
+ PropertyConfigException pc("ErrPkg::init failed.");
+ pc.causedBy(e);
+ throw pc;
+ }
+}
+
+string ErrorPkg::getMessage (const string &key)
+{
+ try
+ {
+ return properties.getProperty(key);
+ }
+ catch (PropertyNotFoundException)
+ {
+ Logger::getLogger(pname+".support")->warning
+ ("Message definition not found for name: " + key);
+ return "";
+ }
+}
+
+
+string ErrorPkg::getMessage (const string &name,
+ const string &arg,
+ const string &val)
+{
+ try
+ {
+ string msg = getMessage(name);
+
+ Logger::getLogger(pname+".debug")->finer
+ (name + ": " + arg + "= " + val);
+
+ return StringUtils::replaceAll(msg, arg, val);
+ }
+ catch (ConfigurationError)
+ {
+ Logger::getLogger(pname+".support")->warning
+ ("Message definition not found for name: " + name);
+ return "";
+ }
+}
+
+
+string ErrorPkg::getMessage(const string &name,
+ const vector &args,
+ const vector &vals)
+{
+ try
+ {
+ string msg = getMessage (name);
+
+ for (unsigned int i = 0; i < args.size() && i < vals.size(); i++)
+ {
+ Logger::getLogger(pname+".debug")->fine("replace: " + args[i]);
+ Logger::getLogger(pname+".debug")->fine("with: " + vals[i]);
+ msg = StringUtils::replaceAll (msg, args[i], vals[i]);
+ }
+
+ return msg;
+ }
+ catch (ConfigurationError)
+ {
+ Logger::getLogger(pname+".support")->warning
+ ("Message definition not found for name: " + name);
+
+ return "";
+ }
+}
+
+string ErrorPkg::findMessageFile()
+{
+ string msgsFile = SystemProperties::getProperty("epp.client.messages.file");
+ Logger::getLogger(pname+".debug")->config("Using message file: " + msgsFile);
+ return msgsFile;
+}
diff --git a/ACTK1_3_2/common/ErrorPkg.d b/ACTK1_3_2/common/ErrorPkg.d
new file mode 100644
index 0000000..365209a
--- /dev/null
+++ b/ACTK1_3_2/common/ErrorPkg.d
@@ -0,0 +1,4 @@
+build/ErrorPkg.o common/ErrorPkg.d: common/ErrorPkg.cpp \
+ common/ErrorPkg.hpp common/Properties.hpp config/config.h \
+ common/EPPException.hpp common/ConfigurationError.hpp common/Logger.hpp \
+ common/StringUtils.hpp common/SystemProperties.hpp
diff --git a/ACTK1_3_2/common/ErrorPkg.hpp b/ACTK1_3_2/common/ErrorPkg.hpp
new file mode 100644
index 0000000..87a2b37
--- /dev/null
+++ b/ACTK1_3_2/common/ErrorPkg.hpp
@@ -0,0 +1,32 @@
+#ifndef __ERROR_PKG_HPP
+#define __ERROR_PKG_HPP
+
+#include "common/Properties.hpp"
+#include "common/ConfigurationError.hpp"
+#include "common/Logger.hpp"
+#include
+#include
+
+class ErrorPkg
+{
+public:
+ static std::string getMessage(const std::string& msg);
+
+ static std::string getMessage(const std::string& msg,
+ const std::string& arg,
+ const std::string& val);
+
+ static std::string getMessage(const std::string& msg,
+ const std::vector& args,
+ const std::vector& vals);
+ static void init() throw (PropertyConfigException);
+private:
+
+ static std::string getMessageInternal(const std::string& msg);
+
+ static Properties properties;
+
+ static std::string findMessageFile();
+};
+
+#endif // __ERROR_PKG_HPP
diff --git a/ACTK1_3_2/common/IllegalStateException.hpp b/ACTK1_3_2/common/IllegalStateException.hpp
new file mode 100644
index 0000000..70a1e64
--- /dev/null
+++ b/ACTK1_3_2/common/IllegalStateException.hpp
@@ -0,0 +1,15 @@
+#ifndef __ILLEGAL_STATE_EXCEPTION_HPP
+#define __ILLEGAL_STATE_EXCEPTION_HPP
+
+#include "common/EPPException.hpp"
+
+class IllegalStateException : public EPPException
+{
+public:
+ IllegalStateException(const std::string &msg)
+ : EPPException (msg)
+ { }
+ EPP_EXCEPTION(IllegalStateException);
+};
+
+#endif // __ILLEGAL_ARGUMENT_EXCEPTION_HPP
diff --git a/ACTK1_3_2/common/Logger.cpp b/ACTK1_3_2/common/Logger.cpp
new file mode 100644
index 0000000..220d64c
--- /dev/null
+++ b/ACTK1_3_2/common/Logger.cpp
@@ -0,0 +1,237 @@
+#include "SystemProperties.hpp"
+#include "common/Logger.hpp"
+#include
+#include
+#include "common/AutoMutex.hpp"
+
+#include
+#include
+#include
+
+using namespace std;
+
+namespace {
+
+// s_loggerMap and s_loggerProperties are protected by s_logPoolLock
+class LoggerMap
+{
+public:
+
+ // This is primarily a thin wrapper around std::map to release the heap
+ // allocated Logger objects. (Bring on map ... ).
+ ~LoggerMap()
+ {
+ for (Map::iterator i = loggerMap.begin(); i != loggerMap.end(); ++i)
+ {
+ delete i->second;
+ }
+ }
+ typedef map Map;
+ typedef Map::const_iterator const_iterator;
+
+ Map::const_iterator find(const string& name) const
+ {
+ return loggerMap.find(name);
+ }
+
+ Map::const_iterator end() const { return loggerMap.end(); }
+
+ void addLog(const string& name, Logger::LoggerLevel lvl, const string& fname)
+ {
+ loggerMap.insert(make_pair(name, new Logger(name, lvl, fname)));
+ }
+
+private:
+ Map loggerMap;
+};
+static LoggerMap s_loggerMap;
+static auto_ptr s_loggerProperties;
+
+pthread_mutex_t s_logPoolLock = PTHREAD_MUTEX_INITIALIZER;
+
+const char * LoggerLevelStringReps[Logger::__INVALID_LEVEL + 1] =
+{
+ "OFF",
+ "FINEST",
+ "FINER",
+ "FINE",
+ "CONFIG",
+ "INFO",
+ "WARNING",
+ "SEVERE",
+ "__INVALID_LEVEL"
+};
+
+string findKey(const string& parent, const string& key, const string& def)
+{
+ const string delim(".");
+ string::size_type i;
+ for (i = parent.size(); i != string::npos; i = parent.rfind(delim, i))
+ {
+ try
+ {
+ return s_loggerProperties->getProperty(parent.substr(0, i) + delim + key);
+ }
+ catch (PropertyNotFoundException& e)
+ { }
+ if (i == 0) break;
+ i -= delim.size();
+ }
+ return def;
+}
+
+string getFileNameForLogger(const string& logName)
+{
+ try
+ {
+ return findKey(logName, "file", "");
+ }
+ catch (EPPException& e)
+ {
+ return "";
+ }
+}
+
+Logger::LoggerLevel getLevelForLogger(
+ const string& logName,
+ const Logger::LoggerLevel defaultLevel)
+{
+ try
+ {
+ const string lvl(findKey(logName, "level", "WARNING"));
+ for (int i = 0; i < Logger::__INVALID_LEVEL; i++)
+ {
+ if (lvl == LoggerLevelStringReps[i])
+ {
+ return (Logger::LoggerLevel)i;
+ }
+ }
+ return defaultLevel;
+ }
+ catch (EPPException& e)
+ {
+ return defaultLevel;
+ }
+}
+
+// Add a time string to str.
+ostream& logTime(ostream& str)
+{
+ struct timeval tv;
+ struct tm tm;
+ const char BUFSZ=32;
+ char tmpbuf[BUFSZ];
+
+ gettimeofday(&tv, NULL);
+ gmtime_r(&(tv.tv_sec), &tm);
+
+ strftime(tmpbuf, BUFSZ, "%Y%m%d %H:%M:%S", &tm);
+ str << tmpbuf;
+ snprintf(tmpbuf, BUFSZ, ".%03ld", tv.tv_usec / 1000);
+ str << tmpbuf;
+ return str;
+}
+
+} // anonymous namespace
+
+
+Logger::Logger(const string& name, const LoggerLevel ll, const string& fileName)
+ : myName(name), level(ll), stream(NULL)
+{
+ pthread_mutex_init(&mtx, NULL);
+ if (fileName.size() > 0)
+ {
+ stream = new ofstream(fileName.c_str(), ios_base::app);
+ if (!stream->good())
+ {
+ cerr << "Logger: failed open file '" << fileName
+ << "' for logger '" << name << "'." << endl;
+
+ // Note if the new worked, but the stream is 'invalid', the object
+ // still exists but is of no use. Let's delete it and treat it as
+ // for the default logging case.
+ delete stream;
+ stream = NULL;
+ }
+ }
+}
+
+Logger::~Logger()
+{
+ pthread_mutex_destroy(&mtx);
+ if (stream) delete stream;
+}
+
+void Logger::init() throw (PropertyConfigException)
+{
+ s_loggerMap = LoggerMap();
+ s_loggerProperties = auto_ptr(new Properties);
+ try
+ {
+ s_loggerProperties->load(SystemProperties::getProperty("logging.config.file"));
+ }
+ catch (PropertyConfigException& e)
+ {
+ // We explicitly send this to cerr as the logging system itself is not working!
+ cerr << "Logger::init failed to load config: "
+ << e.getMessage() << endl;
+ throw;
+ }
+ catch (PropertyNotFoundException& e)
+ {
+ PropertyConfigException pce("Could not initialise the logging system.");
+ pce.causedBy(e);
+
+ // We explicitly send this to cerr as the logging system itself is not
+ // working!
+ cerr << e.getMessage() << endl;
+ throw pce;
+ }
+}
+
+Logger* Logger::getLogger(const string &name)
+{
+ AutoMutex lock(&s_logPoolLock);
+
+ LoggerMap::const_iterator p = s_loggerMap.find(name);
+ if (p != s_loggerMap.end()) return p->second;
+
+ const string fname = getFileNameForLogger(name);
+ const LoggerLevel ll = getLevelForLogger(name, WARNING);
+ s_loggerMap.addLog(name, ll, fname);
+
+ // Redundant find, but this only happens once per log name.
+ return s_loggerMap.find(name)->second;
+}
+
+
+void Logger::log(LoggerLevel lvl,
+ const string& msg,
+ const string& unit,
+ int line)
+{
+ if (lvl >= this->level)
+ {
+ ostringstream str;
+ logTime(str) << " | " << myName << " | ";
+ if (unit != "")
+ {
+ str << unit;
+ if (line > 0) str << "[" << line << "]";
+ str << " | ";
+ }
+ str << LoggerLevelStringReps[lvl] << ": " << msg << "\n";
+
+ AutoMutex lock(&mtx);
+ if (stream)
+ {
+ *stream << str.str();
+ stream->flush();
+ }
+ else
+ {
+ clog << str.str();
+ clog.flush();
+ }
+ }
+}
diff --git a/ACTK1_3_2/common/Logger.d b/ACTK1_3_2/common/Logger.d
new file mode 100644
index 0000000..39b0e42
--- /dev/null
+++ b/ACTK1_3_2/common/Logger.d
@@ -0,0 +1,4 @@
+build/Logger.o common/Logger.d: common/Logger.cpp \
+ common/SystemProperties.hpp common/Properties.hpp config/config.h \
+ common/EPPException.hpp common/Logger.hpp common/ConfigurationError.hpp \
+ common/AutoMutex.hpp
diff --git a/ACTK1_3_2/common/Logger.hpp b/ACTK1_3_2/common/Logger.hpp
new file mode 100644
index 0000000..cde46cf
--- /dev/null
+++ b/ACTK1_3_2/common/Logger.hpp
@@ -0,0 +1,92 @@
+#ifndef __LOGGER_HPP
+#define __LOGGER_HPP
+
+#include "common/Properties.hpp"
+#include "common/ConfigurationError.hpp"
+
+#include
+#include