From e8dda4e6cd9cda1720b663f8fcecb607cfe8129e Mon Sep 17 00:00:00 2001
From: Nicolas Jager <nicolas.jager@savoirfairelinux.com>
Date: Mon, 21 Aug 2017 15:29:38 -0400
Subject: [PATCH] Add stubs and class diagram

add stubs for :
 - Database class.
 - ConversationModel class and Conversation namespace.
 - NewCallModel class and NewCall namespace.
 - ContactModel class and Contact namespace.
 - Message namespace.
 - NewAccountModel.
 - CallbacksHandler, will be used to bind the callbacks from the daemon
   and will emit signals for lrc and client.
 - Lrc class, this class is the root class of all models. Instating this
   class will build interfaces between the daemon, client and the
   database.
 - all these class are nested in the lrc namespace.
 - all publicly exposed API have been put into lrc::api namespace
 - add diagrams in doc folder

Change-Id: Ia06f874dd1baebb086edd570e52d8d61d73b905b
Reviewed-by: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Signed-off-by: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
---
 CMakeLists.txt              |  34 +++++-
 doc/Diagram1.dia            | Bin 0 -> 6958 bytes
 doc/Diagram2.dia            | Bin 0 -> 4597 bytes
 src/api/account.h           |  56 ++++++++++
 src/api/call.h              |  60 ++++++++++
 src/api/contact.h           |  52 +++++++++
 src/api/contactmodel.h      |  74 +++++++++++++
 src/api/conversation.h      |  51 +++++++++
 src/api/conversationmodel.h |  88 +++++++++++++++
 src/api/lrc.h               |  51 +++++++++
 src/api/message.h           |  60 ++++++++++
 src/api/newaccountmodel.h   |  59 ++++++++++
 src/api/newcallmodel.h      |  73 +++++++++++++
 src/callbackshandler.cpp    |  52 +++++++++
 src/callbackshandler.h      |  42 +++++++
 src/contactmodel.cpp        | 157 +++++++++++++++++++++++++++
 src/conversationmodel.cpp   | 211 ++++++++++++++++++++++++++++++++++++
 src/database.cpp            |  88 +++++++++++++++
 src/database.h              |  78 +++++++++++++
 src/lrc.cpp                 |  63 +++++++++++
 src/newaccountmodel.cpp     |  80 ++++++++++++++
 src/newcallmodel.cpp        | 127 ++++++++++++++++++++++
 22 files changed, 1554 insertions(+), 2 deletions(-)
 create mode 100644 doc/Diagram1.dia
 create mode 100644 doc/Diagram2.dia
 create mode 100644 src/api/account.h
 create mode 100644 src/api/call.h
 create mode 100644 src/api/contact.h
 create mode 100644 src/api/contactmodel.h
 create mode 100644 src/api/conversation.h
 create mode 100644 src/api/conversationmodel.h
 create mode 100644 src/api/lrc.h
 create mode 100644 src/api/message.h
 create mode 100644 src/api/newaccountmodel.h
 create mode 100644 src/api/newcallmodel.h
 create mode 100644 src/callbackshandler.cpp
 create mode 100644 src/callbackshandler.h
 create mode 100644 src/contactmodel.cpp
 create mode 100644 src/conversationmodel.cpp
 create mode 100644 src/database.cpp
 create mode 100644 src/database.h
 create mode 100644 src/lrc.cpp
 create mode 100644 src/newaccountmodel.cpp
 create mode 100644 src/newcallmodel.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7c6efcf6..81d89a18 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,7 @@ SET(QT5_MODULE_PATH ${QT5_PATH}/lib/cmake)
 FIND_PACKAGE(Ring REQUIRED)
 FIND_PACKAGE(Qt5Core REQUIRED)
 FIND_PACKAGE(Qt5LinguistTools) # translations
+FIND_PACKAGE(Qt5Sql REQUIRED)
 
 IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND NOT ENABLE_LIBWRAP)
    FIND_PACKAGE(Qt5DBus)
@@ -205,13 +206,13 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
 INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_BINARY_DIR})
 
-# Build dbus interfaces
+# Build dbus api
 IF(DEFINED RING_XML_INTERFACES_DIR)
     SET (dbus_xml_introspecs_path ${RING_XML_INTERFACES_DIR})
 ELSEIF(EXISTS "${RING_BUILD_DIR}/../bin/dbus")
     SET (dbus_xml_introspecs_path ${RING_BUILD_DIR}/../bin/dbus)
 ELSE()
-    SET (dbus_xml_introspecs_path ${CMAKE_INSTALL_PREFIX}/share/dbus-1/interfaces)
+    SET (dbus_xml_introspecs_path ${CMAKE_INSTALL_PREFIX}/share/dbus-1/api)
 ENDIF()
 
 #File to compile
@@ -293,6 +294,13 @@ SET( libringclient_LIB_SRCS
   src/audio/settings.cpp
   src/media/recordingmodel.cpp
   src/bannedcontactmodel.cpp
+  src/contactmodel.cpp
+  src/newcallmodel.cpp
+  src/conversationmodel.cpp
+  src/database.cpp
+  src/lrc.cpp
+  src/newaccountmodel.cpp
+  src/callbackshandler.cpp
 
   #Data collections
   src/transitionalpersonbackend.cpp
@@ -446,6 +454,20 @@ SET( libringclient_LIB_HDRS
   src/bannedcontactmodel.h
 )
 
+SET(libringclient_api_LIB_HDRS
+  src/api/message.h
+  src/api/conversation.h
+  src/api/contact.h
+  src/api/call.h
+  src/api/account.h
+  src/api/lrc.h
+  src/api/newaccountmodel.h
+  src/api/newcallmodel.h
+  src/api/contactmodel.h
+  src/api/conversationmodel.h
+)
+
+
 SET(libringclient_video_LIB_HDRS
   src/video/device.h
   src/video/devicemodel.h
@@ -637,6 +659,7 @@ IF(NOT ${ENABLE_STATIC} MATCHES false)
       -lpthread
       ${QT_QTDBUS_LIBRARY}
       ${QT_QTCORE_LIBRARY}
+      Qt5::Sql
       )
    SET_TARGET_PROPERTIES( ringclient_static
       PROPERTIES VERSION ${GENERIC_LIB_VERSION}
@@ -661,6 +684,7 @@ ENDIF()
 TARGET_LINK_LIBRARIES( ringclient
    -lpthread
    ${QT_QTCORE_LIBRARY}
+   Qt5::Sql
 )
 
 IF(${ENABLE_LIBWRAP} MATCHES true)
@@ -736,6 +760,12 @@ INSTALL( FILES ${libringclient_interface_LIB_HDRS}
   COMPONENT Devel
 )
 
+INSTALL( FILES ${libringclient_api_LIB_HDRS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient/api
+  COMPONENT Devel
+)
+
+
 #This hack force Debian based system to return a non multi-arch path
 #this is required to prevent the .deb libringclient.so from having an
 #higher priority than the prefixed one.
diff --git a/doc/Diagram1.dia b/doc/Diagram1.dia
new file mode 100644
index 0000000000000000000000000000000000000000..7cf3e1844f468be4caaa64d3b2309b2b7b5b87d1
GIT binary patch
literal 6958
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

literal 0
HcmV?d00001

diff --git a/doc/Diagram2.dia b/doc/Diagram2.dia
new file mode 100644
index 0000000000000000000000000000000000000000..dba8decb55f0c3d4da6b2129dcf1588921389394
GIT binary patch
literal 4597
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

literal 0
HcmV?d00001

diff --git a/src/api/account.h b/src/api/account.h
new file mode 100644
index 00000000..6742433f
--- /dev/null
+++ b/src/api/account.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+#include <string>
+#include <memory>
+
+namespace lrc
+{
+
+namespace api
+{
+
+class NewCallModel;
+class ContactModel;
+class ConversationModel;
+class NewAccountModel;
+
+namespace account
+{
+
+enum class Type {
+    INVALID,
+    RING,
+    SIP
+};
+
+struct Info
+{
+    std::string id;
+    Type type = account::Type::INVALID;
+    std::unique_ptr<lrc::api::NewCallModel> callModel;
+    std::unique_ptr<lrc::api::ContactModel> contactModel;
+    std::unique_ptr<lrc::api::ConversationModel> conversationModel;
+    std::unique_ptr<lrc::api::NewAccountModel> accountModel;
+};
+
+} // namespace account
+} // namespace api
+} // namespace lrc
diff --git a/src/api/call.h b/src/api/call.h
new file mode 100644
index 00000000..35dd998d
--- /dev/null
+++ b/src/api/call.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// std
+#include <string>
+#include <ctime>
+
+namespace lrc
+{
+
+namespace api
+{
+
+namespace call
+{
+
+enum class Status {
+    INVALID,
+    OUTGOING_REQUESTED,
+    INCOMING_RINGING,
+    OUTGOING_RINGING,
+    CONNECTING,
+    SEARCHING,
+    IN_PROGRESS,
+    PAUSED,
+    PEER_PAUSED,
+    INACTIVE,
+    ENDED,
+    TERMINATING,
+    CONNECTED,
+    AUTO_ANSWERING
+};
+
+struct Info
+{
+    std::string id;
+    std::time_t startTime = 0;
+    Status status = Status::INVALID;
+};
+
+} // namespace call
+} // namespace api
+} // namespace lrc
diff --git a/src/api/contact.h b/src/api/contact.h
new file mode 100644
index 00000000..7cb65363
--- /dev/null
+++ b/src/api/contact.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <string>
+
+namespace lrc
+{
+
+namespace api
+{
+
+namespace contact
+{
+
+enum class Type {
+    INVALID,
+    RING,
+    SIP
+};
+
+struct Info
+{
+    std::string uri;
+    std::string avatar;
+    std::string registeredName;
+    std::string alias;
+    bool isTrusted = false;
+    bool isPresent = false;
+    Type type = Type::INVALID;
+};
+
+} // namespace contact
+} // namespace api
+} // namespace lrc
diff --git a/src/api/contactmodel.h b/src/api/contactmodel.h
new file mode 100644
index 00000000..d11d46df
--- /dev/null
+++ b/src/api/contactmodel.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <string>
+#include <memory>
+#include <map>
+
+// Qt
+#include <qobject.h>
+
+// LRC
+#include "typedefs.h"
+
+namespace lrc
+{
+
+class Database;
+class ContactModelPimpl;
+
+namespace api
+{
+
+namespace contact { struct Info; }
+namespace account { struct Info; }
+class NewAccountModel;
+class ConversationModel;
+
+class LIB_EXPORT ContactModel : public QObject {
+    Q_OBJECT
+public:
+    using ContactInfoMap = std::map<std::string, std::shared_ptr<contact::Info>>;
+
+    const account::Info& owner;
+
+    ContactModel(NewAccountModel& parent,
+                 const Database& database,
+                 const account::Info& info);
+    ~ContactModel();
+
+    const contact::Info& getContact(const std::string& uri) const;
+    const ContactInfoMap& getAllContacts() const;
+    void addContact(const std::string& uri);
+    void removeContact(const std::string& uri);
+    void nameLookup(const std::string& uri) const;
+    void addressLookup(const std::string& name) const;
+
+Q_SIGNALS:
+    void contactsChanged();
+
+private:
+    std::unique_ptr<ContactModelPimpl> pimpl_;
+
+};
+
+} // namespace api
+} // namespace lrc
diff --git a/src/api/conversation.h b/src/api/conversation.h
new file mode 100644
index 00000000..90b195ee
--- /dev/null
+++ b/src/api/conversation.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <vector>
+#include <map>
+
+// Data
+#include "message.h"
+
+namespace lrc
+{
+
+namespace api
+{
+
+namespace conversation
+{
+
+struct Info
+{
+    std::string uid;
+    std::string accountId;
+    std::vector<std::string> participants;
+    std::string callId;
+    std::map<int, message::Info> messages;
+    unsigned int lastMessageUid = 0;
+    bool isUsed = false;
+    unsigned int unreadMessages = 0;
+};
+
+} // namespace conversation
+} // namespace api
+} // namespace lrc
diff --git a/src/api/conversationmodel.h b/src/api/conversationmodel.h
new file mode 100644
index 00000000..8f58d347
--- /dev/null
+++ b/src/api/conversationmodel.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <memory>
+#include <map>
+#include <string>
+#include <deque>
+
+// Qt
+#include <qobject.h>
+
+// Lrc
+#include "typedefs.h"
+
+// Data
+#include "api/conversation.h"
+
+namespace lrc
+{
+
+class Database;
+class ConversationModelPimpl;
+
+namespace api
+{
+
+namespace account { struct Info; }
+namespace message { struct Info; }
+class NewAccountModel;
+
+class LIB_EXPORT ConversationModel : public QObject {
+    Q_OBJECT
+public:
+    using ConversationQueue = std::deque<conversation::Info>;
+
+    const account::Info& owner;
+
+    ConversationModel(const NewAccountModel& parent,
+                      const Database& database,
+                      const account::Info& info);
+    ~ConversationModel();
+
+    const ConversationQueue& getFilteredConversations() const;
+    conversation::Info getConversation(unsigned int row) const;
+    void addConversation(const std::string& uri) const;
+    void removeConversation(const std::string& uid);
+    void selectConversation(const std::string& uid);
+    void placeCall(const std::string& uid) const;
+    void sendMessage(const std::string& uid, const std::string& body) const;
+    void setFilter(const std::string& filter);
+    void addParticipant(const std::string& uid, const::std::string& uri);
+    void clearHistory(const std::string& uid);
+
+Q_SIGNALS:
+    void newMessageAdded(const std::string& uid, const message::Info& msg);
+    void conversationUpdated(unsigned int row);
+    void modelUpdated() const;
+    void newContactAdded(const std::string& uri);
+    void incomingCallFromItem(const unsigned int row);
+
+    void showChatView(const conversation::Info& conversationInfo);
+    void showCallView(const conversation::Info& conversationInfo);
+    void showIncomingCallView(const conversation::Info& conversationInfo);
+
+private:
+    std::unique_ptr<ConversationModelPimpl> pimpl_;
+};
+
+} // namespace api
+} // namespace lrc
diff --git a/src/api/lrc.h b/src/api/lrc.h
new file mode 100644
index 00000000..67b7a50b
--- /dev/null
+++ b/src/api/lrc.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <memory>
+
+// Lrc
+#include "typedefs.h"
+
+namespace lrc
+{
+
+class Database;
+class CallbacksHandler;
+class LrcPimpl;
+
+namespace api
+{
+
+class NewAccountModel;
+
+class LIB_EXPORT Lrc {
+public:
+    Lrc();
+    ~Lrc();
+
+    NewAccountModel& getAccountModel();
+
+private:
+    std::unique_ptr<LrcPimpl> lrcPipmpl_;
+};
+
+} // namespace api
+} // namespace lrc
diff --git a/src/api/message.h b/src/api/message.h
new file mode 100644
index 00000000..be99b91d
--- /dev/null
+++ b/src/api/message.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// std
+#include <ctime>
+#include <string>
+
+namespace lrc
+{
+
+namespace api
+{
+
+namespace message
+{
+
+enum class Type {
+    INVALID,
+    TEXT,
+    CALL,
+    CONTACT
+};
+
+enum class Status {
+    INVALID,
+    SENDING,
+    FAILED,
+    SUCCEED,
+    READ
+};
+
+struct Info
+{
+    std::string contact;
+    std::string body;
+    std::time_t timestamp = 0;
+    Type type = Type::INVALID;
+    Status status = Status::INVALID;
+};
+
+} // namespace message
+} // namespace api
+} // namespace lrc
diff --git a/src/api/newaccountmodel.h b/src/api/newaccountmodel.h
new file mode 100644
index 00000000..6b67d5e1
--- /dev/null
+++ b/src/api/newaccountmodel.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// std
+#include <vector>
+#include <map>
+#include <memory>
+#include <string>
+
+// Qt
+#include <qobject.h>
+
+// Lrc
+#include "typedefs.h"
+
+namespace lrc
+{
+
+class Database;
+class NewAccountModelPimpl;
+
+namespace api
+{
+
+namespace account { struct Info; }
+
+class LIB_EXPORT NewAccountModel : public QObject {
+public:
+    using AccountInfoMap = std::map<std::string, account::Info>;
+
+    NewAccountModel(const Database& database);
+    ~NewAccountModel();
+
+    const std::vector<std::string> getAccountList() const;
+    const account::Info& getAccountInfo(const std::string& accountId);
+
+private:
+    std::unique_ptr<NewAccountModelPimpl> pimpl_;
+};
+
+} // namespace api
+} // namespace lrc
diff --git a/src/api/newcallmodel.h b/src/api/newcallmodel.h
new file mode 100644
index 00000000..a2223c6f
--- /dev/null
+++ b/src/api/newcallmodel.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <memory>
+#include <string>
+#include <map>
+
+// Qt
+#include <qobject.h>
+
+namespace lrc
+{
+
+class NewCallModelPimpl;
+
+namespace api
+{
+
+namespace account { struct Info; }
+namespace call { struct Info; }
+class NewAccountModel;
+
+class NewCallModel : public QObject {
+    Q_OBJECT
+public:
+    using CallInfoMap = std::map<std::string, std::shared_ptr<call::Info>>;
+
+    const account::Info& owner;
+
+    enum class Media {
+        NONE,
+        AUDIO,
+        VIDEO
+    };
+
+    NewCallModel(NewAccountModel& parent, const account::Info& info);
+    ~NewCallModel();
+
+    const call::Info& createCall(const std::string& contactUri);
+
+    void hangUp(const std::string& callId) const;
+    void togglePause(const std::string& callId) const;
+    void toggleMedia(const std::string& callId, const Media media) const;
+    void toggleRecoringdAudio(const std::string& callId) const;
+    void setQuality(const std::string& callId, const double quality) const;
+    void transfer(const std::string& callId, const std::string& to) const;
+    void addParticipant(const std::string& callId, const std::string& participant);
+    void removeParticipant(const std::string& callId, const std::string& participant);
+
+private:
+    std::unique_ptr<NewCallModelPimpl> pimpl_;
+};
+
+} // namespace api
+} // namespace lrc
diff --git a/src/callbackshandler.cpp b/src/callbackshandler.cpp
new file mode 100644
index 00000000..7f3dbba5
--- /dev/null
+++ b/src/callbackshandler.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "callbackshandler.h"
+
+namespace lrc
+{
+
+CallbacksHandler::CallbacksHandler()
+: QObject()
+{
+
+}
+
+CallbacksHandler::~CallbacksHandler()
+{
+
+}
+
+void
+CallbacksHandler::slotNewAccountMessage(const QString& accountId,
+                                        const QString& from,
+                                        const MapStringString& payloads)
+{
+
+}
+
+void
+CallbacksHandler::slotNewBuddySubscription(const QString& accountId,
+                                           const QString& uri,
+                                           bool status,
+                                           const QString& message)
+{
+
+}
+
+} // namespace lrc
diff --git a/src/callbackshandler.h b/src/callbackshandler.h
new file mode 100644
index 00000000..36315038
--- /dev/null
+++ b/src/callbackshandler.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Qt
+#include <qobject.h>
+
+// Lrc
+#include "typedefs.h"
+
+namespace lrc
+{
+
+class CallbacksHandler : public QObject {
+    Q_OBJECT
+
+public:
+    CallbacksHandler();
+    ~CallbacksHandler();
+
+public Q_SLOTS:
+    void slotNewAccountMessage(const QString& accountId, const QString& from, const MapStringString& payloads);
+    void slotNewBuddySubscription(const QString& accountId, const QString& uri, bool status, const QString& message);
+};
+
+} // namespace lrc
diff --git a/src/contactmodel.cpp b/src/contactmodel.cpp
new file mode 100644
index 00000000..b6c90115
--- /dev/null
+++ b/src/contactmodel.cpp
@@ -0,0 +1,157 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "api/contactmodel.h"
+
+// LRC
+#include "api/newaccountmodel.h"
+#include "api/contact.h"
+
+#include "database.h"
+
+namespace lrc
+{
+
+using namespace api;
+
+class ContactModelPimpl : public QObject
+{
+    Q_OBJECT
+public:
+    ContactModelPimpl(NewAccountModel& p, const Database& d);
+    ~ContactModelPimpl();
+    ContactModelPimpl(const ContactModelPimpl& contactModelPimpl);
+
+    bool fillsWithContacts();
+    void sendMessage(const std::string& uri, const std::string& body) const;
+    void setContactPresent(const std::string& uri, bool status);
+
+    const Database& db;
+    ContactModel::ContactInfoMap contacts;
+    NewAccountModel& parent;
+
+public Q_SLOTS:
+    // TODO remove this from here when LRC signals are added
+    void slotContactsAdded(const QString &accountID, const QString &uri, bool confirmed);
+    void slotContactsRemoved(const QString &accountID, const QString &uri, bool status);
+};
+
+
+ContactModel::ContactModel(NewAccountModel& parent, const Database& database, const account::Info& info)
+: QObject()
+, pimpl_(std::make_unique<ContactModelPimpl>(parent, database))
+, owner(info)
+{
+
+}
+
+ContactModel::~ContactModel()
+{
+
+}
+
+const contact::Info&
+ContactModel::getContact(const std::string& uri) const
+{
+    throw std::invalid_argument("no contact found for given uri");
+}
+
+const ContactModel::ContactInfoMap&
+ContactModel::getAllContacts() const
+{
+    return pimpl_->contacts;
+}
+
+void
+ContactModel::addContact(const std::string& uri)
+{
+
+}
+
+void
+ContactModel::removeContact(const std::string& uri)
+{
+
+}
+
+void
+ContactModel::nameLookup(const std::string& uri) const
+{
+
+}
+
+void
+ContactModel::addressLookup(const std::string& name) const
+{
+
+}
+
+ContactModelPimpl::ContactModelPimpl(NewAccountModel& p, const Database& d)
+: db(d)
+, parent(p)
+{
+
+}
+
+ContactModelPimpl::~ContactModelPimpl()
+{
+
+}
+
+ContactModelPimpl::ContactModelPimpl(const ContactModelPimpl& contactModelPimpl)
+: db(contactModelPimpl.db)
+, contacts(contactModelPimpl.contacts)
+, parent(contactModelPimpl.parent)
+{
+
+}
+
+void
+ContactModelPimpl::sendMessage(const std::string& uri, const std::string& body) const
+{
+
+}
+
+bool
+ContactModelPimpl::fillsWithContacts()
+{
+    return false;
+}
+
+void
+ContactModelPimpl::setContactPresent(const std::string& uri, bool status)
+{
+
+}
+
+void
+ContactModelPimpl::slotContactsAdded(const QString &accountID, const QString &uri, bool confirmed)
+{
+
+}
+
+void
+ContactModelPimpl::slotContactsRemoved(const QString &accountID, const QString &uri, bool status)
+{
+
+}
+
+} // namespace lrc
+
+#include "api/moc_contactmodel.cpp"
+#include "contactmodel.moc"
diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp
new file mode 100644
index 00000000..462655d2
--- /dev/null
+++ b/src/conversationmodel.cpp
@@ -0,0 +1,211 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "api/conversationmodel.h"
+
+// std
+#include <regex>
+
+// LRC
+#include "api/newcallmodel.h"
+#include "api/newaccountmodel.h"
+#include "api/account.h"
+
+#include "database.h"
+#include "namedirectory.h"
+
+namespace lrc
+{
+
+using namespace api;
+
+class ConversationModelPimpl : public QObject
+{
+    Q_OBJECT
+public:
+    ConversationModelPimpl(const NewAccountModel& p, const Database& d, const account::Info& o);
+    ~ConversationModelPimpl();
+
+    // shortcuts in owner
+    NewCallModel& callModel;
+
+    /**
+     * Search a conversation in conversations_
+     * @param uid the contact to search
+     * @return the index in conversations_
+     */
+    int find(const std::string& uid) const;
+    /**
+     * Initialize conversations_ and filteredConversations_
+     */
+    void initConversations();
+    /**
+     * Sort conversation by last action
+     */
+    void sortConversations();
+    void search();
+
+    const NewAccountModel& parent;
+    const Database& database;
+
+    ConversationModel::ConversationQueue conversations;
+    mutable ConversationModel::ConversationQueue filteredConversations;
+    std::string filter;
+
+public Q_SLOTS:
+    void slotContactsChanged();
+    void slotMessageAdded(int uid, const std::string& accountId, const message::Info& msg);
+    void slotRegisteredNameFound(const Account* account, NameDirectory::LookupStatus status,
+                             const QString& address, const QString& name);
+
+};
+
+ConversationModel::ConversationModel(const NewAccountModel& parent,
+                                     const Database& database,
+                                     const account::Info& info)
+: QObject()
+,pimpl_(std::make_unique<ConversationModelPimpl>(parent, database, owner))
+, owner(info)
+{
+
+}
+
+ConversationModel::~ConversationModel()
+{
+
+}
+
+const ConversationModel::ConversationQueue&
+ConversationModel::getFilteredConversations() const
+{
+    return pimpl_->conversations;
+}
+
+conversation::Info
+ConversationModel::getConversation(const unsigned int row) const
+{
+    return {};
+}
+
+void
+ConversationModel::addConversation(const std::string& uri) const
+{
+
+}
+
+void
+ConversationModel::selectConversation(const std::string& uid)
+{
+
+}
+
+void
+ConversationModel::removeConversation(const std::string& uid)
+{
+
+}
+
+void
+ConversationModel::placeCall(const std::string& uid) const
+{
+}
+
+void
+ConversationModel::sendMessage(const std::string& uid, const std::string& body) const
+{
+
+}
+
+void
+ConversationModel::setFilter(const std::string& filter)
+{
+
+}
+
+void
+ConversationModel::addParticipant(const std::string& uid, const::std::string& uri)
+{
+
+}
+
+void
+ConversationModel::clearHistory(const std::string& uid)
+{
+
+}
+
+ConversationModelPimpl::ConversationModelPimpl(const NewAccountModel& p, const Database& d, const account::Info& o)
+: parent(p)
+, database(d)
+, callModel(*o.callModel)
+{
+
+}
+
+ConversationModelPimpl::~ConversationModelPimpl()
+{
+
+}
+
+int
+ConversationModelPimpl::find(const std::string& uid) const
+{
+    return -1;
+}
+
+void
+ConversationModelPimpl::search()
+{
+
+}
+
+void
+ConversationModelPimpl::initConversations()
+{
+
+}
+
+void
+ConversationModelPimpl::sortConversations()
+{
+
+}
+
+void
+ConversationModelPimpl::slotContactsChanged()
+{
+
+}
+
+void
+ConversationModelPimpl::slotMessageAdded(int uid, const std::string& account, const message::Info& msg)
+{
+
+}
+
+void
+ConversationModelPimpl::slotRegisteredNameFound(const Account* account, NameDirectory::LookupStatus status,
+                                           const QString& address, const QString& name)
+{
+
+}
+
+} // namespace lrc
+
+#include "api/moc_conversationmodel.cpp"
+#include "conversationmodel.moc"
diff --git a/src/database.cpp b/src/database.cpp
new file mode 100644
index 00000000..1613ef77
--- /dev/null
+++ b/src/database.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "database.h"
+
+// Data
+#include "api/message.h"
+
+namespace lrc
+{
+
+using namespace api;
+
+Database::Database()
+: QObject()
+{
+
+}
+
+Database::~Database()
+{
+
+}
+
+void
+Database::addMessage(const std::string& accountId, const message::Info& message) const
+{
+
+}
+
+void
+Database::clearHistory(const std::string& accountId, const std::string& uid, bool removeContact) const
+{
+
+}
+
+Database::MessagesMap
+Database::getHistory(const std::string& accountId, const std::string& uid) const
+{
+    return {};
+}
+
+std::size_t
+Database::numberOfUnreads(const std::string& accountId, const std::string& uid) const
+{
+    return 0;
+}
+
+void
+Database::setMessageRead(int uid) const
+{
+
+}
+
+void
+Database::addContact(const std::string& contact, const QByteArray& payload) const
+{
+
+}
+
+std::string
+Database::getContactAttribute(const std::string& uid, const std::string& attribute) const
+{
+    return {};
+}
+
+void
+Database::slotRegisteredNameFound(Account const*, NameDirectory::LookupStatus, QString const&, QString const&) const
+{
+
+}
+
+} // namespace lrc
diff --git a/src/database.h b/src/database.h
new file mode 100644
index 00000000..b61bbd1f
--- /dev/null
+++ b/src/database.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#pragma once
+
+// Std
+#include <memory>
+#include <string>
+
+// Qt
+#include <qobject.h>
+#include <QtSql/QSqlQuery>
+
+// Lrc
+#include "namedirectory.h"
+
+class Account; // TODO: move this class into lrc ns
+
+namespace lrc
+{
+
+namespace api { namespace message { struct Info; }}
+
+class Database : public QObject {
+    Q_OBJECT
+
+public:
+    using MessagesMap = std::map<int, api::message::Info>;
+
+    static constexpr auto ringDB = "ring.db"; // TODO: set path correctly for tests and release.
+
+    Database();
+    ~Database();
+
+    // Messages related
+    void addMessage(const std::string& accountId, const api::message::Info& message) const;
+    void clearHistory(const std::string& accountId,
+                      const std::string& uid,
+                      bool removeContact = false) const;
+    MessagesMap getHistory(const std::string& accountId, const std::string& uid) const;
+    std::size_t numberOfUnreads(const std::string& accountId, const std::string& uid) const;
+    void setMessageRead(int uid) const;
+
+    // Contacts related
+    void addContact(const std::string& contact, const QByteArray& payload) const;
+    std::string getContactAttribute(const std::string& uid, const std::string& attribute) const;
+
+Q_SIGNALS:
+    void messageAdded(int uid, const std::string& accountId, const api::message::Info& msg) const;
+    void contactAdded(const std::string& uid) const;
+
+private Q_SLOTS:
+    void slotRegisteredNameFound(const Account* account,
+                                 NameDirectory::LookupStatus status,
+                                 const QString& address,
+                                 const QString& name) const;
+
+private:
+    std::unique_ptr<QSqlQuery> query_;
+    QSqlDatabase db_;
+};
+
+} // namespace lrc
diff --git a/src/lrc.cpp b/src/lrc.cpp
new file mode 100644
index 00000000..e73838d2
--- /dev/null
+++ b/src/lrc.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "api/lrc.h"
+
+// Models and database
+#include "api/newaccountmodel.h"
+#include "database.h"
+#include "callbackshandler.h"
+
+namespace lrc
+{
+
+using namespace api;
+
+class LrcPimpl
+{
+
+public:
+    LrcPimpl();
+
+    std::unique_ptr<Lrc> parent;
+    std::unique_ptr<Database> database;
+    std::unique_ptr<NewAccountModel> accountModel;
+    std::unique_ptr<CallbacksHandler> callbackHandler;
+};
+
+Lrc::Lrc()
+: lrcPipmpl_(std::make_unique<LrcPimpl>())
+{
+}
+
+Lrc::~Lrc()
+{
+}
+
+NewAccountModel&
+Lrc::getAccountModel()
+{
+    return *lrcPipmpl_->accountModel;
+}
+
+LrcPimpl::LrcPimpl()
+{
+    database = std::make_unique<Database>();
+}
+
+} // namespace lrc
diff --git a/src/newaccountmodel.cpp b/src/newaccountmodel.cpp
new file mode 100644
index 00000000..8128c92b
--- /dev/null
+++ b/src/newaccountmodel.cpp
@@ -0,0 +1,80 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "api/newaccountmodel.h"
+
+
+// LRC
+#include "api/newcallmodel.h"
+#include "api/contactmodel.h"
+#include "api/conversationmodel.h"
+#include "api/account.h"
+
+#include "database.h"
+
+namespace lrc
+{
+
+using namespace api;
+
+class NewAccountModelPimpl
+{
+public:
+    NewAccountModelPimpl(const Database& database);
+    ~NewAccountModelPimpl();
+
+    const Database& database;
+    NewAccountModel::AccountInfoMap accounts;
+};
+
+NewAccountModel::NewAccountModel(const Database& database)
+: QObject()
+, pimpl_(std::make_unique<NewAccountModelPimpl>(database))
+{
+}
+
+NewAccountModel::~NewAccountModel()
+{
+}
+
+const std::vector<std::string>
+NewAccountModel::getAccountList() const
+{
+    return {};
+}
+
+const account::Info&
+NewAccountModel::getAccountInfo(const std::string& accountId)
+{
+    return pimpl_->accounts[accountId];
+}
+
+NewAccountModelPimpl::NewAccountModelPimpl(const Database& database)
+: database(database)
+{
+
+}
+
+NewAccountModelPimpl::~NewAccountModelPimpl()
+{
+
+}
+
+} // namespace lrc
+
+#include "api/moc_newaccountmodel.cpp"
diff --git a/src/newcallmodel.cpp b/src/newcallmodel.cpp
new file mode 100644
index 00000000..f834430b
--- /dev/null
+++ b/src/newcallmodel.cpp
@@ -0,0 +1,127 @@
+/****************************************************************************
+ *   Copyright (C) 2017 Savoir-faire Linux                                  *
+ *   Author : Nicolas Jäger <nicolas.jager@savoirfairelinux.com>            *
+ *   Author : Sébastien Blin <sebastien.blin@savoirfairelinux.com>          *
+ *                                                                          *
+ *   This library is free software; you can redistribute it and/or          *
+ *   modify it under the terms of the GNU Lesser General Public             *
+ *   License as published by the Free Software Foundation; either           *
+ *   version 2.1 of the License, or (at your option) any later version.     *
+ *                                                                          *
+ *   This library is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *
+ *   Lesser General Public License for more details.                        *
+ *                                                                          *
+ *   You should have received a copy of the GNU General Public License      *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
+ ***************************************************************************/
+#include "api/newcallmodel.h"
+
+// LRC
+#include "api/newaccountmodel.h"
+
+namespace lrc
+{
+
+using namespace api;
+
+class NewCallModelPimpl
+{
+public:
+    NewCallModelPimpl(NewAccountModel& parent);
+    ~NewCallModelPimpl();
+
+    void sendMessage(const std::string& callId, const std::string& body) const;
+
+    NewCallModel::CallInfoMap calls;
+    NewAccountModel& parent;
+};
+
+NewCallModel::NewCallModel(NewAccountModel& parent, const account::Info& info)
+: QObject()
+, owner(info)
+, pimpl_(std::make_unique<NewCallModelPimpl>(parent))
+{
+
+}
+
+NewCallModel::~NewCallModel()
+{
+
+}
+
+const call::Info&
+NewCallModel::createCall(const std::string& contactUri)
+{
+
+}
+
+void
+NewCallModel::hangUp(const std::string& callId) const
+{
+
+}
+
+void
+NewCallModel::togglePause(const std::string& callId) const
+{
+
+}
+
+void
+NewCallModel::toggleMedia(const std::string& callId, const Media media) const
+{
+
+}
+
+void
+NewCallModel::toggleRecoringdAudio(const std::string& callId) const
+{
+
+}
+
+void
+NewCallModel::setQuality(const std::string& callId, const double quality) const
+{
+
+}
+
+void
+NewCallModel::transfer(const std::string& callId, const std::string& to) const
+{
+
+}
+
+void
+NewCallModel::addParticipant(const std::string& callId, const std::string& participant)
+{
+
+}
+
+void
+NewCallModel::removeParticipant(const std::string& callId, const std::string& participant)
+{
+
+}
+
+NewCallModelPimpl::NewCallModelPimpl(NewAccountModel& p)
+: parent(p)
+{
+
+}
+
+NewCallModelPimpl::~NewCallModelPimpl()
+{
+
+}
+
+void
+NewCallModelPimpl::sendMessage(const std::string& callId, const std::string& body) const
+{
+
+}
+
+} // namespace lrc
+
+#include "api/moc_newcallmodel.cpp"
-- 
GitLab