summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/ocsp-client.cpp4
-rw-r--r--src/client/ocsp.cpp3
-rw-r--r--src/common/binary-queue.cpp5
-rw-r--r--src/common/dispatcher.h3
-rw-r--r--src/common/eventfd.cpp3
-rw-r--r--src/common/eventfd.h4
-rw-r--r--src/common/log.cpp44
-rw-r--r--src/common/log.h61
-rw-r--r--src/common/mainloop.cpp7
-rw-r--r--src/common/service.cpp16
-rw-r--r--src/common/socket.cpp14
-rw-r--r--src/common/timer.cpp11
-rw-r--r--src/common/timer.h5
-rw-r--r--src/db/sql_query.cpp466
-rw-r--r--src/dpl/core/include/cchecker/dpl/assert.h14
-rw-r--r--src/dpl/core/include/cchecker/dpl/colors.h74
-rw-r--r--src/dpl/core/include/cchecker/dpl/exception.h617
-rw-r--r--src/dpl/core/include/cchecker/dpl/noncopyable.h15
-rw-r--r--src/dpl/core/include/cchecker/dpl/optional.h274
-rw-r--r--src/dpl/core/include/cchecker/dpl/scoped_array.h51
-rw-r--r--src/dpl/core/include/cchecker/dpl/scoped_free.h32
-rw-r--r--src/dpl/core/include/cchecker/dpl/scoped_resource.h77
-rw-r--r--src/dpl/core/include/cchecker/dpl/serialization.h849
-rw-r--r--src/dpl/core/include/cchecker/dpl/string.h123
-rw-r--r--src/dpl/core/src/assert.cpp64
-rw-r--r--src/dpl/core/src/colors.cpp74
-rw-r--r--src/dpl/core/src/errno_string.cpp87
-rw-r--r--src/dpl/core/src/exception.cpp34
-rw-r--r--src/dpl/core/src/string.cpp332
-rw-r--r--src/dpl/db/include/cchecker/dpl/db/naive_synchronization_object.h11
-rw-r--r--src/dpl/db/include/cchecker/dpl/db/sql_connection.h897
-rw-r--r--src/dpl/db/src/naive_synchronization_object.cpp8
-rw-r--r--src/dpl/db/src/sql_connection.cpp1169
-rw-r--r--src/include/cchecker/UIBackend.h28
-rw-r--r--src/include/cchecker/popup-runner.h28
-rw-r--r--src/include/cchecker/sql_query.h66
-rw-r--r--src/main/cert-checker.cpp5
-rw-r--r--src/service/app.cpp57
-rw-r--r--src/service/app.h38
-rw-r--r--src/service/certs.cpp283
-rw-r--r--src/service/certs.h36
-rw-r--r--src/service/logic.cpp1038
-rw-r--r--src/service/logic.h213
-rw-r--r--src/service/ocsp-service.cpp11
-rw-r--r--src/service/queue.cpp27
-rw-r--r--src/service/queue.h34
-rw-r--r--src/ui/UIBackend.cpp47
-rw-r--r--src/ui/popup-bin/popup.cpp448
-rw-r--r--src/ui/popup-bin/popup.h20
-rw-r--r--src/ui/popup-runner.cpp417
50 files changed, 4077 insertions, 4167 deletions
diff --git a/src/client/ocsp-client.cpp b/src/client/ocsp-client.cpp
index 63e6d26..e40f890 100644
--- a/src/client/ocsp-client.cpp
+++ b/src/client/ocsp-client.cpp
@@ -41,9 +41,9 @@ CCerr OcspClient::request()
{
LogDebug("Request to oscp service.");
auto ret = m_dispatcher->methodCall<CommandId>(CommandId::CC_OCSP_SYN);
-
LogDebug("Response ret : " << static_cast<int>(ret));
- if(ret == CommandId::CC_OCSP_ACK)
+
+ if (ret == CommandId::CC_OCSP_ACK)
return E_CC_NONE;
else
return E_CC_INTERNAL;
diff --git a/src/client/ocsp.cpp b/src/client/ocsp.cpp
index 0302687..eb6744a 100644
--- a/src/client/ocsp.cpp
+++ b/src/client/ocsp.cpp
@@ -26,7 +26,8 @@
#include "client/error.h"
__attribute__((visibility("default")))
-int cchecker_ocsp_request() {
+int cchecker_ocsp_request()
+{
CCHECKER::OcspClient oc;
return oc.request() == CCHECKER::E_CC_NONE ? 0 : -1;
};
diff --git a/src/common/binary-queue.cpp b/src/common/binary-queue.cpp
index 776f65e..34cc9f9 100644
--- a/src/common/binary-queue.cpp
+++ b/src/common/binary-queue.cpp
@@ -39,9 +39,7 @@ BinaryQueue::~BinaryQueue()
RawBuffer BinaryQueue::pop()
{
RawBuffer buf(m_size);
-
read(m_size, buf.data());
-
return buf;
}
@@ -78,7 +76,6 @@ void BinaryQueue::read(size_t size, void *bytes)
size_t count = std::min(size, m_buckets.front()->left);
cur = m_buckets.front()->extractTo(cur, count);
-
size -= count;
m_size -= count;
@@ -107,10 +104,8 @@ void *BinaryQueue::Bucket::extractTo(void *dest, size_t size)
throw std::logic_error("logic error. invalid input to Bucket::extractTo.");
memcpy(dest, cur, size);
-
cur += size;
left -= size;
-
return static_cast<unsigned char *>(dest) + size;
}
diff --git a/src/common/dispatcher.h b/src/common/dispatcher.h
index def73ed..9e29580 100644
--- a/src/common/dispatcher.h
+++ b/src/common/dispatcher.h
@@ -57,13 +57,10 @@ Type Dispatcher::methodCall(Args &&...args)
connect();
m_connection->send(BinaryQueue::Serialize(std::forward<Args>(args)...).pop());
-
BinaryQueue q;
q.push(m_connection->receive());
-
Type response;
q.Deserialize(response);
-
return response;
}
diff --git a/src/common/eventfd.cpp b/src/common/eventfd.cpp
index 1828b1f..a3dba42 100644
--- a/src/common/eventfd.cpp
+++ b/src/common/eventfd.cpp
@@ -33,6 +33,7 @@ namespace CCHECKER {
EventFD::EventFD(unsigned int initval, int flags)
{
fd = ::eventfd(initval, flags);
+
if (fd == -1) {
throw std::logic_error("EventFd from constructor is failed!!");
}
@@ -48,6 +49,7 @@ EventFD::~EventFD()
void EventFD::send()
{
const std::uint64_t val = 1;
+
if (::write(fd, &val, sizeof(val)) == -1) {
throw std::logic_error("EventFd send to fd is failed!!");
}
@@ -56,6 +58,7 @@ void EventFD::send()
void EventFD::receive()
{
std::uint64_t val;
+
if (::read(fd, &val, sizeof(val)) == -1) {
throw std::logic_error("EventFd read to fd is failed!!");
}
diff --git a/src/common/eventfd.h b/src/common/eventfd.h
index f10945f..64681ab 100644
--- a/src/common/eventfd.h
+++ b/src/common/eventfd.h
@@ -31,8 +31,8 @@ public:
EventFD(unsigned int initval = 0, int flags = EFD_SEMAPHORE | EFD_CLOEXEC);
~EventFD();
- EventFD(const EventFD&) = delete;
- EventFD& operator=(const EventFD&) = delete;
+ EventFD(const EventFD &) = delete;
+ EventFD &operator=(const EventFD &) = delete;
void send();
void receive();
diff --git a/src/common/log.cpp b/src/common/log.cpp
index c5528a2..9d83458 100644
--- a/src/common/log.cpp
+++ b/src/common/log.cpp
@@ -24,27 +24,27 @@
#include <systemd/sd-journal.h>
void JournalLog(int logLevel,
- const char *message,
- const char *fileName,
- int line,
- const char *function)
+ const char *message,
+ const char *fileName,
+ int line,
+ const char *function)
{
- try {
- sd_journal_send("PRIORITY=%d", logLevel,
- "CODE_FILE=%s", fileName,
- "CODE_FUNC=%s", function,
- "CODE_LINE=%d", line,
- // add file, line & function info to log message
- "MESSAGE=[%s:%d] %s(): %s", fileName, line, function, message,
- NULL);
- } catch (const std::out_of_range&) {
- sd_journal_send(
- "PRIORITY=%d", LOG_ERR,
- "CODE_FILE=%s", fileName,
- "CODE_FUNC=%s", function,
- "CODE_LINE=%d", line,
- // add file, line & function info to log message
- "MESSAGE=[%s:%d] %s(): Unsupported log level %d", fileName, line, function, logLevel,
- NULL);
- }
+ try {
+ sd_journal_send("PRIORITY=%d", logLevel,
+ "CODE_FILE=%s", fileName,
+ "CODE_FUNC=%s", function,
+ "CODE_LINE=%d", line,
+ // add file, line & function info to log message
+ "MESSAGE=[%s:%d] %s(): %s", fileName, line, function, message,
+ NULL);
+ } catch (const std::out_of_range &) {
+ sd_journal_send(
+ "PRIORITY=%d", LOG_ERR,
+ "CODE_FILE=%s", fileName,
+ "CODE_FUNC=%s", function,
+ "CODE_LINE=%d", line,
+ // add file, line & function info to log message
+ "MESSAGE=[%s:%d] %s(): Unsupported log level %d", fileName, line, function, logLevel,
+ NULL);
+ }
}
diff --git a/src/common/log.h b/src/common/log.h
index 99d494b..b0c802d 100644
--- a/src/common/log.h
+++ b/src/common/log.h
@@ -26,57 +26,56 @@
#define CERT_CHECKER_LOG_H
void JournalLog(int logLevel, const char *message, const char *fileName,
- int line, const char *function);
+ int line, const char *function);
/*
* Replacement low overhead null logging class
*/
-class NullStream
-{
- public:
- NullStream() {}
+class NullStream {
+public:
+ NullStream() {}
- template <typename T>
- NullStream& operator<<(const T&)
- {
- return *this;
- }
+ template <typename T>
+ NullStream &operator<<(const T &)
+ {
+ return *this;
+ }
};
/* avoid warnings about unused variables */
#define DPL_MACRO_DUMMY_LOGGING(message, level) \
- do { \
- NullStream ns; \
- ns << message; \
- } while (0)
+ do { \
+ NullStream ns; \
+ ns << message; \
+ } while (0)
#define CERT_CHECKER_LOG(message, level) \
-do \
-{ \
- std::ostringstream platformLog; \
- platformLog << message; \
- JournalLog(level, \
- platformLog.str().c_str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
-} while (0)
+ do \
+ { \
+ std::ostringstream platformLog; \
+ platformLog << message; \
+ JournalLog(level, \
+ platformLog.str().c_str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ } while (0)
/* always logged. */
#define LogError(message) \
- CERT_CHECKER_LOG(message, LOG_ERR)
+ CERT_CHECKER_LOG(message, LOG_ERR)
#define LogInfo(message) \
- CERT_CHECKER_LOG(message, LOG_INFO)
+ CERT_CHECKER_LOG(message, LOG_INFO)
#define LogWarning(message) \
- CERT_CHECKER_LOG(message, LOG_WARNING)
+ CERT_CHECKER_LOG(message, LOG_WARNING)
/* only debug logged. */
#ifdef BUILD_TYPE_DEBUG
- #define LogDebug(message) \
- CERT_CHECKER_LOG(message, LOG_DEBUG)
+#define LogDebug(message) \
+ CERT_CHECKER_LOG(message, LOG_DEBUG)
#else
- #define LogDebug(message) \
- DPL_MACRO_DUMMY_LOGGING(message, LOG_DEBUG)
+#define LogDebug(message) \
+ DPL_MACRO_DUMMY_LOGGING(message, LOG_DEBUG)
#endif // BUILD_TYPE_DEBUG
#endif //CERT_CHECKER_LOG_H
diff --git a/src/common/mainloop.cpp b/src/common/mainloop.cpp
index 8ce7326..0c0d19f 100644
--- a/src/common/mainloop.cpp
+++ b/src/common/mainloop.cpp
@@ -47,7 +47,7 @@ Mainloop::~Mainloop()
{
if (!m_stopped && !m_isTimedOut && !m_callbacks.empty())
throw std::logic_error("mainloop registered callbacks should be empty "
- "except timed out case");
+ "except timed out case");
::close(m_pollfd);
}
@@ -64,7 +64,6 @@ void Mainloop::prepare()
wakeupSignal.receive();
removeEventSource(wakeupSignal.getFd());
};
-
addEventSource(wakeupSignal.getFd(), EPOLLIN, std::move(wakeupMainloop));
}
@@ -87,9 +86,7 @@ void Mainloop::addEventSource(int fd, uint32_t event, Callback &&callback)
throw std::logic_error("event source already added!");
LogDebug("Add event[" << event << "] source on fd[" << fd << "]");
-
epoll_event e;
-
e.events = event;
e.data.fd = fd;
@@ -127,7 +124,6 @@ void Mainloop::dispatch(int timeout)
{
int nfds = -1;
epoll_event event[MAX_EPOLL_EVENTS];
-
LogDebug("Mainloop dispatched with timeout: " << timeout);
do {
@@ -158,7 +154,6 @@ void Mainloop::dispatch(int timeout)
}
LogDebug("event[" << event[i].events << "] polled on fd[" << fd << "]");
-
m_callbacks[fd](event[i].events);
}
}
diff --git a/src/common/service.cpp b/src/common/service.cpp
index 0c14dc2..3547efa 100644
--- a/src/common/service.cpp
+++ b/src/common/service.cpp
@@ -32,7 +32,6 @@ namespace CCHECKER {
Service::Service(const std::string &address) : m_address(address)
{
LogDebug("Service constructed with address[" << address << "]");
-
m_timeout = -1;
setNewConnectionCallback(nullptr);
setCloseConnectionCallback(nullptr);
@@ -45,12 +44,9 @@ Service::~Service()
void Service::start()
{
LogInfo("Service start!");
-
Socket socket(m_address);
-
LogDebug("Get systemd socket[" << socket.getFd()
- << "] with address[" << m_address << "]");
-
+ << "] with address[" << m_address << "]");
m_loop.addEventSource(socket.getFd(), EPOLLIN | EPOLLHUP | EPOLLRDHUP,
[&](uint32_t event) {
if (event != EPOLLIN)
@@ -58,7 +54,6 @@ void Service::start()
m_onNewConnection(std::make_shared<Connection>(socket.accept()));
});
-
m_loop.run(m_timeout);
}
@@ -76,17 +71,14 @@ void Service::setNewConnectionCallback(const ConnCallback &/*callback*/)
throw std::logic_error("onNewConnection called but ConnShPtr is nullptr.");
int fd = connection->getFd();
-
LogInfo("welcome! accepted client socket fd[" << fd << "]");
-
/*
// TODO: disable temporarily
if (callback)
callback(connection);
*/
-
m_loop.addEventSource(fd, EPOLLIN | EPOLLHUP | EPOLLRDHUP,
- [&, fd](uint32_t event) {
+ [ &, fd](uint32_t event) {
LogDebug("read event comes in to fd[" << fd << "]");
if (m_connectionRegistry.count(fd) == 0)
@@ -101,10 +93,8 @@ void Service::setNewConnectionCallback(const ConnCallback &/*callback*/)
}
LogDebug("Start message process on fd[" << fd << "]");
-
onMessageProcess(conn);
});
-
m_connectionRegistry[fd] = connection;
};
}
@@ -122,10 +112,8 @@ void Service::setCloseConnectionCallback(const ConnCallback &/*callback*/)
throw std::logic_error("no connection in registry to remove.");
LogInfo("good-bye! close socket fd[" << fd << "]");
-
m_loop.removeEventSource(fd);
m_connectionRegistry.erase(fd); /* scoped-lock needed? */
-
/*
// TODO: disable temporarily
if (callback)
diff --git a/src/common/socket.cpp b/src/common/socket.cpp
index 05ed75f..a30d605 100644
--- a/src/common/socket.cpp
+++ b/src/common/socket.cpp
@@ -85,7 +85,6 @@ Socket &Socket::operator=(Socket &&other)
m_fd = other.m_fd;
other.m_fd = 0;
-
return *this;
}
@@ -108,7 +107,6 @@ Socket Socket::accept() const
"socket accept failed!");
LogInfo("Accept client success with fd: " << fd);
-
return Socket(fd);
}
@@ -126,7 +124,6 @@ Socket Socket::connect(const std::string &path)
sockaddr_un addr;
addr.sun_family = AF_UNIX;
-
strncpy(addr.sun_path, path.c_str(), sizeof(addr.sun_path));
if (::connect(fd, reinterpret_cast<sockaddr *>(&addr),
@@ -136,7 +133,6 @@ Socket Socket::connect(const std::string &path)
"socket connect failed!");
LogInfo("Connect to OCSP service success with fd:" << fd);
-
return Socket(fd);
}
@@ -148,11 +144,9 @@ int Socket::getFd() const
RawBuffer Socket::read(void) const
{
size_t total = 0;
-
RawBuffer data(1024, 0);
auto buf = reinterpret_cast<char *>(data.data());
auto size = data.size();
-
LogDebug("Read data from stream on socket fd[" << m_fd << "]");
while (total < size) {
@@ -173,20 +167,16 @@ RawBuffer Socket::read(void) const
}
data.resize(total);
-
LogDebug("Read data of size[" << total
- << "] from stream on socket fd[" << m_fd << "] done.");
-
+ << "] from stream on socket fd[" << m_fd << "] done.");
return data;
}
void Socket::write(const RawBuffer &data) const
{
size_t total = 0;
-
auto buf = reinterpret_cast<const char *>(data.data());
auto size = data.size();
-
LogDebug("Write data to stream on socket fd[" << m_fd << "]");
while (total < size) {
@@ -205,7 +195,7 @@ void Socket::write(const RawBuffer &data) const
}
LogDebug("Write data of size[" << total <<
- "] to stream on socket fd[" << m_fd << "] done.");
+ "] to stream on socket fd[" << m_fd << "] done.");
}
} // namespace CCHECKER
diff --git a/src/common/timer.cpp b/src/common/timer.cpp
index 63267d5..395375e 100644
--- a/src/common/timer.cpp
+++ b/src/common/timer.cpp
@@ -38,7 +38,7 @@ void Timer::timerStart(int interval)
{
LogDebug("Timer start!!");
- if(m_isRunning)
+ if (m_isRunning)
return;
m_isRunning = true;
@@ -63,7 +63,7 @@ void Timer::timerStop()
void Timer::run()
{
- while(1) {
+ while (1) {
LogDebug("[timer] running interval : " << m_interval);
if (m_isStop)
@@ -73,10 +73,9 @@ void Timer::run()
m_cv.wait_for(
lock,
std::chrono::seconds(m_interval),
- [this] {
- return m_isStop == true;
- }
- );
+ [this] {
+ return m_isStop == true;
+ });
job();
}
diff --git a/src/common/timer.h b/src/common/timer.h
index e24ac35..9029ba7 100644
--- a/src/common/timer.h
+++ b/src/common/timer.h
@@ -29,8 +29,7 @@
namespace CCHECKER {
-class Timer
-{
+class Timer {
public:
Timer(void);
virtual ~Timer(void);
@@ -45,7 +44,7 @@ public:
protected:
// This is for derived class member function.
- virtual void job(void){}
+ virtual void job(void) {}
void run();
diff --git a/src/db/sql_query.cpp b/src/db/sql_query.cpp
index bafbf56..2485b0b 100644
--- a/src/db/sql_query.cpp
+++ b/src/db/sql_query.cpp
@@ -26,278 +26,292 @@
namespace {
- #define DB_ISSUER 101
- #define DB_DATE 102
- #define DB_APP_ID 103
- #define DB_PKG_ID 104
- #define DB_UID 105
- #define DB_CHECK_ID 106
- #define DB_CERTIFICATE 107
- #define DB_VERIFIED 108
- #define DB_CHAIN_ID 109
- #define DB_CERT_ORDER 110
-
- // This changes define into question mark and a number in quotes
- // e.g. _(DB_ISSUER) -> "?" "101"
- #define _(db) __(db)
- #define __(db) "?" #db
-
- // setup
- const char *DB_CMD_SETUP = "VACUUM; PRAGMA foregin_keys=ON;";
-
- const char *DB_CMD_GET_LAST_INSERTED_ROW = "SELECT last_insert_rowid();";
-
- // apps
- const char *DB_CMD_ADD_APP =
- "INSERT INTO to_check(app_id, pkg_id, uid, verified) VALUES(" _(DB_APP_ID) ", " _(DB_PKG_ID) ", " _(DB_UID) ", " _(DB_VERIFIED) ");";
-
- const char *DB_CMD_GET_CHECK_ID =
- "SELECT check_id FROM to_check WHERE app_id=" _(DB_APP_ID) " AND pkg_id=" _(DB_PKG_ID) " AND uid=" _(DB_UID) ";";
-
- const char *DB_CMD_ADD_CHAIN =
- "INSERT INTO chains_to_check(check_id) VALUES(" _(DB_CHECK_ID) ");";
-
- const char *DB_CMD_ADD_CERT =
- "INSERT INTO certs_to_check(chain_id, certificate, cert_order) VALUES(" _(DB_CHAIN_ID) ", " _(DB_CERTIFICATE) ", " _(DB_CERT_ORDER) ");";
-
- const char *DB_CMD_GET_CHAINS =
- "SELECT chain_id FROM chains_to_check INNER JOIN to_check ON chains_to_check.check_id=to_check.check_id WHERE to_check.app_id="
- _(DB_APP_ID) " AND to_check.pkg_id=" _(DB_PKG_ID) " AND to_check.uid=" _(DB_UID) ";";
-
- const char *DB_CMD_REMOVE_APP =
- "DELETE FROM to_check WHERE app_id=" _(DB_APP_ID) " AND pkg_id=" _(DB_PKG_ID) " AND uid=" _(DB_UID) ";";
-
- const char *DB_CMD_GET_APPS =
- "SELECT app_id, pkg_id, uid, verified FROM to_check";
-
- const char *DB_CMD_GET_CERTS =
- "SELECT certificate FROM certs_to_check WHERE chain_id=" _(DB_CHAIN_ID) " ORDER BY cert_order ASC;";
-
- const char *DB_CMD_SET_APP_AS_VERIFIED =
- "UPDATE to_check SET verified=" _(DB_VERIFIED) " WHERE check_id=" _(DB_CHECK_ID) ";";
+#define DB_ISSUER 101
+#define DB_DATE 102
+#define DB_APP_ID 103
+#define DB_PKG_ID 104
+#define DB_UID 105
+#define DB_CHECK_ID 106
+#define DB_CERTIFICATE 107
+#define DB_VERIFIED 108
+#define DB_CHAIN_ID 109
+#define DB_CERT_ORDER 110
+
+// This changes define into question mark and a number in quotes
+// e.g. _(DB_ISSUER) -> "?" "101"
+#define _(db) __(db)
+#define __(db) "?" #db
+
+// setup
+const char *DB_CMD_SETUP = "VACUUM; PRAGMA foregin_keys=ON;";
+
+const char *DB_CMD_GET_LAST_INSERTED_ROW = "SELECT last_insert_rowid();";
+
+// apps
+const char *DB_CMD_ADD_APP =
+ "INSERT INTO to_check(app_id, pkg_id, uid, verified) VALUES(" _(DB_APP_ID) ", " _(DB_PKG_ID) ", " _
+ (DB_UID) ", " _(DB_VERIFIED) ");";
+
+const char *DB_CMD_GET_CHECK_ID =
+ "SELECT check_id FROM to_check WHERE app_id=" _(DB_APP_ID) " AND pkg_id=" _
+ (DB_PKG_ID) " AND uid=" _(DB_UID) ";";
+
+const char *DB_CMD_ADD_CHAIN =
+ "INSERT INTO chains_to_check(check_id) VALUES(" _(DB_CHECK_ID) ");";
+
+const char *DB_CMD_ADD_CERT =
+ "INSERT INTO certs_to_check(chain_id, certificate, cert_order) VALUES(" _(DB_CHAIN_ID) ", " _
+ (DB_CERTIFICATE) ", " _(DB_CERT_ORDER) ");";
+
+const char *DB_CMD_GET_CHAINS =
+ "SELECT chain_id FROM chains_to_check INNER JOIN to_check ON chains_to_check.check_id=to_check.check_id WHERE to_check.app_id="
+ _(DB_APP_ID) " AND to_check.pkg_id=" _(DB_PKG_ID) " AND to_check.uid=" _(DB_UID) ";";
+
+const char *DB_CMD_REMOVE_APP =
+ "DELETE FROM to_check WHERE app_id=" _(DB_APP_ID) " AND pkg_id=" _(DB_PKG_ID) " AND uid=" _
+ (DB_UID) ";";
+
+const char *DB_CMD_GET_APPS =
+ "SELECT app_id, pkg_id, uid, verified FROM to_check";
+
+const char *DB_CMD_GET_CERTS =
+ "SELECT certificate FROM certs_to_check WHERE chain_id=" _(DB_CHAIN_ID) " ORDER BY cert_order ASC;";
+
+const char *DB_CMD_SET_APP_AS_VERIFIED =
+ "UPDATE to_check SET verified=" _(DB_VERIFIED) " WHERE check_id=" _(DB_CHECK_ID) ";";
}
namespace CCHECKER {
namespace DB {
-SqlQuery::SqlQuery(const std::string& path)
+SqlQuery::SqlQuery(const std::string &path)
{
- m_connection = NULL;
- m_inUserTransaction = false;
+ m_connection = NULL;
+ m_inUserTransaction = false;
- if (!connect(path))
- throw std::runtime_error("Database error");
+ if (!connect(path))
+ throw std::runtime_error("Database error");
}
-bool SqlQuery::connect(const std::string& path)
+bool SqlQuery::connect(const std::string &path)
{
- if (m_connection != NULL) {
- LogError("Already connected!");
- return true;
- }
-
- Try {
- m_connection = new SqlConnection(path, SqlConnection::Flag::None, SqlConnection::Flag::Option::CRW);
- m_connection->ExecCommand(DB_CMD_SETUP);
- return true;
- } Catch(std::bad_alloc) {
- LogError("Couldn't allocate SqlConnection");
- } Catch(SqlConnection::Exception::ConnectionBroken) {
- LogError("Couldn't connect to database: " << path);
- } Catch(SqlConnection::Exception::InvalidColumn) {
- LogError("Couldn't set the key for database");
- } Catch(SqlConnection::Exception::SyntaxError) {
- LogError("Couldn't initiate the database");
- } Catch(SqlConnection::Exception::InternalError) {
- LogError("Couldn't create the database");
- }
- return false;
+ if (m_connection != NULL) {
+ LogError("Already connected!");
+ return true;
+ }
+
+ Try {
+ m_connection = new SqlConnection(path, SqlConnection::Flag::None, SqlConnection::Flag::Option::CRW);
+ m_connection->ExecCommand(DB_CMD_SETUP);
+ return true;
+ } Catch(std::bad_alloc) {
+ LogError("Couldn't allocate SqlConnection");
+ }
+ Catch(SqlConnection::Exception::ConnectionBroken) {
+ LogError("Couldn't connect to database: " << path);
+ }
+ Catch(SqlConnection::Exception::InvalidColumn) {
+ LogError("Couldn't set the key for database");
+ }
+ Catch(SqlConnection::Exception::SyntaxError) {
+ LogError("Couldn't initiate the database");
+ }
+ Catch(SqlConnection::Exception::InternalError) {
+ LogError("Couldn't create the database");
+ }
+ return false;
}
SqlQuery::~SqlQuery()
{
- delete m_connection;
+ delete m_connection;
}
bool SqlQuery::check_if_app_exists(const app_t &app)
{
- int32_t check_id;
- return get_check_id(app, check_id);
+ int32_t check_id;
+ return get_check_id(app, check_id);
}
bool SqlQuery::get_check_id(const app_t &app, int32_t &check_id)
{
- SqlConnection::DataCommandAutoPtr getCheckIDCommand =
- m_connection->PrepareDataCommand(DB_CMD_GET_CHECK_ID);
- getCheckIDCommand->BindString(DB_APP_ID, app.app_id.c_str());
- getCheckIDCommand->BindString(DB_PKG_ID, app.pkg_id.c_str());
- getCheckIDCommand->BindInt64(DB_UID, app.uid);
- if (getCheckIDCommand->Step()) {
- check_id = getCheckIDCommand->GetColumnInt32(0);
- LogDebug("Found check id: " << check_id << ", for app: " << app.app_id);
- return true;
- }
- LogDebug("No check_id for app: " << app.app_id << " in database");
- return false;
+ SqlConnection::DataCommandAutoPtr getCheckIDCommand =
+ m_connection->PrepareDataCommand(DB_CMD_GET_CHECK_ID);
+ getCheckIDCommand->BindString(DB_APP_ID, app.app_id.c_str());
+ getCheckIDCommand->BindString(DB_PKG_ID, app.pkg_id.c_str());
+ getCheckIDCommand->BindInt64(DB_UID, app.uid);
+
+ if (getCheckIDCommand->Step()) {
+ check_id = getCheckIDCommand->GetColumnInt32(0);
+ LogDebug("Found check id: " << check_id << ", for app: " << app.app_id);
+ return true;
+ }
+
+ LogDebug("No check_id for app: " << app.app_id << " in database");
+ return false;
}
bool SqlQuery::add_chain_id(const int32_t check_id, int32_t &chain_id)
{
- // Add new chain for an app
- SqlConnection::DataCommandAutoPtr addChainCommand =
- m_connection->PrepareDataCommand(DB_CMD_ADD_CHAIN);
- addChainCommand->BindInt32(DB_CHECK_ID, check_id);
- addChainCommand->Step();
-
- // get chain_id
- SqlConnection::DataCommandAutoPtr getLastInserted =
- m_connection->PrepareDataCommand(DB_CMD_GET_LAST_INSERTED_ROW);
- if(getLastInserted->Step()) {
- chain_id = getLastInserted->GetColumnInt32(0);
- LogDebug("Found chain_id: " << chain_id << ", for check_id " << check_id);
- return true;
- }
- return false;
+ // Add new chain for an app
+ SqlConnection::DataCommandAutoPtr addChainCommand =
+ m_connection->PrepareDataCommand(DB_CMD_ADD_CHAIN);
+ addChainCommand->BindInt32(DB_CHECK_ID, check_id);
+ addChainCommand->Step();
+ // get chain_id
+ SqlConnection::DataCommandAutoPtr getLastInserted =
+ m_connection->PrepareDataCommand(DB_CMD_GET_LAST_INSERTED_ROW);
+
+ if (getLastInserted->Step()) {
+ chain_id = getLastInserted->GetColumnInt32(0);
+ LogDebug("Found chain_id: " << chain_id << ", for check_id " << check_id);
+ return true;
+ }
+
+ return false;
}
bool SqlQuery::add_app_to_check_list(const app_t &app)
{
- //Check if app exists in DB
- if (check_if_app_exists(app)) {
- LogDebug(app.str() << " already exists in database");
- return true;
- }
-
- m_connection->BeginTransaction();
- //Add app to to_check table
- SqlConnection::DataCommandAutoPtr addAppCommand =
- m_connection->PrepareDataCommand(DB_CMD_ADD_APP);
- addAppCommand->BindString(DB_APP_ID, app.app_id.c_str());
- addAppCommand->BindString(DB_PKG_ID, app.pkg_id.c_str());
- addAppCommand->BindInt64(DB_UID, app.uid);
- addAppCommand->BindInt32(DB_VERIFIED, static_cast<int32_t>(app_t::verified_t::UNKNOWN)); // Set app as not-verified
- addAppCommand->Step();
- LogDebug("App " << app.app_id << " added to to_check table, adding certificates.");
-
- // Get check_id
- int32_t check_id;
- if (!get_check_id(app, check_id)) { // If get check_id failed return false;
- LogDebug("Failed while addind app "<< app.app_id << " to to_check table.");
- m_connection->RollbackTransaction();
- return false;
- }
-
- // If get check_id succeed we can add chain to database
- int32_t chain_id;
- for (const auto &iter : app.signatures) {
- // Add chain
- if (add_chain_id(check_id, chain_id)) {
- // add certificates from chain in right order (start with 1) - end entity go first
- int32_t cert_order = 1;
- for (const auto &iter_cert : iter) {
- SqlConnection::DataCommandAutoPtr addCertCommand =
- m_connection->PrepareDataCommand(DB_CMD_ADD_CERT);
- addCertCommand->BindInt32(DB_CHAIN_ID, chain_id);
- addCertCommand->BindString(DB_CERTIFICATE, iter_cert.c_str());
- addCertCommand->BindInt32(DB_CERT_ORDER, cert_order);
- addCertCommand->Step();
- cert_order++;
- LogDebug("Certificate for app " << app.app_id << "added");
- }
- } else {
- LogDebug("Failed to add certificates chain");
- m_connection->RollbackTransaction();
- return false;
- }
-
- }
- m_connection->CommitTransaction();
- return true;
+ //Check if app exists in DB
+ if (check_if_app_exists(app)) {
+ LogDebug(app.str() << " already exists in database");
+ return true;
+ }
+
+ m_connection->BeginTransaction();
+ //Add app to to_check table
+ SqlConnection::DataCommandAutoPtr addAppCommand =
+ m_connection->PrepareDataCommand(DB_CMD_ADD_APP);
+ addAppCommand->BindString(DB_APP_ID, app.app_id.c_str());
+ addAppCommand->BindString(DB_PKG_ID, app.pkg_id.c_str());
+ addAppCommand->BindInt64(DB_UID, app.uid);
+ addAppCommand->BindInt32(DB_VERIFIED,
+ static_cast<int32_t>(app_t::verified_t::UNKNOWN)); // Set app as not-verified
+ addAppCommand->Step();
+ LogDebug("App " << app.app_id << " added to to_check table, adding certificates.");
+ // Get check_id
+ int32_t check_id;
+
+ if (!get_check_id(app, check_id)) { // If get check_id failed return false;
+ LogDebug("Failed while addind app " << app.app_id << " to to_check table.");
+ m_connection->RollbackTransaction();
+ return false;
+ }
+
+ // If get check_id succeed we can add chain to database
+ int32_t chain_id;
+
+ for (const auto &iter : app.signatures) {
+ // Add chain
+ if (add_chain_id(check_id, chain_id)) {
+ // add certificates from chain in right order (start with 1) - end entity go first
+ int32_t cert_order = 1;
+
+ for (const auto &iter_cert : iter) {
+ SqlConnection::DataCommandAutoPtr addCertCommand =
+ m_connection->PrepareDataCommand(DB_CMD_ADD_CERT);
+ addCertCommand->BindInt32(DB_CHAIN_ID, chain_id);
+ addCertCommand->BindString(DB_CERTIFICATE, iter_cert.c_str());
+ addCertCommand->BindInt32(DB_CERT_ORDER, cert_order);
+ addCertCommand->Step();
+ cert_order++;
+ LogDebug("Certificate for app " << app.app_id << "added");
+ }
+ } else {
+ LogDebug("Failed to add certificates chain");
+ m_connection->RollbackTransaction();
+ return false;
+ }
+ }
+
+ m_connection->CommitTransaction();
+ return true;
}
void SqlQuery::remove_app_from_check_list(const app_t &app)
{
- LogDebug("Removing app: " << app.str());
-
- //Remove app from to_check table
- SqlConnection::DataCommandAutoPtr removeAppCommand =
- m_connection->PrepareDataCommand(DB_CMD_REMOVE_APP);
- removeAppCommand->BindString(DB_APP_ID, app.app_id.c_str());
- removeAppCommand->BindString(DB_PKG_ID, app.pkg_id.c_str());
- removeAppCommand->BindInt32(DB_UID, app.uid);
- removeAppCommand->Step();
- LogDebug("Removed app: " << app.str());
-
- // Removing certificates should be done automatically by DB because of
- // ON DELETE CASCADE for check_id
+ LogDebug("Removing app: " << app.str());
+ //Remove app from to_check table
+ SqlConnection::DataCommandAutoPtr removeAppCommand =
+ m_connection->PrepareDataCommand(DB_CMD_REMOVE_APP);
+ removeAppCommand->BindString(DB_APP_ID, app.app_id.c_str());
+ removeAppCommand->BindString(DB_PKG_ID, app.pkg_id.c_str());
+ removeAppCommand->BindInt32(DB_UID, app.uid);
+ removeAppCommand->Step();
+ LogDebug("Removed app: " << app.str());
+ // Removing certificates should be done automatically by DB because of
+ // ON DELETE CASCADE for check_id
}
void SqlQuery::mark_as_verified(const app_t &app, const app_t::verified_t &verified)
{
- int32_t check_id;
-
- if (get_check_id(app, check_id)) {
- SqlConnection::DataCommandAutoPtr setVerifiedCommand =
- m_connection->PrepareDataCommand(DB_CMD_SET_APP_AS_VERIFIED);
- setVerifiedCommand->BindInt32(DB_CHECK_ID, check_id);
- setVerifiedCommand->BindInt32(DB_VERIFIED, static_cast<int32_t>(verified));
- setVerifiedCommand->Step();
- LogDebug("App: " << app.str() << " marked as verified: " << static_cast<int32_t>(verified));
- }
+ int32_t check_id;
+
+ if (get_check_id(app, check_id)) {
+ SqlConnection::DataCommandAutoPtr setVerifiedCommand =
+ m_connection->PrepareDataCommand(DB_CMD_SET_APP_AS_VERIFIED);
+ setVerifiedCommand->BindInt32(DB_CHECK_ID, check_id);
+ setVerifiedCommand->BindInt32(DB_VERIFIED, static_cast<int32_t>(verified));
+ setVerifiedCommand->Step();
+ LogDebug("App: " << app.str() << " marked as verified: " << static_cast<int32_t>(verified));
+ }
}
void SqlQuery::get_apps(std::list<app_t> &apps_buffer)
{
- // This function will fill buffer with check_id, app_id, pkg_id, uid and verified fields -
- // it leaves certificates' list empty.
- SqlConnection::DataCommandAutoPtr getAppsCommand =
- m_connection->PrepareDataCommand(DB_CMD_GET_APPS);
-
- while (getAppsCommand->Step()) {
- app_t app;
- app.app_id = getAppsCommand->GetColumnString(0);
- app.pkg_id = getAppsCommand->GetColumnString(1);
- app.uid = getAppsCommand->GetColumnInt64(2);
- app.verified = static_cast<app_t::verified_t>(getAppsCommand->GetColumnInt32(3));
- app.signatures = {};
- LogDebug("App read from DB: app_id: " << app.str() << ", verified: " << static_cast<int32_t>(app.verified));
- apps_buffer.push_back(app);
- }
+ // This function will fill buffer with check_id, app_id, pkg_id, uid and verified fields -
+ // it leaves certificates' list empty.
+ SqlConnection::DataCommandAutoPtr getAppsCommand =
+ m_connection->PrepareDataCommand(DB_CMD_GET_APPS);
+
+ while (getAppsCommand->Step()) {
+ app_t app;
+ app.app_id = getAppsCommand->GetColumnString(0);
+ app.pkg_id = getAppsCommand->GetColumnString(1);
+ app.uid = getAppsCommand->GetColumnInt64(2);
+ app.verified = static_cast<app_t::verified_t>(getAppsCommand->GetColumnInt32(3));
+ app.signatures = {};
+ LogDebug("App read from DB: app_id: " << app.str() << ", verified: " << static_cast<int32_t>
+ (app.verified));
+ apps_buffer.push_back(app);
+ }
}
void SqlQuery::get_app_list(std::list<app_t> &apps_buffer)
{
- m_connection->BeginTransaction();
- get_apps(apps_buffer);
-
- // Get chain for every application
- for (auto &iter_app : apps_buffer) {
- SqlConnection::DataCommandAutoPtr getChainsCommand =
- m_connection->PrepareDataCommand(DB_CMD_GET_CHAINS);
- getChainsCommand->BindString(DB_APP_ID, iter_app.app_id.c_str());
- getChainsCommand->BindString(DB_PKG_ID, iter_app.pkg_id.c_str());
- getChainsCommand->BindInt32(DB_UID, iter_app.uid);
-
- // Get all certs from chain - certs will be sorted - end entity go first
- while (getChainsCommand->Step()) {
- chain_t chain;
- int32_t chain_id;
- chain_id = getChainsCommand->GetColumnInt32(0);
- LogDebug("Found chain (" << chain_id << ") for " << iter_app.str());
-
- SqlConnection::DataCommandAutoPtr getCertsCommand =
- m_connection->PrepareDataCommand(DB_CMD_GET_CERTS);
- getCertsCommand->BindInt32(DB_CHAIN_ID, chain_id);
-
- // Add found certs to chain
- while (getCertsCommand->Step()) {
- chain.push_back(getCertsCommand->GetColumnString(0));
- LogDebug("Found certificate (" << chain.size() << ") in chain no. " << chain_id);
- }
- iter_app.signatures.push_back(chain);
- }
- }
- m_connection->CommitTransaction();
+ m_connection->BeginTransaction();
+ get_apps(apps_buffer);
+
+ // Get chain for every application
+ for (auto &iter_app : apps_buffer) {
+ SqlConnection::DataCommandAutoPtr getChainsCommand =
+ m_connection->PrepareDataCommand(DB_CMD_GET_CHAINS);
+ getChainsCommand->BindString(DB_APP_ID, iter_app.app_id.c_str());
+ getChainsCommand->BindString(DB_PKG_ID, iter_app.pkg_id.c_str());
+ getChainsCommand->BindInt32(DB_UID, iter_app.uid);
+
+ // Get all certs from chain - certs will be sorted - end entity go first
+ while (getChainsCommand->Step()) {
+ chain_t chain;
+ int32_t chain_id;
+ chain_id = getChainsCommand->GetColumnInt32(0);
+ LogDebug("Found chain (" << chain_id << ") for " << iter_app.str());
+ SqlConnection::DataCommandAutoPtr getCertsCommand =
+ m_connection->PrepareDataCommand(DB_CMD_GET_CERTS);
+ getCertsCommand->BindInt32(DB_CHAIN_ID, chain_id);
+
+ // Add found certs to chain
+ while (getCertsCommand->Step()) {
+ chain.push_back(getCertsCommand->GetColumnString(0));
+ LogDebug("Found certificate (" << chain.size() << ") in chain no. " << chain_id);
+ }
+
+ iter_app.signatures.push_back(chain);
+ }
+ }
+
+ m_connection->CommitTransaction();
}
} // DB
diff --git a/src/dpl/core/include/cchecker/dpl/assert.h b/src/dpl/core/include/cchecker/dpl/assert.h
index 03dd7d0..1bb918e 100644
--- a/src/dpl/core/include/cchecker/dpl/assert.h
+++ b/src/dpl/core/include/cchecker/dpl/assert.h
@@ -29,15 +29,15 @@ namespace CCHECKER {
// Do not call directly
// Always use Assert macro
CCHECKER_NORETURN void AssertProc(const char *condition,
- const char *file,
- int line,
- const char *function);
+ const char *file,
+ int line,
+ const char *function);
} // namespace CCHECKER
#define Assert(Condition) do { if (!(Condition)) { CCHECKER::AssertProc(#Condition, \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- } } while (0)
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ } } while (0)
#endif // CCHECKER_ASSERT_H
diff --git a/src/dpl/core/include/cchecker/dpl/colors.h b/src/dpl/core/include/cchecker/dpl/colors.h
index d652f5b..b1cf04a 100644
--- a/src/dpl/core/include/cchecker/dpl/colors.h
+++ b/src/dpl/core/include/cchecker/dpl/colors.h
@@ -27,46 +27,46 @@
namespace CCHECKER {
namespace Colors {
namespace Text {
-extern const char* BOLD_GREEN_BEGIN;
-extern const char* BOLD_GREEN_END;
-extern const char* PURPLE_BEGIN;
-extern const char* PURPLE_END;
-extern const char* RED_BEGIN;
-extern const char* RED_END;
-extern const char* GREEN_BEGIN;
-extern const char* GREEN_END;
-extern const char* CYAN_BEGIN;
-extern const char* CYAN_END;
-extern const char* BOLD_RED_BEGIN;
-extern const char* BOLD_RED_END;
-extern const char* BOLD_YELLOW_BEGIN;
-extern const char* BOLD_YELLOW_END;
-extern const char* BOLD_GOLD_BEGIN;
-extern const char* BOLD_GOLD_END;
-extern const char* BOLD_WHITE_BEGIN;
-extern const char* BOLD_WHITE_END;
-extern const char* COLOR_END;
+extern const char *BOLD_GREEN_BEGIN;
+extern const char *BOLD_GREEN_END;
+extern const char *PURPLE_BEGIN;
+extern const char *PURPLE_END;
+extern const char *RED_BEGIN;
+extern const char *RED_END;
+extern const char *GREEN_BEGIN;
+extern const char *GREEN_END;
+extern const char *CYAN_BEGIN;
+extern const char *CYAN_END;
+extern const char *BOLD_RED_BEGIN;
+extern const char *BOLD_RED_END;
+extern const char *BOLD_YELLOW_BEGIN;
+extern const char *BOLD_YELLOW_END;
+extern const char *BOLD_GOLD_BEGIN;
+extern const char *BOLD_GOLD_END;
+extern const char *BOLD_WHITE_BEGIN;
+extern const char *BOLD_WHITE_END;
+extern const char *COLOR_END;
} //namespace Text
namespace Html {
-extern const char* BOLD_GREEN_BEGIN;
-extern const char* BOLD_GREEN_END;
-extern const char* PURPLE_BEGIN;
-extern const char* PURPLE_END;
-extern const char* RED_BEGIN;
-extern const char* RED_END;
-extern const char* GREEN_BEGIN;
-extern const char* GREEN_END;
-extern const char* CYAN_BEGIN;
-extern const char* CYAN_END;
-extern const char* BOLD_RED_BEGIN;
-extern const char* BOLD_RED_END;
-extern const char* BOLD_YELLOW_BEGIN;
-extern const char* BOLD_YELLOW_END;
-extern const char* BOLD_GOLD_BEGIN;
-extern const char* BOLD_GOLD_END;
-extern const char* BOLD_WHITE_BEGIN;
-extern const char* BOLD_WHITE_END;
+extern const char *BOLD_GREEN_BEGIN;
+extern const char *BOLD_GREEN_END;
+extern const char *PURPLE_BEGIN;
+extern const char *PURPLE_END;
+extern const char *RED_BEGIN;
+extern const char *RED_END;
+extern const char *GREEN_BEGIN;
+extern const char *GREEN_END;
+extern const char *CYAN_BEGIN;
+extern const char *CYAN_END;
+extern const char *BOLD_RED_BEGIN;
+extern const char *BOLD_RED_END;
+extern const char *BOLD_YELLOW_BEGIN;
+extern const char *BOLD_YELLOW_END;
+extern const char *BOLD_GOLD_BEGIN;
+extern const char *BOLD_GOLD_END;
+extern const char *BOLD_WHITE_BEGIN;
+extern const char *BOLD_WHITE_END;
} //namespace Html
} //namespace Colors
} //namespace CCHECKER
diff --git a/src/dpl/core/include/cchecker/dpl/exception.h b/src/dpl/core/include/cchecker/dpl/exception.h
index f7b9afc..a23e4ef 100644
--- a/src/dpl/core/include/cchecker/dpl/exception.h
+++ b/src/dpl/core/include/cchecker/dpl/exception.h
@@ -32,340 +32,331 @@
namespace CCHECKER {
void LogUnhandledException(const std::string &str);
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function);
+ const char *filename,
+ int line,
+ const char *function);
}
namespace CCHECKER {
-class Exception
-{
- private:
- static unsigned int m_exceptionCount;
- static Exception* m_lastException;
- static void (*m_terminateHandler)();
-
- static void AddRef(Exception* exception)
- {
- if (!m_exceptionCount) {
- m_terminateHandler = std::set_terminate(&TerminateHandler);
- }
-
- ++m_exceptionCount;
- m_lastException = exception;
- }
-
- static void UnRef(Exception* e)
- {
- if (m_lastException == e) {
- m_lastException = NULL;
- }
-
- --m_exceptionCount;
-
- if (!m_exceptionCount) {
- std::set_terminate(m_terminateHandler);
- m_terminateHandler = NULL;
- }
- }
-
- static void TerminateHandler()
- {
- if (m_lastException != NULL) {
- DisplayKnownException(*m_lastException);
- abort();
- } else {
- DisplayUnknownException();
- abort();
- }
- }
-
- Exception *m_reason;
- std::string m_path;
- std::string m_function;
- int m_line;
-
- protected:
- std::string m_message;
- std::string m_className;
-
- public:
- static std::string KnownExceptionToString(const Exception &e)
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled CCHECKER exception occurred ===\033[m\n\n";
- message << "\033[1;33mException trace:\033[m\n\n";
- message << e.DumpToString();
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static std::string UnknownExceptionToString()
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled non-CCHECKER exception occurred ===\033[m\n\n";
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static void DisplayKnownException(const Exception& e)
- {
- LogUnhandledException(KnownExceptionToString(e).c_str());
- }
-
- static void DisplayUnknownException()
- {
- LogUnhandledException(UnknownExceptionToString().c_str());
- }
-
- Exception(const Exception &other)
- {
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
- }
-
- const Exception &operator =(const Exception &other)
- {
- if (this == &other) {
- return *this;
- }
-
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
-
- return *this;
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const std::string &message) :
- m_reason(NULL),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const Exception &reason,
- const std::string &message) :
- m_reason(new Exception(reason)),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- virtual ~Exception() throw()
- {
- if (m_reason != NULL) {
- delete m_reason;
- m_reason = NULL;
- }
-
- UnRef(this);
- }
-
- void Dump() const
- {
- // Show reason first
- if (m_reason != NULL) {
- m_reason->Dump();
- }
-
- // Afterward, dump exception
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file, m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
- }
-
- std::string DumpToString() const
- {
- std::string ret;
- if (m_reason != NULL) {
- ret = m_reason->DumpToString();
- }
-
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- char buf[1024];
- snprintf(buf,
- sizeof(buf),
- "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file,
- m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
-
- buf[sizeof(buf) - 1] = '\n';
- ret += buf;
-
- return ret;
- }
-
- Exception *GetReason() const
- {
- return m_reason;
- }
-
- std::string GetPath() const
- {
- return m_path;
- }
-
- std::string GetFunction() const
- {
- return m_function;
- }
-
- int GetLine() const
- {
- return m_line;
- }
-
- std::string GetMessage() const
- {
- return m_message;
- }
-
- std::string GetClassName() const
- {
- return m_className;
- }
+class Exception {
+private:
+ static unsigned int m_exceptionCount;
+ static Exception *m_lastException;
+ static void (*m_terminateHandler)();
+
+ static void AddRef(Exception *exception)
+ {
+ if (!m_exceptionCount) {
+ m_terminateHandler = std::set_terminate(&TerminateHandler);
+ }
+
+ ++m_exceptionCount;
+ m_lastException = exception;
+ }
+
+ static void UnRef(Exception *e)
+ {
+ if (m_lastException == e) {
+ m_lastException = NULL;
+ }
+
+ --m_exceptionCount;
+
+ if (!m_exceptionCount) {
+ std::set_terminate(m_terminateHandler);
+ m_terminateHandler = NULL;
+ }
+ }
+
+ static void TerminateHandler()
+ {
+ if (m_lastException != NULL) {
+ DisplayKnownException(*m_lastException);
+ abort();
+ } else {
+ DisplayUnknownException();
+ abort();
+ }
+ }
+
+ Exception *m_reason;
+ std::string m_path;
+ std::string m_function;
+ int m_line;
+
+protected:
+ std::string m_message;
+ std::string m_className;
+
+public:
+ static std::string KnownExceptionToString(const Exception &e)
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled CCHECKER exception occurred ===\033[m\n\n";
+ message << "\033[1;33mException trace:\033[m\n\n";
+ message << e.DumpToString();
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static std::string UnknownExceptionToString()
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled non-CCHECKER exception occurred ===\033[m\n\n";
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static void DisplayKnownException(const Exception &e)
+ {
+ LogUnhandledException(KnownExceptionToString(e).c_str());
+ }
+
+ static void DisplayUnknownException()
+ {
+ LogUnhandledException(UnknownExceptionToString().c_str());
+ }
+
+ Exception(const Exception &other)
+ {
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ }
+
+ const Exception &operator =(const Exception &other)
+ {
+ if (this == &other) {
+ return *this;
+ }
+
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ return *this;
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const std::string &message) :
+ m_reason(NULL),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const Exception &reason,
+ const std::string &message) :
+ m_reason(new Exception(reason)),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ virtual ~Exception() throw()
+ {
+ if (m_reason != NULL) {
+ delete m_reason;
+ m_reason = NULL;
+ }
+
+ UnRef(this);
+ }
+
+ void Dump() const
+ {
+ // Show reason first
+ if (m_reason != NULL) {
+ m_reason->Dump();
+ }
+
+ // Afterward, dump exception
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file, m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ }
+
+ std::string DumpToString() const
+ {
+ std::string ret;
+
+ if (m_reason != NULL) {
+ ret = m_reason->DumpToString();
+ }
+
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ char buf[1024];
+ snprintf(buf,
+ sizeof(buf),
+ "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file,
+ m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ buf[sizeof(buf) - 1] = '\n';
+ ret += buf;
+ return ret;
+ }
+
+ Exception *GetReason() const
+ {
+ return m_reason;
+ }
+
+ std::string GetPath() const
+ {
+ return m_path;
+ }
+
+ std::string GetFunction() const
+ {
+ return m_function;
+ }
+
+ int GetLine() const
+ {
+ return m_line;
+ }
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+
+ std::string GetClassName() const
+ {
+ return m_className;
+ }
};
} // namespace CCHECKER
#define Try try
#define Throw(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__)
#define ThrowMsg(ClassName, Message) \
- do \
- { \
- std::ostringstream dplLoggingStream; \
- dplLoggingStream << Message; \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
- } while (0)
+ do \
+ { \
+ std::ostringstream dplLoggingStream; \
+ dplLoggingStream << Message; \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
+ } while (0)
#define ReThrow(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
#define ReThrowMsg(ClassName, Message) \
- throw ClassName(__FILE__, \
- __FUNCTION__, \
- __LINE__, \
- _rethrown_exception, \
- Message)
+ throw ClassName(__FILE__, \
+ __FUNCTION__, \
+ __LINE__, \
+ _rethrown_exception, \
+ Message)
#define Catch(ClassName) \
- catch (const ClassName &_rethrown_exception)
+ catch (const ClassName &_rethrown_exception)
#define DECLARE_EXCEPTION_TYPE(BaseClass, Class) \
- class Class : \
- public BaseClass \
- { \
- public: \
- Class(const char *path, \
- const char *function, \
- int line, \
- const std::string & message = std::string()) : \
- BaseClass(path, function, line, message) \
- { \
- BaseClass::m_className = #Class; \
- } \
- \
- Class(const char *path, \
- const char *function, \
- int line, \
- const CCHECKER::Exception & reason, \
- const std::string & message = std::string()) : \
- BaseClass(path, function, line, reason, message) \
- { \
- BaseClass::m_className = #Class; \
- } \
- };
+ class Class : \
+ public BaseClass \
+ { \
+ public: \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const std::string & message = std::string()) : \
+ BaseClass(path, function, line, message) \
+ { \
+ BaseClass::m_className = #Class; \
+ } \
+ \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const CCHECKER::Exception & reason, \
+ const std::string & message = std::string()) : \
+ BaseClass(path, function, line, reason, message) \
+ { \
+ BaseClass::m_className = #Class; \
+ } \
+ };
#define UNHANDLED_EXCEPTION_HANDLER_BEGIN try
#define UNHANDLED_EXCEPTION_HANDLER_END \
- catch (const CCHECKER::Exception &exception) \
- { \
- std::ostringstream msg; \
- msg << CCHECKER::Exception::KnownExceptionToString(exception); \
- CCHECKER::LogUnhandledException(msg.str(), __FILE__, __LINE__, __FUNCTION__); \
- abort(); \
- } \
- catch (std::exception& e) \
- { \
- std::ostringstream msg; \
- msg << e.what(); \
- msg << "\n"; \
- msg << CCHECKER::Exception::UnknownExceptionToString(); \
- CCHECKER::LogUnhandledException(msg.str(), __FILE__, __LINE__, __FUNCTION__); \
- abort(); \
- } \
- catch (...) \
- { \
- std::ostringstream msg; \
- msg << CCHECKER::Exception::UnknownExceptionToString(); \
- CCHECKER::LogUnhandledException(msg.str(), __FILE__, __LINE__, __FUNCTION__); \
- abort(); \
- }
+ catch (const CCHECKER::Exception &exception) \
+ { \
+ std::ostringstream msg; \
+ msg << CCHECKER::Exception::KnownExceptionToString(exception); \
+ CCHECKER::LogUnhandledException(msg.str(), __FILE__, __LINE__, __FUNCTION__); \
+ abort(); \
+ } \
+ catch (std::exception& e) \
+ { \
+ std::ostringstream msg; \
+ msg << e.what(); \
+ msg << "\n"; \
+ msg << CCHECKER::Exception::UnknownExceptionToString(); \
+ CCHECKER::LogUnhandledException(msg.str(), __FILE__, __LINE__, __FUNCTION__); \
+ abort(); \
+ } \
+ catch (...) \
+ { \
+ std::ostringstream msg; \
+ msg << CCHECKER::Exception::UnknownExceptionToString(); \
+ CCHECKER::LogUnhandledException(msg.str(), __FILE__, __LINE__, __FUNCTION__); \
+ abort(); \
+ }
namespace CCHECKER {
namespace CommonException {
@@ -377,8 +368,8 @@ namespace CommonException {
* important messages.
*/
DECLARE_EXCEPTION_TYPE(Exception, InternalError) ///< Unexpected error from
- // underlying libraries or
- // kernel
+// underlying libraries or
+// kernel
}
}
diff --git a/src/dpl/core/include/cchecker/dpl/noncopyable.h b/src/dpl/core/include/cchecker/dpl/noncopyable.h
index 747299c..47fc8b3 100644
--- a/src/dpl/core/include/cchecker/dpl/noncopyable.h
+++ b/src/dpl/core/include/cchecker/dpl/noncopyable.h
@@ -23,15 +23,14 @@
#define CCHECKER_NONCOPYABLE_H
namespace CCHECKER {
-class Noncopyable
-{
- private:
- Noncopyable(const Noncopyable &);
- const Noncopyable &operator=(const Noncopyable &);
+class Noncopyable {
+private:
+ Noncopyable(const Noncopyable &);
+ const Noncopyable &operator=(const Noncopyable &);
- public:
- Noncopyable();
- virtual ~Noncopyable();
+public:
+ Noncopyable();
+ virtual ~Noncopyable();
};
} // namespace CCHECKER
diff --git a/src/dpl/core/include/cchecker/dpl/optional.h b/src/dpl/core/include/cchecker/dpl/optional.h
index 42d1bd4..0f19d86 100644
--- a/src/dpl/core/include/cchecker/dpl/optional.h
+++ b/src/dpl/core/include/cchecker/dpl/optional.h
@@ -26,135 +26,137 @@
namespace CCHECKER {
template <typename Type>
-class Optional
-{
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, NullReference)
- };
-
- public:
- Optional() :
- m_null(true),
- m_value()
- {}
-
- Optional(const Type& t) :
- m_null(false),
- m_value(t)
- {}
-
- bool IsNull() const
- {
- return m_null;
- }
-
- Type& operator*()
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return m_value;
- }
-
- const Type& operator*() const
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return m_value;
- }
-
- const Type* operator->() const
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return &m_value;
- }
-
- Type* operator->()
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return &m_value;
- }
-
- bool operator!() const
- {
- return m_null;
- }
-
- Optional<Type>& operator=(const Type& other)
- {
- m_null = false;
- m_value = other;
- return *this;
- }
-
- bool operator==(const Optional<Type>& aSecond) const
- {
- return LogicalOperator<true>(*this, aSecond,
- std::equal_to<Type>(), std::equal_to<bool>());
- }
-
- bool operator==(const Type& aSecond) const
- {
- return Optional<Type>(aSecond) == *this;
- }
-
- bool operator!=(const Optional<Type>& aSecond) const
- {
- return !(*this == aSecond);
- }
-
- bool operator<(const Optional<Type>& aSecond) const
- {
- return LogicalOperator<false>(*this, aSecond,
- std::less<Type>(), std::less<bool>());
- }
-
- bool operator>(const Optional<Type>& aSecond) const
- {
- return LogicalOperator<false>(*this, aSecond,
- std::greater<Type>(), std::greater<bool>());
- }
-
- bool operator<=(const Optional<Type>& aSecond) const
- {
- return *this == aSecond || *this < aSecond;
- }
-
- bool operator>=(const Optional<Type>& aSecond) const
- {
- return *this == aSecond || *this > aSecond;
- }
-
- static Optional<Type> Null;
-
- private:
- bool m_null;
- Type m_value;
-
- template <bool taEquality, typename taComparator, typename taNullComparator>
- static bool LogicalOperator(const Optional<Type>& aFirst,
- const Optional<Type>& aSecond,
- taComparator aComparator,
- taNullComparator aNullComparator)
- {
- if (aFirst.m_null == aSecond.m_null) {
- if (aFirst.m_null) {
- return taEquality;
- } else {
- return aComparator(aFirst.m_value, aSecond.m_value);
- }
- } else {
- return aNullComparator(aFirst.m_null, aSecond.m_null);
- }
- }
+class Optional {
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, NullReference)
+ };
+
+public:
+ Optional() :
+ m_null(true),
+ m_value()
+ {}
+
+ Optional(const Type &t) :
+ m_null(false),
+ m_value(t)
+ {}
+
+ bool IsNull() const
+ {
+ return m_null;
+ }
+
+ Type &operator*()
+ {
+ if (m_null) {
+ Throw(typename Exception::NullReference);
+ }
+
+ return m_value;
+ }
+
+ const Type &operator*() const
+ {
+ if (m_null) {
+ Throw(typename Exception::NullReference);
+ }
+
+ return m_value;
+ }
+
+ const Type *operator->() const
+ {
+ if (m_null) {
+ Throw(typename Exception::NullReference);
+ }
+
+ return &m_value;
+ }
+
+ Type *operator->()
+ {
+ if (m_null) {
+ Throw(typename Exception::NullReference);
+ }
+
+ return &m_value;
+ }
+
+ bool operator!() const
+ {
+ return m_null;
+ }
+
+ Optional<Type> &operator=(const Type &other)
+ {
+ m_null = false;
+ m_value = other;
+ return *this;
+ }
+
+ bool operator==(const Optional<Type> &aSecond) const
+ {
+ return LogicalOperator<true>(*this, aSecond,
+ std::equal_to<Type>(), std::equal_to<bool>());
+ }
+
+ bool operator==(const Type &aSecond) const
+ {
+ return Optional<Type>(aSecond) == *this;
+ }
+
+ bool operator!=(const Optional<Type> &aSecond) const
+ {
+ return !(*this == aSecond);
+ }
+
+ bool operator<(const Optional<Type> &aSecond) const
+ {
+ return LogicalOperator<false>(*this, aSecond,
+ std::less<Type>(), std::less<bool>());
+ }
+
+ bool operator>(const Optional<Type> &aSecond) const
+ {
+ return LogicalOperator<false>(*this, aSecond,
+ std::greater<Type>(), std::greater<bool>());
+ }
+
+ bool operator<=(const Optional<Type> &aSecond) const
+ {
+ return *this == aSecond || *this < aSecond;
+ }
+
+ bool operator>=(const Optional<Type> &aSecond) const
+ {
+ return *this == aSecond || *this > aSecond;
+ }
+
+ static Optional<Type> Null;
+
+private:
+ bool m_null;
+ Type m_value;
+
+ template <bool taEquality, typename taComparator, typename taNullComparator>
+ static bool LogicalOperator(const Optional<Type> &aFirst,
+ const Optional<Type> &aSecond,
+ taComparator aComparator,
+ taNullComparator aNullComparator)
+ {
+ if (aFirst.m_null == aSecond.m_null) {
+ if (aFirst.m_null) {
+ return taEquality;
+ } else {
+ return aComparator(aFirst.m_value, aSecond.m_value);
+ }
+ } else {
+ return aNullComparator(aFirst.m_null, aSecond.m_null);
+ }
+ }
};
template<typename Type>
@@ -162,14 +164,14 @@ Optional<Type> Optional<Type>::Null = Optional<Type>();
} //namespace CCHECKER
template<typename Type>
-std::ostream& operator<<(std::ostream& aStream,
- const CCHECKER::Optional<Type>& aOptional)
+std::ostream &operator<<(std::ostream &aStream,
+ const CCHECKER::Optional<Type> &aOptional)
{
- if (aOptional.IsNull()) {
- return aStream << "null optional";
- } else {
- return aStream << *aOptional;
- }
+ if (aOptional.IsNull()) {
+ return aStream << "null optional";
+ } else {
+ return aStream << *aOptional;
+ }
}
#endif // CCHECKER_OPTIONAL_VALUE_H
diff --git a/src/dpl/core/include/cchecker/dpl/scoped_array.h b/src/dpl/core/include/cchecker/dpl/scoped_array.h
index 54c0c80..f38ae83 100644
--- a/src/dpl/core/include/cchecker/dpl/scoped_array.h
+++ b/src/dpl/core/include/cchecker/dpl/scoped_array.h
@@ -29,36 +29,33 @@
namespace CCHECKER {
template<typename Class>
-struct ScopedArrayPolicy
-{
- typedef Class* Type;
- static Type NullValue()
- {
- return NULL;
- }
- static void Destroy(Type ptr)
- {
- delete[] ptr;
- }
+struct ScopedArrayPolicy {
+ typedef Class *Type;
+ static Type NullValue()
+ {
+ return NULL;
+ }
+ static void Destroy(Type ptr)
+ {
+ delete[] ptr;
+ }
};
template<typename Class>
-class ScopedArray : public ScopedResource<ScopedArrayPolicy<Class> >
-{
- typedef ScopedArrayPolicy<Class> Policy;
- typedef ScopedResource<Policy> BaseType;
-
- public:
- explicit ScopedArray(Class *ptr = Policy::NullValue()) : BaseType(ptr) { }
-
- Class &operator [](std::ptrdiff_t k) const
- {
- Assert(this->m_value != Policy::NullValue() &&
- "Dereference of scoped NULL array!");
- Assert(k >= 0 && "Negative array index");
-
- return this->m_value[k];
- }
+class ScopedArray : public ScopedResource<ScopedArrayPolicy<Class>> {
+ typedef ScopedArrayPolicy<Class> Policy;
+ typedef ScopedResource<Policy> BaseType;
+
+public:
+ explicit ScopedArray(Class *ptr = Policy::NullValue()) : BaseType(ptr) { }
+
+ Class &operator[](std::ptrdiff_t k) const
+ {
+ Assert(this->m_value != Policy::NullValue() &&
+ "Dereference of scoped NULL array!");
+ Assert(k >= 0 && "Negative array index");
+ return this->m_value[k];
+ }
};
} // namespace CCHECKER
diff --git a/src/dpl/core/include/cchecker/dpl/scoped_free.h b/src/dpl/core/include/cchecker/dpl/scoped_free.h
index d8fee50..72b0ae0 100644
--- a/src/dpl/core/include/cchecker/dpl/scoped_free.h
+++ b/src/dpl/core/include/cchecker/dpl/scoped_free.h
@@ -30,27 +30,25 @@
namespace CCHECKER {
template<typename Class>
-struct ScopedFreePolicy
-{
- typedef Class* Type;
- static Type NullValue()
- {
- return NULL;
- }
- static void Destroy(Type ptr)
- {
- free(ptr);
- }
+struct ScopedFreePolicy {
+ typedef Class *Type;
+ static Type NullValue()
+ {
+ return NULL;
+ }
+ static void Destroy(Type ptr)
+ {
+ free(ptr);
+ }
};
template<typename Memory>
-class ScopedFree : public ScopedResource<ScopedFreePolicy<Memory> >
-{
- typedef ScopedFreePolicy<Memory> Policy;
- typedef ScopedResource<Policy> BaseType;
+class ScopedFree : public ScopedResource<ScopedFreePolicy<Memory>> {
+ typedef ScopedFreePolicy<Memory> Policy;
+ typedef ScopedResource<Policy> BaseType;
- public:
- explicit ScopedFree(Memory *ptr = Policy::NullValue()) : BaseType(ptr) { }
+public:
+ explicit ScopedFree(Memory *ptr = Policy::NullValue()) : BaseType(ptr) { }
};
} // namespace CCHECKER
diff --git a/src/dpl/core/include/cchecker/dpl/scoped_resource.h b/src/dpl/core/include/cchecker/dpl/scoped_resource.h
index 2b3c72d..42aef36 100644
--- a/src/dpl/core/include/cchecker/dpl/scoped_resource.h
+++ b/src/dpl/core/include/cchecker/dpl/scoped_resource.h
@@ -27,53 +27,52 @@
namespace CCHECKER {
template<typename ClassPolicy>
class ScopedResource :
- private Noncopyable
-{
- public:
- typedef typename ClassPolicy::Type ValueType;
- typedef ScopedResource<ClassPolicy> ThisType;
+ private Noncopyable {
+public:
+ typedef typename ClassPolicy::Type ValueType;
+ typedef ScopedResource<ClassPolicy> ThisType;
- protected:
- ValueType m_value;
+protected:
+ ValueType m_value;
- public:
- explicit ScopedResource(ValueType value) : m_value(value) { }
+public:
+ explicit ScopedResource(ValueType value) : m_value(value) { }
- ~ScopedResource()
- {
- ClassPolicy::Destroy(m_value);
- }
+ ~ScopedResource()
+ {
+ ClassPolicy::Destroy(m_value);
+ }
- ValueType Get() const
- {
- return m_value;
- }
+ ValueType Get() const
+ {
+ return m_value;
+ }
- void Reset(ValueType value = ClassPolicy::NullValue())
- {
- ClassPolicy::Destroy(m_value);
- m_value = value;
- }
+ void Reset(ValueType value = ClassPolicy::NullValue())
+ {
+ ClassPolicy::Destroy(m_value);
+ m_value = value;
+ }
- ValueType Release()
- {
- ValueType value = m_value;
- m_value = ClassPolicy::NullValue();
- return value;
- }
- typedef ValueType ThisType::*UnknownBoolType;
+ ValueType Release()
+ {
+ ValueType value = m_value;
+ m_value = ClassPolicy::NullValue();
+ return value;
+ }
+ typedef ValueType ThisType::*UnknownBoolType;
- operator UnknownBoolType() const
- {
- return m_value == ClassPolicy::NullValue() ?
- 0 : //0 is valid here because it converts to false
- &ThisType::m_value; //it converts to true
- }
+ operator UnknownBoolType() const
+ {
+ return m_value == ClassPolicy::NullValue() ?
+ 0 : //0 is valid here because it converts to false
+ &ThisType::m_value; //it converts to true
+ }
- bool operator !() const
- {
- return m_value == ClassPolicy::NullValue();
- }
+ bool operator !() const
+ {
+ return m_value == ClassPolicy::NullValue();
+ }
};
} // namespace CCHECKER
diff --git a/src/dpl/core/include/cchecker/dpl/serialization.h b/src/dpl/core/include/cchecker/dpl/serialization.h
index 5628350..c39ca09 100644
--- a/src/dpl/core/include/cchecker/dpl/serialization.h
+++ b/src/dpl/core/include/cchecker/dpl/serialization.h
@@ -32,423 +32,424 @@
namespace CCHECKER {
// Abstract data stream buffer
-class IStream
-{
- public:
- virtual void Read(size_t num, void * bytes) = 0;
- virtual void Write(size_t num, const void * bytes) = 0;
- virtual ~IStream(){}
+class IStream {
+public:
+ virtual void Read(size_t num, void *bytes) = 0;
+ virtual void Write(size_t num, const void *bytes) = 0;
+ virtual ~IStream() {}
};
// Serializable interface
-class ISerializable
-{
- public:
- /* ISerializable(){};
- * ISerializable(IStream&){}; */
- virtual void Serialize(IStream &) const = 0;
- virtual ~ISerializable(){}
+class ISerializable {
+public:
+ /* ISerializable(){};
+ * ISerializable(IStream&){}; */
+ virtual void Serialize(IStream &) const = 0;
+ virtual ~ISerializable() {}
};
struct Serialization {
- // serialization
- // normal functions
-
- // ISerializable objects
- static void Serialize(IStream& stream, const ISerializable& object)
- {
- object.Serialize(stream);
- }
-
- static void Serialize(IStream& stream, const ISerializable* const object)
- {
- object->Serialize(stream);
- }
-
- // char
- static void Serialize(IStream& stream, const char value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const char* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // unsigned char
- static void Serialize(IStream& stream, const unsigned char value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const unsigned char* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // unsigned int32
- static void Serialize(IStream& stream, const uint32_t value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const uint32_t* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // int32
- static void Serialize(IStream& stream, const int32_t value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const int32_t* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // unsigned int64
- static void Serialize(IStream& stream, const uint64_t value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const uint64_t* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // int64
- static void Serialize(IStream& stream, const int64_t value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const int64_t* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // bool
- static void Serialize(IStream& stream, const bool value)
- {
- stream.Write(sizeof(value), &value);
- }
- static void Serialize(IStream& stream, const bool* const value)
- {
- stream.Write(sizeof(*value), value);
- }
-
- // std::string
- template <typename T, typename R, typename A>
- static void Serialize(IStream& stream, const std::basic_string<T,R,A>& str)
- {
- int length = str.size();
- stream.Write(sizeof(length), &length);
- stream.Write(length*sizeof(T), str.data());
- }
-
- template<typename T, typename R, typename A>
- static void Serialize(IStream& stream, const std::basic_string<T,R,A>* const str)
- {
- int length = str->size();
- stream.Write(sizeof(length), &length);
- stream.Write(length*sizeof(T), str->data());
- }
-
- // STL templates
-
- // std::list
- template <typename T>
- static void Serialize(IStream& stream, const std::list<T>& list)
- {
- int length = list.size();
- stream.Write(sizeof(length), &length);
- for (typename std::list<T>::const_iterator list_iter = list.begin();
- list_iter != list.end(); list_iter++)
- {
- Serialize(stream, *list_iter);
- }
- }
- template <typename T>
- static void Serialize(IStream& stream, const std::list<T>* const list)
- {
- Serialize(stream, *list);
- }
-
- // RawBuffer
- template <typename A>
- static void Serialize(IStream& stream, const std::vector<unsigned char, A>& vec)
- {
- int length = vec.size();
- stream.Write(sizeof(length), &length);
- stream.Write(length, vec.data());
- }
-
- template <typename A>
- static void Serialize(IStream& stream, const std::vector<unsigned char, A>* const vec)
- {
- Serialize(stream, *vec);
- }
-
- // std::vector
- template <typename T, typename A>
- static void Serialize(IStream& stream, const std::vector<T, A>& vec)
- {
- int length = vec.size();
- stream.Write(sizeof(length), &length);
- for (const auto &i : vec)
- {
- Serialize(stream, i);
- }
- }
- template <typename T, typename A>
- static void Serialize(IStream& stream, const std::vector<T, A>* const vec)
- {
- Serialize(stream, *vec);
- }
-
- // std::pair
- template <typename A, typename B>
- static void Serialize(IStream& stream, const std::pair<A, B>& p)
- {
- Serialize(stream, p.first);
- Serialize(stream, p.second);
- }
- template <typename A, typename B>
- static void Serialize(IStream& stream, const std::pair<A, B>* const p)
- {
- Serialize(stream, *p);
- }
-
- // std::map
- template <typename K, typename T>
- static void Serialize(IStream& stream, const std::map<K, T>& map)
- {
- int length = map.size();
- stream.Write(sizeof(length), &length);
- typename std::map<K, T>::const_iterator it;
- for (it = map.begin(); it != map.end(); ++it) {
- Serialize(stream, (*it).first);
- Serialize(stream, (*it).second);
- }
- }
- template <typename K, typename T>
- static void Serialize(IStream& stream, const std::map<K, T>* const map)
- {
- Serialize(stream, *map);
- }
-
- // std::unique_ptr
- template <typename T>
- static void Serialize(IStream& stream, const std::unique_ptr<T>& p)
- {
- Serialize(stream, *p);
- }
-
+ // serialization
+ // normal functions
+
+ // ISerializable objects
+ static void Serialize(IStream &stream, const ISerializable &object)
+ {
+ object.Serialize(stream);
+ }
+
+ static void Serialize(IStream &stream, const ISerializable *const object)
+ {
+ object->Serialize(stream);
+ }
+
+ // char
+ static void Serialize(IStream &stream, const char value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const char *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // unsigned char
+ static void Serialize(IStream &stream, const unsigned char value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const unsigned char *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // unsigned int32
+ static void Serialize(IStream &stream, const uint32_t value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const uint32_t *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // int32
+ static void Serialize(IStream &stream, const int32_t value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const int32_t *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // unsigned int64
+ static void Serialize(IStream &stream, const uint64_t value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const uint64_t *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // int64
+ static void Serialize(IStream &stream, const int64_t value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const int64_t *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // bool
+ static void Serialize(IStream &stream, const bool value)
+ {
+ stream.Write(sizeof(value), &value);
+ }
+ static void Serialize(IStream &stream, const bool *const value)
+ {
+ stream.Write(sizeof(*value), value);
+ }
+
+ // std::string
+ template <typename T, typename R, typename A>
+ static void Serialize(IStream &stream, const std::basic_string<T, R, A> &str)
+ {
+ int length = str.size();
+ stream.Write(sizeof(length), &length);
+ stream.Write(length * sizeof(T), str.data());
+ }
+
+ template<typename T, typename R, typename A>
+ static void Serialize(IStream &stream, const std::basic_string<T, R, A> *const str)
+ {
+ int length = str->size();
+ stream.Write(sizeof(length), &length);
+ stream.Write(length * sizeof(T), str->data());
+ }
+
+ // STL templates
+
+ // std::list
+ template <typename T>
+ static void Serialize(IStream &stream, const std::list<T> &list)
+ {
+ int length = list.size();
+ stream.Write(sizeof(length), &length);
+
+ for (typename std::list<T>::const_iterator list_iter = list.begin();
+ list_iter != list.end(); list_iter++) {
+ Serialize(stream, *list_iter);
+ }
+ }
+ template <typename T>
+ static void Serialize(IStream &stream, const std::list<T> *const list)
+ {
+ Serialize(stream, *list);
+ }
+
+ // RawBuffer
+ template <typename A>
+ static void Serialize(IStream &stream, const std::vector<unsigned char, A> &vec)
+ {
+ int length = vec.size();
+ stream.Write(sizeof(length), &length);
+ stream.Write(length, vec.data());
+ }
+
+ template <typename A>
+ static void Serialize(IStream &stream, const std::vector<unsigned char, A> *const vec)
+ {
+ Serialize(stream, *vec);
+ }
+
+ // std::vector
+ template <typename T, typename A>
+ static void Serialize(IStream &stream, const std::vector<T, A> &vec)
+ {
+ int length = vec.size();
+ stream.Write(sizeof(length), &length);
+
+ for (const auto &i : vec) {
+ Serialize(stream, i);
+ }
+ }
+ template <typename T, typename A>
+ static void Serialize(IStream &stream, const std::vector<T, A> *const vec)
+ {
+ Serialize(stream, *vec);
+ }
+
+ // std::pair
+ template <typename A, typename B>
+ static void Serialize(IStream &stream, const std::pair<A, B> &p)
+ {
+ Serialize(stream, p.first);
+ Serialize(stream, p.second);
+ }
+ template <typename A, typename B>
+ static void Serialize(IStream &stream, const std::pair<A, B> *const p)
+ {
+ Serialize(stream, *p);
+ }
+
+ // std::map
+ template <typename K, typename T>
+ static void Serialize(IStream &stream, const std::map<K, T> &map)
+ {
+ int length = map.size();
+ stream.Write(sizeof(length), &length);
+ typename std::map<K, T>::const_iterator it;
+
+ for (it = map.begin(); it != map.end(); ++it) {
+ Serialize(stream, (*it).first);
+ Serialize(stream, (*it).second);
+ }
+ }
+ template <typename K, typename T>
+ static void Serialize(IStream &stream, const std::map<K, T> *const map)
+ {
+ Serialize(stream, *map);
+ }
+
+ // std::unique_ptr
+ template <typename T>
+ static void Serialize(IStream &stream, const std::unique_ptr<T> &p)
+ {
+ Serialize(stream, *p);
+ }
}; // struct Serialization
struct Deserialization {
- // deserialization
- // normal functions
-
- // ISerializable objects
- // T instead of ISerializable is needed to call proper constructor
- template <typename T>
- static void Deserialize(IStream& stream, T& object)
- {
- object = T(stream);
- }
- template <typename T>
- static void Deserialize(IStream& stream, T*& object)
- {
- object = new T(stream);
- }
-
- // char
- static void Deserialize(IStream& stream, char& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, char*& value)
- {
- value = new char;
- stream.Read(sizeof(*value), value);
- }
-
- // unsigned char
- static void Deserialize(IStream& stream, unsigned char& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, unsigned char*& value)
- {
- value = new unsigned char;
- stream.Read(sizeof(*value), value);
- }
-
- // unsigned int32
- static void Deserialize(IStream& stream, uint32_t& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, uint32_t*& value)
- {
- value = new uint32_t;
- stream.Read(sizeof(*value), value);
- }
-
- // int32
- static void Deserialize(IStream& stream, int32_t& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, int32_t*& value)
- {
- value = new int32_t;
- stream.Read(sizeof(*value), value);
- }
-
- // unsigned int64
- static void Deserialize(IStream& stream, uint64_t& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, uint64_t*& value)
- {
- value = new uint64_t;
- stream.Read(sizeof(*value), value);
- }
-
- // int64
- static void Deserialize(IStream& stream, int64_t& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, int64_t*& value)
- {
- value = new int64_t;
- stream.Read(sizeof(*value), value);
- }
-
- // bool
- static void Deserialize(IStream& stream, bool& value)
- {
- stream.Read(sizeof(value), &value);
- }
- static void Deserialize(IStream& stream, bool*& value)
- {
- value = new bool;
- stream.Read(sizeof(*value), value);
- }
-
- template <typename T, typename R, typename A>
- static void Deserialize(IStream& stream, std::basic_string<T,R,A>& str)
- {
- int length;
- stream.Read(sizeof(length), &length);
- std::vector<T> buf(length);
- stream.Read(length*sizeof(T), buf.data());
- str = std::basic_string<T,R,A>(buf.data(), buf.data()+length);
- }
-
- template <typename T, typename R, typename A>
- static void Deserialize(IStream& stream, std::basic_string<T,R,A>*& str)
- {
- int length;
- stream.Read(sizeof(length), &length);
- std::vector<T> buf(length);
- stream.Read(length*sizeof(T), buf.data());
- str = new std::basic_string<T,R,A>(buf.data(), buf.data()+length);
- }
-
- // STL templates
-
- // std::list
- template <typename T>
- static void Deserialize(IStream& stream, std::list<T>& list)
- {
- int length;
- stream.Read(sizeof(length), &length);
- for (int i = 0; i < length; ++i) {
- T obj;
- Deserialize(stream, obj);
- list.push_back(std::move(obj));
- }
- }
- template <typename T>
- static void Deserialize(IStream& stream, std::list<T>*& list)
- {
- list = new std::list<T>;
- Deserialize(stream, *list);
- }
-
- // RawBuffer
- template <typename A>
- static void Deserialize(IStream& stream, std::vector<unsigned char, A>& vec)
- {
- int length;
- stream.Read(sizeof(length), &length);
- vec.resize(length);
- stream.Read(length, vec.data());
- }
-
- template <typename A>
- static void Deserialize(IStream& stream, std::vector<unsigned char, A>*& vec)
- {
- vec = new std::vector<unsigned char,A>;
- Deserialize(stream, *vec);
- }
-
- // std::vector
- template <typename T, typename A>
- static void Deserialize(IStream& stream, std::vector<T,A>& vec)
- {
- int length;
- stream.Read(sizeof(length), &length);
- for (int i = 0; i < length; ++i) {
- T obj;
- Deserialize(stream, obj);
- vec.push_back(std::move(obj));
- }
- }
- template <typename T, typename A>
- static void Deserialize(IStream& stream, std::vector<T,A>*& vec)
- {
- vec = new std::vector<T,A>;
- Deserialize(stream, *vec);
- }
-
- // std::pair
- template <typename A, typename B>
- static void Deserialize(IStream& stream, std::pair<A, B>& p)
- {
- Deserialize(stream, p.first);
- Deserialize(stream, p.second);
- }
- template <typename A, typename B>
- static void Deserialize(IStream& stream, std::pair<A, B>*& p)
- {
- p = new std::pair<A, B>;
- Deserialize(stream, *p);
- }
-
- // std::map
- template <typename K, typename T>
- static void Deserialize(IStream& stream, std::map<K, T>& map)
- {
- int length;
- stream.Read(sizeof(length), &length);
- for (int i = 0; i < length; ++i) {
- K key;
- T obj;
- Deserialize(stream, key);
- Deserialize(stream, obj);
- map[key] = std::move(obj);
- }
- }
- template <typename K, typename T>
- static void Deserialize(IStream& stream, std::map<K, T>*& map)
- {
- map = new std::map<K, T>;
- Deserialize(stream, *map);
- }
+ // deserialization
+ // normal functions
+
+ // ISerializable objects
+ // T instead of ISerializable is needed to call proper constructor
+ template <typename T>
+ static void Deserialize(IStream &stream, T &object)
+ {
+ object = T(stream);
+ }
+ template <typename T>
+ static void Deserialize(IStream &stream, T *&object)
+ {
+ object = new T(stream);
+ }
+
+ // char
+ static void Deserialize(IStream &stream, char &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, char *&value)
+ {
+ value = new char;
+ stream.Read(sizeof(*value), value);
+ }
+
+ // unsigned char
+ static void Deserialize(IStream &stream, unsigned char &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, unsigned char *&value)
+ {
+ value = new unsigned char;
+ stream.Read(sizeof(*value), value);
+ }
+
+ // unsigned int32
+ static void Deserialize(IStream &stream, uint32_t &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, uint32_t *&value)
+ {
+ value = new uint32_t;
+ stream.Read(sizeof(*value), value);
+ }
+
+ // int32
+ static void Deserialize(IStream &stream, int32_t &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, int32_t *&value)
+ {
+ value = new int32_t;
+ stream.Read(sizeof(*value), value);
+ }
+
+ // unsigned int64
+ static void Deserialize(IStream &stream, uint64_t &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, uint64_t *&value)
+ {
+ value = new uint64_t;
+ stream.Read(sizeof(*value), value);
+ }
+
+ // int64
+ static void Deserialize(IStream &stream, int64_t &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, int64_t *&value)
+ {
+ value = new int64_t;
+ stream.Read(sizeof(*value), value);
+ }
+
+ // bool
+ static void Deserialize(IStream &stream, bool &value)
+ {
+ stream.Read(sizeof(value), &value);
+ }
+ static void Deserialize(IStream &stream, bool *&value)
+ {
+ value = new bool;
+ stream.Read(sizeof(*value), value);
+ }
+
+ template <typename T, typename R, typename A>
+ static void Deserialize(IStream &stream, std::basic_string<T, R, A> &str)
+ {
+ int length;
+ stream.Read(sizeof(length), &length);
+ std::vector<T> buf(length);
+ stream.Read(length * sizeof(T), buf.data());
+ str = std::basic_string<T, R, A>(buf.data(), buf.data() + length);
+ }
+
+ template <typename T, typename R, typename A>
+ static void Deserialize(IStream &stream, std::basic_string<T, R, A> *&str)
+ {
+ int length;
+ stream.Read(sizeof(length), &length);
+ std::vector<T> buf(length);
+ stream.Read(length * sizeof(T), buf.data());
+ str = new std::basic_string<T, R, A>(buf.data(), buf.data() + length);
+ }
+
+ // STL templates
+
+ // std::list
+ template <typename T>
+ static void Deserialize(IStream &stream, std::list<T> &list)
+ {
+ int length;
+ stream.Read(sizeof(length), &length);
+
+ for (int i = 0; i < length; ++i) {
+ T obj;
+ Deserialize(stream, obj);
+ list.push_back(std::move(obj));
+ }
+ }
+ template <typename T>
+ static void Deserialize(IStream &stream, std::list<T> *&list)
+ {
+ list = new std::list<T>;
+ Deserialize(stream, *list);
+ }
+
+ // RawBuffer
+ template <typename A>
+ static void Deserialize(IStream &stream, std::vector<unsigned char, A> &vec)
+ {
+ int length;
+ stream.Read(sizeof(length), &length);
+ vec.resize(length);
+ stream.Read(length, vec.data());
+ }
+
+ template <typename A>
+ static void Deserialize(IStream &stream, std::vector<unsigned char, A> *&vec)
+ {
+ vec = new std::vector<unsigned char, A>;
+ Deserialize(stream, *vec);
+ }
+
+ // std::vector
+ template <typename T, typename A>
+ static void Deserialize(IStream &stream, std::vector<T, A> &vec)
+ {
+ int length;
+ stream.Read(sizeof(length), &length);
+
+ for (int i = 0; i < length; ++i) {
+ T obj;
+ Deserialize(stream, obj);
+ vec.push_back(std::move(obj));
+ }
+ }
+ template <typename T, typename A>
+ static void Deserialize(IStream &stream, std::vector<T, A> *&vec)
+ {
+ vec = new std::vector<T, A>;
+ Deserialize(stream, *vec);
+ }
+
+ // std::pair
+ template <typename A, typename B>
+ static void Deserialize(IStream &stream, std::pair<A, B> &p)
+ {
+ Deserialize(stream, p.first);
+ Deserialize(stream, p.second);
+ }
+ template <typename A, typename B>
+ static void Deserialize(IStream &stream, std::pair<A, B> *&p)
+ {
+ p = new std::pair<A, B>;
+ Deserialize(stream, *p);
+ }
+
+ // std::map
+ template <typename K, typename T>
+ static void Deserialize(IStream &stream, std::map<K, T> &map)
+ {
+ int length;
+ stream.Read(sizeof(length), &length);
+
+ for (int i = 0; i < length; ++i) {
+ K key;
+ T obj;
+ Deserialize(stream, key);
+ Deserialize(stream, obj);
+ map[key] = std::move(obj);
+ }
+ }
+ template <typename K, typename T>
+ static void Deserialize(IStream &stream, std::map<K, T> *&map)
+ {
+ map = new std::map<K, T>;
+ Deserialize(stream, *map);
+ }
}; // struct Deserialization
// generic serialization
@@ -457,18 +458,20 @@ struct Serializer;
template <typename First, typename... Args>
struct Serializer<First, Args...> : public Serializer<Args...> {
- static void Serialize(IStream& stream, const First& f, const Args&... args) {
- Serialization::Serialize(stream, f);
- Serializer<Args...>::Serialize(stream, args...);
- }
+ static void Serialize(IStream &stream, const First &f, const Args &... args)
+ {
+ Serialization::Serialize(stream, f);
+ Serializer<Args...>::Serialize(stream, args...);
+ }
};
// end of recursion
template <>
struct Serializer<> {
- static void Serialize(IStream&) {
- return;
- }
+ static void Serialize(IStream &)
+ {
+ return;
+ }
};
// generic deserialization
@@ -477,18 +480,20 @@ struct Deserializer;
template <typename First, typename... Args>
struct Deserializer<First, Args...> : public Deserializer<Args...> {
- static void Deserialize(IStream& stream, First& f, Args&... args) {
- Deserialization::Deserialize(stream, f);
- Deserializer<Args...>::Deserialize(stream, args...);
- }
+ static void Deserialize(IStream &stream, First &f, Args &... args)
+ {
+ Deserialization::Deserialize(stream, f);
+ Deserializer<Args...>::Deserialize(stream, args...);
+ }
};
// end of recursion
template <>
struct Deserializer<> {
- static void Deserialize(IStream&) {
- return;
- }
+ static void Deserialize(IStream &)
+ {
+ return;
+ }
};
} // CCHECKER
diff --git a/src/dpl/core/include/cchecker/dpl/string.h b/src/dpl/core/include/cchecker/dpl/string.h
index d9c3bbd..5d12e17 100644
--- a/src/dpl/core/include/cchecker/dpl/string.h
+++ b/src/dpl/core/include/cchecker/dpl/string.h
@@ -33,47 +33,46 @@ namespace CCHECKER {
typedef std::basic_string<wchar_t, CharTraits> String;
// @brief String exception class
-class StringException
-{
- public:
- DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base)
+class StringException {
+public:
+ DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base)
- // @brief Invalid init for UTF8 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF8ToUTF32)
+ // @brief Invalid init for UTF8 to UTF32 converter
+ DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF8ToUTF32)
- // @brief Invalid taStdContainerinit for UTF32 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF32ToUTF8)
+ // @brief Invalid taStdContainerinit for UTF32 to UTF32 converter
+ DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF32ToUTF8)
- // @brief Invalid conversion for UTF8 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF8ToUTF32)
+ // @brief Invalid conversion for UTF8 to UTF32 converter
+ DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF8ToUTF32)
- // @brief Invalid conversion for UTF8 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF32ToUTF8)
+ // @brief Invalid conversion for UTF8 to UTF32 converter
+ DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF32ToUTF8)
- // @brief Invalid ASCII character detected in FromASCII
- DECLARE_EXCEPTION_TYPE(Base, InvalidASCIICharacter)
+ // @brief Invalid ASCII character detected in FromASCII
+ DECLARE_EXCEPTION_TYPE(Base, InvalidASCIICharacter)
- // @brief Invalid ASCII character detected in FromASCII
- DECLARE_EXCEPTION_TYPE(Base, ICUInvalidCharacterFound)
+ // @brief Invalid ASCII character detected in FromASCII
+ DECLARE_EXCEPTION_TYPE(Base, ICUInvalidCharacterFound)
};
//!\brief convert ASCII string to CCHECKER::String
-String FromASCIIString(const std::string& aString);
+String FromASCIIString(const std::string &aString);
//!\brief convert UTF32 string to CCHECKER::String
-String FromUTF32String(const std::wstring& aString);
+String FromUTF32String(const std::wstring &aString);
//@brief Returns String object created from UTF8 string
//@param[in] aString input UTF-8 string
-String FromUTF8String(const std::string& aString);
+String FromUTF8String(const std::string &aString);
//@brief Returns String content as std::string
-std::string ToUTF8String(const String& aString);
+std::string ToUTF8String(const String &aString);
//@brief Compare two unicode strings
int StringCompare(const String &left,
- const String &right,
- bool caseInsensitive = false);
+ const String &right,
+ bool caseInsensitive = false);
//@brief Splits the string into substrings.
//@param[in] str Input string
@@ -81,61 +80,63 @@ int StringCompare(const String &left,
// delimiters. Can be also a single delimiter character.
//@param[in] it InserterIterator that is used to save the generated substrings.
template<typename StringType, typename Delimiters, typename InserterIterator>
-void Tokenize(const StringType& str,
- const Delimiters& delimiters,
- InserterIterator it,
- bool ignoreEmpty = false)
+void Tokenize(const StringType &str,
+ const Delimiters &delimiters,
+ InserterIterator it,
+ bool ignoreEmpty = false)
{
- typename StringType::size_type nextSearchStart = 0;
- typename StringType::size_type pos;
- typename StringType::size_type length;
-
- while (true) {
- pos = str.find_first_of(delimiters, nextSearchStart);
- length =
- ((pos == StringType::npos) ? str.length() : pos) - nextSearchStart;
-
- if (!ignoreEmpty || length > 0) {
- *it = str.substr(nextSearchStart, length);
- it++;
- }
-
- if (pos == StringType::npos) {
- return;
- }
-
- nextSearchStart = pos + 1;
- }
+ typename StringType::size_type nextSearchStart = 0;
+ typename StringType::size_type pos;
+ typename StringType::size_type length;
+
+ while (true) {
+ pos = str.find_first_of(delimiters, nextSearchStart);
+ length =
+ ((pos == StringType::npos) ? str.length() : pos) - nextSearchStart;
+
+ if (!ignoreEmpty || length > 0) {
+ *it = str.substr(nextSearchStart, length);
+ it++;
+ }
+
+ if (pos == StringType::npos) {
+ return;
+ }
+
+ nextSearchStart = pos + 1;
+ }
}
namespace Utils {
-template<typename T> class ConcatFunc : public std::binary_function<T, T, T>
-{
+template<typename T> class ConcatFunc : public std::binary_function<T, T, T> {
public:
- explicit ConcatFunc(const T & val) : m_delim(val) {}
- T operator()(const T & arg1, const T & arg2) const
- {
- return arg1 + m_delim + arg2;
- }
+ explicit ConcatFunc(const T &val) : m_delim(val) {}
+ T operator()(const T &arg1, const T &arg2) const
+ {
+ return arg1 + m_delim + arg2;
+ }
private:
- T m_delim;
+ T m_delim;
};
}
template<typename ForwardIterator>
-typename ForwardIterator::value_type Join(ForwardIterator begin, ForwardIterator end, typename ForwardIterator::value_type delim)
+typename ForwardIterator::value_type Join(ForwardIterator begin, ForwardIterator end,
+ typename ForwardIterator::value_type delim)
{
- typedef typename ForwardIterator::value_type value;
- if(begin == end) return value();
- Utils::ConcatFunc<value> func(delim);
- ForwardIterator init = begin;
- return std::accumulate(++begin, end, *init, func);
+ typedef typename ForwardIterator::value_type value;
+
+ if (begin == end) return value();
+
+ Utils::ConcatFunc<value> func(delim);
+ ForwardIterator init = begin;
+ return std::accumulate(++begin, end, *init, func);
}
} //namespace CCHECKER
-std::ostream& operator<<(std::ostream& aStream, const CCHECKER::String& aString);
+std::ostream &operator<<(std::ostream &aStream, const CCHECKER::String &aString);
#endif // CCHECKER_STRING
diff --git a/src/dpl/core/src/assert.cpp b/src/dpl/core/src/assert.cpp
index e367562..acaa958 100644
--- a/src/dpl/core/src/assert.cpp
+++ b/src/dpl/core/src/assert.cpp
@@ -28,41 +28,39 @@
namespace CCHECKER {
void AssertProc(const char *condition,
- const char *file,
- int line,
- const char *function)
+ const char *file,
+ int line,
+ const char *function)
{
#define INTERNAL_LOG(message) \
- do \
- { \
- std::ostringstream platformLog; \
- platformLog << message; \
- JournalLog(LOG_DEBUG, \
- platformLog.str().c_str(), \
- __FILE__, __LINE__, __FUNCTION__); \
- } \
- while (0)
+ do \
+ { \
+ std::ostringstream platformLog; \
+ platformLog << message; \
+ JournalLog(LOG_DEBUG, \
+ platformLog.str().c_str(), \
+ __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ while (0)
+ // Try to log failed assertion to log system
+ Try {
+ INTERNAL_LOG(
+ "################################################################################");
+ INTERNAL_LOG(
+ "### cert-checker assertion failed! ###");
+ INTERNAL_LOG(
+ "################################################################################");
+ INTERNAL_LOG("### Condition: " << condition);
+ INTERNAL_LOG("### File: " << file);
+ INTERNAL_LOG("### Line: " << line);
+ INTERNAL_LOG("### Function: " << function);
+ INTERNAL_LOG(
+ "################################################################################");
+ } catch (Exception) {
+ // Just ignore possible double errors
+ }
- // Try to log failed assertion to log system
- Try
- {
- INTERNAL_LOG(
- "################################################################################");
- INTERNAL_LOG(
- "### cert-checker assertion failed! ###");
- INTERNAL_LOG(
- "################################################################################");
- INTERNAL_LOG("### Condition: " << condition);
- INTERNAL_LOG("### File: " << file);
- INTERNAL_LOG("### Line: " << line);
- INTERNAL_LOG("### Function: " << function);
- INTERNAL_LOG(
- "################################################################################");
- } catch (Exception) {
- // Just ignore possible double errors
- }
-
- // Fail with c-library abort
- abort();
+ // Fail with c-library abort
+ abort();
}
} // namespace CCHECKER
diff --git a/src/dpl/core/src/colors.cpp b/src/dpl/core/src/colors.cpp
index 272c06b..1f380b9 100644
--- a/src/dpl/core/src/colors.cpp
+++ b/src/dpl/core/src/colors.cpp
@@ -27,46 +27,46 @@
namespace CCHECKER {
namespace Colors {
namespace Text {
-const char* BOLD_GREEN_BEGIN = "\033[1;32m";
-const char* BOLD_GREEN_END = "\033[m";
-const char* RED_BEGIN = "\033[0;31m";
-const char* RED_END = "\033[m";
-const char* PURPLE_BEGIN = "\033[0;35m";
-const char* PURPLE_END = "\033[m";
-const char* GREEN_BEGIN = "\033[0;32m";
-const char* GREEN_END = "\033[m";
-const char* CYAN_BEGIN = "\033[0;36m";
-const char* CYAN_END = "\033[m";
-const char* BOLD_RED_BEGIN = "\033[1;31m";
-const char* BOLD_RED_END = "\033[m";
-const char* BOLD_YELLOW_BEGIN = "\033[1;33m";
-const char* BOLD_YELLOW_END = "\033[m";
-const char* BOLD_GOLD_BEGIN = "\033[0;33m";
-const char* BOLD_GOLD_END = "\033[m";
-const char* BOLD_WHITE_BEGIN = "\033[1;37m";
-const char* BOLD_WHITE_END = "\033[m";
-const char* COLOR_END = "\033[m";
+const char *BOLD_GREEN_BEGIN = "\033[1;32m";
+const char *BOLD_GREEN_END = "\033[m";
+const char *RED_BEGIN = "\033[0;31m";
+const char *RED_END = "\033[m";
+const char *PURPLE_BEGIN = "\033[0;35m";
+const char *PURPLE_END = "\033[m";
+const char *GREEN_BEGIN = "\033[0;32m";
+const char *GREEN_END = "\033[m";
+const char *CYAN_BEGIN = "\033[0;36m";
+const char *CYAN_END = "\033[m";
+const char *BOLD_RED_BEGIN = "\033[1;31m";
+const char *BOLD_RED_END = "\033[m";
+const char *BOLD_YELLOW_BEGIN = "\033[1;33m";
+const char *BOLD_YELLOW_END = "\033[m";
+const char *BOLD_GOLD_BEGIN = "\033[0;33m";
+const char *BOLD_GOLD_END = "\033[m";
+const char *BOLD_WHITE_BEGIN = "\033[1;37m";
+const char *BOLD_WHITE_END = "\033[m";
+const char *COLOR_END = "\033[m";
} //namespace Text
namespace Html {
-const char* BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
-const char* BOLD_GREEN_END = "</b></font>";
-const char* PURPLE_BEGIN = "<font color=\"purple\"><b>";
-const char* PURPLE_END = "</b></font>";
-const char* RED_BEGIN = "<font color=\"red\"><b>";
-const char* RED_END = "</b></font>";
-const char* GREEN_BEGIN = "<font color=\"green\">";
-const char* GREEN_END = "</font>";
-const char* CYAN_BEGIN = "<font color=\"cyan\">";
-const char* CYAN_END = "</font>";
-const char* BOLD_RED_BEGIN = "<font color=\"red\"><b>";
-const char* BOLD_RED_END = "</b></font>";
-const char* BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
-const char* BOLD_YELLOW_END = "</b></font>";
-const char* BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
-const char* BOLD_GOLD_END = "</b></font>";
-const char* BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
-const char* BOLD_WHITE_END = "</b></font>";
+const char *BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
+const char *BOLD_GREEN_END = "</b></font>";
+const char *PURPLE_BEGIN = "<font color=\"purple\"><b>";
+const char *PURPLE_END = "</b></font>";
+const char *RED_BEGIN = "<font color=\"red\"><b>";
+const char *RED_END = "</b></font>";
+const char *GREEN_BEGIN = "<font color=\"green\">";
+const char *GREEN_END = "</font>";
+const char *CYAN_BEGIN = "<font color=\"cyan\">";
+const char *CYAN_END = "</font>";
+const char *BOLD_RED_BEGIN = "<font color=\"red\"><b>";
+const char *BOLD_RED_END = "</b></font>";
+const char *BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
+const char *BOLD_YELLOW_END = "</b></font>";
+const char *BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
+const char *BOLD_GOLD_END = "</b></font>";
+const char *BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
+const char *BOLD_WHITE_END = "</b></font>";
} //namespace Html
} //namespace Colors
} //namespace CCHECKER
diff --git a/src/dpl/core/src/errno_string.cpp b/src/dpl/core/src/errno_string.cpp
index 5b1de37..fa04a45 100644
--- a/src/dpl/core/src/errno_string.cpp
+++ b/src/dpl/core/src/errno_string.cpp
@@ -34,66 +34,65 @@
#include <cchecker/dpl/scoped_free.h>
namespace CCHECKER {
-namespace // anonymous
-{
+namespace { // anonymous
const size_t DEFAULT_ERRNO_STRING_SIZE = 32;
} // namespace anonymous
std::string GetErrnoString(int error)
{
- size_t size = DEFAULT_ERRNO_STRING_SIZE;
- char *buffer = NULL;
-
- for (;;) {
- // Add one extra characted for end of string null value
- char *newBuffer = static_cast<char *>(::realloc(buffer, size + 1));
+ size_t size = DEFAULT_ERRNO_STRING_SIZE;
+ char *buffer = NULL;
- if (!newBuffer) {
- // Failed to realloc
- ::free(buffer);
- throw std::bad_alloc();
- }
+ for (;;) {
+ // Add one extra characted for end of string null value
+ char *newBuffer = static_cast<char *>(::realloc(buffer, size + 1));
- // Setup reallocated buffer
- buffer = newBuffer;
- ::memset(buffer, 0, size + 1);
+ if (!newBuffer) {
+ // Failed to realloc
+ ::free(buffer);
+ throw std::bad_alloc();
+ }
- // Try to retrieve error string
+ // Setup reallocated buffer
+ buffer = newBuffer;
+ ::memset(buffer, 0, size + 1);
+ // Try to retrieve error string
#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE
- // The XSI-compliant version of strerror_r() is provided if:
- int result = ::strerror_r(error, buffer, size);
+ // The XSI-compliant version of strerror_r() is provided if:
+ int result = ::strerror_r(error, buffer, size);
+
+ if (result == 0) {
+ ScopedFree<char> scopedBufferFree(buffer);
+ return std::string(buffer);
+ }
- if (result == 0) {
- ScopedFree<char> scopedBufferFree(buffer);
- return std::string(buffer);
- }
#else
- errno = 0;
+ errno = 0;
+ // Otherwise, the GNU-specific version is provided.
+ char *result = ::strerror_r(error, buffer, size);
- // Otherwise, the GNU-specific version is provided.
- char *result = ::strerror_r(error, buffer, size);
+ if (result != NULL) {
+ ScopedFree<char> scopedBufferFree(buffer);
+ return std::string(result);
+ }
- if (result != NULL) {
- ScopedFree<char> scopedBufferFree(buffer);
- return std::string(result);
- }
#endif
- // Interpret errors
- switch (errno) {
- case EINVAL:
- // We got an invalid errno value
- ::free(buffer);
- ThrowMsg(InvalidErrnoValue, "Invalid errno value: " << error);
+ // Interpret errors
+ switch (errno) {
+ case EINVAL:
+ // We got an invalid errno value
+ ::free(buffer);
+ ThrowMsg(InvalidErrnoValue, "Invalid errno value: " << error);
- case ERANGE:
- // Incease buffer size and retry
- size <<= 1;
- continue;
+ case ERANGE:
+ // Incease buffer size and retry
+ size <<= 1;
+ continue;
- default:
- Assert(0 && "Invalid errno value after call to strerror_r!");
- }
- }
+ default:
+ Assert(0 && "Invalid errno value after call to strerror_r!");
+ }
+ }
}
} // namespace CCHECKER
diff --git a/src/dpl/core/src/exception.cpp b/src/dpl/core/src/exception.cpp
index bee161b..66024fc 100644
--- a/src/dpl/core/src/exception.cpp
+++ b/src/dpl/core/src/exception.cpp
@@ -26,32 +26,30 @@
#include "common/log.h"
namespace CCHECKER {
-Exception* Exception::m_lastException = NULL;
+Exception *Exception::m_lastException = NULL;
unsigned int Exception::m_exceptionCount = 0;
void (*Exception::m_terminateHandler)() = NULL;
void LogUnhandledException(const std::string &str)
{
- // Logging to console
- printf("%s\n", str.c_str());
-
- // Logging to dlog
- LogDebug(str);
+ // Logging to console
+ printf("%s\n", str.c_str());
+ // Logging to dlog
+ LogDebug(str);
}
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function)
+ const char *filename,
+ int line,
+ const char *function)
{
- // Logging to console
- std::ostringstream msg;
- msg << "\033[1;5;31m\n=== [" << filename << ":" << line << "] " <<
- function << " ===\033[m";
- msg << str;
- printf("%s\n", msg.str().c_str());
-
- // Logging to dlog
- LogError(str.c_str() << filename << line << function);
+ // Logging to console
+ std::ostringstream msg;
+ msg << "\033[1;5;31m\n=== [" << filename << ":" << line << "] " <<
+ function << " ===\033[m";
+ msg << str;
+ printf("%s\n", msg.str().c_str());
+ // Logging to dlog
+ LogError(str.c_str() << filename << line << function);
}
} // namespace CCHECKER
diff --git a/src/dpl/core/src/string.cpp b/src/dpl/core/src/string.cpp
index 7c8223d..72ade02 100644
--- a/src/dpl/core/src/string.cpp
+++ b/src/dpl/core/src/string.cpp
@@ -37,215 +37,197 @@
// TODO: Completely move to ICU
namespace CCHECKER {
-namespace //anonymous
-{
-class ASCIIValidator
-{
- const std::string& m_TestedString;
+namespace { //anonymous
+class ASCIIValidator {
+ const std::string &m_TestedString;
- public:
- ASCIIValidator(const std::string& aTestedString);
+public:
+ ASCIIValidator(const std::string &aTestedString);
- void operator()(signed char aCharacter) const;
+ void operator()(signed char aCharacter) const;
};
-ASCIIValidator::ASCIIValidator(const std::string& aTestedString) :
- m_TestedString(aTestedString)
+ASCIIValidator::ASCIIValidator(const std::string &aTestedString) :
+ m_TestedString(aTestedString)
{}
void ASCIIValidator::operator()(signed char aCharacter) const
{
- // Check for ASCII data range
- if (aCharacter <= 0) {
- ThrowMsg(
- StringException::InvalidASCIICharacter,
- "invalid character code " << static_cast<int>(aCharacter)
- << " from string [" <<
- m_TestedString
- << "] passed as ASCII");
- }
+ // Check for ASCII data range
+ if (aCharacter <= 0) {
+ ThrowMsg(
+ StringException::InvalidASCIICharacter,
+ "invalid character code " << static_cast<int>(aCharacter)
+ << " from string [" <<
+ m_TestedString
+ << "] passed as ASCII");
+ }
}
const iconv_t gc_IconvOperError = reinterpret_cast<iconv_t>(-1);
const size_t gc_IconvConvertError = static_cast<size_t>(-1);
} // namespace anonymous
-String FromUTF8String(const std::string& aIn)
+String FromUTF8String(const std::string &aIn)
{
- if (aIn.empty()) {
- return String();
- }
-
- size_t inbytes = aIn.size();
-
- // Default iconv UTF-32 module adds BOM (4 bytes) in from of string
- // The worst case is when 8bit UTF-8 char converts to 32bit UTF-32
- // newsize = oldsize * 4 + end + bom
- // newsize - bytes for UTF-32 string
- // oldsize - letters in UTF-8 string
- // end - end character for UTF-32 (\0)
- // bom - Unicode header in front of string (0xfeff)
- size_t outbytes = sizeof(wchar_t) * (inbytes + 2);
- std::vector<wchar_t> output(inbytes + 2, 0);
-
- size_t outbytesleft = outbytes;
- char* inbuf = const_cast<char*>(aIn.c_str());
-
- // vector is used to provide buffer for iconv which expects char* buffer
- // but during conversion from UTF32 uses internaly wchar_t
- char* outbuf = reinterpret_cast<char*>(&output[0]);
-
- iconv_t iconvHandle = iconv_open("UTF-32", "UTF-8");
-
- if (gc_IconvOperError == iconvHandle) {
- int error = errno;
-
- ThrowMsg(StringException::IconvInitErrorUTF8ToUTF32,
- "iconv_open failed for " << "UTF-32 <- UTF-8" <<
- "error: " << GetErrnoString(error));
- }
-
- size_t iconvRet = iconv(iconvHandle,
- &inbuf,
- &inbytes,
- &outbuf,
- &outbytesleft);
-
- iconv_close(iconvHandle);
-
- if (gc_IconvConvertError == iconvRet) {
- ThrowMsg(StringException::IconvConvertErrorUTF8ToUTF32,
- "iconv failed for " << "UTF-32 <- UTF-8" << "error: "
- << GetErrnoString());
- }
-
- // Ignore BOM in front of UTF-32
- return &output[1];
+ if (aIn.empty()) {
+ return String();
+ }
+
+ size_t inbytes = aIn.size();
+ // Default iconv UTF-32 module adds BOM (4 bytes) in from of string
+ // The worst case is when 8bit UTF-8 char converts to 32bit UTF-32
+ // newsize = oldsize * 4 + end + bom
+ // newsize - bytes for UTF-32 string
+ // oldsize - letters in UTF-8 string
+ // end - end character for UTF-32 (\0)
+ // bom - Unicode header in front of string (0xfeff)
+ size_t outbytes = sizeof(wchar_t) * (inbytes + 2);
+ std::vector<wchar_t> output(inbytes + 2, 0);
+ size_t outbytesleft = outbytes;
+ char *inbuf = const_cast<char *>(aIn.c_str());
+ // vector is used to provide buffer for iconv which expects char* buffer
+ // but during conversion from UTF32 uses internaly wchar_t
+ char *outbuf = reinterpret_cast<char *>(&output[0]);
+ iconv_t iconvHandle = iconv_open("UTF-32", "UTF-8");
+
+ if (gc_IconvOperError == iconvHandle) {
+ int error = errno;
+ ThrowMsg(StringException::IconvInitErrorUTF8ToUTF32,
+ "iconv_open failed for " << "UTF-32 <- UTF-8" <<
+ "error: " << GetErrnoString(error));
+ }
+
+ size_t iconvRet = iconv(iconvHandle,
+ &inbuf,
+ &inbytes,
+ &outbuf,
+ &outbytesleft);
+ iconv_close(iconvHandle);
+
+ if (gc_IconvConvertError == iconvRet) {
+ ThrowMsg(StringException::IconvConvertErrorUTF8ToUTF32,
+ "iconv failed for " << "UTF-32 <- UTF-8" << "error: "
+ << GetErrnoString());
+ }
+
+ // Ignore BOM in front of UTF-32
+ return &output[1];
}
-std::string ToUTF8String(const CCHECKER::String& aIn)
+std::string ToUTF8String(const CCHECKER::String &aIn)
{
- if (aIn.empty()) {
- return std::string();
- }
-
- size_t inbytes = aIn.size() * sizeof(wchar_t);
- size_t outbytes = inbytes + sizeof(char);
-
- // wstring returns wchar_t but iconv expects char*
- // iconv internally is processing input as wchar_t
- char* inbuf = reinterpret_cast<char*>(const_cast<wchar_t*>(aIn.c_str()));
- std::vector<char> output(inbytes, 0);
- char* outbuf = &output[0];
-
- size_t outbytesleft = outbytes;
-
- iconv_t iconvHandle = iconv_open("UTF-8", "UTF-32");
-
- if (gc_IconvOperError == iconvHandle) {
- ThrowMsg(StringException::IconvInitErrorUTF32ToUTF8,
- "iconv_open failed for " << "UTF-8 <- UTF-32"
- << "error: " << GetErrnoString());
- }
-
- size_t iconvRet = iconv(iconvHandle,
- &inbuf,
- &inbytes,
- &outbuf,
- &outbytesleft);
-
- iconv_close(iconvHandle);
-
- if (gc_IconvConvertError == iconvRet) {
- ThrowMsg(StringException::IconvConvertErrorUTF32ToUTF8,
- "iconv failed for " << "UTF-8 <- UTF-32"
- << "error: " << GetErrnoString());
- }
-
- return &output[0];
+ if (aIn.empty()) {
+ return std::string();
+ }
+
+ size_t inbytes = aIn.size() * sizeof(wchar_t);
+ size_t outbytes = inbytes + sizeof(char);
+ // wstring returns wchar_t but iconv expects char*
+ // iconv internally is processing input as wchar_t
+ char *inbuf = reinterpret_cast<char *>(const_cast<wchar_t *>(aIn.c_str()));
+ std::vector<char> output(inbytes, 0);
+ char *outbuf = &output[0];
+ size_t outbytesleft = outbytes;
+ iconv_t iconvHandle = iconv_open("UTF-8", "UTF-32");
+
+ if (gc_IconvOperError == iconvHandle) {
+ ThrowMsg(StringException::IconvInitErrorUTF32ToUTF8,
+ "iconv_open failed for " << "UTF-8 <- UTF-32"
+ << "error: " << GetErrnoString());
+ }
+
+ size_t iconvRet = iconv(iconvHandle,
+ &inbuf,
+ &inbytes,
+ &outbuf,
+ &outbytesleft);
+ iconv_close(iconvHandle);
+
+ if (gc_IconvConvertError == iconvRet) {
+ ThrowMsg(StringException::IconvConvertErrorUTF32ToUTF8,
+ "iconv failed for " << "UTF-8 <- UTF-32"
+ << "error: " << GetErrnoString());
+ }
+
+ return &output[0];
}
-String FromASCIIString(const std::string& aString)
+String FromASCIIString(const std::string &aString)
{
- String output;
-
- std::for_each(aString.begin(), aString.end(), ASCIIValidator(aString));
- std::copy(aString.begin(), aString.end(), std::back_inserter<String>(output));
-
- return output;
+ String output;
+ std::for_each(aString.begin(), aString.end(), ASCIIValidator(aString));
+ std::copy(aString.begin(), aString.end(), std::back_inserter<String>(output));
+ return output;
}
-String FromUTF32String(const std::wstring& aString)
+String FromUTF32String(const std::wstring &aString)
{
- return String(&aString[0]);
+ return String(&aString[0]);
}
static UChar *ConvertToICU(const String &inputString)
{
- ScopedArray<UChar> outputString;
- int32_t size = 0;
- int32_t convertedSize = 0;
- UErrorCode error = U_ZERO_ERROR;
-
- // Calculate size of output string
- ::u_strFromWCS(NULL,
- 0,
- &size,
- inputString.c_str(),
- -1,
- &error);
-
- if (error == U_ZERO_ERROR ||
- error == U_BUFFER_OVERFLOW_ERROR)
- {
- // What buffer size is ok ?
- LogDebug("ICU: Output buffer size: " << size);
- } else {
- ThrowMsg(StringException::ICUInvalidCharacterFound,
- "ICU: Failed to retrieve output string size. Error: "
- << error);
- }
-
- // Allocate proper buffer
- outputString.Reset(new UChar[size + 1]);
- ::memset(outputString.Get(), 0, sizeof(UChar) * (size + 1));
-
- error = U_ZERO_ERROR;
-
- // Do conversion
- ::u_strFromWCS(outputString.Get(),
- size + 1,
- &convertedSize,
- inputString.c_str(),
- -1,
- &error);
-
- if (!U_SUCCESS(error)) {
- ThrowMsg(StringException::ICUInvalidCharacterFound,
- "ICU: Failed to convert string. Error: " << error);
- }
-
- // Done
- return outputString.Release();
+ ScopedArray<UChar> outputString;
+ int32_t size = 0;
+ int32_t convertedSize = 0;
+ UErrorCode error = U_ZERO_ERROR;
+ // Calculate size of output string
+ ::u_strFromWCS(NULL,
+ 0,
+ &size,
+ inputString.c_str(),
+ -1,
+ &error);
+
+ if (error == U_ZERO_ERROR ||
+ error == U_BUFFER_OVERFLOW_ERROR) {
+ // What buffer size is ok ?
+ LogDebug("ICU: Output buffer size: " << size);
+ } else {
+ ThrowMsg(StringException::ICUInvalidCharacterFound,
+ "ICU: Failed to retrieve output string size. Error: "
+ << error);
+ }
+
+ // Allocate proper buffer
+ outputString.Reset(new UChar[size + 1]);
+ ::memset(outputString.Get(), 0, sizeof(UChar) * (size + 1));
+ error = U_ZERO_ERROR;
+ // Do conversion
+ ::u_strFromWCS(outputString.Get(),
+ size + 1,
+ &convertedSize,
+ inputString.c_str(),
+ -1,
+ &error);
+
+ if (!U_SUCCESS(error)) {
+ ThrowMsg(StringException::ICUInvalidCharacterFound,
+ "ICU: Failed to convert string. Error: " << error);
+ }
+
+ // Done
+ return outputString.Release();
}
int StringCompare(const String &left,
- const String &right,
- bool caseInsensitive)
+ const String &right,
+ bool caseInsensitive)
{
- // Convert input strings
- ScopedArray<UChar> leftICU(ConvertToICU(left));
- ScopedArray<UChar> rightICU(ConvertToICU(right));
-
- if (caseInsensitive) {
- return static_cast<int>(u_strcasecmp(leftICU.Get(), rightICU.Get(), 0));
- } else {
- return static_cast<int>(u_strcmp(leftICU.Get(), rightICU.Get()));
- }
+ // Convert input strings
+ ScopedArray<UChar> leftICU(ConvertToICU(left));
+ ScopedArray<UChar> rightICU(ConvertToICU(right));
+
+ if (caseInsensitive) {
+ return static_cast<int>(u_strcasecmp(leftICU.Get(), rightICU.Get(), 0));
+ } else {
+ return static_cast<int>(u_strcmp(leftICU.Get(), rightICU.Get()));
+ }
}
} //namespace CCHECKER
-std::ostream& operator<<(std::ostream& aStream, const CCHECKER::String& aString)
+std::ostream &operator<<(std::ostream &aStream, const CCHECKER::String &aString)
{
- return aStream << CCHECKER::ToUTF8String(aString);
+ return aStream << CCHECKER::ToUTF8String(aString);
}
diff --git a/src/dpl/db/include/cchecker/dpl/db/naive_synchronization_object.h b/src/dpl/db/include/cchecker/dpl/db/naive_synchronization_object.h
index 8836635..393dc52 100644
--- a/src/dpl/db/include/cchecker/dpl/db/naive_synchronization_object.h
+++ b/src/dpl/db/include/cchecker/dpl/db/naive_synchronization_object.h
@@ -32,12 +32,11 @@ namespace DB {
* to the same database across different threads and processes
*/
class NaiveSynchronizationObject :
- public SqlConnection::SynchronizationObject
-{
- public:
- // [SqlConnection::SynchronizationObject]
- virtual void Synchronize();
- virtual void NotifyAll();
+ public SqlConnection::SynchronizationObject {
+public:
+ // [SqlConnection::SynchronizationObject]
+ virtual void Synchronize();
+ virtual void NotifyAll();
};
} // namespace DB
} // namespace CCHECKER
diff --git a/src/dpl/db/include/cchecker/dpl/db/sql_connection.h b/src/dpl/db/include/cchecker/dpl/db/sql_connection.h
index d3612ce..dd27a1a 100644
--- a/src/dpl/db/include/cchecker/dpl/db/sql_connection.h
+++ b/src/dpl/db/include/cchecker/dpl/db/sql_connection.h
@@ -40,458 +40,451 @@ namespace DB {
/**
* SQL connection class
*/
-class SqlConnection
-{
- public:
- /**
- * SQL Exception classes
- */
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, SyntaxError)
- DECLARE_EXCEPTION_TYPE(Base, ConnectionBroken)
- DECLARE_EXCEPTION_TYPE(Base, InternalError)
- DECLARE_EXCEPTION_TYPE(Base, InvalidColumn)
- };
-
- typedef int ColumnIndex;
- typedef int ArgumentIndex;
-
- /*
- * SQL processed data command
- */
- class DataCommand :
- private Noncopyable
- {
- private:
- SqlConnection *m_masterConnection;
- sqlite3_stmt *m_stmt;
-
- void CheckBindResult(int result);
- void CheckColumnIndex(SqlConnection::ColumnIndex column);
-
- DataCommand(SqlConnection *connection, const char *buffer);
-
- friend class SqlConnection;
-
- public:
- virtual ~DataCommand();
-
- /**
- * Bind null to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- */
- void BindNull(ArgumentIndex position);
-
- /**
- * Bind int to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInteger(ArgumentIndex position, int value);
-
- /**
- * Bind int8_t to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt8(ArgumentIndex position, int8_t value);
-
- /**
- * Bind int16 to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt16(ArgumentIndex position, int16_t value);
-
- /**
- * Bind int32 to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt32(ArgumentIndex position, int32_t value);
-
- /**
- * Bind int64 to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt64(ArgumentIndex position, int64_t value);
-
- /**
- * Bind float to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindFloat(ArgumentIndex position, float value);
-
- /**
- * Bind double to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindDouble(ArgumentIndex position, double value);
-
- /**
- * Bind string to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindString(ArgumentIndex position, const char *value);
-
- /**
- * Bind string to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindString(ArgumentIndex position, const String& value);
-
- /**
- * Bind optional int to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInteger(ArgumentIndex position, const Optional<int> &value);
-
- /**
- * Bind optional int8 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt8(ArgumentIndex position, const Optional<int8_t> &value);
-
- /**
- * Bind optional int16 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt16(ArgumentIndex position, const Optional<int16_t> &value);
-
- /**
- * Bind optional int32 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt32(ArgumentIndex position, const Optional<int32_t> &value);
-
- /**
- * Bind optional int64 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt64(ArgumentIndex position, const Optional<int64_t> &value);
-
- /**
- * Bind optional float to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindFloat(ArgumentIndex position, const Optional<float> &value);
-
- /**
- * Bind optional double to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindDouble(ArgumentIndex position, const Optional<double> &value);
-
- /**
- * Bind optional string to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindString(ArgumentIndex position, const Optional<String> &value);
-
- /**
- * Execute the prepared statement and/or move
- * to the next row of the result
- *
- * @return True when there was a row returned
- */
- bool Step();
-
- /**
- * Reset prepared statement's arguments
- * All parameters will become null
- */
- void Reset();
-
- /**
- * Checks whether column value is null
- *
- * @throw Exception::InvalidColumn
- */
- bool IsColumnNull(ColumnIndex column);
-
- /**
- * Get integer value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int GetColumnInteger(ColumnIndex column);
-
- /**
- * Get int8 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int8_t GetColumnInt8(ColumnIndex column);
-
- /**
- * Get int16 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int16_t GetColumnInt16(ColumnIndex column);
- /**
- * Get int32 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int32_t GetColumnInt32(ColumnIndex column);
-
- /**
- * Get int64 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int64_t GetColumnInt64(ColumnIndex column);
-
- /**
- * Get float value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- float GetColumnFloat(ColumnIndex column);
-
- /**
- * Get double value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- double GetColumnDouble(ColumnIndex column);
-
- /**
- * Get string value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- std::string GetColumnString(ColumnIndex column);
-
- /**
- * Get optional integer value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<int> GetColumnOptionalInteger(ColumnIndex column);
-
- /**
- * Get optional int8 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<int8_t> GetColumnOptionalInt8(ColumnIndex column);
-
- /**
- * Get optional int16value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<int16_t> GetColumnOptionalInt16(ColumnIndex column);
-
- /**
- * Get optional int32 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<int32_t> GetColumnOptionalInt32(ColumnIndex column);
-
- /**
- * Get optional int64 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<int64_t> GetColumnOptionalInt64(ColumnIndex column);
-
- /**
- * Get optional float value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<float> GetColumnOptionalFloat(ColumnIndex column);
-
- /**
- * Get optional double value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<double> GetColumnOptionalDouble(ColumnIndex column);
-
- /**
- * Get optional string value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- Optional<String> GetColumnOptionalString(ColumnIndex column);
- };
-
- // Move on copy semantics
- typedef std::auto_ptr<DataCommand> DataCommandAutoPtr;
-
- // Open flags
- class Flag
- {
- public:
- enum Type
- {
- None = 1 << 0,
- UseLucene = 1 << 1
- };
-
- enum Option
- {
- RO = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READONLY,
- /**
- * *TODO: please remove CREATE option from RW flag when all places
- * that need that switched do CRW
- */
- RW = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE |
- SQLITE_OPEN_CREATE,
- CRW = RW | SQLITE_OPEN_CREATE
- };
- };
-
- // RowID
- typedef sqlite3_int64 RowID;
-
- /**
- * Synchronization object used to synchronize SQL connection
- * to the same database across different threads and processes
- */
- class SynchronizationObject
- {
- public:
- virtual ~SynchronizationObject() {}
-
- /**
- * Synchronizes SQL connection for multiple clients.
- */
- virtual void Synchronize() = 0;
-
- /**
- * Notify all waiting clients that the connection is no longer locked.
- */
- virtual void NotifyAll() = 0;
- };
-
- protected:
- sqlite3 *m_connection;
-
- // Options
- bool m_usingLucene;
-
- // Stored data procedures
- int m_dataCommandsCount;
-
- // Synchronization object
- std::unique_ptr<SynchronizationObject> m_synchronizationObject;
-
- virtual void Connect(const std::string &address,
- Flag::Type = Flag::None, Flag::Option = Flag::RO);
- virtual void Disconnect();
-
- void TurnOnForeignKeys();
-
- static SynchronizationObject *AllocDefaultSynchronizationObject();
-
- public:
- /**
- * Open SQL connection
- *
- * Synchronization is archieved by using provided asynchronization object.
- * If synchronizationObject is set to NULL, so synchronization is performed.
- * Ownership of the synchronization object is transfered to sql connection
- * object.
- *
- * @param address Database file name
- * @param flags Open flags
- * @param synchronizationObject A synchronization object to use.
- */
- explicit SqlConnection(const std::string &address = std::string(),
- Flag::Type flags = Flag::None,
- Flag::Option options = Flag::RO,
- SynchronizationObject *synchronizationObject =
- AllocDefaultSynchronizationObject());
-
- /**
- * Destructor
- */
- virtual ~SqlConnection();
-
- /**
- * Execute SQL command without result
- *
- * @param format
- * @param ...
- */
- void ExecCommand(const char *format, ...);
-
- /**
- * Prepare stored procedure
- *
- * @param format SQL statement
- * @return Data command representing stored procedure
- */
- DataCommandAutoPtr PrepareDataCommand(const char *format, ...);
-
- /**
- * Check whether given table exists
- *
- * @param tableName Name of the table to check
- * @return True if given table name exists
- */
- bool CheckTableExist(const char *tableName);
-
- /**
- * Get last insert operation new row id
- *
- * @return Row ID
- */
- RowID GetLastInsertRowID() const;
-
- void BeginTransaction();
-
- void RollbackTransaction();
-
- void CommitTransaction();
+class SqlConnection {
+public:
+ /**
+ * SQL Exception classes
+ */
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, SyntaxError)
+ DECLARE_EXCEPTION_TYPE(Base, ConnectionBroken)
+ DECLARE_EXCEPTION_TYPE(Base, InternalError)
+ DECLARE_EXCEPTION_TYPE(Base, InvalidColumn)
+ };
+
+ typedef int ColumnIndex;
+ typedef int ArgumentIndex;
+
+ /*
+ * SQL processed data command
+ */
+ class DataCommand :
+ private Noncopyable {
+ private:
+ SqlConnection *m_masterConnection;
+ sqlite3_stmt *m_stmt;
+
+ void CheckBindResult(int result);
+ void CheckColumnIndex(SqlConnection::ColumnIndex column);
+
+ DataCommand(SqlConnection *connection, const char *buffer);
+
+ friend class SqlConnection;
+
+ public:
+ virtual ~DataCommand();
+
+ /**
+ * Bind null to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ */
+ void BindNull(ArgumentIndex position);
+
+ /**
+ * Bind int to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInteger(ArgumentIndex position, int value);
+
+ /**
+ * Bind int8_t to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt8(ArgumentIndex position, int8_t value);
+
+ /**
+ * Bind int16 to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt16(ArgumentIndex position, int16_t value);
+
+ /**
+ * Bind int32 to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt32(ArgumentIndex position, int32_t value);
+
+ /**
+ * Bind int64 to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt64(ArgumentIndex position, int64_t value);
+
+ /**
+ * Bind float to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindFloat(ArgumentIndex position, float value);
+
+ /**
+ * Bind double to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindDouble(ArgumentIndex position, double value);
+
+ /**
+ * Bind string to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindString(ArgumentIndex position, const char *value);
+
+ /**
+ * Bind string to the prepared statement argument
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindString(ArgumentIndex position, const String &value);
+
+ /**
+ * Bind optional int to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInteger(ArgumentIndex position, const Optional<int> &value);
+
+ /**
+ * Bind optional int8 to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt8(ArgumentIndex position, const Optional<int8_t> &value);
+
+ /**
+ * Bind optional int16 to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt16(ArgumentIndex position, const Optional<int16_t> &value);
+
+ /**
+ * Bind optional int32 to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt32(ArgumentIndex position, const Optional<int32_t> &value);
+
+ /**
+ * Bind optional int64 to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindInt64(ArgumentIndex position, const Optional<int64_t> &value);
+
+ /**
+ * Bind optional float to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindFloat(ArgumentIndex position, const Optional<float> &value);
+
+ /**
+ * Bind optional double to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindDouble(ArgumentIndex position, const Optional<double> &value);
+
+ /**
+ * Bind optional string to the prepared statement argument.
+ * If optional is not set null will be bound
+ *
+ * @param position Index of argument to bind value to
+ * @param value Value to bind
+ */
+ void BindString(ArgumentIndex position, const Optional<String> &value);
+
+ /**
+ * Execute the prepared statement and/or move
+ * to the next row of the result
+ *
+ * @return True when there was a row returned
+ */
+ bool Step();
+
+ /**
+ * Reset prepared statement's arguments
+ * All parameters will become null
+ */
+ void Reset();
+
+ /**
+ * Checks whether column value is null
+ *
+ * @throw Exception::InvalidColumn
+ */
+ bool IsColumnNull(ColumnIndex column);
+
+ /**
+ * Get integer value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ int GetColumnInteger(ColumnIndex column);
+
+ /**
+ * Get int8 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ int8_t GetColumnInt8(ColumnIndex column);
+
+ /**
+ * Get int16 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ int16_t GetColumnInt16(ColumnIndex column);
+ /**
+ * Get int32 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ int32_t GetColumnInt32(ColumnIndex column);
+
+ /**
+ * Get int64 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ int64_t GetColumnInt64(ColumnIndex column);
+
+ /**
+ * Get float value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ float GetColumnFloat(ColumnIndex column);
+
+ /**
+ * Get double value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ double GetColumnDouble(ColumnIndex column);
+
+ /**
+ * Get string value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ std::string GetColumnString(ColumnIndex column);
+
+ /**
+ * Get optional integer value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<int> GetColumnOptionalInteger(ColumnIndex column);
+
+ /**
+ * Get optional int8 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<int8_t> GetColumnOptionalInt8(ColumnIndex column);
+
+ /**
+ * Get optional int16value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<int16_t> GetColumnOptionalInt16(ColumnIndex column);
+
+ /**
+ * Get optional int32 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<int32_t> GetColumnOptionalInt32(ColumnIndex column);
+
+ /**
+ * Get optional int64 value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<int64_t> GetColumnOptionalInt64(ColumnIndex column);
+
+ /**
+ * Get optional float value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<float> GetColumnOptionalFloat(ColumnIndex column);
+
+ /**
+ * Get optional double value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<double> GetColumnOptionalDouble(ColumnIndex column);
+
+ /**
+ * Get optional string value from column in current row.
+ *
+ * @throw Exception::InvalidColumn
+ */
+ Optional<String> GetColumnOptionalString(ColumnIndex column);
+ };
+
+ // Move on copy semantics
+ typedef std::auto_ptr<DataCommand> DataCommandAutoPtr;
+
+ // Open flags
+ class Flag {
+ public:
+ enum Type {
+ None = 1 << 0,
+ UseLucene = 1 << 1
+ };
+
+ enum Option {
+ RO = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READONLY,
+ /**
+ * *TODO: please remove CREATE option from RW flag when all places
+ * that need that switched do CRW
+ */
+ RW = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE |
+ SQLITE_OPEN_CREATE,
+ CRW = RW | SQLITE_OPEN_CREATE
+ };
+ };
+
+ // RowID
+ typedef sqlite3_int64 RowID;
+
+ /**
+ * Synchronization object used to synchronize SQL connection
+ * to the same database across different threads and processes
+ */
+ class SynchronizationObject {
+ public:
+ virtual ~SynchronizationObject() {}
+
+ /**
+ * Synchronizes SQL connection for multiple clients.
+ */
+ virtual void Synchronize() = 0;
+
+ /**
+ * Notify all waiting clients that the connection is no longer locked.
+ */
+ virtual void NotifyAll() = 0;
+ };
+
+protected:
+ sqlite3 *m_connection;
+
+ // Options
+ bool m_usingLucene;
+
+ // Stored data procedures
+ int m_dataCommandsCount;
+
+ // Synchronization object
+ std::unique_ptr<SynchronizationObject> m_synchronizationObject;
+
+ virtual void Connect(const std::string &address,
+ Flag::Type = Flag::None, Flag::Option = Flag::RO);
+ virtual void Disconnect();
+
+ void TurnOnForeignKeys();
+
+ static SynchronizationObject *AllocDefaultSynchronizationObject();
+
+public:
+ /**
+ * Open SQL connection
+ *
+ * Synchronization is archieved by using provided asynchronization object.
+ * If synchronizationObject is set to NULL, so synchronization is performed.
+ * Ownership of the synchronization object is transfered to sql connection
+ * object.
+ *
+ * @param address Database file name
+ * @param flags Open flags
+ * @param synchronizationObject A synchronization object to use.
+ */
+ explicit SqlConnection(const std::string &address = std::string(),
+ Flag::Type flags = Flag::None,
+ Flag::Option options = Flag::RO,
+ SynchronizationObject *synchronizationObject =
+ AllocDefaultSynchronizationObject());
+
+ /**
+ * Destructor
+ */
+ virtual ~SqlConnection();
+
+ /**
+ * Execute SQL command without result
+ *
+ * @param format
+ * @param ...
+ */
+ void ExecCommand(const char *format, ...);
+
+ /**
+ * Prepare stored procedure
+ *
+ * @param format SQL statement
+ * @return Data command representing stored procedure
+ */
+ DataCommandAutoPtr PrepareDataCommand(const char *format, ...);
+
+ /**
+ * Check whether given table exists
+ *
+ * @param tableName Name of the table to check
+ * @return True if given table name exists
+ */
+ bool CheckTableExist(const char *tableName);
+
+ /**
+ * Get last insert operation new row id
+ *
+ * @return Row ID
+ */
+ RowID GetLastInsertRowID() const;
+
+ void BeginTransaction();
+
+ void RollbackTransaction();
+
+ void CommitTransaction();
};
} // namespace DB
} // namespace CCHECKER
diff --git a/src/dpl/db/src/naive_synchronization_object.cpp b/src/dpl/db/src/naive_synchronization_object.cpp
index 18eeefb..2a66db2 100644
--- a/src/dpl/db/src/naive_synchronization_object.cpp
+++ b/src/dpl/db/src/naive_synchronization_object.cpp
@@ -27,20 +27,20 @@
#include <cchecker/dpl/db/naive_synchronization_object.h>
namespace {
- unsigned int seed = time(NULL);
+unsigned int seed = time(NULL);
}
namespace CCHECKER {
namespace DB {
void NaiveSynchronizationObject::Synchronize()
{
- // Sleep for about 10ms - 30ms
- std::this_thread::sleep_for(std::chrono::milliseconds(10 + rand_r(&seed) % 20));
+ // Sleep for about 10ms - 30ms
+ std::this_thread::sleep_for(std::chrono::milliseconds(10 + rand_r(&seed) % 20));
}
void NaiveSynchronizationObject::NotifyAll()
{
- // No need to inform about anything
+ // No need to inform about anything
}
} // namespace DB
} // namespace CCHECKER
diff --git a/src/dpl/db/src/sql_connection.cpp b/src/dpl/db/src/sql_connection.cpp
index 4bee5de..3cd274e 100644
--- a/src/dpl/db/src/sql_connection.cpp
+++ b/src/dpl/db/src/sql_connection.cpp
@@ -35,834 +35,817 @@
namespace CCHECKER {
namespace DB {
-namespace // anonymous
-{
+namespace { // anonymous
class ScopedNotifyAll :
- public Noncopyable
-{
- private:
- SqlConnection::SynchronizationObject *m_synchronizationObject;
-
- public:
- explicit ScopedNotifyAll(
- SqlConnection::SynchronizationObject *synchronizationObject) :
- m_synchronizationObject(synchronizationObject)
- {}
-
- ~ScopedNotifyAll()
- {
- if (!m_synchronizationObject) {
- return;
- }
-
- LogDebug("Notifying after successful synchronize");
- m_synchronizationObject->NotifyAll();
- }
+ public Noncopyable {
+private:
+ SqlConnection::SynchronizationObject *m_synchronizationObject;
+
+public:
+ explicit ScopedNotifyAll(
+ SqlConnection::SynchronizationObject *synchronizationObject) :
+ m_synchronizationObject(synchronizationObject)
+ {}
+
+ ~ScopedNotifyAll()
+ {
+ if (!m_synchronizationObject) {
+ return;
+ }
+
+ LogDebug("Notifying after successful synchronize");
+ m_synchronizationObject->NotifyAll();
+ }
};
} // namespace anonymous
SqlConnection::DataCommand::DataCommand(SqlConnection *connection,
- const char *buffer) :
- m_masterConnection(connection),
- m_stmt(NULL)
-{
- Assert(connection != NULL);
-
- // Notify all after potentially synchronized database connection access
- ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get());
-
- for (;;) {
- int ret = sqlite3_prepare_v2(connection->m_connection,
- buffer, strlen(buffer),
- &m_stmt, NULL);
-
- if (ret == SQLITE_OK) {
- LogDebug("Data command prepared successfuly");
- break;
- } else if (ret == SQLITE_BUSY) {
- LogDebug("Collision occurred while preparing SQL command");
-
- // Synchronize if synchronization object is available
- if (connection->m_synchronizationObject) {
- LogDebug("Performing synchronization");
- connection->m_synchronizationObject->Synchronize();
- continue;
- }
-
- // No synchronization object defined. Fail.
- }
-
- // Fatal error
- const char *error = sqlite3_errmsg(m_masterConnection->m_connection);
-
- LogDebug("SQL prepare data command failed");
- LogDebug(" Statement: " << buffer);
- LogDebug(" Error: " << error);
-
- ThrowMsg(Exception::SyntaxError, error);
- }
-
- LogDebug("Prepared data command: " << buffer);
-
- // Increment stored data command count
- ++m_masterConnection->m_dataCommandsCount;
+ const char *buffer) :
+ m_masterConnection(connection),
+ m_stmt(NULL)
+{
+ Assert(connection != NULL);
+ // Notify all after potentially synchronized database connection access
+ ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get());
+
+ for (;;) {
+ int ret = sqlite3_prepare_v2(connection->m_connection,
+ buffer, strlen(buffer),
+ &m_stmt, NULL);
+
+ if (ret == SQLITE_OK) {
+ LogDebug("Data command prepared successfuly");
+ break;
+ } else if (ret == SQLITE_BUSY) {
+ LogDebug("Collision occurred while preparing SQL command");
+
+ // Synchronize if synchronization object is available
+ if (connection->m_synchronizationObject) {
+ LogDebug("Performing synchronization");
+ connection->m_synchronizationObject->Synchronize();
+ continue;
+ }
+
+ // No synchronization object defined. Fail.
+ }
+
+ // Fatal error
+ const char *error = sqlite3_errmsg(m_masterConnection->m_connection);
+ LogDebug("SQL prepare data command failed");
+ LogDebug(" Statement: " << buffer);
+ LogDebug(" Error: " << error);
+ ThrowMsg(Exception::SyntaxError, error);
+ }
+
+ LogDebug("Prepared data command: " << buffer);
+ // Increment stored data command count
+ ++m_masterConnection->m_dataCommandsCount;
}
SqlConnection::DataCommand::~DataCommand()
{
- LogDebug("SQL data command finalizing");
+ LogDebug("SQL data command finalizing");
- if (sqlite3_finalize(m_stmt) != SQLITE_OK) {
- LogDebug("Failed to finalize data command");
- }
+ if (sqlite3_finalize(m_stmt) != SQLITE_OK) {
+ LogDebug("Failed to finalize data command");
+ }
- // Decrement stored data command count
- --m_masterConnection->m_dataCommandsCount;
+ // Decrement stored data command count
+ --m_masterConnection->m_dataCommandsCount;
}
void SqlConnection::DataCommand::CheckBindResult(int result)
{
- if (result != SQLITE_OK) {
- const char *error = sqlite3_errmsg(
- m_masterConnection->m_connection);
-
- LogDebug("Failed to bind SQL statement parameter");
- LogDebug(" Error: " << error);
-
- ThrowMsg(Exception::SyntaxError, error);
- }
+ if (result != SQLITE_OK) {
+ const char *error = sqlite3_errmsg(
+ m_masterConnection->m_connection);
+ LogDebug("Failed to bind SQL statement parameter");
+ LogDebug(" Error: " << error);
+ ThrowMsg(Exception::SyntaxError, error);
+ }
}
void SqlConnection::DataCommand::BindNull(
- SqlConnection::ArgumentIndex position)
+ SqlConnection::ArgumentIndex position)
{
- CheckBindResult(sqlite3_bind_null(m_stmt, position));
- LogDebug("SQL data command bind null: ["
- << position << "]");
+ CheckBindResult(sqlite3_bind_null(m_stmt, position));
+ LogDebug("SQL data command bind null: ["
+ << position << "]");
}
void SqlConnection::DataCommand::BindInteger(
- SqlConnection::ArgumentIndex position,
- int value)
+ SqlConnection::ArgumentIndex position,
+ int value)
{
- CheckBindResult(sqlite3_bind_int(m_stmt, position, value));
- LogDebug("SQL data command bind integer: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_int(m_stmt, position, value));
+ LogDebug("SQL data command bind integer: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindInt8(
- SqlConnection::ArgumentIndex position,
- int8_t value)
+ SqlConnection::ArgumentIndex position,
+ int8_t value)
{
- CheckBindResult(sqlite3_bind_int(m_stmt, position,
- static_cast<int>(value)));
- LogDebug("SQL data command bind int8: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_int(m_stmt, position,
+ static_cast<int>(value)));
+ LogDebug("SQL data command bind int8: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindInt16(
- SqlConnection::ArgumentIndex position,
- int16_t value)
+ SqlConnection::ArgumentIndex position,
+ int16_t value)
{
- CheckBindResult(sqlite3_bind_int(m_stmt, position,
- static_cast<int>(value)));
- LogDebug("SQL data command bind int16: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_int(m_stmt, position,
+ static_cast<int>(value)));
+ LogDebug("SQL data command bind int16: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindInt32(
- SqlConnection::ArgumentIndex position,
- int32_t value)
+ SqlConnection::ArgumentIndex position,
+ int32_t value)
{
- CheckBindResult(sqlite3_bind_int(m_stmt, position,
- static_cast<int>(value)));
- LogDebug("SQL data command bind int32: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_int(m_stmt, position,
+ static_cast<int>(value)));
+ LogDebug("SQL data command bind int32: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindInt64(
- SqlConnection::ArgumentIndex position,
- int64_t value)
+ SqlConnection::ArgumentIndex position,
+ int64_t value)
{
- CheckBindResult(sqlite3_bind_int64(m_stmt, position,
- static_cast<sqlite3_int64>(value)));
- LogDebug("SQL data command bind int64: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_int64(m_stmt, position,
+ static_cast<sqlite3_int64>(value)));
+ LogDebug("SQL data command bind int64: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindFloat(
- SqlConnection::ArgumentIndex position,
- float value)
+ SqlConnection::ArgumentIndex position,
+ float value)
{
- CheckBindResult(sqlite3_bind_double(m_stmt, position,
- static_cast<double>(value)));
- LogDebug("SQL data command bind float: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_double(m_stmt, position,
+ static_cast<double>(value)));
+ LogDebug("SQL data command bind float: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindDouble(
- SqlConnection::ArgumentIndex position,
- double value)
+ SqlConnection::ArgumentIndex position,
+ double value)
{
- CheckBindResult(sqlite3_bind_double(m_stmt, position, value));
- LogDebug("SQL data command bind double: ["
- << position << "] -> " << value);
+ CheckBindResult(sqlite3_bind_double(m_stmt, position, value));
+ LogDebug("SQL data command bind double: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindString(
- SqlConnection::ArgumentIndex position,
- const char *value)
+ SqlConnection::ArgumentIndex position,
+ const char *value)
{
- if (!value) {
- BindNull(position);
- return;
- }
+ if (!value) {
+ BindNull(position);
+ return;
+ }
- // Assume that text may disappear
- CheckBindResult(sqlite3_bind_text(m_stmt, position,
- value, strlen(value),
- SQLITE_TRANSIENT));
-
- LogDebug("SQL data command bind string: ["
- << position << "] -> " << value);
+ // Assume that text may disappear
+ CheckBindResult(sqlite3_bind_text(m_stmt, position,
+ value, strlen(value),
+ SQLITE_TRANSIENT));
+ LogDebug("SQL data command bind string: ["
+ << position << "] -> " << value);
}
void SqlConnection::DataCommand::BindString(
- SqlConnection::ArgumentIndex position,
- const String &value)
+ SqlConnection::ArgumentIndex position,
+ const String &value)
{
- BindString(position, ToUTF8String(value).c_str());
+ BindString(position, ToUTF8String(value).c_str());
}
void SqlConnection::DataCommand::BindInteger(
- SqlConnection::ArgumentIndex position,
- const Optional<int> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<int> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindInteger(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindInteger(position, *value);
+ }
}
void SqlConnection::DataCommand::BindInt8(
- SqlConnection::ArgumentIndex position,
- const Optional<int8_t> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<int8_t> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindInt8(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindInt8(position, *value);
+ }
}
void SqlConnection::DataCommand::BindInt16(
- SqlConnection::ArgumentIndex position,
- const Optional<int16_t> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<int16_t> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindInt16(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindInt16(position, *value);
+ }
}
void SqlConnection::DataCommand::BindInt32(
- SqlConnection::ArgumentIndex position,
- const Optional<int32_t> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<int32_t> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindInt32(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindInt32(position, *value);
+ }
}
void SqlConnection::DataCommand::BindInt64(
- SqlConnection::ArgumentIndex position,
- const Optional<int64_t> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<int64_t> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindInt64(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindInt64(position, *value);
+ }
}
void SqlConnection::DataCommand::BindFloat(
- SqlConnection::ArgumentIndex position,
- const Optional<float> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<float> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindFloat(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindFloat(position, *value);
+ }
}
void SqlConnection::DataCommand::BindDouble(
- SqlConnection::ArgumentIndex position,
- const Optional<double> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<double> &value)
{
- if (value.IsNull()) {
- BindNull(position);
- } else {
- BindDouble(position, *value);
- }
+ if (value.IsNull()) {
+ BindNull(position);
+ } else {
+ BindDouble(position, *value);
+ }
}
void SqlConnection::DataCommand::BindString(
- SqlConnection::ArgumentIndex position,
- const Optional<String> &value)
+ SqlConnection::ArgumentIndex position,
+ const Optional<String> &value)
{
- if (!!value) {
- BindString(position, ToUTF8String(*value).c_str());
- } else {
- BindNull(position);
- }
+ if (!!value) {
+ BindString(position, ToUTF8String(*value).c_str());
+ } else {
+ BindNull(position);
+ }
}
bool SqlConnection::DataCommand::Step()
{
- // Notify all after potentially synchronized database connection access
- ScopedNotifyAll notifyAll(
- m_masterConnection->m_synchronizationObject.get());
-
- for (;;) {
- int ret = sqlite3_step(m_stmt);
-
- if (ret == SQLITE_ROW) {
- LogDebug("SQL data command step ROW");
- return true;
- } else if (ret == SQLITE_DONE) {
- LogDebug("SQL data command step DONE");
- return false;
- } else if (ret == SQLITE_BUSY) {
- LogDebug("Collision occurred while executing SQL command");
-
- // Synchronize if synchronization object is available
- if (m_masterConnection->m_synchronizationObject) {
- LogDebug("Performing synchronization");
-
- m_masterConnection->
- m_synchronizationObject->Synchronize();
-
- continue;
- }
-
- // No synchronization object defined. Fail.
- }
-
- // Fatal error
- const char *error = sqlite3_errmsg(m_masterConnection->m_connection);
-
- LogDebug("SQL step data command failed");
- LogDebug(" Error: " << error);
-
- ThrowMsg(Exception::InternalError, error);
- }
+ // Notify all after potentially synchronized database connection access
+ ScopedNotifyAll notifyAll(
+ m_masterConnection->m_synchronizationObject.get());
+
+ for (;;) {
+ int ret = sqlite3_step(m_stmt);
+
+ if (ret == SQLITE_ROW) {
+ LogDebug("SQL data command step ROW");
+ return true;
+ } else if (ret == SQLITE_DONE) {
+ LogDebug("SQL data command step DONE");
+ return false;
+ } else if (ret == SQLITE_BUSY) {
+ LogDebug("Collision occurred while executing SQL command");
+
+ // Synchronize if synchronization object is available
+ if (m_masterConnection->m_synchronizationObject) {
+ LogDebug("Performing synchronization");
+ m_masterConnection->
+ m_synchronizationObject->Synchronize();
+ continue;
+ }
+
+ // No synchronization object defined. Fail.
+ }
+
+ // Fatal error
+ const char *error = sqlite3_errmsg(m_masterConnection->m_connection);
+ LogDebug("SQL step data command failed");
+ LogDebug(" Error: " << error);
+ ThrowMsg(Exception::InternalError, error);
+ }
}
void SqlConnection::DataCommand::Reset()
{
- /*
- * According to:
- * http://www.sqlite.org/c3ref/stmt.html
- *
- * if last sqlite3_step command on this stmt returned an error,
- * then sqlite3_reset will return that error, althought it is not an error.
- * So sqlite3_reset allways succedes.
- */
- sqlite3_reset(m_stmt);
-
- LogDebug("SQL data command reset");
+ /*
+ * According to:
+ * http://www.sqlite.org/c3ref/stmt.html
+ *
+ * if last sqlite3_step command on this stmt returned an error,
+ * then sqlite3_reset will return that error, althought it is not an error.
+ * So sqlite3_reset allways succedes.
+ */
+ sqlite3_reset(m_stmt);
+ LogDebug("SQL data command reset");
}
void SqlConnection::DataCommand::CheckColumnIndex(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- if (column < 0 || column >= sqlite3_column_count(m_stmt)) {
- ThrowMsg(Exception::InvalidColumn, "Column index is out of bounds");
- }
+ if (column < 0 || column >= sqlite3_column_count(m_stmt)) {
+ ThrowMsg(Exception::InvalidColumn, "Column index is out of bounds");
+ }
}
bool SqlConnection::DataCommand::IsColumnNull(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column type: [" << column << "]");
- CheckColumnIndex(column);
- return sqlite3_column_type(m_stmt, column) == SQLITE_NULL;
+ LogDebug("SQL data command get column type: [" << column << "]");
+ CheckColumnIndex(column);
+ return sqlite3_column_type(m_stmt, column) == SQLITE_NULL;
}
int SqlConnection::DataCommand::GetColumnInteger(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column integer: [" << column << "]");
- CheckColumnIndex(column);
- int value = sqlite3_column_int(m_stmt, column);
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column integer: [" << column << "]");
+ CheckColumnIndex(column);
+ int value = sqlite3_column_int(m_stmt, column);
+ LogDebug(" Value: " << value);
+ return value;
}
int8_t SqlConnection::DataCommand::GetColumnInt8(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column int8: [" << column << "]");
- CheckColumnIndex(column);
- int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column int8: [" << column << "]");
+ CheckColumnIndex(column);
+ int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return value;
}
int16_t SqlConnection::DataCommand::GetColumnInt16(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column int16: [" << column << "]");
- CheckColumnIndex(column);
- int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column int16: [" << column << "]");
+ CheckColumnIndex(column);
+ int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return value;
}
int32_t SqlConnection::DataCommand::GetColumnInt32(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column int32: [" << column << "]");
- CheckColumnIndex(column);
- int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column int32: [" << column << "]");
+ CheckColumnIndex(column);
+ int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return value;
}
int64_t SqlConnection::DataCommand::GetColumnInt64(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column int64: [" << column << "]");
- CheckColumnIndex(column);
- int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column));
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column int64: [" << column << "]");
+ CheckColumnIndex(column);
+ int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return value;
}
float SqlConnection::DataCommand::GetColumnFloat(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column float: [" << column << "]");
- CheckColumnIndex(column);
- float value = static_cast<float>(sqlite3_column_double(m_stmt, column));
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column float: [" << column << "]");
+ CheckColumnIndex(column);
+ float value = static_cast<float>(sqlite3_column_double(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return value;
}
double SqlConnection::DataCommand::GetColumnDouble(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column double: [" << column << "]");
- CheckColumnIndex(column);
- double value = sqlite3_column_double(m_stmt, column);
- LogDebug(" Value: " << value);
- return value;
+ LogDebug("SQL data command get column double: [" << column << "]");
+ CheckColumnIndex(column);
+ double value = sqlite3_column_double(m_stmt, column);
+ LogDebug(" Value: " << value);
+ return value;
}
std::string SqlConnection::DataCommand::GetColumnString(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column string: [" << column << "]");
- CheckColumnIndex(column);
-
- const char *value = reinterpret_cast<const char *>(
- sqlite3_column_text(m_stmt, column));
-
- LogDebug("Value: " << (value ? value : "NULL"));
+ LogDebug("SQL data command get column string: [" << column << "]");
+ CheckColumnIndex(column);
+ const char *value = reinterpret_cast<const char *>(
+ sqlite3_column_text(m_stmt, column));
+ LogDebug("Value: " << (value ? value : "NULL"));
- if (value == NULL) {
- return std::string();
- }
+ if (value == NULL) {
+ return std::string();
+ }
- return std::string(value);
+ return std::string(value);
}
Optional<int> SqlConnection::DataCommand::GetColumnOptionalInteger(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional integer: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<int>::Null;
- }
- int value = sqlite3_column_int(m_stmt, column);
- LogDebug(" Value: " << value);
- return Optional<int>(value);
+ LogDebug("SQL data command get column optional integer: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<int>::Null;
+ }
+
+ int value = sqlite3_column_int(m_stmt, column);
+ LogDebug(" Value: " << value);
+ return Optional<int>(value);
}
Optional<int8_t> SqlConnection::DataCommand::GetColumnOptionalInt8(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional int8: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<int8_t>::Null;
- }
- int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return Optional<int8_t>(value);
+ LogDebug("SQL data command get column optional int8: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<int8_t>::Null;
+ }
+
+ int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return Optional<int8_t>(value);
}
Optional<int16_t> SqlConnection::DataCommand::GetColumnOptionalInt16(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional int16: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<int16_t>::Null;
- }
- int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return Optional<int16_t>(value);
+ LogDebug("SQL data command get column optional int16: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<int16_t>::Null;
+ }
+
+ int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return Optional<int16_t>(value);
}
Optional<int32_t> SqlConnection::DataCommand::GetColumnOptionalInt32(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional int32: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<int32_t>::Null;
- }
- int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return Optional<int32_t>(value);
+ LogDebug("SQL data command get column optional int32: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<int32_t>::Null;
+ }
+
+ int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return Optional<int32_t>(value);
}
Optional<int64_t> SqlConnection::DataCommand::GetColumnOptionalInt64(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional int64: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<int64_t>::Null;
- }
- int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column));
- LogDebug(" Value: " << value);
- return Optional<int64_t>(value);
+ LogDebug("SQL data command get column optional int64: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<int64_t>::Null;
+ }
+
+ int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return Optional<int64_t>(value);
}
Optional<float> SqlConnection::DataCommand::GetColumnOptionalFloat(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional float: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<float>::Null;
- }
- float value = static_cast<float>(sqlite3_column_double(m_stmt, column));
- LogDebug(" Value: " << value);
- return Optional<float>(value);
+ LogDebug("SQL data command get column optional float: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<float>::Null;
+ }
+
+ float value = static_cast<float>(sqlite3_column_double(m_stmt, column));
+ LogDebug(" Value: " << value);
+ return Optional<float>(value);
}
Optional<double> SqlConnection::DataCommand::GetColumnOptionalDouble(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional double: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<double>::Null;
- }
- double value = sqlite3_column_double(m_stmt, column);
- LogDebug(" Value: " << value);
- return Optional<double>(value);
+ LogDebug("SQL data command get column optional double: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<double>::Null;
+ }
+
+ double value = sqlite3_column_double(m_stmt, column);
+ LogDebug(" Value: " << value);
+ return Optional<double>(value);
}
Optional<String> SqlConnection::DataCommand::GetColumnOptionalString(
- SqlConnection::ColumnIndex column)
+ SqlConnection::ColumnIndex column)
{
- LogDebug("SQL data command get column optional string: ["
- << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return Optional<String>::Null;
- }
- const char *value = reinterpret_cast<const char *>(
- sqlite3_column_text(m_stmt, column));
- LogDebug("Value: " << value);
- String s = FromUTF8String(value);
- return Optional<String>(s);
+ LogDebug("SQL data command get column optional string: ["
+ << column << "]");
+ CheckColumnIndex(column);
+
+ if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
+ return Optional<String>::Null;
+ }
+
+ const char *value = reinterpret_cast<const char *>(
+ sqlite3_column_text(m_stmt, column));
+ LogDebug("Value: " << value);
+ String s = FromUTF8String(value);
+ return Optional<String>(s);
}
void SqlConnection::Connect(const std::string &address,
- Flag::Type type,
- Flag::Option flag)
-{
- if (m_connection != NULL) {
- LogDebug("Already connected.");
- return;
- }
- LogDebug("Connecting to DB: " << address << "...");
-
- // Connect to database
- int result;
- if (type & Flag::UseLucene) {
- result = db_util_open_with_options(
- address.c_str(),
- &m_connection,
- flag,
- NULL);
-
- m_usingLucene = true;
- LogDebug("Lucene index enabled");
- } else {
- result = sqlite3_open_v2(
- address.c_str(),
- &m_connection,
- flag,
- NULL);
-
- m_usingLucene = false;
- LogDebug("Lucene index disabled");
- }
-
- if (result == SQLITE_OK) {
- LogDebug("Connected to DB");
- } else {
- LogDebug("Failed to connect to DB!");
- ThrowMsg(Exception::ConnectionBroken, address);
- }
-
- // Enable foreign keys
- TurnOnForeignKeys();
+ Flag::Type type,
+ Flag::Option flag)
+{
+ if (m_connection != NULL) {
+ LogDebug("Already connected.");
+ return;
+ }
+
+ LogDebug("Connecting to DB: " << address << "...");
+ // Connect to database
+ int result;
+
+ if (type & Flag::UseLucene) {
+ result = db_util_open_with_options(
+ address.c_str(),
+ &m_connection,
+ flag,
+ NULL);
+ m_usingLucene = true;
+ LogDebug("Lucene index enabled");
+ } else {
+ result = sqlite3_open_v2(
+ address.c_str(),
+ &m_connection,
+ flag,
+ NULL);
+ m_usingLucene = false;
+ LogDebug("Lucene index disabled");
+ }
+
+ if (result == SQLITE_OK) {
+ LogDebug("Connected to DB");
+ } else {
+ LogDebug("Failed to connect to DB!");
+ ThrowMsg(Exception::ConnectionBroken, address);
+ }
+
+ // Enable foreign keys
+ TurnOnForeignKeys();
}
void SqlConnection::Disconnect()
{
- if (m_connection == NULL) {
- LogDebug("Already disconnected.");
- return;
- }
-
- LogDebug("Disconnecting from DB...");
+ if (m_connection == NULL) {
+ LogDebug("Already disconnected.");
+ return;
+ }
- // All stored data commands must be deleted before disconnect
- Assert(m_dataCommandsCount == 0 &&
- "All stored procedures must be deleted"
- " before disconnecting SqlConnection");
+ LogDebug("Disconnecting from DB...");
+ // All stored data commands must be deleted before disconnect
+ Assert(m_dataCommandsCount == 0 &&
+ "All stored procedures must be deleted"
+ " before disconnecting SqlConnection");
+ int result;
- int result;
+ if (m_usingLucene) {
+ result = db_util_close(m_connection);
+ } else {
+ result = sqlite3_close(m_connection);
+ }
- if (m_usingLucene) {
- result = db_util_close(m_connection);
- } else {
- result = sqlite3_close(m_connection);
- }
+ if (result != SQLITE_OK) {
+ const char *error = sqlite3_errmsg(m_connection);
+ LogDebug("SQL close failed");
+ LogDebug(" Error: " << error);
+ Throw(Exception::InternalError);
+ }
- if (result != SQLITE_OK) {
- const char *error = sqlite3_errmsg(m_connection);
- LogDebug("SQL close failed");
- LogDebug(" Error: " << error);
- Throw(Exception::InternalError);
- }
-
- m_connection = NULL;
-
- LogDebug("Disconnected from DB");
+ m_connection = NULL;
+ LogDebug("Disconnected from DB");
}
bool SqlConnection::CheckTableExist(const char *tableName)
{
- if (m_connection == NULL) {
- LogDebug("Cannot execute command. Not connected to DB!");
- return false;
- }
-
- DataCommandAutoPtr command =
- PrepareDataCommand("select tbl_name from sqlite_master where name=?;");
+ if (m_connection == NULL) {
+ LogDebug("Cannot execute command. Not connected to DB!");
+ return false;
+ }
- command->BindString(1, tableName);
+ DataCommandAutoPtr command =
+ PrepareDataCommand("select tbl_name from sqlite_master where name=?;");
+ command->BindString(1, tableName);
- if (!command->Step()) {
- LogDebug("No matching records in table");
- return false;
- }
+ if (!command->Step()) {
+ LogDebug("No matching records in table");
+ return false;
+ }
- return command->GetColumnString(0) == tableName;
+ return command->GetColumnString(0) == tableName;
}
SqlConnection::SqlConnection(const std::string &address,
- Flag::Type flag,
- Flag::Option option,
- SynchronizationObject *synchronizationObject) :
- m_connection(NULL),
- m_usingLucene(false),
- m_dataCommandsCount(0),
- m_synchronizationObject(synchronizationObject)
+ Flag::Type flag,
+ Flag::Option option,
+ SynchronizationObject *synchronizationObject) :
+ m_connection(NULL),
+ m_usingLucene(false),
+ m_dataCommandsCount(0),
+ m_synchronizationObject(synchronizationObject)
{
- LogDebug("Opening database connection to: " << address);
+ LogDebug("Opening database connection to: " << address);
+ // Connect to DB
+ SqlConnection::Connect(address, flag, option);
- // Connect to DB
- SqlConnection::Connect(address, flag, option);
-
- if (!m_synchronizationObject) {
- LogDebug("No synchronization object defined");
- }
+ if (!m_synchronizationObject) {
+ LogDebug("No synchronization object defined");
+ }
}
SqlConnection::~SqlConnection()
{
- LogDebug("Closing database connection");
-
- // Disconnect from DB
- Try
- {
- SqlConnection::Disconnect();
- }
- Catch(Exception::Base)
- {
- LogDebug("Failed to disconnect from database");
- }
+ LogDebug("Closing database connection");
+ // Disconnect from DB
+ Try {
+ SqlConnection::Disconnect();
+ }
+ Catch(Exception::Base) {
+ LogDebug("Failed to disconnect from database");
+ }
}
void SqlConnection::ExecCommand(const char *format, ...)
{
- if (m_connection == NULL) {
- LogDebug("Cannot execute command. Not connected to DB!");
- return;
- }
-
- if (format == NULL) {
- LogDebug("Null query!");
- ThrowMsg(Exception::SyntaxError, "Null statement");
- }
-
- char *rawBuffer;
-
- va_list args;
- va_start(args, format);
-
- if (vasprintf(&rawBuffer, format, args) == -1) {
- rawBuffer = NULL;
- }
-
- va_end(args);
-
- ScopedFree<char> buffer(rawBuffer);
-
- if (!buffer) {
- LogDebug("Failed to allocate statement string");
- return;
- }
-
- LogDebug("Executing SQL command: " << buffer.Get());
-
- // Notify all after potentially synchronized database connection access
- ScopedNotifyAll notifyAll(m_synchronizationObject.get());
-
- for (;;) {
- char *errorBuffer;
-
- int ret = sqlite3_exec(m_connection,
- buffer.Get(),
- NULL,
- NULL,
- &errorBuffer);
-
- std::string errorMsg;
-
- // Take allocated error buffer
- if (errorBuffer != NULL) {
- errorMsg = errorBuffer;
- sqlite3_free(errorBuffer);
- }
-
- if (ret == SQLITE_OK) {
- return;
- }
-
- if (ret == SQLITE_BUSY) {
- LogDebug("Collision occurred while executing SQL command");
-
- // Synchronize if synchronization object is available
- if (m_synchronizationObject) {
- LogDebug("Performing synchronization");
- m_synchronizationObject->Synchronize();
- continue;
- }
-
- // No synchronization object defined. Fail.
- }
-
- // Fatal error
- LogDebug("Failed to execute SQL command. Error: " << errorMsg);
- ThrowMsg(Exception::SyntaxError, errorMsg);
- }
+ if (m_connection == NULL) {
+ LogDebug("Cannot execute command. Not connected to DB!");
+ return;
+ }
+
+ if (format == NULL) {
+ LogDebug("Null query!");
+ ThrowMsg(Exception::SyntaxError, "Null statement");
+ }
+
+ char *rawBuffer;
+ va_list args;
+ va_start(args, format);
+
+ if (vasprintf(&rawBuffer, format, args) == -1) {
+ rawBuffer = NULL;
+ }
+
+ va_end(args);
+ ScopedFree<char> buffer(rawBuffer);
+
+ if (!buffer) {
+ LogDebug("Failed to allocate statement string");
+ return;
+ }
+
+ LogDebug("Executing SQL command: " << buffer.Get());
+ // Notify all after potentially synchronized database connection access
+ ScopedNotifyAll notifyAll(m_synchronizationObject.get());
+
+ for (;;) {
+ char *errorBuffer;
+ int ret = sqlite3_exec(m_connection,
+ buffer.Get(),
+ NULL,
+ NULL,
+ &errorBuffer);
+ std::string errorMsg;
+
+ // Take allocated error buffer
+ if (errorBuffer != NULL) {
+ errorMsg = errorBuffer;
+ sqlite3_free(errorBuffer);
+ }
+
+ if (ret == SQLITE_OK) {
+ return;
+ }
+
+ if (ret == SQLITE_BUSY) {
+ LogDebug("Collision occurred while executing SQL command");
+
+ // Synchronize if synchronization object is available
+ if (m_synchronizationObject) {
+ LogDebug("Performing synchronization");
+ m_synchronizationObject->Synchronize();
+ continue;
+ }
+
+ // No synchronization object defined. Fail.
+ }
+
+ // Fatal error
+ LogDebug("Failed to execute SQL command. Error: " << errorMsg);
+ ThrowMsg(Exception::SyntaxError, errorMsg);
+ }
}
SqlConnection::DataCommandAutoPtr SqlConnection::PrepareDataCommand(
- const char *format,
- ...)
+ const char *format,
+ ...)
{
- if (m_connection == NULL) {
- LogDebug("Cannot execute data command. Not connected to DB!");
- return DataCommandAutoPtr();
- }
-
- char *rawBuffer;
-
- va_list args;
- va_start(args, format);
-
- if (vasprintf(&rawBuffer, format, args) == -1) {
- rawBuffer = NULL;
- }
+ if (m_connection == NULL) {
+ LogDebug("Cannot execute data command. Not connected to DB!");
+ return DataCommandAutoPtr();
+ }
- va_end(args);
+ char *rawBuffer;
+ va_list args;
+ va_start(args, format);
- ScopedFree<char> buffer(rawBuffer);
+ if (vasprintf(&rawBuffer, format, args) == -1) {
+ rawBuffer = NULL;
+ }
- if (!buffer) {
- LogDebug("Failed to allocate statement string");
- return DataCommandAutoPtr();
- }
+ va_end(args);
+ ScopedFree<char> buffer(rawBuffer);
- LogDebug("Executing SQL data command: " << buffer.Get());
+ if (!buffer) {
+ LogDebug("Failed to allocate statement string");
+ return DataCommandAutoPtr();
+ }
- return DataCommandAutoPtr(new DataCommand(this, buffer.Get()));
+ LogDebug("Executing SQL data command: " << buffer.Get());
+ return DataCommandAutoPtr(new DataCommand(this, buffer.Get()));
}
SqlConnection::RowID SqlConnection::GetLastInsertRowID() const
{
- return static_cast<RowID>(sqlite3_last_insert_rowid(m_connection));
+ return static_cast<RowID>(sqlite3_last_insert_rowid(m_connection));
}
void SqlConnection::TurnOnForeignKeys()
{
- ExecCommand("PRAGMA foreign_keys = ON;");
+ ExecCommand("PRAGMA foreign_keys = ON;");
}
SqlConnection::SynchronizationObject *
SqlConnection::AllocDefaultSynchronizationObject()
{
- return new NaiveSynchronizationObject();
+ return new NaiveSynchronizationObject();
}
void SqlConnection::BeginTransaction()
{
- ExecCommand("BEGIN;");
+ ExecCommand("BEGIN;");
}
void SqlConnection::RollbackTransaction()
{
- ExecCommand("ROLLBACK;");
+ ExecCommand("ROLLBACK;");
}
void SqlConnection::CommitTransaction()
{
- ExecCommand("COMMIT;");
+ ExecCommand("COMMIT;");
}
} // namespace DB
diff --git a/src/include/cchecker/UIBackend.h b/src/include/cchecker/UIBackend.h
index 659adb8..c0ff3ab 100644
--- a/src/include/cchecker/UIBackend.h
+++ b/src/include/cchecker/UIBackend.h
@@ -27,31 +27,31 @@ namespace CCHECKER {
namespace UI {
enum popup_status : int {
- NO_ERROR = 0,
- EXIT_ERROR = 1
+ NO_ERROR = 0,
+ EXIT_ERROR = 1
};
enum response_e : int {
- DONT_UNINSTALL = 2,
- UNINSTALL = 3,
- RESPONSE_ERROR = 4
+ DONT_UNINSTALL = 2,
+ UNINSTALL = 3,
+ RESPONSE_ERROR = 4
};
class UIBackend {
public:
- explicit UIBackend(int timeout = 60); //timeout in seconds (zero or less means infinity)
- virtual ~UIBackend();
+ explicit UIBackend(int timeout = 60); //timeout in seconds (zero or less means infinity)
+ virtual ~UIBackend();
- // Displays popup with question, and - if needed - app_control for removing application.
- // Returns true if UI was displayed correctly and user's response was collected.
- // If there was a problem with displaying UI or a timeout has been reached (no user's response)
- // then returns false.
- bool call_popup(const app_t &app);
+ // Displays popup with question, and - if needed - app_control for removing application.
+ // Returns true if UI was displayed correctly and user's response was collected.
+ // If there was a problem with displaying UI or a timeout has been reached (no user's response)
+ // then returns false.
+ bool call_popup(const app_t &app);
private:
- response_e run(const app_t &app);
+ response_e run(const app_t &app);
- const int m_responseTimeout; // seconds
+ const int m_responseTimeout; // seconds
};
} // UI
diff --git a/src/include/cchecker/popup-runner.h b/src/include/cchecker/popup-runner.h
index addaa3b..17aaccd 100644
--- a/src/include/cchecker/popup-runner.h
+++ b/src/include/cchecker/popup-runner.h
@@ -23,28 +23,28 @@
#include <cchecker/dpl/serialization.h>
-namespace CCHECKER{
-namespace UI{
+namespace CCHECKER {
+namespace UI {
class BinaryStream : public CCHECKER::IStream {
- public:
- void Read (size_t num, void * bytes);
- void Write(size_t num, const void * bytes);
+public:
+ void Read(size_t num, void *bytes);
+ void Write(size_t num, const void *bytes);
- BinaryStream();
- ~BinaryStream();
+ BinaryStream();
+ ~BinaryStream();
- const unsigned char* char_pointer() const;
- size_t size() const;
+ const unsigned char *char_pointer() const;
+ size_t size() const;
- private:
- std::vector<unsigned char> m_data;
- size_t m_readPosition;
+private:
+ std::vector<unsigned char> m_data;
+ size_t m_readPosition;
};
response_e run_popup(
- const app_t &app,
- int timeout); // zero or negative timeout means infinity
+ const app_t &app,
+ int timeout); // zero or negative timeout means infinity
} // UI
} // CCHECKER
diff --git a/src/include/cchecker/sql_query.h b/src/include/cchecker/sql_query.h
index 6338561..ed1f1a8 100644
--- a/src/include/cchecker/sql_query.h
+++ b/src/include/cchecker/sql_query.h
@@ -29,41 +29,45 @@
namespace CCHECKER {
namespace DB {
class SqlQuery {
- public:
- class Exception {
- public: DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base);
- public: DECLARE_EXCEPTION_TYPE(Base, InternalError);
- public: DECLARE_EXCEPTION_TYPE(Base, TransactionError);
- public: DECLARE_EXCEPTION_TYPE(Base, InvalidArgs);
- };
- SqlQuery() :
- m_connection(NULL),
- m_inUserTransaction(false)
- {};
- explicit SqlQuery(const std::string &path);
- virtual ~SqlQuery();
+public:
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(CCHECKER::Exception, Base);
+ public:
+ DECLARE_EXCEPTION_TYPE(Base, InternalError);
+ public:
+ DECLARE_EXCEPTION_TYPE(Base, TransactionError);
+ public:
+ DECLARE_EXCEPTION_TYPE(Base, InvalidArgs);
+ };
+ SqlQuery() :
+ m_connection(NULL),
+ m_inUserTransaction(false)
+ {};
+ explicit SqlQuery(const std::string &path);
+ virtual ~SqlQuery();
- // Connecting outside the constructor
- bool connect(const std::string& path);
+ // Connecting outside the constructor
+ bool connect(const std::string &path);
- // Apps
- bool add_app_to_check_list(const app_t &app);
- void remove_app_from_check_list(const app_t &app);
- void mark_as_verified(const app_t &app, const app_t::verified_t &verified);
- void get_app_list(std::list<app_t> &apps_buffer); // TODO: typedef std::list<app_t>
+ // Apps
+ bool add_app_to_check_list(const app_t &app);
+ void remove_app_from_check_list(const app_t &app);
+ void mark_as_verified(const app_t &app, const app_t::verified_t &verified);
+ void get_app_list(std::list<app_t> &apps_buffer); // TODO: typedef std::list<app_t>
- protected:
- SqlConnection *m_connection;
+protected:
+ SqlConnection *m_connection;
- private:
- bool m_inUserTransaction;
- int getDBVersion(void);
- void get_apps(std::list<app_t> &apps_buffer);
- bool check_if_app_exists(const app_t &app);
- bool get_check_id(const app_t &app, int32_t &check_id);
- bool add_chain_id(const int32_t check_id, int32_t &chain_id);
- int verified_enum_to_int(const app_t::verified_t &verified);
- app_t::verified_t verified_int_to_enum(const int &verified);
+private:
+ bool m_inUserTransaction;
+ int getDBVersion(void);
+ void get_apps(std::list<app_t> &apps_buffer);
+ bool check_if_app_exists(const app_t &app);
+ bool get_check_id(const app_t &app, int32_t &check_id);
+ bool add_chain_id(const int32_t check_id, int32_t &chain_id);
+ int verified_enum_to_int(const app_t::verified_t &verified);
+ app_t::verified_t verified_int_to_enum(const int &verified);
};
} // DB
} // CCHECKER
diff --git a/src/main/cert-checker.cpp b/src/main/cert-checker.cpp
index 18fe21a..98eeef8 100644
--- a/src/main/cert-checker.cpp
+++ b/src/main/cert-checker.cpp
@@ -33,16 +33,11 @@ int main(void)
{
try {
LogInfo("Cert-checker start!");
-
CCHECKER::OcspService service(SERVICE_STREAM);
-
setlocale(LC_ALL, "");
-
service.start();
-
LogInfo("Cert-checker exit!");
return 0;
-
} catch (const std::exception &e) {
LogError("Exception occured in cert-checker main : " << e.what());
return -1;
diff --git a/src/service/app.cpp b/src/service/app.cpp
index c35bc73..3a7bd79 100644
--- a/src/service/app.cpp
+++ b/src/service/app.cpp
@@ -30,48 +30,51 @@
namespace CCHECKER {
app_t::app_t(void):
- uid((uid_t)-1), // (uid_t)-1 (0xFF) is defined to be invalid uid. According
- // to chown manual page, you cannot change file group of owner
- // to (uid_t)-1, so we'll use it as initial, invalid value.
- verified(verified_t::UNKNOWN)
+ uid((uid_t) - 1), // (uid_t)-1 (0xFF) is defined to be invalid uid. According
+ // to chown manual page, you cannot change file group of owner
+ // to (uid_t)-1, so we'll use it as initial, invalid value.
+ verified(verified_t::UNKNOWN)
{}
app_t::app_t(const std::string &app_id,
- const std::string &pkg_id,
- uid_t uid,
- const signatures_t &signatures):
- app_id(app_id),
- pkg_id(pkg_id),
- uid(uid),
- signatures(signatures),
- verified(verified_t::UNKNOWN)
+ const std::string &pkg_id,
+ uid_t uid,
+ const signatures_t &signatures):
+ app_id(app_id),
+ pkg_id(pkg_id),
+ uid(uid),
+ signatures(signatures),
+ verified(verified_t::UNKNOWN)
{}
-std::ostream & operator<< (std::ostream &out, const app_t &app)
+std::ostream &operator<< (std::ostream &out, const app_t &app)
{
- out << "app: " << app.app_id << ", pkg: " << app.pkg_id << ", uid: " << app.uid;
- return out;
+ out << "app: " << app.app_id << ", pkg: " << app.pkg_id << ", uid: " << app.uid;
+ return out;
}
std::string app_t::str() const
{
- std::stringstream ss;
- ss << *this;
- return ss.str();
+ std::stringstream ss;
+ ss << *this;
+ return ss.str();
}
std::string app_t::str_certs(void) const
{
- std::stringstream ss;
+ std::stringstream ss;
- for (const auto &iter : signatures) {
- ss << " { ";
- for (const auto iter_cert : iter) {
- ss << "\"" << iter_cert << "\", ";
- }
- ss << " } ,";
- }
- return ss.str();
+ for (const auto &iter : signatures) {
+ ss << " { ";
+
+ for (const auto iter_cert : iter) {
+ ss << "\"" << iter_cert << "\", ";
+ }
+
+ ss << " } ,";
+ }
+
+ return ss.str();
}
} //CCHECKER
diff --git a/src/service/app.h b/src/service/app.h
index df4a860..a12703d 100644
--- a/src/service/app.h
+++ b/src/service/app.h
@@ -36,25 +36,25 @@ typedef std::list<std::string> chain_t;
typedef std::list<chain_t> signatures_t;
struct app_t {
- enum class verified_t : int32_t {
- NO = 0,
- YES = 1,
- UNKNOWN = 2
- };
-
- std::string app_id;
- std::string pkg_id;
- uid_t uid;
- signatures_t signatures;
- verified_t verified;
-
- app_t(void);
- app_t(const std::string &app_id,
- const std::string &pkg_id,
- uid_t uid,
- const signatures_t &signatures);
- std::string str(void) const;
- std::string str_certs(void) const;
+ enum class verified_t : int32_t {
+ NO = 0,
+ YES = 1,
+ UNKNOWN = 2
+ };
+
+ std::string app_id;
+ std::string pkg_id;
+ uid_t uid;
+ signatures_t signatures;
+ verified_t verified;
+
+ app_t(void);
+ app_t(const std::string &app_id,
+ const std::string &pkg_id,
+ uid_t uid,
+ const signatures_t &signatures);
+ std::string str(void) const;
+ std::string str_certs(void) const;
};
} //CCHECKER
diff --git a/src/service/certs.cpp b/src/service/certs.cpp
index c06fe6f..8abdc43 100644
--- a/src/service/certs.cpp
+++ b/src/service/certs.cpp
@@ -39,65 +39,65 @@ namespace CCHECKER {
namespace {
struct PkgmgrinfoCertInfo {
- PkgmgrinfoCertInfo()
- {
- ret = pkgmgrinfo_pkginfo_create_certinfo(&handle);
- }
- ~PkgmgrinfoCertInfo()
- {
- pkgmgrinfo_pkginfo_destroy_certinfo(handle);
- }
-
- pkgmgrinfo_certinfo_h handle;
- int ret;
+ PkgmgrinfoCertInfo()
+ {
+ ret = pkgmgrinfo_pkginfo_create_certinfo(&handle);
+ }
+ ~PkgmgrinfoCertInfo()
+ {
+ pkgmgrinfo_pkginfo_destroy_certinfo(handle);
+ }
+
+ pkgmgrinfo_certinfo_h handle;
+ int ret;
};
static void get_cert_chain(const char *pkgid, uid_t uid, int sig_type, chain_t &chain)
{
- LogDebug("Get cert chain start. pkgid : " << pkgid << ", uid : " << uid);
- int ret;
- int cert_type;
- const char *cert_value;
-
- auto pm_certinfo = std::make_shared<PkgmgrinfoCertInfo>();
-
- if (pm_certinfo->ret != PMINFO_R_OK) {
- LogError("Get pkgmgrinfo certinfo failed. ret : " << ret);
- return;
- }
-
- ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, pm_certinfo->handle, uid);
- if (ret != PMINFO_R_OK) {
- LogError("Load pkgmgrinfo certinfo failed. ret : " << ret);
- return;
- }
-
- // add signer, intermediate, root certificates.
- for (int cert_cnt = 0; cert_cnt < 3; cert_cnt++) {
- cert_type = sig_type - cert_cnt;
- ret = pkgmgrinfo_pkginfo_get_cert_value(pm_certinfo->handle,
- static_cast<pkgmgrinfo_cert_type>(cert_type), &cert_value);
-
- if (ret != PMINFO_R_OK) {
- LogError("Get cert value from certinfo failed. ret : " << ret);
- return;
- }
-
- if (cert_value == NULL) {
- LogDebug("cert_type[" << cert_type << "] is null");
- } else {
- LogDebug("Add cert_type[" << cert_type << "] data : " << cert_value);
- chain.push_back(cert_value);
- }
- }
-
- return;
+ LogDebug("Get cert chain start. pkgid : " << pkgid << ", uid : " << uid);
+ int ret;
+ int cert_type;
+ const char *cert_value;
+ auto pm_certinfo = std::make_shared<PkgmgrinfoCertInfo>();
+
+ if (pm_certinfo->ret != PMINFO_R_OK) {
+ LogError("Get pkgmgrinfo certinfo failed. ret : " << ret);
+ return;
+ }
+
+ ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, pm_certinfo->handle, uid);
+
+ if (ret != PMINFO_R_OK) {
+ LogError("Load pkgmgrinfo certinfo failed. ret : " << ret);
+ return;
+ }
+
+ // add signer, intermediate, root certificates.
+ for (int cert_cnt = 0; cert_cnt < 3; cert_cnt++) {
+ cert_type = sig_type - cert_cnt;
+ ret = pkgmgrinfo_pkginfo_get_cert_value(pm_certinfo->handle,
+ static_cast<pkgmgrinfo_cert_type>(cert_type), &cert_value);
+
+ if (ret != PMINFO_R_OK) {
+ LogError("Get cert value from certinfo failed. ret : " << ret);
+ return;
+ }
+
+ if (cert_value == NULL) {
+ LogDebug("cert_type[" << cert_type << "] is null");
+ } else {
+ LogDebug("Add cert_type[" << cert_type << "] data : " << cert_value);
+ chain.push_back(cert_value);
+ }
+ }
+
+ return;
}
}
Certs::Certs()
{
- m_ckm = CKM::Manager::create();
+ m_ckm = CKM::Manager::create();
}
Certs::~Certs()
@@ -105,100 +105,109 @@ Certs::~Certs()
void Certs::get_certificates(app_t &app)
{
- // build chain using pkgmgr-info
- std::map<int, int> sig_type;
- sig_type[AUTHOR_SIG] = PMINFO_AUTHOR_SIGNER_CERT;
- sig_type[DISTRIBUTOR_SIG] = PMINFO_DISTRIBUTOR_SIGNER_CERT;
- sig_type[DISTRIBUTOR2_SIG] = PMINFO_DISTRIBUTOR2_SIGNER_CERT;
-
- for (auto s : sig_type) {
- chain_t chain;
- get_cert_chain(app.pkg_id.c_str(), app.uid, s.second, chain);
-
- if(!chain.empty()) {
- LogDebug("Add certificates chain to app. Size of chain : " << chain.size());
- app.signatures.emplace_back(std::move(chain));
- }
- }
+ // build chain using pkgmgr-info
+ std::map<int, int> sig_type;
+ sig_type[AUTHOR_SIG] = PMINFO_AUTHOR_SIGNER_CERT;
+ sig_type[DISTRIBUTOR_SIG] = PMINFO_DISTRIBUTOR_SIGNER_CERT;
+ sig_type[DISTRIBUTOR2_SIG] = PMINFO_DISTRIBUTOR2_SIGNER_CERT;
+
+ for (auto s : sig_type) {
+ chain_t chain;
+ get_cert_chain(app.pkg_id.c_str(), app.uid, s.second, chain);
+
+ if (!chain.empty()) {
+ LogDebug("Add certificates chain to app. Size of chain : " << chain.size());
+ app.signatures.emplace_back(std::move(chain));
+ }
+ }
}
Certs::ocsp_response_t Certs::check_ocsp_chain(const chain_t &chain)
{
- CKM::CertificateShPtrVector vect_ckm_chain;
-
- LogDebug("Size of chain: " << chain.size());
- for (auto &iter : chain) {
- CKM::RawBuffer buff(iter.begin(), iter.end());
- auto cert = CKM::Certificate::create(buff, CKM::DataFormat::FORM_DER_BASE64);
- vect_ckm_chain.emplace_back(std::move(cert));
- }
-
- int status = CKM_API_OCSP_STATUS_UNKNOWN;
- int ret = m_ckm->ocspCheck(vect_ckm_chain, status);
- if (ret != CKM_API_SUCCESS) {
- LogError("CKM ckeck OCSP returned " << ret);
- // Add handling for different errors codes
- // For these we can try to check ocsp again later:
- switch (ret) {
- case CKM_API_ERROR_NOT_SUPPORTED:
- LogDebug("Key-manager OCSP API temporary diabled.");
- case CKM_API_ERROR_SOCKET:
- case CKM_API_ERROR_BAD_REQUEST:
- case CKM_API_ERROR_BAD_RESPONSE:
- case CKM_API_ERROR_SEND_FAILED:
- case CKM_API_ERROR_RECV_FAILED:
- case CKM_API_ERROR_SERVER_ERROR:
- case CKM_API_ERROR_OUT_OF_MEMORY:
- return Certs::ocsp_response_t::OCSP_CHECK_AGAIN;
- // Any other error should be recurrent - checking the same app again
- // should give the same result.
- default:
- return Certs::ocsp_response_t::OCSP_CERT_ERROR;
- }
- }
-
- LogDebug("OCSP status: " << status);
- switch (status) {
- // Remove app from "to-check" list:
- case CKM_API_OCSP_STATUS_GOOD:
- return Certs::ocsp_response_t::OCSP_APP_OK;
- case CKM_API_OCSP_STATUS_UNSUPPORTED:
- case CKM_API_OCSP_STATUS_UNKNOWN:
- case CKM_API_OCSP_STATUS_INVALID_URL:
- return Certs::ocsp_response_t::OCSP_CERT_ERROR;
-
- //Show popup to user and remove app from "to-check" list
- case CKM_API_OCSP_STATUS_REVOKED:
- return Certs::ocsp_response_t::OCSP_APP_REVOKED;
-
- //Keep app for checking it again later:
- case CKM_API_OCSP_STATUS_NET_ERROR:
- case CKM_API_OCSP_STATUS_INVALID_RESPONSE:
- case CKM_API_OCSP_STATUS_REMOTE_ERROR:
- case CKM_API_OCSP_STATUS_INTERNAL_ERROR:
- return Certs::ocsp_response_t::OCSP_CHECK_AGAIN;
-
- default:
- // This should never happen
- return Certs::ocsp_response_t::OCSP_CERT_ERROR;
- }
+ CKM::CertificateShPtrVector vect_ckm_chain;
+ LogDebug("Size of chain: " << chain.size());
+
+ for (auto &iter : chain) {
+ CKM::RawBuffer buff(iter.begin(), iter.end());
+ auto cert = CKM::Certificate::create(buff, CKM::DataFormat::FORM_DER_BASE64);
+ vect_ckm_chain.emplace_back(std::move(cert));
+ }
+
+ int status = CKM_API_OCSP_STATUS_UNKNOWN;
+ int ret = m_ckm->ocspCheck(vect_ckm_chain, status);
+
+ if (ret != CKM_API_SUCCESS) {
+ LogError("CKM ckeck OCSP returned " << ret);
+
+ // Add handling for different errors codes
+ // For these we can try to check ocsp again later:
+ switch (ret) {
+ case CKM_API_ERROR_NOT_SUPPORTED:
+ LogDebug("Key-manager OCSP API temporary diabled.");
+
+ case CKM_API_ERROR_SOCKET:
+ case CKM_API_ERROR_BAD_REQUEST:
+ case CKM_API_ERROR_BAD_RESPONSE:
+ case CKM_API_ERROR_SEND_FAILED:
+ case CKM_API_ERROR_RECV_FAILED:
+ case CKM_API_ERROR_SERVER_ERROR:
+ case CKM_API_ERROR_OUT_OF_MEMORY:
+ return Certs::ocsp_response_t::OCSP_CHECK_AGAIN;
+
+ // Any other error should be recurrent - checking the same app again
+ // should give the same result.
+ default:
+ return Certs::ocsp_response_t::OCSP_CERT_ERROR;
+ }
+ }
+
+ LogDebug("OCSP status: " << status);
+
+ switch (status) {
+ // Remove app from "to-check" list:
+ case CKM_API_OCSP_STATUS_GOOD:
+ return Certs::ocsp_response_t::OCSP_APP_OK;
+
+ case CKM_API_OCSP_STATUS_UNSUPPORTED:
+ case CKM_API_OCSP_STATUS_UNKNOWN:
+ case CKM_API_OCSP_STATUS_INVALID_URL:
+ return Certs::ocsp_response_t::OCSP_CERT_ERROR;
+
+ //Show popup to user and remove app from "to-check" list
+ case CKM_API_OCSP_STATUS_REVOKED:
+ return Certs::ocsp_response_t::OCSP_APP_REVOKED;
+
+ //Keep app for checking it again later:
+ case CKM_API_OCSP_STATUS_NET_ERROR:
+ case CKM_API_OCSP_STATUS_INVALID_RESPONSE:
+ case CKM_API_OCSP_STATUS_REMOTE_ERROR:
+ case CKM_API_OCSP_STATUS_INTERNAL_ERROR:
+ return Certs::ocsp_response_t::OCSP_CHECK_AGAIN;
+
+ default:
+ // This should never happen
+ return Certs::ocsp_response_t::OCSP_CERT_ERROR;
+ }
}
-Certs::ocsp_response_t Certs::check_ocsp (const app_t &app)
+Certs::ocsp_response_t Certs::check_ocsp(const app_t &app)
{
- bool check_again = false;
-
- for (auto &iter : app.signatures) {
- Certs::ocsp_response_t resp = check_ocsp_chain(iter);
- if (resp == Certs::ocsp_response_t::OCSP_APP_REVOKED)
- return Certs::ocsp_response_t::OCSP_APP_REVOKED;
- if (resp == Certs::ocsp_response_t::OCSP_CHECK_AGAIN)
- check_again = true;
- }
-
- if (check_again)
- return Certs::ocsp_response_t::OCSP_CHECK_AGAIN;
- return Certs::ocsp_response_t::OCSP_APP_OK;
+ bool check_again = false;
+
+ for (auto &iter : app.signatures) {
+ Certs::ocsp_response_t resp = check_ocsp_chain(iter);
+
+ if (resp == Certs::ocsp_response_t::OCSP_APP_REVOKED)
+ return Certs::ocsp_response_t::OCSP_APP_REVOKED;
+
+ if (resp == Certs::ocsp_response_t::OCSP_CHECK_AGAIN)
+ check_again = true;
+ }
+
+ if (check_again)
+ return Certs::ocsp_response_t::OCSP_CHECK_AGAIN;
+
+ return Certs::ocsp_response_t::OCSP_APP_OK;
}
} // CCHECKER
diff --git a/src/service/certs.h b/src/service/certs.h
index 4871c39..46c688e 100644
--- a/src/service/certs.h
+++ b/src/service/certs.h
@@ -34,29 +34,29 @@
namespace CCHECKER {
enum sig_t {
- AUTHOR_SIG,
- DISTRIBUTOR_SIG,
- DISTRIBUTOR2_SIG
+ AUTHOR_SIG,
+ DISTRIBUTOR_SIG,
+ DISTRIBUTOR2_SIG
};
class Certs {
- public:
- enum class ocsp_response_t {
- OCSP_APP_OK,
- OCSP_APP_REVOKED,
- OCSP_CHECK_AGAIN,
- OCSP_CERT_ERROR
- };
- Certs();
- virtual ~Certs();
- void get_certificates (app_t &app);
- ocsp_response_t check_ocsp (const app_t &app);
+public:
+ enum class ocsp_response_t {
+ OCSP_APP_OK,
+ OCSP_APP_REVOKED,
+ OCSP_CHECK_AGAIN,
+ OCSP_CERT_ERROR
+ };
+ Certs();
+ virtual ~Certs();
+ void get_certificates(app_t &app);
+ ocsp_response_t check_ocsp(const app_t &app);
- protected: // Needed for tests
- ocsp_response_t check_ocsp_chain (const chain_t &chain);
+protected: // Needed for tests
+ ocsp_response_t check_ocsp_chain(const chain_t &chain);
- //private:
- CKM::ManagerShPtr m_ckm;
+ //private:
+ CKM::ManagerShPtr m_ckm;
};
} // CCHECKER
diff --git a/src/service/logic.cpp b/src/service/logic.cpp
index 574b9b2..0bef2ee 100644
--- a/src/service/logic.cpp
+++ b/src/service/logic.cpp
@@ -38,38 +38,38 @@ namespace CCHECKER {
namespace {
struct PkgmgrinfoEvent {
- PkgmgrinfoEvent(uid_t _uid, const char *_pkgid)
- : uid(_uid)
- , pkgid(_pkgid) {}
-
- inline bool operator==(const PkgmgrinfoEvent &rhs) const
- {
- return uid == rhs.uid && pkgid.compare(rhs.pkgid) == 0;
- }
-
- inline bool operator<(const PkgmgrinfoEvent &rhs) const
- {
- if (uid < rhs.uid)
- return true;
- else if (uid < rhs.uid)
- return false;
- else
- return pkgid.compare(rhs.pkgid) < 0;
- }
-
- inline bool operator>(const PkgmgrinfoEvent &rhs) const
- {
- if (uid > rhs.uid)
- return true;
- else if (uid < rhs.uid)
- return false;
- else
- return pkgid.compare(rhs.pkgid) > 0;
- }
-
- uid_t uid;
- std::string pkgid;
- pkgmgr_event_t type;
+ PkgmgrinfoEvent(uid_t _uid, const char *_pkgid)
+ : uid(_uid)
+ , pkgid(_pkgid) {}
+
+ inline bool operator==(const PkgmgrinfoEvent &rhs) const
+ {
+ return uid == rhs.uid && pkgid.compare(rhs.pkgid) == 0;
+ }
+
+ inline bool operator<(const PkgmgrinfoEvent &rhs) const
+ {
+ if (uid < rhs.uid)
+ return true;
+ else if (uid < rhs.uid)
+ return false;
+ else
+ return pkgid.compare(rhs.pkgid) < 0;
+ }
+
+ inline bool operator>(const PkgmgrinfoEvent &rhs) const
+ {
+ if (uid > rhs.uid)
+ return true;
+ else if (uid < rhs.uid)
+ return false;
+ else
+ return pkgid.compare(rhs.pkgid) > 0;
+ }
+
+ uid_t uid;
+ std::string pkgid;
+ pkgmgr_event_t type;
};
std::set<PkgmgrinfoEvent> pkgmgrinfo_event_set;
@@ -79,395 +79,388 @@ const char *const DB_PATH = DB_INSTALL_DIR"/.cert-checker.db";
Logic::~Logic(void)
{
- clean();
+ clean();
}
void Logic::clean(void)
{
- LogDebug("Cert-checker cleaning start.");
-
- // wait and join processing thread
- if (m_thread.joinable()) {
- LogDebug("Waiting for join processing thread");
- {
- std::lock_guard<std::mutex> lock(m_mutex_cv);
- set_should_exit();
- LogDebug("Notify thread : enforced by cleaning");
- m_to_process.notify_one();
- }
- m_thread.join();
- LogDebug("Processing thread joined");
- }
- else
- LogDebug("No thread to join");
-
- if (m_proxy_connman)
- g_object_unref(m_proxy_connman);
-
- if (m_loop)
- g_main_loop_unref(m_loop);
-
- delete m_sqlquery;
-
- timerStop();
-
- LogDebug("Cert-checker cleaning finish.");
+ LogDebug("Cert-checker cleaning start.");
+
+ // wait and join processing thread
+ if (m_thread.joinable()) {
+ LogDebug("Waiting for join processing thread");
+ {
+ std::lock_guard<std::mutex> lock(m_mutex_cv);
+ set_should_exit();
+ LogDebug("Notify thread : enforced by cleaning");
+ m_to_process.notify_one();
+ }
+ m_thread.join();
+ LogDebug("Processing thread joined");
+ } else {
+ LogDebug("No thread to join");
+ }
+
+ if (m_proxy_connman)
+ g_object_unref(m_proxy_connman);
+
+ if (m_loop)
+ g_main_loop_unref(m_loop);
+
+ delete m_sqlquery;
+ timerStop();
+ LogDebug("Cert-checker cleaning finish.");
}
Logic::Logic(void) :
- m_loop(g_main_loop_new(NULL, FALSE)),
- m_sqlquery(NULL),
- m_was_setup_called(false),
- m_is_online(false),
- m_is_online_enabled(false),
- m_should_exit(false),
- m_proxy_connman(NULL),
- m_pc_install(nullptr, nullptr),
- m_pc_uninstall(nullptr, nullptr)
+ m_loop(g_main_loop_new(NULL, FALSE)),
+ m_sqlquery(NULL),
+ m_was_setup_called(false),
+ m_is_online(false),
+ m_is_online_enabled(false),
+ m_should_exit(false),
+ m_proxy_connman(NULL),
+ m_pc_install(nullptr, nullptr),
+ m_pc_uninstall(nullptr, nullptr)
{
}
bool Logic::get_online() const
{
- return m_is_online;
+ return m_is_online;
}
void Logic::set_online(bool online)
{
- std::lock_guard<std::mutex> lock(m_mutex_cv);
-
- m_is_online = online;
- if (m_is_online) {
- m_is_online_enabled = true;
- LogDebug("Notify thread : Network connected");
- m_to_process.notify_one();
- }
+ std::lock_guard<std::mutex> lock(m_mutex_cv);
+ m_is_online = online;
+
+ if (m_is_online) {
+ m_is_online_enabled = true;
+ LogDebug("Notify thread : Network connected");
+ m_to_process.notify_one();
+ }
}
error_t Logic::setup_db()
{
- // TODO: If database doesn't exist -should we create a new one?
- Try {
- m_sqlquery = new DB::SqlQuery(DB_PATH);
- } Catch (runtime_error) {
- LogError("Error while creating SqlQuery object");
- return DATABASE_ERROR;
- }
-
- if(!m_sqlquery) {
- LogError("Cannot open database");
- return DATABASE_ERROR;
- }
-
- return NO_ERROR;
+ // TODO: If database doesn't exist -should we create a new one?
+ Try {
+ m_sqlquery = new DB::SqlQuery(DB_PATH);
+ } Catch(runtime_error) {
+ LogError("Error while creating SqlQuery object");
+ return DATABASE_ERROR;
+ }
+
+ if (!m_sqlquery) {
+ LogError("Cannot open database");
+ return DATABASE_ERROR;
+ }
+
+ return NO_ERROR;
}
error_t Logic::setup()
{
- // Check if setup was called
- if (m_was_setup_called) {
- LogDebug("Setup is already done.");
- return NO_ERROR;
- }
- m_was_setup_called = true;
-
- // Check if DB exists and create a new one if it doesn't
- error_t err = setup_db();
- if (err != NO_ERROR) {
- LogError("Database error");
- return err;
- }
-
- load_database_to_buffer();
-
- // run process thread - thread will be waiting on condition variable
- m_thread = std::thread(&Logic::process_all, this);
-
- // Add connman callback
- LogDebug("register connman event callback start");
- if (register_dbus_signal_handler(&m_proxy_connman,
- "net.connman",
- "/",
- "net.connman.Manager",
- connman_callback) != NO_ERROR) {
- LogError("Error in register_connman_signal_handler");
- return REGISTER_CALLBACK_ERROR;
- }
- LogDebug("register connman event callback success");
-
- set_connman_online_state();
-
- // Add pkgmgrinfo callback
- LogDebug("Register package event handler start");
-
- std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)>
- _pcInstall(pkgmgrinfo_client_new(PMINFO_LISTENING), pkgmgrinfo_client_free);
- std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)>
- _pcUninstall(pkgmgrinfo_client_new(PMINFO_LISTENING), pkgmgrinfo_client_free);
- m_pc_install = std::move(_pcInstall);
- m_pc_uninstall = std::move(_pcUninstall);
-
- if (!m_pc_install || !m_pc_uninstall) {
- LogError("Get pkgmgrinfo client failed");
- return REGISTER_CALLBACK_ERROR;
- }
-
- int ret_status_install;
- int ret_status_uninstall;
- ret_status_install = pkgmgrinfo_client_set_status_type(
- m_pc_install.get(), PKGMGR_CLIENT_STATUS_INSTALL);
- ret_status_uninstall = pkgmgrinfo_client_set_status_type(
- m_pc_uninstall.get(), PKGMGR_CLIENT_STATUS_UNINSTALL);
-
- if (ret_status_install == PMINFO_R_ERROR || ret_status_uninstall == PMINFO_R_ERROR) {
- LogError("Set pkgmgrinfo status fail");
- return REGISTER_CALLBACK_ERROR;
- }
- m_reqid_install = pkgmgrinfo_client_listen_status(
- m_pc_install.get(), pkgmgrinfo_event_handler_static, this);
- m_reqid_uninstall = pkgmgrinfo_client_listen_status(
- m_pc_uninstall.get(), pkgmgrinfo_event_handler_static, this);
-
- if (m_reqid_install < 0 || m_reqid_uninstall < 0) {
- LogError("Register pacakge install event handler fail");
- return REGISTER_CALLBACK_ERROR;
- }
-
- // Init for gio timeout.
- m_is_first_run = false;
-
- LogDebug("Register package event handler success");
-
- return NO_ERROR;
+ // Check if setup was called
+ if (m_was_setup_called) {
+ LogDebug("Setup is already done.");
+ return NO_ERROR;
+ }
+
+ m_was_setup_called = true;
+ // Check if DB exists and create a new one if it doesn't
+ error_t err = setup_db();
+
+ if (err != NO_ERROR) {
+ LogError("Database error");
+ return err;
+ }
+
+ load_database_to_buffer();
+ // run process thread - thread will be waiting on condition variable
+ m_thread = std::thread(&Logic::process_all, this);
+ // Add connman callback
+ LogDebug("register connman event callback start");
+
+ if (register_dbus_signal_handler(&m_proxy_connman,
+ "net.connman",
+ "/",
+ "net.connman.Manager",
+ connman_callback) != NO_ERROR) {
+ LogError("Error in register_connman_signal_handler");
+ return REGISTER_CALLBACK_ERROR;
+ }
+
+ LogDebug("register connman event callback success");
+ set_connman_online_state();
+ // Add pkgmgrinfo callback
+ LogDebug("Register package event handler start");
+ std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)>
+ _pcInstall(pkgmgrinfo_client_new(PMINFO_LISTENING), pkgmgrinfo_client_free);
+ std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)>
+ _pcUninstall(pkgmgrinfo_client_new(PMINFO_LISTENING), pkgmgrinfo_client_free);
+ m_pc_install = std::move(_pcInstall);
+ m_pc_uninstall = std::move(_pcUninstall);
+
+ if (!m_pc_install || !m_pc_uninstall) {
+ LogError("Get pkgmgrinfo client failed");
+ return REGISTER_CALLBACK_ERROR;
+ }
+
+ int ret_status_install;
+ int ret_status_uninstall;
+ ret_status_install = pkgmgrinfo_client_set_status_type(
+ m_pc_install.get(), PKGMGR_CLIENT_STATUS_INSTALL);
+ ret_status_uninstall = pkgmgrinfo_client_set_status_type(
+ m_pc_uninstall.get(), PKGMGR_CLIENT_STATUS_UNINSTALL);
+
+ if (ret_status_install == PMINFO_R_ERROR || ret_status_uninstall == PMINFO_R_ERROR) {
+ LogError("Set pkgmgrinfo status fail");
+ return REGISTER_CALLBACK_ERROR;
+ }
+
+ m_reqid_install = pkgmgrinfo_client_listen_status(
+ m_pc_install.get(), pkgmgrinfo_event_handler_static, this);
+ m_reqid_uninstall = pkgmgrinfo_client_listen_status(
+ m_pc_uninstall.get(), pkgmgrinfo_event_handler_static, this);
+
+ if (m_reqid_install < 0 || m_reqid_uninstall < 0) {
+ LogError("Register pacakge install event handler fail");
+ return REGISTER_CALLBACK_ERROR;
+ }
+
+ // Init for gio timeout.
+ m_is_first_run = false;
+ LogDebug("Register package event handler success");
+ return NO_ERROR;
}
void Logic::run(guint timeout)
{
- LogDebug("Running the main loop");
-
- g_timeout_add_seconds(timeout, timeout_cb, m_loop);
- g_main_loop_run(m_loop);
+ LogDebug("Running the main loop");
+ g_timeout_add_seconds(timeout, timeout_cb, m_loop);
+ g_main_loop_run(m_loop);
}
int Logic::pkgmgrinfo_event_handler_static(
- uid_t uid,
- int reqid,
- const char *pkgtype,
- const char *pkgid,
- const char *key,
- const char *val,
- const void *pmsg,
- void *data)
+ uid_t uid,
+ int reqid,
+ const char *pkgtype,
+ const char *pkgid,
+ const char *key,
+ const char *val,
+ const void *pmsg,
+ void *data)
{
- LogDebug("pkgmgrinfo event handler start!!");
- if (data == nullptr)
- return -1;
-
- std::string keyStr(key);
- std::string valStr(val);
- LogDebug("pkgmgrinfo event was caught. type : " << valStr << ", status : " << keyStr);
-
- if ((valStr.compare("install") == 0 || valStr.compare("uninstall") == 0)
- && keyStr.compare("start") == 0) {
- return static_cast<Logic *>(data)->pkgmgrinfo_event_handler(
- uid, reqid, pkgtype, pkgid, key, val, pmsg, data);
- } else if (keyStr.compare("end") == 0 && valStr.compare("ok") == 0) {
- return static_cast<Logic *>(data)->push_pkgmgrinfo_event(uid, pkgid);
- } else {
- // TODO(sangwan.kwon) if get untreat event like fail, must quit loop
- LogDebug("Untreated event was caught : " << val);
- return -1;
- }
+ LogDebug("pkgmgrinfo event handler start!!");
+
+ if (data == nullptr)
+ return -1;
+
+ std::string keyStr(key);
+ std::string valStr(val);
+ LogDebug("pkgmgrinfo event was caught. type : " << valStr << ", status : " << keyStr);
+
+ if ((valStr.compare("install") == 0 || valStr.compare("uninstall") == 0)
+ && keyStr.compare("start") == 0) {
+ return static_cast<Logic *>(data)->pkgmgrinfo_event_handler(
+ uid, reqid, pkgtype, pkgid, key, val, pmsg, data);
+ } else if (keyStr.compare("end") == 0 && valStr.compare("ok") == 0) {
+ return static_cast<Logic *>(data)->push_pkgmgrinfo_event(uid, pkgid);
+ } else {
+ // TODO(sangwan.kwon) if get untreat event like fail, must quit loop
+ LogDebug("Untreated event was caught : " << val);
+ return -1;
+ }
}
int Logic::pkgmgrinfo_event_handler(
- uid_t uid,
- int reqid,
- const char */*pkgtype*/,
- const char *pkgid,
- const char *key,
- const char *val,
- const void */*pmsg*/,
- void */*data*/)
+ uid_t uid,
+ int reqid,
+ const char */*pkgtype*/,
+ const char *pkgid,
+ const char *key,
+ const char *val,
+ const void */*pmsg*/,
+ void */*data*/)
{
- if (pkgid == nullptr || key == nullptr || val == nullptr) {
- LogError("Invalid parameter.");
- return -1;
- }
-
- std::string keyStr(key);
- std::string valStr(val);
-
- LogDebug("uid: " << uid << " pkgid: " << pkgid << " key: " << keyStr << " val: " << valStr);
-
- PkgmgrinfoEvent event(uid, pkgid);
-
- if(valStr.compare("install") == 0) {
- if (reqid != m_reqid_install) {
- LogError("pkgmgrinfo event reqid unmatched");
- return -1;
- }
- event.type = EVENT_INSTALL;
- } else if(valStr.compare("uninstall") == 0) {
- if (reqid != m_reqid_uninstall) {
- LogError("pkgmgrinfo event reqid unmatched");
- return -1;
- }
- event.type = EVENT_UNINSTALL;
- }
-
- pkgmgrinfo_event_set.insert(event);
-
- return 0;
+ if (pkgid == nullptr || key == nullptr || val == nullptr) {
+ LogError("Invalid parameter.");
+ return -1;
+ }
+
+ std::string keyStr(key);
+ std::string valStr(val);
+ LogDebug("uid: " << uid << " pkgid: " << pkgid << " key: " << keyStr << " val: " << valStr);
+ PkgmgrinfoEvent event(uid, pkgid);
+
+ if (valStr.compare("install") == 0) {
+ if (reqid != m_reqid_install) {
+ LogError("pkgmgrinfo event reqid unmatched");
+ return -1;
+ }
+
+ event.type = EVENT_INSTALL;
+ } else if (valStr.compare("uninstall") == 0) {
+ if (reqid != m_reqid_uninstall) {
+ LogError("pkgmgrinfo event reqid unmatched");
+ return -1;
+ }
+
+ event.type = EVENT_UNINSTALL;
+ }
+
+ pkgmgrinfo_event_set.insert(event);
+ return 0;
}
int Logic::push_pkgmgrinfo_event(uid_t uid, const char *pkgid)
{
- PkgmgrinfoEvent event(uid, pkgid);
- std::set<PkgmgrinfoEvent>::iterator pkgmgrinfo_event_iter = pkgmgrinfo_event_set.find(event);
-
- if (pkgmgrinfo_event_iter != pkgmgrinfo_event_set.end()) {
- // FIXME: No information about app_id in the signal. Use stub.
- app_t app(TEMP_APP_ID, pkgid, uid, {});
-
- if (pkgmgrinfo_event_iter->type == EVENT_INSTALL) {
- LogDebug("Successfully Installed. uid: " << uid << ", pkgid: " << pkgid);
- push_event(event_t(app, event_t::event_type_t::APP_INSTALL));
- } else if (pkgmgrinfo_event_iter->type == EVENT_UNINSTALL) {
- LogDebug("Successfully Uninstalled. uid: " << uid << ", pkgid: " << pkgid);
- push_event(event_t(app, event_t::event_type_t::APP_UNINSTALL));
- }
-
- LogDebug("push pkgmgrifo success. pkgid: " << pkgid << ", uid: " << uid);
- pkgmgrinfo_event_set.erase(event);
- return 0;
- } else {
- // if update status, return fail
- LogDebug("push pkgmgrifo fail. pkgid: " << pkgid << ", uid: " << uid);
- return -1;
- }
+ PkgmgrinfoEvent event(uid, pkgid);
+ std::set<PkgmgrinfoEvent>::iterator pkgmgrinfo_event_iter = pkgmgrinfo_event_set.find(event);
+
+ if (pkgmgrinfo_event_iter != pkgmgrinfo_event_set.end()) {
+ // FIXME: No information about app_id in the signal. Use stub.
+ app_t app(TEMP_APP_ID, pkgid, uid, {});
+
+ if (pkgmgrinfo_event_iter->type == EVENT_INSTALL) {
+ LogDebug("Successfully Installed. uid: " << uid << ", pkgid: " << pkgid);
+ push_event(event_t(app, event_t::event_type_t::APP_INSTALL));
+ } else if (pkgmgrinfo_event_iter->type == EVENT_UNINSTALL) {
+ LogDebug("Successfully Uninstalled. uid: " << uid << ", pkgid: " << pkgid);
+ push_event(event_t(app, event_t::event_type_t::APP_UNINSTALL));
+ }
+
+ LogDebug("push pkgmgrifo success. pkgid: " << pkgid << ", uid: " << uid);
+ pkgmgrinfo_event_set.erase(event);
+ return 0;
+ } else {
+ // if update status, return fail
+ LogDebug("push pkgmgrifo fail. pkgid: " << pkgid << ", uid: " << uid);
+ return -1;
+ }
}
error_t Logic::register_dbus_signal_handler(GDBusProxy **proxy,
- const char *name,
- const char *object_path,
- const char *interface_name,
- void (*callback) (GDBusProxy *proxy,
- gchar *sender_name,
- gchar *signal_name,
- GVariant *parameters,
- void *logic_ptr)
- )
+ const char *name,
+ const char *object_path,
+ const char *interface_name,
+ void (*callback)(GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr)
+ )
{
- GError *error = NULL;
- GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_NONE;
-
- // Obtain a connection to the System Bus
- *proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
- flags,
- NULL, /* GDBusInterfaceInfo */
- name,
- object_path,
- interface_name,
- NULL, /* GCancellable */
- &error);
-
- if (*proxy == NULL) {
- if (error) {
- LogError("Error creating D-Bus proxy for /'" << interface_name <<"/': " << error->message);
- g_error_free(error);
- } else {
- LogError("Error creating D-Bus proxy for /'" << interface_name <<"/'. Unknown error");
- }
- return DBUS_ERROR;
- }
-
- // Connect to g-signal to receive signals from proxy
- if (g_signal_connect(*proxy, "g-signal", G_CALLBACK(callback), this) < 1) {
- LogError("g_signal_connect error while connecting " << interface_name);
- return REGISTER_CALLBACK_ERROR;
- }
-
- return NO_ERROR;
+ GError *error = NULL;
+ GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_NONE;
+ // Obtain a connection to the System Bus
+ *proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
+ flags,
+ NULL, /* GDBusInterfaceInfo */
+ name,
+ object_path,
+ interface_name,
+ NULL, /* GCancellable */
+ &error);
+
+ if (*proxy == NULL) {
+ if (error) {
+ LogError("Error creating D-Bus proxy for /'" << interface_name << "/': " << error->message);
+ g_error_free(error);
+ } else {
+ LogError("Error creating D-Bus proxy for /'" << interface_name << "/'. Unknown error");
+ }
+
+ return DBUS_ERROR;
+ }
+
+ // Connect to g-signal to receive signals from proxy
+ if (g_signal_connect(*proxy, "g-signal", G_CALLBACK(callback), this) < 1) {
+ LogError("g_signal_connect error while connecting " << interface_name);
+ return REGISTER_CALLBACK_ERROR;
+ }
+
+ return NO_ERROR;
}
void Logic::set_connman_online_state()
{
- GError *error = NULL;
- GVariant *response;
-
- if (m_proxy_connman == NULL) {
- LogError("connman proxy is NULL");
- return;
- }
-
- response = g_dbus_proxy_call_sync (m_proxy_connman,
- "GetProperties",
- NULL, // GetProperties gets no parameters
- G_DBUS_CALL_FLAGS_NONE,
- -1, // Default timeout
- NULL,
- &error);
-
- if (error) {
- LogError("Error while calling connman GetProperties() Dbus API: " << error->message);
- g_error_free(error);
- return;
- }
-
- if (response == NULL) {
- // This should never happen
- return;
- }
-
- gchar *resp_g = g_variant_print(response, TRUE);
- std::string resp_s(resp_g);
- LogDebug("response: " << resp_s);
- g_free(resp_g);
-
- // Response should look like this:
- // ({'State': <'online'>, 'OfflineMode': <false>, 'SessionMode': <false>},)
- if (resp_s.find("'State': <'online'>", 0) != std::string::npos) {
- LogDebug("Connman has returned: online");
- set_online(true);
- }
-
- // free memory
- g_variant_unref(response);
+ GError *error = NULL;
+ GVariant *response;
+
+ if (m_proxy_connman == NULL) {
+ LogError("connman proxy is NULL");
+ return;
+ }
+
+ response = g_dbus_proxy_call_sync(m_proxy_connman,
+ "GetProperties",
+ NULL, // GetProperties gets no parameters
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, // Default timeout
+ NULL,
+ &error);
+
+ if (error) {
+ LogError("Error while calling connman GetProperties() Dbus API: " << error->message);
+ g_error_free(error);
+ return;
+ }
+
+ if (response == NULL) {
+ // This should never happen
+ return;
+ }
+
+ gchar *resp_g = g_variant_print(response, TRUE);
+ std::string resp_s(resp_g);
+ LogDebug("response: " << resp_s);
+ g_free(resp_g);
+
+ // Response should look like this:
+ // ({'State': <'online'>, 'OfflineMode': <false>, 'SessionMode': <false>},)
+ if (resp_s.find("'State': <'online'>", 0) != std::string::npos) {
+ LogDebug("Connman has returned: online");
+ set_online(true);
+ }
+
+ // free memory
+ g_variant_unref(response);
}
void Logic::connman_callback(GDBusProxy */*proxy*/,
- gchar */*sender_name*/,
- gchar *signal_name,
- GVariant *parameters,
- void *logic_ptr)
+ gchar */*sender_name*/,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr)
{
- string signal_name_str = string(signal_name);
- if (signal_name_str != "PropertyChanged") {
- // Invalid param. Nothing to do here.
- return;
- }
-
- gchar *parameters_g = g_variant_print(parameters, TRUE);
- string params_str = string(parameters_g);
- g_free (parameters_g);
-
- Logic *logic = static_cast<Logic*> (logic_ptr);
-
- if (params_str == "('State', <'online'>)") {
- LogDebug("Device online");
- logic->set_online(true);
- }
- else if (params_str == "('State', <'offline'>)") {
- LogDebug("Device offline");
- logic->set_online(false);
- }
+ string signal_name_str = string(signal_name);
+
+ if (signal_name_str != "PropertyChanged") {
+ // Invalid param. Nothing to do here.
+ return;
+ }
+
+ gchar *parameters_g = g_variant_print(parameters, TRUE);
+ string params_str = string(parameters_g);
+ g_free(parameters_g);
+ Logic *logic = static_cast<Logic *>(logic_ptr);
+
+ if (params_str == "('State', <'online'>)") {
+ LogDebug("Device online");
+ logic->set_online(true);
+ } else if (params_str == "('State', <'offline'>)") {
+ LogDebug("Device offline");
+ logic->set_online(false);
+ }
}
void Logic::load_database_to_buffer()
{
- LogDebug("Loading database to the buffer");
- m_sqlquery->get_app_list(m_buffer);
+ LogDebug("Loading database to the buffer");
+ m_sqlquery->get_app_list(m_buffer);
}
/**
@@ -475,182 +468,184 @@ void Logic::load_database_to_buffer()
**/
void Logic::process_queue(void)
{
- event_t event;
- while(m_queue.pop_event(event)) {
- process_event(event);
- }
+ event_t event;
+
+ while (m_queue.pop_event(event)) {
+ process_event(event);
+ }
}
bool Logic::call_ui(const app_t &app)
{
- UI::UIBackend ui;
-
- if (ui.call_popup(app)) { // If calling popup or app_controll service will fail,
- // do not remove application, and ask about it once again later
- LogDebug("Popup shown correctly. Application will be removed from DB and buffer");
- return true;
- }
- LogDebug("Popup error. Application will be marked to show popup later.");
- return false;
+ UI::UIBackend ui;
+
+ if (ui.call_popup(app)) { // If calling popup or app_controll service will fail,
+ // do not remove application, and ask about it once again later
+ LogDebug("Popup shown correctly. Application will be removed from DB and buffer");
+ return true;
+ }
+
+ LogDebug("Popup error. Application will be marked to show popup later.");
+ return false;
}
-bool Logic::process_app(app_t& app) {
- // Check if app hasn't already been verified.
- // If yes then just try to display popup once again, and go the next app.
+bool Logic::process_app(app_t &app)
+{
+ // Check if app hasn't already been verified.
+ // If yes then just try to display popup once again, and go the next app.
#if POPUP
- if (app.verified == app_t::verified_t::NO) {
- LogDebug(app.str() << " has been verified before. Popup should be shown.");
- return call_ui(app);
- }
-#endif
+ if (app.verified == app_t::verified_t::NO) {
+ LogDebug(app.str() << " has been verified before. Popup should be shown.");
+ return call_ui(app);
+ }
- Certs::ocsp_response_t ret;
- ret = m_certs.check_ocsp(app);
-
- // If OCSP returns success or OCSP checking fails we should remove application from buffer and database
- if (ret == Certs::ocsp_response_t::OCSP_APP_OK ||
- ret == Certs::ocsp_response_t::OCSP_CERT_ERROR) {
- LogDebug(app.str() << " OCSP verified (or not available for app's chains)");
- return true;
- }
- else if (ret == Certs::ocsp_response_t::OCSP_APP_REVOKED) {
- LogDebug(app.str() << " certificate has been revoked. Popup should be shown");
- app.verified = app_t::verified_t::NO;
+#endif
+ Certs::ocsp_response_t ret;
+ ret = m_certs.check_ocsp(app);
+
+ // If OCSP returns success or OCSP checking fails we should remove application from buffer and database
+ if (ret == Certs::ocsp_response_t::OCSP_APP_OK ||
+ ret == Certs::ocsp_response_t::OCSP_CERT_ERROR) {
+ LogDebug(app.str() << " OCSP verified (or not available for app's chains)");
+ return true;
+ } else if (ret == Certs::ocsp_response_t::OCSP_APP_REVOKED) {
+ LogDebug(app.str() << " certificate has been revoked. Popup should be shown");
+ app.verified = app_t::verified_t::NO;
#if POPUP
-// Do not remove app here - just waits for user answer from popup
- return call_ui(app);
+ // Do not remove app here - just waits for user answer from popup
+ return call_ui(app);
#else
- return true;
+ return true;
#endif
- }
- else {
- LogDebug(app.str() << " should be checked again later");
- // If check_ocsp returns Certs::ocsp_response_t::OCSP_CHECK_AGAIN
- // app should be checked again later
- }
- return false;
+ } else {
+ LogDebug(app.str() << " should be checked again later");
+ // If check_ocsp returns Certs::ocsp_response_t::OCSP_CHECK_AGAIN
+ // app should be checked again later
+ }
+
+ return false;
}
void Logic::process_buffer(void)
{
- for (auto iter = m_buffer.begin(); iter != m_buffer.end();) {
- bool remove = process_app(*iter);
- auto prev = *iter;
- iter++;
- if (remove)
- remove_app_from_buffer_and_database(prev);
- app_processed();
- }
+ for (auto iter = m_buffer.begin(); iter != m_buffer.end();) {
+ bool remove = process_app(*iter);
+ auto prev = *iter;
+ iter++;
+
+ if (remove)
+ remove_app_from_buffer_and_database(prev);
+
+ app_processed();
+ }
}
void Logic::push_event(event_t event)
{
- std::lock_guard<std::mutex> lock(m_mutex_cv);
- m_queue.push_event(std::move(event));
- LogDebug("Notify thread : pkgmgr event added");
- m_to_process.notify_one();
+ std::lock_guard<std::mutex> lock(m_mutex_cv);
+ m_queue.push_event(std::move(event));
+ LogDebug("Notify thread : pkgmgr event added");
+ m_to_process.notify_one();
}
void Logic::process_all()
{
- LogInfo("[thread] Start to process event.");
- for(;;) {
- std::unique_lock<std::mutex> lock(m_mutex_cv);
-
- // Wait condition.
- if(m_queue.empty() && !m_is_online_enabled) {
- LogDebug("[thread] wait condition <queue, Network> : "
- << !m_queue.empty() << ", " << get_online());
- m_to_process.wait(lock); // spurious wakeups do not concern us
-
- LogDebug("[thread] wake up! running stage");
- m_is_first_run = true;
- }
-
- // Value for prevent infinite loop.
- m_is_online_enabled = false;
- // Move event data from queue to buffer & database.
- process_queue();
-
- lock.unlock();
-
- if (get_online() && !m_buffer.empty()) {
-
- process_buffer();
-
- // This is for OCSP_CHECK_AGAIN case.
- if(m_buffer.empty()) {
- LogInfo("[thread] Finish processing event.");
- g_main_loop_quit(m_loop);
- break;
- } else {
- LogDebug("[thread] Check again : " << m_buffer.size());
- // Timer running periodically
- timerStart(TIMEOUT_TIMER);
- }
- } else if (!get_online()) {
- LogDebug("[thread] No network. Buffer won't be processed.");
- } else {
- LogDebug("[thread] No event since cert-checker started.");
- }
-
- if (m_should_exit)
- break;
- }
+ LogInfo("[thread] Start to process event.");
+
+ for (;;) {
+ std::unique_lock<std::mutex> lock(m_mutex_cv);
+
+ // Wait condition.
+ if (m_queue.empty() && !m_is_online_enabled) {
+ LogDebug("[thread] wait condition <queue, Network> : "
+ << !m_queue.empty() << ", " << get_online());
+ m_to_process.wait(lock); // spurious wakeups do not concern us
+ LogDebug("[thread] wake up! running stage");
+ m_is_first_run = true;
+ }
+
+ // Value for prevent infinite loop.
+ m_is_online_enabled = false;
+ // Move event data from queue to buffer & database.
+ process_queue();
+ lock.unlock();
+
+ if (get_online() && !m_buffer.empty()) {
+ process_buffer();
+
+ // This is for OCSP_CHECK_AGAIN case.
+ if (m_buffer.empty()) {
+ LogInfo("[thread] Finish processing event.");
+ g_main_loop_quit(m_loop);
+ break;
+ } else {
+ LogDebug("[thread] Check again : " << m_buffer.size());
+ // Timer running periodically
+ timerStart(TIMEOUT_TIMER);
+ }
+ } else if (!get_online()) {
+ LogDebug("[thread] No network. Buffer won't be processed.");
+ } else {
+ LogDebug("[thread] No event since cert-checker started.");
+ }
+
+ if (m_should_exit)
+ break;
+ }
}
void Logic::job(void)
{
- std::lock_guard<std::mutex> lock(m_mutex_cv);
-
- if (m_buffer.empty()) {
- LogDebug("[timer] Buffer is empty.");
- timerStop();
- } else {
- LogDebug("[timer] Notify thread - periodic wakeup");
- m_to_process.notify_one();
- }
+ std::lock_guard<std::mutex> lock(m_mutex_cv);
+
+ if (m_buffer.empty()) {
+ LogDebug("[timer] Buffer is empty.");
+ timerStop();
+ } else {
+ LogDebug("[timer] Notify thread - periodic wakeup");
+ m_to_process.notify_one();
+ }
}
void Logic::process_event(const event_t &event)
{
- LogDebug("Move event from queue to (buffer and db).");
- if (event.event_type == event_t::event_type_t::APP_INSTALL) {
- // pulling out certificates from signatures
- app_t app = event.app;
- m_certs.get_certificates(app);
- add_app_to_buffer_and_database(app);
- }
- else if (event.event_type == event_t::event_type_t::APP_UNINSTALL) {
- remove_app_from_buffer_and_database(event.app);
- }
- else
- LogError("Unknown event type");
+ LogDebug("Move event from queue to (buffer and db).");
+
+ if (event.event_type == event_t::event_type_t::APP_INSTALL) {
+ // pulling out certificates from signatures
+ app_t app = event.app;
+ m_certs.get_certificates(app);
+ add_app_to_buffer_and_database(app);
+ } else if (event.event_type == event_t::event_type_t::APP_UNINSTALL) {
+ remove_app_from_buffer_and_database(event.app);
+ } else {
+ LogError("Unknown event type");
+ }
}
void Logic::add_app_to_buffer_and_database(const app_t &app)
{
- // First add app to DB
- if(!m_sqlquery->add_app_to_check_list(app)) {
- LogError("Failed to add " << app.str() << "to database");
- // We can do nothing about it. We can only log the error.
- }
-
- // Then add app to buffer - skip if already added.
- // FIXME: What to do if the same app will be installed twice?
- // Add it twice to the buffer, or check if apps in buffer are unique?
- // At the moment doubled apps are skipped.
- for (auto &iter : m_buffer) {
- if (iter.app_id == app.app_id &&
- iter.pkg_id == app.pkg_id &&
- iter.uid == app.uid) {
- LogDebug(app.str() << " already in buffer. Skip.");
- return;
- }
- }
-
- // Then add app to buffer
- m_buffer.push_back(app);
+ // First add app to DB
+ if (!m_sqlquery->add_app_to_check_list(app)) {
+ LogError("Failed to add " << app.str() << "to database");
+ // We can do nothing about it. We can only log the error.
+ }
+
+ // Then add app to buffer - skip if already added.
+ // FIXME: What to do if the same app will be installed twice?
+ // Add it twice to the buffer, or check if apps in buffer are unique?
+ // At the moment doubled apps are skipped.
+ for (auto &iter : m_buffer) {
+ if (iter.app_id == app.app_id &&
+ iter.pkg_id == app.pkg_id &&
+ iter.uid == app.uid) {
+ LogDebug(app.str() << " already in buffer. Skip.");
+ return;
+ }
+ }
+
+ // Then add app to buffer
+ m_buffer.push_back(app);
}
// Notice that this operator doesn't compare list of certificate, because it isn't needed here.
@@ -658,45 +653,44 @@ void Logic::add_app_to_buffer_and_database(const app_t &app)
// Operator which compares certificates is implemented in tests.
bool operator ==(const app_t &app1, const app_t &app2)
{
- return app1.app_id == app2.app_id &&
- app1.pkg_id == app2.pkg_id &&
- app1.uid == app2.uid;
+ return app1.app_id == app2.app_id &&
+ app1.pkg_id == app2.pkg_id &&
+ app1.uid == app2.uid;
}
void Logic::remove_app_from_buffer_and_database(const app_t &app)
{
- // First remove app from DB
- m_sqlquery->remove_app_from_check_list(app);
-
- // Then remove app from buffer
- m_buffer.remove(app);
+ // First remove app from DB
+ m_sqlquery->remove_app_from_check_list(app);
+ // Then remove app from buffer
+ m_buffer.remove(app);
}
bool Logic::get_should_exit(void) const
{
- return m_should_exit;
+ return m_should_exit;
}
void Logic::set_should_exit(void)
{
- m_should_exit = true;
+ m_should_exit = true;
}
std::atomic<bool> Logic::m_is_first_run(false);
bool Logic::is_running()
{
- return g_main_loop_is_running(m_loop);
+ return g_main_loop_is_running(m_loop);
}
gboolean Logic::timeout_cb(gpointer data)
{
- if (!m_is_first_run) {
- LogDebug("No event Since cchecker launched. timeout.");
- g_main_loop_quit(static_cast<GMainLoop *>(data));
- }
+ if (!m_is_first_run) {
+ LogDebug("No event Since cchecker launched. timeout.");
+ g_main_loop_quit(static_cast<GMainLoop *>(data));
+ }
- return FALSE;
+ return FALSE;
}
} // namespace CCHECKER
diff --git a/src/service/logic.h b/src/service/logic.h
index e2d5fd7..eedd2e4 100644
--- a/src/service/logic.h
+++ b/src/service/logic.h
@@ -51,119 +51,118 @@ class SqlQuery;
} // namespace DB
enum error_t {
- NO_ERROR,
- REGISTER_CALLBACK_ERROR,
- DBUS_ERROR,
- PACKAGE_MANAGER_ERROR,
- DATABASE_ERROR,
- INTERNAL_ERROR
+ NO_ERROR,
+ REGISTER_CALLBACK_ERROR,
+ DBUS_ERROR,
+ PACKAGE_MANAGER_ERROR,
+ DATABASE_ERROR,
+ INTERNAL_ERROR
};
enum pkgmgr_event_t {
- EVENT_INSTALL,
- EVENT_UNINSTALL
+ EVENT_INSTALL,
+ EVENT_UNINSTALL
};
class Logic : public Timer {
- public:
- Logic(void);
- virtual ~Logic(void);
- error_t setup(void);
- void run(guint timeout);
- bool is_running();
- virtual void clean(void);
-
- static void connman_callback(GDBusProxy *proxy,
- gchar *sender_name,
- gchar *signal_name,
- GVariant *parameters,
- void *logic_ptr);
-
- protected:
- // Timer function
- void job(void) override;
-
- virtual void process_event(const event_t &event);
- virtual void app_processed() {}; // for tests
- void set_should_exit(void);
- void push_event(event_t event);
- void set_online(bool online);
-
- std::list<app_t> m_buffer;
- std::condition_variable m_to_process;
- std::mutex m_mutex_cv;
- std::thread m_thread;
-
- private:
- error_t setup_db();
- void load_database_to_buffer();
- void add_app_to_buffer_and_database(const app_t &app);
- void remove_app_from_buffer_and_database(const app_t &app);
-
- void set_connman_online_state();
- error_t register_dbus_signal_handler(GDBusProxy **proxy,
- const char *name,
- const char *object_path,
- const char *interface_name,
- void (*callback) (GDBusProxy *proxy,
- gchar *sender_name,
- gchar *signal_name,
- GVariant *parameters,
- void *logic_ptr)
- );
- bool get_online(void) const;
-
- static int pkgmgrinfo_event_handler_static(
- uid_t uid,
- int reqid,
- const char *pkgtype,
- const char *pkgid,
- const char *key,
- const char *val,
- const void *pmsg,
- void *data);
- int pkgmgrinfo_event_handler(
- uid_t uid,
- int reqid,
- const char *pkgtype,
- const char *pkgid,
- const char *key,
- const char *val,
- const void *pmsg,
- void *data);
- int push_pkgmgrinfo_event(uid_t uid, const char *pkgid);
-
- void process_all(void);
- void process_queue(void);
- bool process_app(app_t& app);
- void process_buffer(void);
- bool get_should_exit(void) const;
-
- bool call_ui(const app_t &app);
-
- static gboolean timeout_cb(gpointer data);
-
- // main event loop data type
- GMainLoop *m_loop;
-
- Queue m_queue;
- Certs m_certs;
- DB::SqlQuery *m_sqlquery;
- bool m_was_setup_called;
-
- bool m_is_online;
- // TODO: use m_queue for online events
- bool m_is_online_enabled;
- bool m_should_exit;
- static std::atomic<bool> m_is_first_run;
-
- GDBusProxy *m_proxy_connman;
-
- // about pkgmgr event
- int m_reqid_install;
- int m_reqid_uninstall;
- std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)> m_pc_install;
- std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)> m_pc_uninstall;
+public:
+ Logic(void);
+ virtual ~Logic(void);
+ error_t setup(void);
+ void run(guint timeout);
+ bool is_running();
+ virtual void clean(void);
+
+ static void connman_callback(GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr);
+
+protected:
+ // Timer function
+ void job(void) override;
+
+ virtual void process_event(const event_t &event);
+ virtual void app_processed() {}; // for tests
+ void set_should_exit(void);
+ void push_event(event_t event);
+ void set_online(bool online);
+
+ std::list<app_t> m_buffer;
+ std::condition_variable m_to_process;
+ std::mutex m_mutex_cv;
+ std::thread m_thread;
+
+private:
+ error_t setup_db();
+ void load_database_to_buffer();
+ void add_app_to_buffer_and_database(const app_t &app);
+ void remove_app_from_buffer_and_database(const app_t &app);
+
+ void set_connman_online_state();
+ error_t register_dbus_signal_handler(GDBusProxy **proxy,
+ const char *name,
+ const char *object_path,
+ const char *interface_name,
+ void (*callback)(GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr));
+ bool get_online(void) const;
+
+ static int pkgmgrinfo_event_handler_static(
+ uid_t uid,
+ int reqid,
+ const char *pkgtype,
+ const char *pkgid,
+ const char *key,
+ const char *val,
+ const void *pmsg,
+ void *data);
+ int pkgmgrinfo_event_handler(
+ uid_t uid,
+ int reqid,
+ const char *pkgtype,
+ const char *pkgid,
+ const char *key,
+ const char *val,
+ const void *pmsg,
+ void *data);
+ int push_pkgmgrinfo_event(uid_t uid, const char *pkgid);
+
+ void process_all(void);
+ void process_queue(void);
+ bool process_app(app_t &app);
+ void process_buffer(void);
+ bool get_should_exit(void) const;
+
+ bool call_ui(const app_t &app);
+
+ static gboolean timeout_cb(gpointer data);
+
+ // main event loop data type
+ GMainLoop *m_loop;
+
+ Queue m_queue;
+ Certs m_certs;
+ DB::SqlQuery *m_sqlquery;
+ bool m_was_setup_called;
+
+ bool m_is_online;
+ // TODO: use m_queue for online events
+ bool m_is_online_enabled;
+ bool m_should_exit;
+ static std::atomic<bool> m_is_first_run;
+
+ GDBusProxy *m_proxy_connman;
+
+ // about pkgmgr event
+ int m_reqid_install;
+ int m_reqid_uninstall;
+ std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)> m_pc_install;
+ std::unique_ptr<pkgmgrinfo_client, int(*)(pkgmgrinfo_client *)> m_pc_uninstall;
};
} // namespace CCHECKER
diff --git a/src/service/ocsp-service.cpp b/src/service/ocsp-service.cpp
index 5d6997d..398deb2 100644
--- a/src/service/ocsp-service.cpp
+++ b/src/service/ocsp-service.cpp
@@ -33,7 +33,7 @@ OcspService::OcspService(const std::string &address) :
OcspService::~OcspService()
{
- if(m_thread.joinable())
+ if (m_thread.joinable())
m_thread.join();
}
@@ -46,13 +46,12 @@ void OcspService::run(void)
void OcspService::onMessageProcess(const ConnShPtr &connection)
{
LogDebug("Start to process message on ocsp service.");
-
auto in = connection->receive();
connection->send(this->process(connection, in));
// Run gmainloop for event listening.
- if(!m_logic.is_running())
- m_thread = std::thread(&OcspService::run,this);
+ if (!m_logic.is_running())
+ m_thread = std::thread(&OcspService::run, this);
LogDebug("Finish processing message on ocsp service.");
}
@@ -61,11 +60,10 @@ RawBuffer OcspService::process(const ConnShPtr &, RawBuffer &data)
{
BinaryQueue q;
q.push(data);
-
CommandId cid;
q.Deserialize(cid);
-
LogInfo("Request dispatch on ocsp-service.");
+
switch (cid) {
case CommandId::CC_OCSP_SYN: {
if (m_logic.setup() != NO_ERROR) {
@@ -76,6 +74,7 @@ RawBuffer OcspService::process(const ConnShPtr &, RawBuffer &data)
LogDebug("Success to receive SYN and setup. reply ACK cmd.");
return BinaryQueue::Serialize(CommandId::CC_OCSP_ACK).pop();
}
+
case CommandId::CC_OCSP_ACK:
default:
throw std::logic_error("Protocol error. unknown command id.");
diff --git a/src/service/queue.cpp b/src/service/queue.cpp
index 1ae4f1b..06f6268 100644
--- a/src/service/queue.cpp
+++ b/src/service/queue.cpp
@@ -27,35 +27,36 @@
namespace CCHECKER {
event_t::event_t():
- event_type(event_type_t::EVENT_TYPE_UNKNOWN),
- app()
+ event_type(event_type_t::EVENT_TYPE_UNKNOWN),
+ app()
{}
event_t::event_t(const app_t &app, event_type_t type):
- event_type(type),
- app(app)
+ event_type(type),
+ app(app)
{}
void Queue::push_event(const event_t &event)
{
- std::lock_guard<std::mutex> lock(m_mutex);
- m_event_list.push(event);
+ std::lock_guard<std::mutex> lock(m_mutex);
+ m_event_list.push(event);
}
bool Queue::pop_event(event_t &event)
{
- std::lock_guard<std::mutex> lock(m_mutex);
- if (m_event_list.empty())
- return false;
+ std::lock_guard<std::mutex> lock(m_mutex);
- event = std::move(m_event_list.front());
- m_event_list.pop();
- return true;
+ if (m_event_list.empty())
+ return false;
+
+ event = std::move(m_event_list.front());
+ m_event_list.pop();
+ return true;
}
bool Queue::empty()
{
- return m_event_list.empty();
+ return m_event_list.empty();
}
} //CCHECKER
diff --git a/src/service/queue.h b/src/service/queue.h
index 9c3eaae..c5ec0d9 100644
--- a/src/service/queue.h
+++ b/src/service/queue.h
@@ -31,28 +31,28 @@
namespace CCHECKER {
struct event_t {
- enum class event_type_t {
- APP_INSTALL,
- APP_UNINSTALL,
- EVENT_TYPE_UNKNOWN
- };
+ enum class event_type_t {
+ APP_INSTALL,
+ APP_UNINSTALL,
+ EVENT_TYPE_UNKNOWN
+ };
- event_type_t event_type;
- app_t app;
+ event_type_t event_type;
+ app_t app;
- event_t();
- event_t(const app_t &app, event_type_t type);
+ event_t();
+ event_t(const app_t &app, event_type_t type);
};
class Queue {
- public:
- void push_event(const event_t &event);
- bool pop_event(event_t &event);
- bool empty();
-
- private:
- std::mutex m_mutex;
- std::queue<event_t> m_event_list;
+public:
+ void push_event(const event_t &event);
+ bool pop_event(event_t &event);
+ bool empty();
+
+private:
+ std::mutex m_mutex;
+ std::queue<event_t> m_event_list;
};
} // CCHECKER
diff --git a/src/ui/UIBackend.cpp b/src/ui/UIBackend.cpp
index bb15e34..3bd0663 100644
--- a/src/ui/UIBackend.cpp
+++ b/src/ui/UIBackend.cpp
@@ -29,7 +29,7 @@ namespace CCHECKER {
namespace UI {
UIBackend::UIBackend(int timeout) :
- m_responseTimeout(timeout)
+ m_responseTimeout(timeout)
{}
UIBackend::~UIBackend()
@@ -37,34 +37,35 @@ UIBackend::~UIBackend()
response_e UIBackend::run(const app_t &app)
{
- return run_popup(app, m_responseTimeout);
+ return run_popup(app, m_responseTimeout);
}
bool UIBackend::call_popup(const app_t &app)
{
- response_e resp;
+ response_e resp;
+ resp = run(app);
+ LogDebug(app.str() << " response: " << resp);
- resp = run(app);
- LogDebug(app.str() << " response: " << resp);
- if (resp == response_e::RESPONSE_ERROR) {
- return false;
- }
+ if (resp == response_e::RESPONSE_ERROR) {
+ return false;
+ } else if (resp == response_e::UNINSTALL) {
+ app_control_h service = NULL;
+ int result = 0;
+ result = app_control_create(&service);
- else if (resp == response_e::UNINSTALL) {
- app_control_h service = NULL;
- int result = 0;
- result = app_control_create(&service);
- if (!service || result != APP_CONTROL_ERROR_NONE) {
- return false;
- }
- app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
- app_control_set_app_id(service, "setting-manage-applications-efl");
- app_control_add_extra_data(service, "viewtype", "application-info");
- app_control_add_extra_data(service, "pkgname", app.pkg_id.c_str());
- app_control_send_launch_request(service, NULL, NULL);
- app_control_destroy(service);
- }
- return true;
+ if (!service || result != APP_CONTROL_ERROR_NONE) {
+ return false;
+ }
+
+ app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
+ app_control_set_app_id(service, "setting-manage-applications-efl");
+ app_control_add_extra_data(service, "viewtype", "application-info");
+ app_control_add_extra_data(service, "pkgname", app.pkg_id.c_str());
+ app_control_send_launch_request(service, NULL, NULL);
+ app_control_destroy(service);
+ }
+
+ return true;
}
} // UI
diff --git a/src/ui/popup-bin/popup.cpp b/src/ui/popup-bin/popup.cpp
index b9381af..b3256b1 100644
--- a/src/ui/popup-bin/popup.cpp
+++ b/src/ui/popup-bin/popup.cpp
@@ -41,171 +41,162 @@ using namespace CCHECKER::UI;
namespace { // anonymous
-void on_done(void) {
- // Quit the efl-mainloop
- LogDebug("elm_exit()");
- elm_exit();
+void on_done(void)
+{
+ // Quit the efl-mainloop
+ LogDebug("elm_exit()");
+ elm_exit();
}
-void keep_answer(void *data, Evas_Object * /* obj */, void * /* event_info */) {
+void keep_answer(void *data, Evas_Object * /* obj */, void * /* event_info */)
+{
+ LogDebug("keep_answer");
+
+ if (NULL == data) {
+ LogError("data is NULL; return");
+ return;
+ }
- LogDebug("keep_answer");
- if(NULL == data){
- LogError("data is NULL; return");
- return;
- }
- struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *> (data);
- pdp->result = response_e::DONT_UNINSTALL;
+ struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *>(data);
- on_done();
+ pdp->result = response_e::DONT_UNINSTALL;
+
+ on_done();
}
-void uninstall_answer(void *data, Evas_Object * /* obj */, void * /* event_info */) {
+void uninstall_answer(void *data, Evas_Object * /* obj */, void * /* event_info */)
+{
+ LogDebug("uninstall_answer");
- LogDebug("uninstall_answer");
- if(NULL == data){
- LogError("data is NULL; return");
- return;
- }
- struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *> (data);
- pdp->result = response_e::UNINSTALL;
+ if (NULL == data) {
+ LogError("data is NULL; return");
+ return;
+ }
- on_done();
-}
+ struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *>(data);
-void show_popup(struct cert_checker_popup_data *pdp) {
- LogDebug("show_popup()");
-
- if(NULL == pdp){
- LogError("pdp is NULL; return");
- return;
- }
-
- pdp->win = elm_win_add(NULL,
- dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED"),
- ELM_WIN_NOTIFICATION);
-
- elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
- elm_win_autodel_set(pdp->win, EINA_TRUE);
- evas_object_show(pdp->win);
- elm_win_indicator_opacity_set(pdp->win, ELM_WIN_INDICATOR_TRANSLUCENT);
-
- pdp->popup = elm_popup_add(pdp->win);
-
- pdp->box = elm_box_add(pdp->popup);
- evas_object_size_hint_weight_set(pdp->box, EVAS_HINT_EXPAND, 0);
- evas_object_size_hint_align_set(pdp->box, EVAS_HINT_FILL, 0.0);
-
- pdp->title = elm_label_add(pdp->popup);
- elm_object_style_set(pdp->title, "elm.text.title");
- elm_object_text_set(pdp->title, dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED"));
- evas_object_show(pdp->title);
- elm_box_pack_end(pdp->box, pdp->title);
-
- pdp->content = elm_label_add(pdp->popup);
- elm_object_style_set(pdp->content, "elm.swallow.content");
- elm_label_line_wrap_set(pdp->content, ELM_WRAP_MIXED);
-
- char *buff = NULL;
- int ret;
-
- // Set message
- // App ID may be absent, so in that case we need to use only package ID
- if (pdp->app_id == std::string(CCHECKER::TEMP_APP_ID)) {
- char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_PACKAGE VERIFICATION_FAILED");
- ret = asprintf(&buff, content, pdp->pkg_id.c_str());
- }
- else {
- char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_VERIFICATION_FAILED");
- ret = asprintf(&buff, content, pdp->app_id.c_str(), pdp->pkg_id.c_str());
- }
-
- if(-1 == ret){
- LogError("asprintf failed - returned -1");
- evas_object_del(pdp->content);
- evas_object_del(pdp->popup);
- evas_object_del(pdp->win);
- return;
- }
- elm_object_text_set(pdp->content, buff);
- LogDebug("Popup label: " << buff);
- free(buff);
- evas_object_size_hint_weight_set(pdp->content, EVAS_HINT_EXPAND, 0.0);
- evas_object_size_hint_align_set(pdp->content, EVAS_HINT_FILL, EVAS_HINT_FILL);
- evas_object_show(pdp->content);
- elm_box_pack_end(pdp->box, pdp->content);
-
- elm_object_part_content_set(pdp->popup, "default", pdp->box);
-
- pdp->keep_button = elm_button_add(pdp->popup);
- elm_object_style_set(pdp->keep_button, "elm.swallow.content.button1");
- elm_object_text_set(pdp->keep_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_KEEP_APP"));
- elm_object_part_content_set(pdp->popup, "button1", pdp->keep_button);
- evas_object_smart_callback_add(pdp->keep_button, "clicked", keep_answer, pdp);
-
- pdp->uninstall_button = elm_button_add(pdp->popup);
- elm_object_style_set(pdp->uninstall_button, "elm.swallow.content.button2");
- elm_object_text_set(pdp->uninstall_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_UNINSTALL_APP"));
- elm_object_part_content_set(pdp->popup, "button2 ", pdp->uninstall_button);
- evas_object_smart_callback_add(pdp->uninstall_button, "clicked", uninstall_answer, pdp);
-
- evas_object_show(pdp->popup);
-
- // Showing the popup window
- evas_object_show(pdp->win);
-
- // Run the efl mainloop
- elm_run();
-
- // Shutdown elementary
- LogDebug("elm_shutdown()");
- elm_shutdown();
+ pdp->result = response_e::UNINSTALL;
+
+ on_done();
}
-static int wait_for_parent_info (int pipe_in)
+void show_popup(struct cert_checker_popup_data *pdp)
{
- // wait for parameters from pipe_in
- // timeout is set for 10 seconds
- struct timeval timeout = {10L, 0L};
- fd_set readfds;
- FD_ZERO(&readfds);
- FD_SET(pipe_in, &readfds);
-
- int sel = select(pipe_in + 1, &readfds, NULL, NULL, &timeout);
- if (sel == -1) {
- int error = errno;
- LogError("Cannot get info from parent. Exit popup");
- LogError("Error: " << CCHECKER::GetErrnoString(error));
- close(pipe_in);
- return -1;
- }
- else if (sel == 0) {
- LogError("Timeout reached! Exit popup - ERROR");
- close(pipe_in);
- return -1;
- }
- return 0;
+ LogDebug("show_popup()");
+
+ if (NULL == pdp) {
+ LogError("pdp is NULL; return");
+ return;
+ }
+
+ pdp->win = elm_win_add(NULL,
+ dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED"),
+ ELM_WIN_NOTIFICATION);
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+ elm_win_autodel_set(pdp->win, EINA_TRUE);
+ evas_object_show(pdp->win);
+ elm_win_indicator_opacity_set(pdp->win, ELM_WIN_INDICATOR_TRANSLUCENT);
+ pdp->popup = elm_popup_add(pdp->win);
+ pdp->box = elm_box_add(pdp->popup);
+ evas_object_size_hint_weight_set(pdp->box, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(pdp->box, EVAS_HINT_FILL, 0.0);
+ pdp->title = elm_label_add(pdp->popup);
+ elm_object_style_set(pdp->title, "elm.text.title");
+ elm_object_text_set(pdp->title, dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED"));
+ evas_object_show(pdp->title);
+ elm_box_pack_end(pdp->box, pdp->title);
+ pdp->content = elm_label_add(pdp->popup);
+ elm_object_style_set(pdp->content, "elm.swallow.content");
+ elm_label_line_wrap_set(pdp->content, ELM_WRAP_MIXED);
+ char *buff = NULL;
+ int ret;
+
+ // Set message
+ // App ID may be absent, so in that case we need to use only package ID
+ if (pdp->app_id == std::string(CCHECKER::TEMP_APP_ID)) {
+ char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_PACKAGE VERIFICATION_FAILED");
+ ret = asprintf(&buff, content, pdp->pkg_id.c_str());
+ } else {
+ char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_VERIFICATION_FAILED");
+ ret = asprintf(&buff, content, pdp->app_id.c_str(), pdp->pkg_id.c_str());
+ }
+
+ if (-1 == ret) {
+ LogError("asprintf failed - returned -1");
+ evas_object_del(pdp->content);
+ evas_object_del(pdp->popup);
+ evas_object_del(pdp->win);
+ return;
+ }
+
+ elm_object_text_set(pdp->content, buff);
+ LogDebug("Popup label: " << buff);
+ free(buff);
+ evas_object_size_hint_weight_set(pdp->content, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pdp->content, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(pdp->content);
+ elm_box_pack_end(pdp->box, pdp->content);
+ elm_object_part_content_set(pdp->popup, "default", pdp->box);
+ pdp->keep_button = elm_button_add(pdp->popup);
+ elm_object_style_set(pdp->keep_button, "elm.swallow.content.button1");
+ elm_object_text_set(pdp->keep_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_KEEP_APP"));
+ elm_object_part_content_set(pdp->popup, "button1", pdp->keep_button);
+ evas_object_smart_callback_add(pdp->keep_button, "clicked", keep_answer, pdp);
+ pdp->uninstall_button = elm_button_add(pdp->popup);
+ elm_object_style_set(pdp->uninstall_button, "elm.swallow.content.button2");
+ elm_object_text_set(pdp->uninstall_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_UNINSTALL_APP"));
+ elm_object_part_content_set(pdp->popup, "button2 ", pdp->uninstall_button);
+ evas_object_smart_callback_add(pdp->uninstall_button, "clicked", uninstall_answer, pdp);
+ evas_object_show(pdp->popup);
+ // Showing the popup window
+ evas_object_show(pdp->win);
+ // Run the efl mainloop
+ elm_run();
+ // Shutdown elementary
+ LogDebug("elm_shutdown()");
+ elm_shutdown();
}
-void deserialize (cert_checker_popup_data *pdp, char *line, ssize_t line_length)
+static int wait_for_parent_info(int pipe_in)
{
- BinaryStream stream;
- stream.Write(line_length, static_cast <void *> (line));
-
- std::string app_id;
- std::string pkg_id;
-
- LogDebug("------- Deserialization -------");
- // Deserialization order:
- // app_id, pkg_id
-
- CCHECKER::Deserialization::Deserialize(stream, app_id);
- LogDebug("app_id : " << app_id.c_str());
- pdp->app_id = app_id.c_str();
+ // wait for parameters from pipe_in
+ // timeout is set for 10 seconds
+ struct timeval timeout = {10L, 0L};
+ fd_set readfds;
+ FD_ZERO(&readfds);
+ FD_SET(pipe_in, &readfds);
+ int sel = select(pipe_in + 1, &readfds, NULL, NULL, &timeout);
+
+ if (sel == -1) {
+ int error = errno;
+ LogError("Cannot get info from parent. Exit popup");
+ LogError("Error: " << CCHECKER::GetErrnoString(error));
+ close(pipe_in);
+ return -1;
+ } else if (sel == 0) {
+ LogError("Timeout reached! Exit popup - ERROR");
+ close(pipe_in);
+ return -1;
+ }
+
+ return 0;
+}
- CCHECKER::Deserialization::Deserialize(stream, pkg_id);
- LogDebug("pkg_id : " << pkg_id.c_str());
- pdp->pkg_id = pkg_id.c_str();
+void deserialize(cert_checker_popup_data *pdp, char *line, ssize_t line_length)
+{
+ BinaryStream stream;
+ stream.Write(line_length, static_cast <void *>(line));
+ std::string app_id;
+ std::string pkg_id;
+ LogDebug("------- Deserialization -------");
+ // Deserialization order:
+ // app_id, pkg_id
+ CCHECKER::Deserialization::Deserialize(stream, app_id);
+ LogDebug("app_id : " << app_id.c_str());
+ pdp->app_id = app_id.c_str();
+ CCHECKER::Deserialization::Deserialize(stream, pkg_id);
+ LogDebug("pkg_id : " << pkg_id.c_str());
+ pdp->pkg_id = pkg_id.c_str();
}
} // anonymous
@@ -213,88 +204,81 @@ void deserialize (cert_checker_popup_data *pdp, char *line, ssize_t line_length)
EAPI_MAIN int
elm_main(int argc, char **argv)
{
- // int pipe_in and int pipe_out should be passed to Popup via args.
-
- // These parameters should be passed to Popup via pipe_in:
- // std::string app_id
- // std::string pkg_id
-
- struct cert_checker_popup_data pd;
- struct cert_checker_popup_data *pdp = &pd;
-
- LogDebug("############################ popup binary ################################");
-
- setlocale(LC_ALL, "");
-
- if(argc < 3){
- LogError("To few args passed in exec to popup-bin - should be at least 3:");
- LogError("(binary-name, pipe_in, pipe_out)");
- LogError("return ERROR");
- return popup_status::EXIT_ERROR;
- }
-
- LogDebug("Passed args: " << argv[0] <<", " << argv[1] << ", " << argv[2]);
-
- int pipe_in;
- int pipe_out;
-
- // Parsing args (pipe_in, pipe_out)
- if ( 0 == sscanf(argv[1], "%d", &pipe_in) ){
- LogError("Error while parsing pipe_in; return ERROR");
- return popup_status::EXIT_ERROR;
- }
- if ( 0 == sscanf(argv[2], "%d", &pipe_out) ){
- LogError("Error while parsing pipe_out; return ERROR");
- return popup_status::EXIT_ERROR;
- }
- LogDebug("Parsed pipes: IN: " << pipe_in <<", OUT: " << pipe_out);
-
- if (wait_for_parent_info(pipe_in) == -1) {
- close(pipe_out);
- return popup_status::EXIT_ERROR;
- }
-
- int buff_size = 1024;
- char line[buff_size];
-
- ssize_t count = 0;
-
- do {
- count = TEMP_FAILURE_RETRY(read(pipe_in, line, buff_size));
- } while (0 == count);
- if(count < 0){
- int error = errno;
- close(pipe_in);
- close(pipe_out);
- LogError("read returned a negative value (" << count <<")");
- LogError("error: " << CCHECKER::GetErrnoString(error));
- LogError("Exit popup - ERROR");
- return popup_status::EXIT_ERROR;
- }
- LogDebug("Read bytes : " << count);
- close(pipe_in); // cleanup
-
- deserialize(pdp, line, count);
-
- pdp->result = response_e::RESPONSE_ERROR;
-
- show_popup(pdp); // Showing popup
-
- // sending validation_result to popup-runner
- BinaryStream stream_out;
-
- LogDebug("pdp->result : " << pdp->result);
- CCHECKER::Serialization::Serialize(stream_out, pdp->result);
- if(-1 == TEMP_FAILURE_RETRY(write(pipe_out, stream_out.char_pointer(), stream_out.size()))){
- LogError("Write to pipe failed!");
- close(pipe_out);
- return popup_status::EXIT_ERROR;
- }
-
- close(pipe_out);
-
- LogDebug("############################ /popup binary ################################");
- LogDebug("Return: " << popup_status::NO_ERROR);
- return popup_status::NO_ERROR;
+ // int pipe_in and int pipe_out should be passed to Popup via args.
+ // These parameters should be passed to Popup via pipe_in:
+ // std::string app_id
+ // std::string pkg_id
+ struct cert_checker_popup_data pd;
+ struct cert_checker_popup_data *pdp = &pd;
+ LogDebug("############################ popup binary ################################");
+ setlocale(LC_ALL, "");
+
+ if (argc < 3) {
+ LogError("To few args passed in exec to popup-bin - should be at least 3:");
+ LogError("(binary-name, pipe_in, pipe_out)");
+ LogError("return ERROR");
+ return popup_status::EXIT_ERROR;
+ }
+
+ LogDebug("Passed args: " << argv[0] << ", " << argv[1] << ", " << argv[2]);
+ int pipe_in;
+ int pipe_out;
+
+ // Parsing args (pipe_in, pipe_out)
+ if (0 == sscanf(argv[1], "%d", &pipe_in)) {
+ LogError("Error while parsing pipe_in; return ERROR");
+ return popup_status::EXIT_ERROR;
+ }
+
+ if (0 == sscanf(argv[2], "%d", &pipe_out)) {
+ LogError("Error while parsing pipe_out; return ERROR");
+ return popup_status::EXIT_ERROR;
+ }
+
+ LogDebug("Parsed pipes: IN: " << pipe_in << ", OUT: " << pipe_out);
+
+ if (wait_for_parent_info(pipe_in) == -1) {
+ close(pipe_out);
+ return popup_status::EXIT_ERROR;
+ }
+
+ int buff_size = 1024;
+ char line[buff_size];
+ ssize_t count = 0;
+
+ do {
+ count = TEMP_FAILURE_RETRY(read(pipe_in, line, buff_size));
+ } while (0 == count);
+
+ if (count < 0) {
+ int error = errno;
+ close(pipe_in);
+ close(pipe_out);
+ LogError("read returned a negative value (" << count << ")");
+ LogError("error: " << CCHECKER::GetErrnoString(error));
+ LogError("Exit popup - ERROR");
+ return popup_status::EXIT_ERROR;
+ }
+
+ LogDebug("Read bytes : " << count);
+ close(pipe_in); // cleanup
+ deserialize(pdp, line, count);
+ pdp->result = response_e::RESPONSE_ERROR;
+ show_popup(pdp); // Showing popup
+ // sending validation_result to popup-runner
+ BinaryStream stream_out;
+ LogDebug("pdp->result : " << pdp->result);
+ CCHECKER::Serialization::Serialize(stream_out, pdp->result);
+
+ if (-1 == TEMP_FAILURE_RETRY(write(pipe_out, stream_out.char_pointer(), stream_out.size()))) {
+ LogError("Write to pipe failed!");
+ close(pipe_out);
+ return popup_status::EXIT_ERROR;
+ }
+
+ close(pipe_out);
+ LogDebug("############################ /popup binary ################################");
+ LogDebug("Return: " << popup_status::NO_ERROR);
+ return popup_status::NO_ERROR;
}
ELM_MAIN()
diff --git a/src/ui/popup-bin/popup.h b/src/ui/popup-bin/popup.h
index 4a5d32a..a9b88b4 100644
--- a/src/ui/popup-bin/popup.h
+++ b/src/ui/popup-bin/popup.h
@@ -24,15 +24,15 @@
#include <cchecker/UIBackend.h>
struct cert_checker_popup_data {
- std::string app_id;
- std::string pkg_id;
- CCHECKER::UI::response_e result;
+ std::string app_id;
+ std::string pkg_id;
+ CCHECKER::UI::response_e result;
- Evas_Object *popup = NULL;
- Evas_Object *win = NULL;
- Evas_Object *box = NULL;
- Evas_Object *title = NULL;
- Evas_Object *content = NULL;
- Evas_Object *keep_button = NULL;
- Evas_Object *uninstall_button = NULL;
+ Evas_Object *popup = NULL;
+ Evas_Object *win = NULL;
+ Evas_Object *box = NULL;
+ Evas_Object *title = NULL;
+ Evas_Object *content = NULL;
+ Evas_Object *keep_button = NULL;
+ Evas_Object *uninstall_button = NULL;
};
diff --git a/src/ui/popup-runner.cpp b/src/ui/popup-runner.cpp
index 31e3e8f..7c2eb2c 100644
--- a/src/ui/popup-runner.cpp
+++ b/src/ui/popup-runner.cpp
@@ -39,138 +39,136 @@ namespace { // anonymous
using namespace CCHECKER::UI;
-const char *POPUP_EXEC = tzplatform_mkpath(TZ_SYS_BIN, "cert-checker-popup"); // check-checker-popup binary
+const char *POPUP_EXEC = tzplatform_mkpath(TZ_SYS_BIN,
+ "cert-checker-popup"); // check-checker-popup binary
-std::string response_to_str (response_e response)
+std::string response_to_str(response_e response)
{
- switch (response) {
- case response_e::DONT_UNINSTALL:
- return "DONT_UNINSTALL";
- case response_e::UNINSTALL:
- return "UNINSTALL";
- default:
- return "RESPONSE_ERROR";
- }
+ switch (response) {
+ case response_e::DONT_UNINSTALL:
+ return "DONT_UNINSTALL";
+
+ case response_e::UNINSTALL:
+ return "UNINSTALL";
+
+ default:
+ return "RESPONSE_ERROR";
+ }
}
-int wait_for_popup (int popup_pid, int timeout)
+int wait_for_popup(int popup_pid, int timeout)
{
- int status;
- int ret;
-
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, SIGCHLD);
- sigprocmask(SIG_BLOCK, &set, NULL);
- siginfo_t info;
- struct timespec time = {timeout, 0L};
-
- if (timeout > 0)
- ret = TEMP_FAILURE_RETRY(sigtimedwait(&set, &info, &time));
- else
- ret = TEMP_FAILURE_RETRY(sigwaitinfo(&set, &info));
-
- sigprocmask(SIG_UNBLOCK, &set, NULL);
-
- if (ret == -1 && errno == EAGAIN) {
- LogError("POPUP TIMEOUT");
- goto err;
- }
- else if (ret == SIGCHLD && info.si_pid == popup_pid) {
- // call waitpid on the child process to get rid of zombie process
- waitpid(popup_pid, NULL, 0);
-
- // The proper signal has been caught and its pid matches to popup_pid
- // Now check the popup exit status
- status = WEXITSTATUS(info.si_status);
- LogDebug("STATUS EXIT ON POPUP (CHILD: " << info.si_pid << "): " << status);
-
- switch (static_cast<popup_status>(status)) {
-
- case popup_status::NO_ERROR:
- LogDebug("NO_ERROR");
- return 0;
-
- case popup_status::EXIT_ERROR:
- LogError("ERROR");
- return -1;
-
- default: // Unknown exit status
- LogError("UNKNOWN_ERROR");
- return -1;
- }
- }
- else {
- LogError("Some other signal has been caught (pid: " << info.si_pid << ", signal: " << info.si_signo << ")");
- goto err;
- }
+ int status;
+ int ret;
+ sigset_t set;
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &set, NULL);
+ siginfo_t info;
+ struct timespec time = {timeout, 0L};
+
+ if (timeout > 0)
+ ret = TEMP_FAILURE_RETRY(sigtimedwait(&set, &info, &time));
+ else
+ ret = TEMP_FAILURE_RETRY(sigwaitinfo(&set, &info));
+
+ sigprocmask(SIG_UNBLOCK, &set, NULL);
+
+ if (ret == -1 && errno == EAGAIN) {
+ LogError("POPUP TIMEOUT");
+ goto err;
+ } else if (ret == SIGCHLD && info.si_pid == popup_pid) {
+ // call waitpid on the child process to get rid of zombie process
+ waitpid(popup_pid, NULL, 0);
+ // The proper signal has been caught and its pid matches to popup_pid
+ // Now check the popup exit status
+ status = WEXITSTATUS(info.si_status);
+ LogDebug("STATUS EXIT ON POPUP (CHILD: " << info.si_pid << "): " << status);
+
+ switch (static_cast<popup_status>(status)) {
+ case popup_status::NO_ERROR:
+ LogDebug("NO_ERROR");
+ return 0;
+
+ case popup_status::EXIT_ERROR:
+ LogError("ERROR");
+ return -1;
+
+ default: // Unknown exit status
+ LogError("UNKNOWN_ERROR");
+ return -1;
+ }
+ } else {
+ LogError("Some other signal has been caught (pid: " << info.si_pid << ", signal: " << info.si_signo
+ << ")");
+ goto err;
+ }
err:
- // kill popup process and return error
- kill(popup_pid, SIGKILL);
-
- // call waitpid on the child process to get rid of zombie process
- waitpid(popup_pid, NULL, 0);
- return -1;
+ // kill popup process and return error
+ kill(popup_pid, SIGKILL);
+ // call waitpid on the child process to get rid of zombie process
+ waitpid(popup_pid, NULL, 0);
+ return -1;
}
-void child_process (int fd_send_to_child[2], int fd_send_to_parent[2])
+void child_process(int fd_send_to_child[2], int fd_send_to_parent[2])
{
- LogDebug("Child");
-
- // read data from parent
- close(fd_send_to_child[1]);
-
- // send data to parent
- close(fd_send_to_parent[0]);
+ LogDebug("Child");
+ // read data from parent
+ close(fd_send_to_child[1]);
+ // send data to parent
+ close(fd_send_to_parent[0]);
+ std::stringstream pipe_in_buff;
+ std::stringstream pipe_out_buff;
+ pipe_in_buff << fd_send_to_parent[1];
+ pipe_out_buff << fd_send_to_child[0];
+ std::string pipe_in = pipe_in_buff.str();
+ std::string pipe_out = pipe_out_buff.str();
+ LogDebug("Passed file descriptors: " << fd_send_to_child[0] << ", " << fd_send_to_parent[1]);
+
+ if (execl(POPUP_EXEC, POPUP_EXEC, pipe_out.c_str(), pipe_in.c_str(), NULL) < 0) {
+ LogError("execl FAILED");
+ }
+
+ LogError("This should not happen!!!");
+ _exit(response_e::RESPONSE_ERROR);
+}
- std::stringstream pipe_in_buff;
- std::stringstream pipe_out_buff;
- pipe_in_buff << fd_send_to_parent[1];
- pipe_out_buff << fd_send_to_child[0];
- std::string pipe_in = pipe_in_buff.str();
- std::string pipe_out = pipe_out_buff.str();
+int send_message_to_child(const BinaryStream &stream, int fd_send_to_child)
+{
+ LogDebug("Sending message to popup-bin process");
+ unsigned int begin = 0;
+ int tmp;
- LogDebug("Passed file descriptors: " << fd_send_to_child[0] << ", "<< fd_send_to_parent[1]);
+ while (begin < stream.size()) {
+ tmp = TEMP_FAILURE_RETRY(write(fd_send_to_child,
+ stream.char_pointer() + begin,
+ stream.size() - begin));
- if (execl(POPUP_EXEC, POPUP_EXEC, pipe_out.c_str(), pipe_in.c_str(), NULL) < 0){
- LogError("execl FAILED");
- }
+ if (-1 == tmp) {
+ LogError("Write to pipe failed!");
+ return -1;
+ }
- LogError("This should not happen!!!");
- _exit(response_e::RESPONSE_ERROR);
-}
+ begin += tmp;
+ }
-int send_message_to_child(const BinaryStream &stream, int fd_send_to_child)
-{
- LogDebug("Sending message to popup-bin process");
- unsigned int begin = 0;
- int tmp;
- while (begin < stream.size()) {
- tmp = TEMP_FAILURE_RETRY(write(fd_send_to_child,
- stream.char_pointer() + begin,
- stream.size() - begin));
- if(-1 == tmp){
- LogError("Write to pipe failed!");
- return -1;
- }
- begin += tmp;
- }
- LogDebug("Message has been sent");
- return 0;
+ LogDebug("Message has been sent");
+ return 0;
}
-response_e parse_response (int count, char *data)
+response_e parse_response(int count, char *data)
{
- LogDebug("RESULT FROM POPUP PIPE (CHILD) : [ " << count << " ]");
- int response_int;
- response_e response;
- BinaryStream stream_in;
- stream_in.Write(count, data);
- CCHECKER::Deserialization::Deserialize(stream_in, response_int);
- response = static_cast <response_e> (response_int);
- LogDebug("response :" << response_to_str(response));
- return response;
+ LogDebug("RESULT FROM POPUP PIPE (CHILD) : [ " << count << " ]");
+ int response_int;
+ response_e response;
+ BinaryStream stream_in;
+ stream_in.Write(count, data);
+ CCHECKER::Deserialization::Deserialize(stream_in, response_int);
+ response = static_cast <response_e>(response_int);
+ LogDebug("response :" << response_to_str(response));
+ return response;
}
} // anonymous namespace
@@ -179,124 +177,123 @@ namespace CCHECKER {
namespace UI {
// BinaryStream class implementation
-void BinaryStream::Read(size_t num, void * bytes)
+void BinaryStream::Read(size_t num, void *bytes)
{
- size_t max_size = m_data.size();
- for (size_t i = 0; i < num; ++i) {
- if( i + m_readPosition >= max_size){
- return;
- }
- static_cast <unsigned char*> (bytes)[i] = m_data[i + m_readPosition];
- }
- m_readPosition += num;
+ size_t max_size = m_data.size();
+
+ for (size_t i = 0; i < num; ++i) {
+ if (i + m_readPosition >= max_size) {
+ return;
+ }
+
+ static_cast <unsigned char *>(bytes)[i] = m_data[i + m_readPosition];
+ }
+
+ m_readPosition += num;
}
-void BinaryStream::Write(size_t num, const void * bytes)
+void BinaryStream::Write(size_t num, const void *bytes)
{
- for (size_t i = 0; i < num; ++i) {
- m_data.push_back(static_cast <const unsigned char*> (bytes)[i]);
- }
+ for (size_t i = 0; i < num; ++i) {
+ m_data.push_back(static_cast <const unsigned char *>(bytes)[i]);
+ }
}
BinaryStream::BinaryStream() :
- m_readPosition(0)
+ m_readPosition(0)
{}
BinaryStream::~BinaryStream() {}
-const unsigned char* BinaryStream::char_pointer() const
+const unsigned char *BinaryStream::char_pointer() const
{
- return &m_data[0];
+ return &m_data[0];
}
size_t BinaryStream::size() const
{
- return m_data.size();
+ return m_data.size();
}
// BinaryStream
response_e run_popup(
- const app_t &app,
- int timeout)
+ const app_t &app,
+ int timeout)
{
- LogDebug(app.str());
-
- // serialization
- BinaryStream stream;
- CCHECKER::Serialization::Serialize(stream, app.app_id);
- CCHECKER::Serialization::Serialize(stream, app.pkg_id);
-
- int fd_send_to_child[2];
- int fd_send_to_parent[2];
- pid_t childpid;
-
- if(0 != pipe(fd_send_to_child)){
- LogError("Cannot create pipes!");
- return response_e::RESPONSE_ERROR;
- }
- if(0 != pipe(fd_send_to_parent)){
- LogError("Cannot create pipes!");
- close(fd_send_to_child[0]);
- close(fd_send_to_child[1]);
- return response_e::RESPONSE_ERROR;
- }
-
- if ((childpid = fork()) == -1) {
- LogError("Fork() ERROR");
- close(fd_send_to_child[0]);
- close(fd_send_to_parent[1]);
- goto error;
- }
-
- if(childpid == 0) { // Child process
- child_process (fd_send_to_child, fd_send_to_parent);
- }
- else { // Parent process
- LogDebug("Parent (child pid: " << childpid << ")");
-
- // send data to child
- close(fd_send_to_child[0]);
-
- // read data from child
- close(fd_send_to_parent[1]);
-
- // writing to child
- if (send_message_to_child(stream, fd_send_to_child[1]))
- goto error;
-
- // wait for child
- if (wait_for_popup(childpid, timeout) != 0 )
- goto error;
-
- // Read message from popup (child)
- int buff_size = 1024;
- char result[buff_size];
- int count;
- count = TEMP_FAILURE_RETRY(read(fd_send_to_parent[0], result, buff_size));
-
- // Parsing response from child
- response_e response;
- if (0 < count)
- response = parse_response(count, result);
- else {
- LogDebug("ERROR, count = " << count);;
- goto error;
- }
-
- LogDebug("popup-runner: EXIT SUCCESS");
- // cleanup
- close(fd_send_to_parent[0]);
- close(fd_send_to_child[1]);
- return response;
- }
-
- LogError("This should not happen!!!");
+ LogDebug(app.str());
+ // serialization
+ BinaryStream stream;
+ CCHECKER::Serialization::Serialize(stream, app.app_id);
+ CCHECKER::Serialization::Serialize(stream, app.pkg_id);
+ int fd_send_to_child[2];
+ int fd_send_to_parent[2];
+ pid_t childpid;
+
+ if (0 != pipe(fd_send_to_child)) {
+ LogError("Cannot create pipes!");
+ return response_e::RESPONSE_ERROR;
+ }
+
+ if (0 != pipe(fd_send_to_parent)) {
+ LogError("Cannot create pipes!");
+ close(fd_send_to_child[0]);
+ close(fd_send_to_child[1]);
+ return response_e::RESPONSE_ERROR;
+ }
+
+ if ((childpid = fork()) == -1) {
+ LogError("Fork() ERROR");
+ close(fd_send_to_child[0]);
+ close(fd_send_to_parent[1]);
+ goto error;
+ }
+
+ if (childpid == 0) { // Child process
+ child_process(fd_send_to_child, fd_send_to_parent);
+ } else { // Parent process
+ LogDebug("Parent (child pid: " << childpid << ")");
+ // send data to child
+ close(fd_send_to_child[0]);
+ // read data from child
+ close(fd_send_to_parent[1]);
+
+ // writing to child
+ if (send_message_to_child(stream, fd_send_to_child[1]))
+ goto error;
+
+ // wait for child
+ if (wait_for_popup(childpid, timeout) != 0)
+ goto error;
+
+ // Read message from popup (child)
+ int buff_size = 1024;
+ char result[buff_size];
+ int count;
+ count = TEMP_FAILURE_RETRY(read(fd_send_to_parent[0], result, buff_size));
+ // Parsing response from child
+ response_e response;
+
+ if (0 < count) {
+ response = parse_response(count, result);
+ } else {
+ LogDebug("ERROR, count = " << count);;
+ goto error;
+ }
+
+ LogDebug("popup-runner: EXIT SUCCESS");
+ // cleanup
+ close(fd_send_to_parent[0]);
+ close(fd_send_to_child[1]);
+ return response;
+ }
+
+ LogError("This should not happen!!!");
error:
- // cleanup
- LogDebug("popup-runner: EXIT ERROR");
- close(fd_send_to_parent[0]);
- close(fd_send_to_child[1]);
- return response_e::RESPONSE_ERROR;
+ // cleanup
+ LogDebug("popup-runner: EXIT ERROR");
+ close(fd_send_to_parent[0]);
+ close(fd_send_to_child[1]);
+ return response_e::RESPONSE_ERROR;
}
} // UI