first commit
This commit is contained in:
commit
0b2333ee14
58 changed files with 3436 additions and 0 deletions
5
.gitinorge
Normal file
5
.gitinorge
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
*.user.*
|
||||||
|
.*
|
||||||
|
build/
|
||||||
|
*.o
|
||||||
|
|
66
CMakeLists.txt
Normal file
66
CMakeLists.txt
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
|
project(chat LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_AUTOUIC ON)
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
set(CMAKE_AUTORCC ON)
|
||||||
|
|
||||||
|
set(QPACKAGE Core Gui Qml Quick QuickControls2)
|
||||||
|
find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS ${QPACKAGE} )
|
||||||
|
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QPACKAGE})
|
||||||
|
|
||||||
|
# lazy add file
|
||||||
|
#file(GLOB_RECURSE BASE_DIR "src/base/*.cpp" "src/base/*.h")
|
||||||
|
#file(GLOB_RECURSE INCLUDE_DIR "include/*.h" )
|
||||||
|
|
||||||
|
# file(GLOB_RECURSE CHAT_SRC "src/*.cpp")
|
||||||
|
# file(GLOB_RECURSE CHAT_HDR "include/*.h")
|
||||||
|
|
||||||
|
set(QML_IMPORT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/qml" CACHE STRING "Path used to locate CMake modules by Qt Creator" FORCE)
|
||||||
|
set(QML2_IMPORT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/qml" CACHE STRING "Path used to locate CMake modules by Qt Creator" FORCE)
|
||||||
|
set(QT_PLUGIN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/qml" )
|
||||||
|
set(QML_SOURCE_PATH "qml/")
|
||||||
|
set(QML_MODULES_PATH "qml/")
|
||||||
|
|
||||||
|
add_executable(chat
|
||||||
|
src/deltachat/account.h src/deltachat/account.cpp
|
||||||
|
src/deltachat/context.h src/deltachat/context.cpp
|
||||||
|
src/deltachat/message.h src/deltachat/message.cpp
|
||||||
|
src/deltachat/event.h src/deltachat/event.cpp
|
||||||
|
src/deltachat/contact.h src/deltachat/contact.cpp
|
||||||
|
src/deltachat/chat.h src/deltachat/chat.cpp
|
||||||
|
src/deltachat/chatlist.h src/deltachat/chatlist.cpp
|
||||||
|
src/deltachat/lot.h src/deltachat/lot.cpp
|
||||||
|
src/deltachat/eventemitter.h src/deltachat/eventemitter.cpp
|
||||||
|
src/main.cpp
|
||||||
|
src/app/msgshow.h src/app/msgshow.cpp
|
||||||
|
src/deltachat/deltacpp.h
|
||||||
|
src/app/task.h src/app/task.cpp
|
||||||
|
src/app/acc.h src/app/acc.cpp
|
||||||
|
src/app/app.h
|
||||||
|
src/app/send.h src/app/send.cpp
|
||||||
|
src/app/contactui.h src/app/contactui.cpp
|
||||||
|
src/app/chatui.h src/app/chatui.cpp
|
||||||
|
resource.qrc
|
||||||
|
src/model/chat/chatproxymodel.h src/model/chat/chatproxymodel.cpp
|
||||||
|
src/model/chat/chatlistmodel.h src/model/chat/chatlistmodel.cpp
|
||||||
|
src/model/chat/chatcore.h src/model/chat/chatcore.cpp
|
||||||
|
src/model/chat/chatroommodel.h src/model/chat/chatroommodel.cpp
|
||||||
|
src/model/chat/messagemodel.h src/model/chat/messagemodel.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(chat PRIVATE "./include" "./src")
|
||||||
|
|
||||||
|
foreach( PACK IN LISTS QPACKAGE )
|
||||||
|
target_link_libraries(chat Qt${QT_VERSION_MAJOR}::${PACK} )
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
install(TARGETS chat
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
find_package(Deltachat REQUIRED)
|
||||||
|
target_link_libraries(chat Deltachat)
|
467
CMakeLists.txt.user
Normal file
467
CMakeLists.txt.user
Normal file
|
@ -0,0 +1,467 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE QtCreatorProject>
|
||||||
|
<!-- Written by QtCreator 15.0.1, 2025-03-14T17:17:45. -->
|
||||||
|
<qtcreator>
|
||||||
|
<data>
|
||||||
|
<variable>EnvironmentId</variable>
|
||||||
|
<value type="QByteArray">{de1076e9-327b-449c-9243-94dce3154b24}</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
<value type="qlonglong">0</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
|
<value type="QString" key="language">Cpp</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||||
|
<value type="QString" key="language">QmlJS</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
|
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
|
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
||||||
|
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="bool" key="AutoTest.ApplyFilter">false</value>
|
||||||
|
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
||||||
|
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
|
||||||
|
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
||||||
|
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="ClangTools">
|
||||||
|
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
||||||
|
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
||||||
|
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
||||||
|
<value type="int" key="ClangTools.ParallelJobs">6</value>
|
||||||
|
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
||||||
|
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="CppEditor.QuickFix">
|
||||||
|
<value type="bool" key="UseGlobalSettings">true</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="DeviceType">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 GCC 64bit</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 GCC 64bit</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.gcc_64_kit</value>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
|
<value type="QString" key="CMake.Build.Type">Debug</value>
|
||||||
|
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||||
|
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_BUILD_TYPE:STRING=Debug
|
||||||
|
-DCMAKE_GENERATOR:STRING=Ninja
|
||||||
|
-DLINPHONE_SDK:STRING=/home/amneiht/app/workspace/lib/linphone/release/x64
|
||||||
|
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||||
|
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}
|
||||||
|
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON
|
||||||
|
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX};/home/amneiht/app/workspace/lib/delta_chat/build/output
|
||||||
|
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake</value>
|
||||||
|
<value type="int" key="EnableQmlDebugging">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ramdisk/build/deltachat/Desktop_Qt_5_15_2_GCC_64bit-Debug</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||||
|
<value type="QString" key="CMake.Build.Type">Release</value>
|
||||||
|
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||||
|
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_BUILD_TYPE:STRING=Release
|
||||||
|
-DCMAKE_GENERATOR:STRING=Ninja
|
||||||
|
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||||
|
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}
|
||||||
|
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON
|
||||||
|
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ramdisk/build/deltachat/Desktop_Qt_5_15_2_GCC_64bit-Release</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||||
|
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||||
|
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||||
|
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
|
||||||
|
-DCMAKE_GENERATOR:STRING=Ninja
|
||||||
|
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||||
|
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}
|
||||||
|
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON
|
||||||
|
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ramdisk/build/deltachat/Desktop_Qt_5_15_2_GCC_64bit-RelWithDebInfo</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
|
||||||
|
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||||
|
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||||
|
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
|
||||||
|
-DCMAKE_GENERATOR:STRING=Ninja
|
||||||
|
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||||
|
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}
|
||||||
|
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON
|
||||||
|
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake</value>
|
||||||
|
<value type="int" key="EnableQmlDebugging">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ramdisk/build/deltachat/Desktop_Qt_5_15_2_GCC_64bit-Profile</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.4">
|
||||||
|
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
|
||||||
|
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||||
|
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_BUILD_TYPE:STRING=MinSizeRel
|
||||||
|
-DCMAKE_GENERATOR:STRING=Ninja
|
||||||
|
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||||
|
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}
|
||||||
|
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON
|
||||||
|
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ramdisk/build/deltachat/Desktop_Qt_5_15_2_GCC_64bit-MinSizeRel</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">5</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString"></value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ApplicationManagerPlugin.Deploy.CMakePackageStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||||
|
<value type="QString" key="ApplicationManagerPlugin.Deploy.InstallPackageStep.Arguments">install-package --acknowledge</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Install Application Manager package</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ApplicationManagerPlugin.Deploy.InstallPackageStep</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
|
||||||
|
<valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
|
||||||
|
<valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ApplicationManagerPlugin.Deploy.Configuration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">2</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||||
|
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
|
||||||
|
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">chat</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">chat</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseTerminal">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/mnt/ramdisk/build/deltachat/Desktop_Qt_5_15_2_GCC_64bit-Debug</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
|
<value type="qlonglong">1</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>Version</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
</qtcreator>
|
20
cmake/FindDeltachat.cmake
Normal file
20
cmake/FindDeltachat.cmake
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#custom find deltachat
|
||||||
|
set(DeltaDIR "/home/amneiht/app/workspace/lib/delta_chat/arm64")
|
||||||
|
|
||||||
|
# cmake_policy(SET CMP0074 OLD)
|
||||||
|
# find_path(Deltachat_INCLUDE_DIR NAMES deltachat.h PATHS ${DeltaDIR} PATH_SUFFIXES include NO_DEFAULT_PATH )
|
||||||
|
# find_library(Deltachat_LIBS NAMES deltachat PATHS ${DeltaDIR} PATH_SUFFIXES lib )
|
||||||
|
|
||||||
|
set(Deltachat_INCLUDE_DIR ${DeltaDIR}/include )
|
||||||
|
set(Deltachat_LIBS ${DeltaDIR}/lib/libdeltachat.so )
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
find_package_handle_standard_args(Deltachat DEFAULT_MSG Deltachat_INCLUDE_DIR Deltachat_LIBS)
|
||||||
|
if ( Deltachat_FOUND )
|
||||||
|
add_library(Deltachat INTERFACE IMPORTED)
|
||||||
|
target_include_directories(Deltachat INTERFACE ${Deltachat_INCLUDE_DIR})
|
||||||
|
target_link_libraries(Deltachat INTERFACE ${Deltachat_LIBS} dl pthread m)
|
||||||
|
message("Set config")
|
||||||
|
else()
|
||||||
|
message("No deltachat found")
|
||||||
|
endif()
|
14
qml/DCStyle/ChatStyle.qml
Normal file
14
qml/DCStyle/ChatStyle.qml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
pragma Singleton
|
||||||
|
import QtQml 2.2
|
||||||
|
// import QtQuick 2.0
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
property QtObject list: QtObject {
|
||||||
|
property int viewWidth: 50
|
||||||
|
property color scolor: "lightgreen"
|
||||||
|
property color ucolor: "white"
|
||||||
|
|
||||||
|
property color pcolor: "black"
|
||||||
|
property int psize : 3
|
||||||
|
}
|
||||||
|
}
|
21
qml/DCStyle/MessStyle.qml
Normal file
21
qml/DCStyle/MessStyle.qml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
pragma Singleton
|
||||||
|
import QtQml 2.2
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
|
||||||
|
property QtObject mess: QtObject {
|
||||||
|
property color background: "lightgray"
|
||||||
|
property QtObject incoming: QtObject {
|
||||||
|
property color color: "lightgreen"
|
||||||
|
}
|
||||||
|
property QtObject outgoing: QtObject {
|
||||||
|
property color color: "white"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
property QtObject margin: QtObject {
|
||||||
|
property int maxsize : 50
|
||||||
|
property int border : 10
|
||||||
|
property int padding : border * 2
|
||||||
|
}
|
||||||
|
}
|
6
qml/DCStyle/qmldir
Normal file
6
qml/DCStyle/qmldir
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# See: https://wiki.qt.io/Qml_Styling
|
||||||
|
module DCStyle
|
||||||
|
|
||||||
|
# qml style
|
||||||
|
singleton ChatStyle 1.0 ChatStyle.qml
|
||||||
|
singleton MessStyle 1.0 MessStyle.qml
|
48
qml/chat/ChatList.qml
Normal file
48
qml/chat/ChatList.qml
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Layouts 1.2
|
||||||
|
|
||||||
|
import Dcchat 1.0
|
||||||
|
import DCStyle 1.0
|
||||||
|
Item {
|
||||||
|
|
||||||
|
id: chatlist
|
||||||
|
anchors.fill: parent
|
||||||
|
property int cindex : 0
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
// view panel
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: 0
|
||||||
|
ChatListView {
|
||||||
|
// list view
|
||||||
|
id: chatlistview
|
||||||
|
Layout.fillHeight: true
|
||||||
|
width: 240
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
color: ChatStyle.list.pcolor
|
||||||
|
width: ChatStyle.list.psize
|
||||||
|
Layout.fillHeight: true
|
||||||
|
}
|
||||||
|
Loader {
|
||||||
|
id : chatContend
|
||||||
|
z:2
|
||||||
|
asynchronous : true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function setSource(id){
|
||||||
|
chatContend.setSource("MessageArea.qml", {"chat_id": id ,})
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: chatlistview
|
||||||
|
function onIdChange(id)
|
||||||
|
{
|
||||||
|
// set chat id to show
|
||||||
|
chatContend.source = ""
|
||||||
|
Qt.callLater(setSource , id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
39
qml/chat/ChatListItem.qml
Normal file
39
qml/chat/ChatListItem.qml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
import DCStyle 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
|
||||||
|
required property string $name
|
||||||
|
required property int $chatid
|
||||||
|
Layout.fillWidth: true
|
||||||
|
height: ChatStyle.list.viewWidth
|
||||||
|
color: ChatStyle.list.ucolor
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id :stext
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
verticalAlignment : Text.AlignVCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
list.idChange($chatid)
|
||||||
|
color = ChatStyle.list.scolor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Component.onCompleted:{
|
||||||
|
stext.text = $name
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: list
|
||||||
|
function onIdChange(pid){
|
||||||
|
if(pid !== $chatid)
|
||||||
|
color = ChatStyle.list.ucolor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
qml/chat/ChatListView.qml
Normal file
50
qml/chat/ChatListView.qml
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Styles 1.4
|
||||||
|
import QtQuick.Layouts 1.2
|
||||||
|
import Dcchat 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
// detachat
|
||||||
|
id: list
|
||||||
|
signal idChange(int id)
|
||||||
|
ChatListModel {
|
||||||
|
id : lmodel
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: bar
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
height: search.height
|
||||||
|
z:1
|
||||||
|
TextField {
|
||||||
|
id: search
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: btn.right
|
||||||
|
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
id :btn
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.right: parent.right
|
||||||
|
width: 30
|
||||||
|
text: "tk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ListView {
|
||||||
|
id: view
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.top: bar.bottom
|
||||||
|
spacing: 1
|
||||||
|
model: lmodel
|
||||||
|
delegate: ChatListItem {
|
||||||
|
width: parent.width
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
12
qml/chat/MessageArea.js
Normal file
12
qml/chat/MessageArea.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
|
||||||
|
function viewChange() {
|
||||||
|
view.positionViewAtEnd()
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadMoreData(){
|
||||||
|
|
||||||
|
var dtx = view.contentHeight
|
||||||
|
var lastindex = model.loadMoredata()
|
||||||
|
view.positionViewAtIndex(lastindex,ListView.Beginning)
|
||||||
|
}
|
108
qml/chat/MessageArea.qml
Normal file
108
qml/chat/MessageArea.qml
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import Dcchat 1.0
|
||||||
|
import DCStyle 1.0
|
||||||
|
|
||||||
|
import "MessageArea.js" as MS
|
||||||
|
Rectangle {
|
||||||
|
|
||||||
|
// default property alias data: view.data
|
||||||
|
id: mess_area
|
||||||
|
required property int chat_id
|
||||||
|
signal loadMoreData();
|
||||||
|
property alias model: model
|
||||||
|
color: MessStyle.mess.background
|
||||||
|
Layout.fillWidth: true
|
||||||
|
ChatRoomModel {
|
||||||
|
id:model
|
||||||
|
chatid: chat_id
|
||||||
|
}
|
||||||
|
MessageModel {
|
||||||
|
id:mess
|
||||||
|
chatid: chat_id
|
||||||
|
}
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
Rectangle {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
height: 40
|
||||||
|
color: "green"
|
||||||
|
z:2
|
||||||
|
Text {
|
||||||
|
id: banner
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "white"
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ListView {
|
||||||
|
id:view
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
model : model
|
||||||
|
spacing: 1
|
||||||
|
delegate: MessageItem {
|
||||||
|
width: mess_area.width
|
||||||
|
}
|
||||||
|
cacheBuffer:20
|
||||||
|
//for ScrollBar
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
id: scroll_bar
|
||||||
|
parent: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
// send bare
|
||||||
|
z:2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
height: 30
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
TextArea {
|
||||||
|
id : local
|
||||||
|
height: parent.height
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
id : btn
|
||||||
|
text: "send"
|
||||||
|
onClicked: {
|
||||||
|
mess.sendText(local.text)
|
||||||
|
local.text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// load more message when scroll at end
|
||||||
|
Connections {
|
||||||
|
target: view
|
||||||
|
function onMovementEnded(){
|
||||||
|
if(view.atYBeginning )
|
||||||
|
{
|
||||||
|
MS.loadMoreData()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// handle when have incomming mess
|
||||||
|
Connections {
|
||||||
|
target: model
|
||||||
|
function onUpdateData(){
|
||||||
|
if( view.atYEnd )
|
||||||
|
{
|
||||||
|
Qt.callLater(MS.viewChange)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Component.onCompleted:
|
||||||
|
{
|
||||||
|
// view.model = model
|
||||||
|
banner.text = model.chatName()
|
||||||
|
view.positionViewAtEnd()
|
||||||
|
}
|
||||||
|
}
|
35
qml/chat/MessageItem.qml
Normal file
35
qml/chat/MessageItem.qml
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
|
import DCStyle 1.0
|
||||||
|
Item{
|
||||||
|
|
||||||
|
// mode data
|
||||||
|
id: _mess
|
||||||
|
required property bool $local
|
||||||
|
required property string $text
|
||||||
|
required property string $user
|
||||||
|
required property date $date
|
||||||
|
// width: text.width
|
||||||
|
height: text.height + MessStyle.margin.padding
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id:rec
|
||||||
|
// chang size of x
|
||||||
|
x : $local ? parent.width - rec.width - MessStyle.margin.padding : MessStyle.margin.padding
|
||||||
|
color: $local ? MessStyle.mess.incoming.color : MessStyle.mess.outgoing.color
|
||||||
|
radius: 5
|
||||||
|
width: text.contentWidth + MessStyle.margin.padding
|
||||||
|
height: text.height + MessStyle.margin.padding
|
||||||
|
Text {
|
||||||
|
y: MessStyle.margin.border
|
||||||
|
x: MessStyle.margin.border
|
||||||
|
id : text
|
||||||
|
width: _mess.width - MessStyle.margin.maxsize
|
||||||
|
text: $text
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
qml/main.qml
Normal file
14
qml/main.qml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
|
||||||
|
import "./chat"
|
||||||
|
ApplicationWindow {
|
||||||
|
id:main
|
||||||
|
width: 1600
|
||||||
|
height: 800
|
||||||
|
visible: true
|
||||||
|
title: "lmao"
|
||||||
|
ChatList {
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
}
|
14
resource.qrc
Normal file
14
resource.qrc
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>qml/main.qml</file>
|
||||||
|
<file>qml/chat/ChatList.qml</file>
|
||||||
|
<file>qml/chat/ChatListView.qml</file>
|
||||||
|
<file>qml/chat/ChatListItem.qml</file>
|
||||||
|
<file>qml/DCStyle/ChatStyle.qml</file>
|
||||||
|
<file>qml/DCStyle/qmldir</file>
|
||||||
|
<file>qml/chat/MessageArea.qml</file>
|
||||||
|
<file>qml/chat/MessageItem.qml</file>
|
||||||
|
<file>qml/DCStyle/MessStyle.qml</file>
|
||||||
|
<file>qml/chat/MessageArea.js</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
118
src/app/acc.cpp
Normal file
118
src/app/acc.cpp
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
#include "acc.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <deltachat/deltacpp.h>
|
||||||
|
|
||||||
|
using namespace dc;
|
||||||
|
Acc::Acc(Task* parent)
|
||||||
|
: QObject { parent }
|
||||||
|
, ts(stdout)
|
||||||
|
{
|
||||||
|
connect(parent, &Task::processInput, this, &Acc::proccsesInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Acc::showUser()
|
||||||
|
{
|
||||||
|
auto list = Account::getInstance()->getAll();
|
||||||
|
ts << "Show user" << Qt::endl;
|
||||||
|
if (list.size() == 0) {
|
||||||
|
ts << "\tNo aviable user" << Qt::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (auto acc : list) {
|
||||||
|
auto ctx = Account::getInstance()->getAccount(acc);
|
||||||
|
QString info = ctx->getConfig("addr");
|
||||||
|
ts << "\tId:" << acc << "\tUser: " << info << Qt::endl;
|
||||||
|
}
|
||||||
|
ts << "\n\tCurent user: " << Account::getInstance()->getSelectedAccount()->getConfig("addr")
|
||||||
|
<< Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Acc::addUser(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.size() < 4) {
|
||||||
|
ts << "Error:Not enought variable" << Qt::endl;
|
||||||
|
}
|
||||||
|
QString mail = qm.at(2);
|
||||||
|
QString pass = qm.at(3);
|
||||||
|
|
||||||
|
// new acc
|
||||||
|
auto manager = Account::getInstance();
|
||||||
|
auto id = manager->addAcount();
|
||||||
|
auto ctx = manager->getAccount(id);
|
||||||
|
|
||||||
|
ctx->setConfig("addr", mail);
|
||||||
|
ctx->setConfig("mail_pw", pass);
|
||||||
|
if (1) {
|
||||||
|
// local config
|
||||||
|
auto list = mail.split("@");
|
||||||
|
QString ser = "mail." + list.at(1);
|
||||||
|
// config imap
|
||||||
|
ctx->setConfig("mail_server", ser);
|
||||||
|
ctx->setConfig("mail_user", mail);
|
||||||
|
ctx->setConfig("mail_port", "143");
|
||||||
|
// smtp config
|
||||||
|
ctx->setConfig("send_server", ser);
|
||||||
|
ctx->setConfig("send_user", mail);
|
||||||
|
ctx->setConfig("send_pw", pass);
|
||||||
|
ctx->setConfig("send_port", "465");
|
||||||
|
}
|
||||||
|
ctx->configure();
|
||||||
|
ts << "\tUser is add" << Qt::endl;
|
||||||
|
}
|
||||||
|
void Acc::rmUser(const QStringList& qm)
|
||||||
|
{
|
||||||
|
QTextStream ts(stdout);
|
||||||
|
if (qm.size() < 3)
|
||||||
|
return;
|
||||||
|
uint32_t id = qm.at(2).toInt();
|
||||||
|
Account::getInstance()->removeAccount(id);
|
||||||
|
ts << "\tUser is removed" << Qt::endl;
|
||||||
|
}
|
||||||
|
void Acc::showHelp()
|
||||||
|
{
|
||||||
|
ts << "User Command" << Qt::endl;
|
||||||
|
ts << "\tuser show : show all user\n";
|
||||||
|
ts << "\tuser detail <id> : show full detail for user\n";
|
||||||
|
ts << "\tuser add <mail addr> <mail pass>: ADD USER\n";
|
||||||
|
ts << "\tuser use <id>: select it to default account\n";
|
||||||
|
ts << "\tuser rm <id>: remove user";
|
||||||
|
ts << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Acc::useUser(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.size() < 3)
|
||||||
|
return;
|
||||||
|
uint32_t id = qm.at(2).toInt();
|
||||||
|
Account::getInstance()->setSelectAccount(id);
|
||||||
|
ts << "\tDefalt user set to id :" << id << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Acc::showQr(const QString& id)
|
||||||
|
{
|
||||||
|
int cid = id.toInt();
|
||||||
|
auto ctx = Account::getInstance()->getAccount(cid);
|
||||||
|
ts << "\tQrcode is: " << ctx->getSecurejoinQr(0) << Qt::endl;
|
||||||
|
}
|
||||||
|
void Acc::proccsesInput(const QStringList& qm)
|
||||||
|
{
|
||||||
|
auto cmd = qm.at(0);
|
||||||
|
if (cmd == "help") {
|
||||||
|
showHelp();
|
||||||
|
return;
|
||||||
|
} else if (cmd != "user")
|
||||||
|
return;
|
||||||
|
|
||||||
|
cmd = qm.at(1);
|
||||||
|
if (cmd == "show")
|
||||||
|
showUser();
|
||||||
|
else if (cmd == "add")
|
||||||
|
addUser(qm);
|
||||||
|
else if (cmd == "rm")
|
||||||
|
rmUser(qm);
|
||||||
|
else if (cmd == "use")
|
||||||
|
useUser(qm);
|
||||||
|
else if (cmd == "detail" && qm.size() == 3)
|
||||||
|
showQr(qm.at(2));
|
||||||
|
}
|
29
src/app/acc.h
Normal file
29
src/app/acc.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef ACC_H
|
||||||
|
#define ACC_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
class Task;
|
||||||
|
class Acc : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QTextStream ts;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Acc(Task *parent);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void proccsesInput(const QStringList &qm);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void showUser();
|
||||||
|
void addUser(const QStringList &qm);
|
||||||
|
void rmUser(const QStringList &qm);
|
||||||
|
void showHelp();
|
||||||
|
void useUser(const QStringList &qm);
|
||||||
|
void showQr(const QString &id);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ACC_H
|
11
src/app/app.h
Normal file
11
src/app/app.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef APP_H
|
||||||
|
#define APP_H
|
||||||
|
|
||||||
|
#include "acc.h"
|
||||||
|
#include "chatui.h"
|
||||||
|
#include "contactui.h"
|
||||||
|
#include "msgshow.h"
|
||||||
|
#include "send.h"
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
|
#endif // APP_H
|
156
src/app/chatui.cpp
Normal file
156
src/app/chatui.cpp
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
#include "chatui.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include <deltachat/deltacpp.h>
|
||||||
|
ChatUi::ChatUi(Task* parent)
|
||||||
|
: QObject { parent }
|
||||||
|
, ts(stdout)
|
||||||
|
{
|
||||||
|
connect(parent, &Task::processInput, this, &ChatUi::proccsesInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::proccsesInput(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.at(0) == "help") {
|
||||||
|
showHelp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (qm.at(0) != "chat") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (qm.size() < 2)
|
||||||
|
return;
|
||||||
|
auto cmd = qm.at(1);
|
||||||
|
if (cmd == "show") {
|
||||||
|
showChat();
|
||||||
|
} else if (cmd == "create") {
|
||||||
|
createWithContact(qm);
|
||||||
|
} else if (cmd == "remove") {
|
||||||
|
if (qm.size() == 3)
|
||||||
|
chatRemove(qm.at(2));
|
||||||
|
} else if (cmd == "group") {
|
||||||
|
if (qm.size() < 4)
|
||||||
|
return;
|
||||||
|
auto cmd2 = qm.at(3);
|
||||||
|
if (cmd2 == "create") {
|
||||||
|
createGroup(qm);
|
||||||
|
} else if (cmd2 == "add") {
|
||||||
|
addUser(qm);
|
||||||
|
} else if (cmd2 == "rm") {
|
||||||
|
rmUser(qm);
|
||||||
|
}
|
||||||
|
} else if (cmd == "send") {
|
||||||
|
chatSend(qm);
|
||||||
|
} else if (cmd == "list" && qm.size() == 3) {
|
||||||
|
listMess(qm.at(2));
|
||||||
|
} else {
|
||||||
|
ts << "Wrong command , using help for detail";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::showHelp()
|
||||||
|
{
|
||||||
|
ts << "Chat Command\n";
|
||||||
|
ts << "\tchat show : show avaible chat and id\n";
|
||||||
|
ts << "\tchat create <contact_id> : create a chat with contact id\n";
|
||||||
|
ts << "\tchat send <chat_id> \"mess\": send message to chat with id\n";
|
||||||
|
ts << "\tchat list <chat_id>: see last 10 message in chat with id\n";
|
||||||
|
ts << "\tchat remove <chat_id> : remove chat id\n";
|
||||||
|
ts << "\tchat group create <name>: create a group chat with name\n";
|
||||||
|
ts << "\tchat group add <chat_id> <contact_id>: add contact id to group chat\n";
|
||||||
|
ts << "\tchat group rm <chat_id> <contact_id>: remove contact id from group chat";
|
||||||
|
ts << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::showChat()
|
||||||
|
{
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
auto chatlist = ctx->getChatlist(0, "");
|
||||||
|
int d = chatlist->getChatCount();
|
||||||
|
for (int i = 0; i < d; i++) {
|
||||||
|
int id = chatlist->getChatId(i);
|
||||||
|
auto chat = ctx->getChat(id);
|
||||||
|
ts << "\tChat Id: " << id << "\twith name" << chat->getName() << Qt::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::createWithContact(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.size() < 3) {
|
||||||
|
ts << "\tNot enought arument" << Qt::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int id = qm.at(2).toInt();
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
int rid = ctx->createChatByContactId(id);
|
||||||
|
ts << "\tNew chat is created with Id: " << id << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::createGroup(const QStringList& qm)
|
||||||
|
{
|
||||||
|
auto name = qm.at(3);
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
int id = ctx->createGroupChat(name, false);
|
||||||
|
ts << "\tNew group chat is created with Id: " << id << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::chatRemove(const QString& id)
|
||||||
|
{
|
||||||
|
int cid = id.toInt();
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->deleteChat(cid);
|
||||||
|
ts << "\tChat id " << id << "is delete" << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::addUser(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.size() != 5)
|
||||||
|
return;
|
||||||
|
int chat_id = qm.at(3).toInt();
|
||||||
|
int contact_id = qm.at(4).toInt();
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->addContactToChat(chat_id, contact_id);
|
||||||
|
ts << "\tContact " << contact_id << "is added to group" << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::rmUser(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.size() != 5)
|
||||||
|
return;
|
||||||
|
int chat_id = qm.at(3).toInt();
|
||||||
|
int contact_id = qm.at(4).toInt();
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->removeContactFromChat(chat_id, contact_id);
|
||||||
|
ts << "\tContact " << contact_id << "is remove from group" << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::chatSend(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.size() != 4) {
|
||||||
|
ts << "wrong command" << Qt::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int chat_id = qm.at(2).toInt();
|
||||||
|
auto mess = qm.at(3);
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->sendTextMessage(chat_id, mess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatUi::listMess(const QString& id)
|
||||||
|
{
|
||||||
|
int chat_id = id.toInt();
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
auto list = ctx->getMsgIdList(chat_id);
|
||||||
|
int v = list.count() - 10;
|
||||||
|
|
||||||
|
if (list.count() == 0) {
|
||||||
|
ts << "\tNo Mess in Chat " << Qt::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (v < 0)
|
||||||
|
v = 0;
|
||||||
|
for (; v < list.count(); v++) {
|
||||||
|
auto mid = list.at(v);
|
||||||
|
auto msg = ctx->getMessage(mid);
|
||||||
|
ts << "\tMess: " << msg->getText() << Qt::endl;
|
||||||
|
}
|
||||||
|
}
|
30
src/app/chatui.h
Normal file
30
src/app/chatui.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef CHATUI_H
|
||||||
|
#define CHATUI_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QTextStream>
|
||||||
|
class Task;
|
||||||
|
class ChatUi : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
QTextStream ts;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ChatUi(Task *parent);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void proccsesInput(const QStringList &qm);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void showHelp();
|
||||||
|
void showChat();
|
||||||
|
void createWithContact(const QStringList &qm);
|
||||||
|
void createGroup(const QStringList &qm);
|
||||||
|
void chatRemove(const QString &id);
|
||||||
|
void addUser(const QStringList &qm);
|
||||||
|
void rmUser(const QStringList &qm);
|
||||||
|
void chatSend(const QStringList &qm);
|
||||||
|
void listMess(const QString &id);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CHATUI_H
|
61
src/app/contactui.cpp
Normal file
61
src/app/contactui.cpp
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#include "contactui.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include <deltachat/deltacpp.h>
|
||||||
|
ContactUi::ContactUi(Task* parent)
|
||||||
|
: QObject { parent }
|
||||||
|
, ts(stdout)
|
||||||
|
{
|
||||||
|
connect(parent, &Task::processInput, this, &ContactUi::proccsesInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactUi::proccsesInput(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.at(0) == "help") {
|
||||||
|
showHelp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (qm.at(0) != "contact" || qm.size() < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QString qs = qm.at(1);
|
||||||
|
if (qs == "show") {
|
||||||
|
listContact();
|
||||||
|
} else if (qs == "rm" && qm.size() == 3) {
|
||||||
|
removeContact(qm.at(2));
|
||||||
|
} else if (qs == "add" && qm.size() == 4) {
|
||||||
|
addContact(qm.at(2), qm.at(3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactUi::showHelp()
|
||||||
|
{
|
||||||
|
ts << "Contact comad:\n";
|
||||||
|
ts << "\tcontact show : show all contact\n";
|
||||||
|
ts << "\tcontact add <name> <mail_addr> : add contact\n";
|
||||||
|
ts << "\tcontact rm <id> : remove contact with id";
|
||||||
|
ts << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactUi::listContact()
|
||||||
|
{
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
auto list = ctx->getContacts(0, nullptr);
|
||||||
|
for (auto id : list) {
|
||||||
|
auto contact = ctx->getContact(id);
|
||||||
|
ts << "\tId:" << id << "\taddr:" << contact->getAddr() << Qt::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactUi::addContact(const QString& name, const QString& addr)
|
||||||
|
{
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->createContact(name, addr);
|
||||||
|
ts << "\tContact is added" << Qt::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactUi::removeContact(const QString& id)
|
||||||
|
{
|
||||||
|
uint32_t cid = id.toInt();
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->deleteContact(cid);
|
||||||
|
}
|
26
src/app/contactui.h
Normal file
26
src/app/contactui.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef CONTACTUI_H
|
||||||
|
#define CONTACTUI_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QTextStream>
|
||||||
|
class Task;
|
||||||
|
class ContactUi : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QTextStream ts;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ContactUi(Task *parent);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void proccsesInput(const QStringList &qm);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void showHelp();
|
||||||
|
void listContact();
|
||||||
|
void addContact(const QString &name, const QString &addr);
|
||||||
|
void removeContact(const QString &id);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CONTACTUI_H
|
24
src/app/msgshow.cpp
Normal file
24
src/app/msgshow.cpp
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include "msgshow.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <deltachat/deltacpp.h>
|
||||||
|
|
||||||
|
MsgShow::MsgShow() {}
|
||||||
|
|
||||||
|
void MsgShow::onIncomingMessage(uint32_t accountId, int chatId, int msgId)
|
||||||
|
{
|
||||||
|
auto acc = dc::Account::getInstance();
|
||||||
|
auto ctx = acc->getAccount(accountId);
|
||||||
|
auto msg = ctx->getMessage(msgId);
|
||||||
|
|
||||||
|
auto text = msg->getText();
|
||||||
|
qDebug() << "\tYou Got:" << text;
|
||||||
|
// auto chat = ctx->getChat(chatId);
|
||||||
|
// int info = msg->getInfoType();
|
||||||
|
// if (!chat->isProtected()) {
|
||||||
|
// auto qr = ctx->getSecurejoinQr(0);
|
||||||
|
// msg = ctx->newMessage(DC_MSG_TEXT);
|
||||||
|
// msg->setSubject("ENCRYPT_INFO");
|
||||||
|
// msg->setText(qr);
|
||||||
|
// ctx->sendMessage(chatId, msg);
|
||||||
|
// }
|
||||||
|
}
|
16
src/app/msgshow.h
Normal file
16
src/app/msgshow.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef MSGSHOW_H
|
||||||
|
#define MSGSHOW_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class MsgShow : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
MsgShow();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onIncomingMessage(uint32_t accountId, int chatId, int msgId);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MSGSHOW_H
|
7
src/app/send.cpp
Normal file
7
src/app/send.cpp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include "send.h"
|
||||||
|
#include "task.h"
|
||||||
|
Send::Send(Task *parent)
|
||||||
|
: QObject{parent}
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Send::proccsesInput(const QStringList &qm) {}
|
19
src/app/send.h
Normal file
19
src/app/send.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef SEND_H
|
||||||
|
#define SEND_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class Task;
|
||||||
|
class Send : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit Send(Task *parent);
|
||||||
|
public slots:
|
||||||
|
void proccsesInput(const QStringList &qm);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void send_mess(const QStringList &qm);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SEND_H
|
88
src/app/task.cpp
Normal file
88
src/app/task.cpp
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
#include "task.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
Task::Task()
|
||||||
|
{
|
||||||
|
isrun = true;
|
||||||
|
connect(this, &Task::processInput, this, &Task::check);
|
||||||
|
}
|
||||||
|
static QStringList praseLine(const QString& line)
|
||||||
|
{
|
||||||
|
QStringList ret;
|
||||||
|
QString data = "";
|
||||||
|
bool quote = false;
|
||||||
|
for (int i = 0; i < line.count(); i++) {
|
||||||
|
auto c = line.at(i);
|
||||||
|
if (quote) {
|
||||||
|
if (c == '"') {
|
||||||
|
quote = false;
|
||||||
|
if (data != "") {
|
||||||
|
ret.append(data);
|
||||||
|
data = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
data.append(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (c == '"') {
|
||||||
|
quote = true;
|
||||||
|
} else {
|
||||||
|
if (c == ' ') {
|
||||||
|
if (data != "") {
|
||||||
|
ret.append(data);
|
||||||
|
data = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
data.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data != "") {
|
||||||
|
ret.append(data);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
void Task::run()
|
||||||
|
{
|
||||||
|
QTextStream stream(stdin);
|
||||||
|
QString line = "";
|
||||||
|
|
||||||
|
fd_set rfds;
|
||||||
|
struct timeval tv;
|
||||||
|
int retval;
|
||||||
|
tv.tv_sec = 1; // Timeout: 1 seconds
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
FD_ZERO(&rfds);
|
||||||
|
FD_SET(fileno(stdin), &rfds);
|
||||||
|
retval = select(fileno(stdin) + 1, &rfds, NULL, NULL, &tv);
|
||||||
|
|
||||||
|
if (retval) {
|
||||||
|
line = stream.readLine();
|
||||||
|
if (line != "") {
|
||||||
|
QStringList qlist = praseLine(line);
|
||||||
|
emit processInput(qlist);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (isrun);
|
||||||
|
emit finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Task::check(const QStringList& qm)
|
||||||
|
{
|
||||||
|
if (qm.at(0) == "q") {
|
||||||
|
this->isrun = 0;
|
||||||
|
} else if (qm.at(0) == "help") {
|
||||||
|
QTextStream ts(stdout);
|
||||||
|
ts << "\tq: quit application" << Qt::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Task::disablerun()
|
||||||
|
{
|
||||||
|
isrun = false;
|
||||||
|
}
|
23
src/app/task.h
Normal file
23
src/app/task.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef TASK_H
|
||||||
|
#define TASK_H
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
class Task : public QThread {
|
||||||
|
Q_OBJECT
|
||||||
|
bool isrun = true;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Task();
|
||||||
|
|
||||||
|
void run();
|
||||||
|
void check(const QStringList& qm);
|
||||||
|
|
||||||
|
void disablerun();
|
||||||
|
signals:
|
||||||
|
void processInput(const QStringList& qm);
|
||||||
|
void finish();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TASK_H
|
224
src/deltachat/account.cpp
Normal file
224
src/deltachat/account.cpp
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
#include "account.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include "chat.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "event.h"
|
||||||
|
#include "eventemitter.h"
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
|
||||||
|
std::shared_ptr<Account> Account::inst = nullptr;
|
||||||
|
|
||||||
|
Account::Account()
|
||||||
|
{
|
||||||
|
QString path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
|
||||||
|
const int writeable = true;
|
||||||
|
m_accounts = dc_accounts_new(path.toUtf8().constData(), writeable);
|
||||||
|
// install emiter
|
||||||
|
m_emit = new EventEmitter(dc_accounts_get_event_emitter(m_accounts));
|
||||||
|
}
|
||||||
|
|
||||||
|
Account::Account(QString path)
|
||||||
|
{
|
||||||
|
const int writeable = true;
|
||||||
|
m_accounts = dc_accounts_new(path.toUtf8().constData(), writeable);
|
||||||
|
// install emiter
|
||||||
|
m_emit = new EventEmitter(dc_accounts_get_event_emitter(m_accounts));
|
||||||
|
}
|
||||||
|
|
||||||
|
Account::~Account()
|
||||||
|
{
|
||||||
|
stopIo();
|
||||||
|
dc_accounts_unref(m_accounts);
|
||||||
|
m_emit->wait();
|
||||||
|
delete m_emit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::init(QString datapath)
|
||||||
|
{
|
||||||
|
if (datapath.isEmpty())
|
||||||
|
inst = std::shared_ptr<Account>(new Account());
|
||||||
|
else
|
||||||
|
inst = std::shared_ptr<Account>(new Account(datapath));
|
||||||
|
qRegisterMetaType<size_t>("size_t");
|
||||||
|
qRegisterMetaType<uint32_t>("uint32_t");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::close()
|
||||||
|
{
|
||||||
|
inst = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Account> Account::getInstance()
|
||||||
|
{
|
||||||
|
return inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::startIo()
|
||||||
|
{
|
||||||
|
dc_accounts_start_io(m_accounts);
|
||||||
|
}
|
||||||
|
void Account::stopIo()
|
||||||
|
{
|
||||||
|
dc_accounts_stop_io(m_accounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::maybeNetWork()
|
||||||
|
{
|
||||||
|
dc_accounts_maybe_network(m_accounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::maybeNetWorkLost()
|
||||||
|
{
|
||||||
|
dc_accounts_maybe_network_lost(m_accounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::backgroundFetch(uint64_t timeout)
|
||||||
|
{
|
||||||
|
dc_accounts_background_fetch(m_accounts, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Context> Account::getAccount(uint32_t id)
|
||||||
|
{
|
||||||
|
dc_context_t *ctx = dc_accounts_get_account(m_accounts, id);
|
||||||
|
if (ctx != nullptr) {
|
||||||
|
auto acc = std::shared_ptr<Context>(new Context(ctx));
|
||||||
|
return acc;
|
||||||
|
} else
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Context> Account::getSelectedAccount()
|
||||||
|
{
|
||||||
|
dc_context_t *ctx = dc_accounts_get_selected_account(m_accounts);
|
||||||
|
if (ctx != nullptr) {
|
||||||
|
auto acc = std::shared_ptr<Context>(new Context(ctx));
|
||||||
|
return acc;
|
||||||
|
} else
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::setSelectAccount(uint32_t id)
|
||||||
|
{
|
||||||
|
dc_accounts_select_account(m_accounts, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::removeAccount(uint32_t id)
|
||||||
|
{
|
||||||
|
dc_accounts_remove_account(m_accounts, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Account::addAcount()
|
||||||
|
{
|
||||||
|
return dc_accounts_add_account(m_accounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<uint32_t> Account::getAll()
|
||||||
|
{
|
||||||
|
dc_array_t *arr = dc_accounts_get_all(m_accounts);
|
||||||
|
QList<uint32_t> id;
|
||||||
|
for (int i = 0; i < dc_array_get_cnt(arr); i++) {
|
||||||
|
id.append(dc_array_get_id(arr, i));
|
||||||
|
}
|
||||||
|
dc_array_unref(arr);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::startEventLoop()
|
||||||
|
{
|
||||||
|
// start io
|
||||||
|
startIo();
|
||||||
|
connect(m_emit, &EventEmitter::gotEvent, this, &Account::processEvent, Qt::DirectConnection);
|
||||||
|
m_emit->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Context> Account::getUser(const QString &addr)
|
||||||
|
{
|
||||||
|
auto list = getAll();
|
||||||
|
for (auto id : list) {
|
||||||
|
auto ctx = getAccount(id);
|
||||||
|
if (ctx->getConfig("addr") == addr) {
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Account::processEvent(QSharedPointer<Event> event)
|
||||||
|
{
|
||||||
|
int acc_id;
|
||||||
|
std::shared_ptr<Context> ctx;
|
||||||
|
std::shared_ptr<Chat> chat;
|
||||||
|
switch (event->getId()) {
|
||||||
|
/*
|
||||||
|
case DC_EVENT_SMTP_CONNECTED:
|
||||||
|
qInfo("SMTP connected: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_IMAP_CONNECTED:
|
||||||
|
qInfo("IMAP connected: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_SMTP_MESSAGE_SENT:
|
||||||
|
qInfo("SMTP message sent: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_IMAP_MESSAGE_DELETED:
|
||||||
|
qInfo("IMAP message deleted: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_IMAP_MESSAGE_MOVED:
|
||||||
|
qInfo("IMAP message moved: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_NEW_BLOB_FILE:
|
||||||
|
qInfo("New blob file: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_DELETED_BLOB_FILE:
|
||||||
|
qInfo("Deleted blob file: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_ERROR_SELF_NOT_IN_GROUP:
|
||||||
|
qCritical("Self not in group error: %s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DC_EVENT_INFO:
|
||||||
|
qInfo("%s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_WARNING:
|
||||||
|
qWarning("%s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
case DC_EVENT_ERROR:
|
||||||
|
qCritical("%s", qUtf8Printable(event->getData2Str()));
|
||||||
|
break;
|
||||||
|
//*/
|
||||||
|
case DC_EVENT_CHAT_MODIFIED:
|
||||||
|
emit chatModified(event->getAccountId(), event->getData1Int());
|
||||||
|
break;
|
||||||
|
case DC_EVENT_MSGS_CHANGED:
|
||||||
|
emit messagesChanged(event->getAccountId(), event->getData1Int(), event->getData2Int());
|
||||||
|
break;
|
||||||
|
case DC_EVENT_INCOMING_MSG:
|
||||||
|
ctx = Account::getInstance()->getAccount(event->getAccountId());
|
||||||
|
chat = ctx->getChat(event->getData1Int());
|
||||||
|
if (chat->isContactRequest()) {
|
||||||
|
ctx->acceptChat(event->getData1Int());
|
||||||
|
}
|
||||||
|
emit incomingMessage(event->getAccountId(), event->getData1Int(), event->getData2Int());
|
||||||
|
break;
|
||||||
|
case DC_EVENT_MSGS_NOTICED:
|
||||||
|
emit messagesNoticed(event->getAccountId(), event->getData1Int());
|
||||||
|
break;
|
||||||
|
case DC_EVENT_CONFIGURE_PROGRESS:
|
||||||
|
emit configureProgress(event->getAccountId(), event->getData1Int(), event->getData2Str());
|
||||||
|
acc_id = event->getAccountId();
|
||||||
|
if (event->getData1Int() == 1000) {
|
||||||
|
ctx = Account::getInstance()->getAccount(acc_id);
|
||||||
|
ctx->startIo();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DC_EVENT_IMEX_PROGRESS:
|
||||||
|
emit imexProgress(event->getAccountId(), event->getData1Int());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// qDebug() << "Not processing " << event->getId();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
73
src/deltachat/account.h
Normal file
73
src/deltachat/account.h
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#ifndef ACCOUNT_H
|
||||||
|
#define ACCOUNT_H
|
||||||
|
|
||||||
|
#include "deltachat.h"
|
||||||
|
#include <QList>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
class Context;
|
||||||
|
class Event;
|
||||||
|
class EventEmitter;
|
||||||
|
|
||||||
|
class Account : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
dc_accounts_t* m_accounts;
|
||||||
|
|
||||||
|
static std::shared_ptr<Account> inst;
|
||||||
|
|
||||||
|
EventEmitter* m_emit;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Account();
|
||||||
|
Account(QString datapath);
|
||||||
|
~Account();
|
||||||
|
// init some proprey of deltachat
|
||||||
|
static void init(QString datapath);
|
||||||
|
// close library
|
||||||
|
static void close();
|
||||||
|
|
||||||
|
static std::shared_ptr<Account> getInstance();
|
||||||
|
|
||||||
|
// warper funtion
|
||||||
|
void startIo();
|
||||||
|
void stopIo();
|
||||||
|
|
||||||
|
// network
|
||||||
|
void maybeNetWork();
|
||||||
|
void maybeNetWorkLost();
|
||||||
|
|
||||||
|
// fetch
|
||||||
|
void backgroundFetch(uint64_t timeout);
|
||||||
|
|
||||||
|
// account
|
||||||
|
std::shared_ptr<Context> getAccount(uint32_t id);
|
||||||
|
std::shared_ptr<Context> getSelectedAccount();
|
||||||
|
void setSelectAccount(uint32_t id);
|
||||||
|
void removeAccount(uint32_t id);
|
||||||
|
uint32_t addAcount();
|
||||||
|
|
||||||
|
QList<uint32_t> getAll();
|
||||||
|
// custom funtion
|
||||||
|
|
||||||
|
void startEventLoop();
|
||||||
|
std::shared_ptr<Context> getUser(const QString& addr);
|
||||||
|
public slots:
|
||||||
|
void processEvent(QSharedPointer<Event> evt);
|
||||||
|
signals:
|
||||||
|
void chatModified(uint32_t accountId, int chatId);
|
||||||
|
void configureProgress(uint32_t accountId, int progress, QString comment);
|
||||||
|
void imexProgress(uint32_t accountId, int progress);
|
||||||
|
void incomingMessage(uint32_t accountId, int chatId, int msgId);
|
||||||
|
void messagesChanged(uint32_t accountId, int chatId, int msgId);
|
||||||
|
void messagesNoticed(uint32_t accountId, int chatId);
|
||||||
|
|
||||||
|
// for detail
|
||||||
|
void outGoingMessage(uint32_t accountId, int chatId);
|
||||||
|
};
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // ACCOUNT_H
|
69
src/deltachat/chat.cpp
Normal file
69
src/deltachat/chat.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#include "chat.h"
|
||||||
|
|
||||||
|
using namespace dc;
|
||||||
|
|
||||||
|
Chat::Chat(dc_chat_t *chat)
|
||||||
|
: QObject{nullptr}
|
||||||
|
, m_chat{chat}
|
||||||
|
{}
|
||||||
|
|
||||||
|
Chat::~Chat()
|
||||||
|
{
|
||||||
|
dc_chat_unref(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Chat::getId()
|
||||||
|
{
|
||||||
|
return dc_chat_get_id(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Chat::getType()
|
||||||
|
{
|
||||||
|
return dc_chat_get_type(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Chat::getName()
|
||||||
|
{
|
||||||
|
char *name = dc_chat_get_name(m_chat);
|
||||||
|
QString result{name};
|
||||||
|
dc_str_unref(name);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Chat::getProfileImage()
|
||||||
|
{
|
||||||
|
char *profileImage = dc_chat_get_profile_image(m_chat);
|
||||||
|
QString result{profileImage};
|
||||||
|
dc_str_unref(profileImage);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Chat::isContactRequest()
|
||||||
|
{
|
||||||
|
return dc_chat_is_contact_request(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Chat::canSend()
|
||||||
|
{
|
||||||
|
return dc_chat_can_send(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Chat::isMuted()
|
||||||
|
{
|
||||||
|
return dc_chat_is_muted(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Chat::getVisibility()
|
||||||
|
{
|
||||||
|
return dc_chat_get_visibility(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Chat::isProtected()
|
||||||
|
{
|
||||||
|
return dc_chat_is_protected(m_chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Chat::isProtectionBroken()
|
||||||
|
{
|
||||||
|
return dc_chat_is_protection_broken(m_chat);
|
||||||
|
}
|
33
src/deltachat/chat.h
Normal file
33
src/deltachat/chat.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef CHAT_H
|
||||||
|
#define CHAT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <deltachat.h>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
class Chat : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit Chat(dc_chat_t *chat);
|
||||||
|
~Chat();
|
||||||
|
|
||||||
|
uint32_t getId();
|
||||||
|
int getType();
|
||||||
|
QString getName();
|
||||||
|
QString getProfileImage();
|
||||||
|
bool isContactRequest();
|
||||||
|
bool canSend();
|
||||||
|
bool isMuted();
|
||||||
|
int getVisibility();
|
||||||
|
|
||||||
|
bool isProtected();
|
||||||
|
|
||||||
|
bool isProtectionBroken();
|
||||||
|
|
||||||
|
private:
|
||||||
|
dc_chat_t *m_chat{nullptr};
|
||||||
|
};
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // CHAT_H
|
37
src/deltachat/chatlist.cpp
Normal file
37
src/deltachat/chatlist.cpp
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#include "chatlist.h"
|
||||||
|
#include "lot.h"
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
|
||||||
|
Chatlist::Chatlist(dc_chatlist_t *chatlist)
|
||||||
|
: m_chatlist{chatlist}
|
||||||
|
{}
|
||||||
|
|
||||||
|
Chatlist::~Chatlist()
|
||||||
|
{
|
||||||
|
dc_chatlist_unref(m_chatlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Chatlist::getChatCount() const
|
||||||
|
{
|
||||||
|
return dc_chatlist_get_cnt(m_chatlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Chatlist::getChatId(size_t index) const
|
||||||
|
{
|
||||||
|
return dc_chatlist_get_chat_id(m_chatlist, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Chatlist::getMsgId(size_t index) const
|
||||||
|
{
|
||||||
|
return dc_chatlist_get_msg_id(m_chatlist, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Lot> Chatlist::getSummary(size_t index) const
|
||||||
|
{
|
||||||
|
auto lot = new Lot(dc_chatlist_get_summary(m_chatlist, index, NULL));
|
||||||
|
auto ret = std::shared_ptr<Lot>(lot);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
28
src/deltachat/chatlist.h
Normal file
28
src/deltachat/chatlist.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef CHATLIST_H
|
||||||
|
#define CHATLIST_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <deltachat.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
class Lot;
|
||||||
|
|
||||||
|
class Chatlist : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit Chatlist(dc_chatlist_t *context);
|
||||||
|
~Chatlist();
|
||||||
|
|
||||||
|
size_t getChatCount() const;
|
||||||
|
uint32_t getChatId(size_t index) const;
|
||||||
|
uint32_t getMsgId(size_t index) const;
|
||||||
|
std::shared_ptr<Lot> getSummary(size_t index) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
dc_chatlist_t *m_chatlist{nullptr};
|
||||||
|
};
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // CHATLIST_H
|
51
src/deltachat/contact.cpp
Normal file
51
src/deltachat/contact.cpp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include "contact.h"
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
Contact::Contact(dc_contact_t *contact)
|
||||||
|
: QObject{nullptr}
|
||||||
|
, m_contact{contact}
|
||||||
|
{}
|
||||||
|
|
||||||
|
Contact::~Contact()
|
||||||
|
{
|
||||||
|
dc_contact_unref(m_contact);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Contact::getId()
|
||||||
|
{
|
||||||
|
return dc_contact_get_id(m_contact);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Contact::getAddr()
|
||||||
|
{
|
||||||
|
char *addr = dc_contact_get_addr(m_contact);
|
||||||
|
QString result{addr};
|
||||||
|
dc_str_unref(addr);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Contact::getName()
|
||||||
|
{
|
||||||
|
char *name = dc_contact_get_name(m_contact);
|
||||||
|
QString result{name};
|
||||||
|
dc_str_unref(name);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Contact::getDisplayName()
|
||||||
|
{
|
||||||
|
char *display_name = dc_contact_get_display_name(m_contact);
|
||||||
|
QString result{display_name};
|
||||||
|
dc_str_unref(display_name);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Contact::getProfileImage()
|
||||||
|
{
|
||||||
|
char *profileImage = dc_contact_get_profile_image(m_contact);
|
||||||
|
QString result{profileImage};
|
||||||
|
dc_str_unref(profileImage);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
26
src/deltachat/contact.h
Normal file
26
src/deltachat/contact.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef CONTACT_H
|
||||||
|
#define CONTACT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <deltachat.h>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
class Contact : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit Contact(dc_contact_t *contact);
|
||||||
|
~Contact();
|
||||||
|
|
||||||
|
uint32_t getId();
|
||||||
|
QString getAddr();
|
||||||
|
QString getName();
|
||||||
|
QString getDisplayName();
|
||||||
|
QString getProfileImage();
|
||||||
|
|
||||||
|
private:
|
||||||
|
dc_contact_t *m_contact{nullptr};
|
||||||
|
};
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // CONTACT_H
|
304
src/deltachat/context.cpp
Normal file
304
src/deltachat/context.cpp
Normal file
|
@ -0,0 +1,304 @@
|
||||||
|
#include "context.h"
|
||||||
|
#include "chat.h"
|
||||||
|
#include "chatlist.h"
|
||||||
|
#include "contact.h"
|
||||||
|
#include "lot.h"
|
||||||
|
#include "message.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
Context::Context(dc_context_t* mctx)
|
||||||
|
{
|
||||||
|
m_context = mctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
Context::~Context()
|
||||||
|
{
|
||||||
|
dc_context_unref(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::configure()
|
||||||
|
{
|
||||||
|
dc_configure(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Context::isConfigured() const
|
||||||
|
{
|
||||||
|
return dc_is_configured(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::startIo()
|
||||||
|
{
|
||||||
|
dc_start_io(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::stopIo()
|
||||||
|
{
|
||||||
|
dc_stop_io(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::maybeNetwork()
|
||||||
|
{
|
||||||
|
dc_maybe_network(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getInfo()
|
||||||
|
{
|
||||||
|
char* info = dc_get_info(m_context);
|
||||||
|
QString result { info };
|
||||||
|
dc_str_unref(info);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Chatlist> Context::getChatlist(int flags, QString query)
|
||||||
|
{
|
||||||
|
QByteArray utf8Query = query.toUtf8();
|
||||||
|
dc_chatlist_t* chatlist = dc_get_chatlist(m_context,
|
||||||
|
flags,
|
||||||
|
query.isEmpty() ? nullptr : utf8Query.constData(),
|
||||||
|
0);
|
||||||
|
auto p = new Chatlist(chatlist);
|
||||||
|
return std::shared_ptr<Chatlist>(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::createChatByContactId(uint32_t contactId)
|
||||||
|
{
|
||||||
|
return dc_create_chat_by_contact_id(m_context, contactId);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::createGroupChat(const QString& name, bool secure)
|
||||||
|
{
|
||||||
|
QByteArray str = name.toUtf8();
|
||||||
|
return dc_create_group_chat(m_context, secure, str.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
int Context::removeContactFromChat(uint32_t chat_id, uint32_t contact_id)
|
||||||
|
{
|
||||||
|
return dc_remove_contact_from_chat(m_context, chat_id, contact_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Context::addContactToChat(uint32_t chat_id, uint32_t contact_id)
|
||||||
|
{
|
||||||
|
return dc_add_contact_to_chat(m_context, chat_id, contact_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::getId()
|
||||||
|
{
|
||||||
|
return dc_get_id(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::setChatVisibility(uint32_t chatId, int visibility)
|
||||||
|
{
|
||||||
|
dc_set_chat_visibility(m_context, chatId, visibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::deleteChat(uint32_t chatId)
|
||||||
|
{
|
||||||
|
dc_delete_chat(m_context, chatId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::blockChat(uint32_t chatId)
|
||||||
|
{
|
||||||
|
dc_block_chat(m_context, chatId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::acceptChat(uint32_t chatId)
|
||||||
|
{
|
||||||
|
dc_accept_chat(m_context, chatId);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getChatEncrinfo(uint32_t chatId)
|
||||||
|
{
|
||||||
|
char* encrinfo = dc_get_chat_encrinfo(m_context, chatId);
|
||||||
|
QString result { encrinfo };
|
||||||
|
dc_str_unref(encrinfo);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::getChatEphemeralTimer(uint32_t chatId)
|
||||||
|
{
|
||||||
|
return dc_get_chat_ephemeral_timer(m_context, chatId);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Chat> Context::getChat(uint32_t chatId)
|
||||||
|
{
|
||||||
|
dc_chat_t* chat = dc_get_chat(m_context, chatId);
|
||||||
|
return std::shared_ptr<Chat>(new Chat { chat });
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<int> Context::getMsgIdList(uint32_t chatId)
|
||||||
|
{
|
||||||
|
QList<int> result;
|
||||||
|
dc_array_t* msgIdArray = dc_get_chat_msgs(m_context, chatId, 0, 0);
|
||||||
|
for (size_t i = 0; i < dc_array_get_cnt(msgIdArray); i++) {
|
||||||
|
result << dc_array_get_id(msgIdArray, i);
|
||||||
|
}
|
||||||
|
dc_array_unref(msgIdArray);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<int> Context::getContacts(uint32_t flags, QString query)
|
||||||
|
{
|
||||||
|
QList<int> result;
|
||||||
|
QByteArray utf8Query = query.toUtf8();
|
||||||
|
dc_array_t* contactsArray = dc_get_contacts(m_context, flags, utf8Query.constData());
|
||||||
|
for (size_t i = 0; i < dc_array_get_cnt(contactsArray); i++) {
|
||||||
|
result << dc_array_get_id(contactsArray, i);
|
||||||
|
}
|
||||||
|
dc_array_unref(contactsArray);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Context::getFreshMsgCnt(uint32_t chatId)
|
||||||
|
{
|
||||||
|
return dc_get_fresh_msg_cnt(m_context, chatId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::marknoticedChat(uint32_t chatId)
|
||||||
|
{
|
||||||
|
return dc_marknoticed_chat(m_context, chatId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::markseenMsgs(QVector<uint32_t> msg_ids)
|
||||||
|
{
|
||||||
|
dc_markseen_msgs(m_context, msg_ids.constData(), msg_ids.count());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Message> Context::getMessage(uint32_t msgId)
|
||||||
|
{
|
||||||
|
dc_msg_t* message = dc_get_msg(m_context, msgId);
|
||||||
|
auto m = new Message(message);
|
||||||
|
return std::shared_ptr<Message>(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Contact> Context::getContact(uint32_t contactId)
|
||||||
|
{
|
||||||
|
dc_contact_t* contact = dc_get_contact(m_context, contactId);
|
||||||
|
return std::shared_ptr<Contact>(new Contact { contact });
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::createContact(QString name, QString addr)
|
||||||
|
{
|
||||||
|
QByteArray utf8name = name.toUtf8();
|
||||||
|
QByteArray utf8addr = addr.toUtf8();
|
||||||
|
return dc_create_contact(m_context, utf8name.constData(), utf8addr.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
int Context::deleteContact(uint32_t contact_id)
|
||||||
|
{
|
||||||
|
return dc_delete_contact(m_context, contact_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getBlobdir()
|
||||||
|
{
|
||||||
|
char* blobdir = dc_get_blobdir(m_context);
|
||||||
|
QString result { blobdir };
|
||||||
|
dc_str_unref(blobdir);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Context::setConfig(QString key, QString value)
|
||||||
|
{
|
||||||
|
QByteArray utf8Key = key.toUtf8();
|
||||||
|
QByteArray utf8Value = value.toUtf8();
|
||||||
|
return dc_set_config(m_context, utf8Key.constData(), utf8Value.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getConfig(QString key)
|
||||||
|
{
|
||||||
|
QByteArray utf8Key = key.toUtf8();
|
||||||
|
char* value = dc_get_config(m_context, utf8Key.constData());
|
||||||
|
QString result { value };
|
||||||
|
dc_str_unref(value);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getMessageInfo(uint32_t msgId)
|
||||||
|
{
|
||||||
|
char* info = dc_get_msg_info(m_context, msgId);
|
||||||
|
QString result { info };
|
||||||
|
dc_str_unref(info);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getMessageHtml(uint32_t msgId)
|
||||||
|
{
|
||||||
|
char* html = dc_get_msg_html(m_context, msgId);
|
||||||
|
QString result { html };
|
||||||
|
dc_str_unref(html);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::sendTextMessage(uint32_t chatId, QString textToSend)
|
||||||
|
{
|
||||||
|
QByteArray utf8Text = textToSend.toUtf8();
|
||||||
|
return dc_send_text_msg(m_context, chatId, utf8Text.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::setDraft(uint32_t chatId, std::shared_ptr<Message>& message)
|
||||||
|
{
|
||||||
|
dc_set_draft(m_context, chatId, message ? message->m_message : nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Message> Context::getDraft(uint32_t chatId)
|
||||||
|
{
|
||||||
|
dc_msg_t* draft = dc_get_draft(m_context, chatId);
|
||||||
|
if (draft) {
|
||||||
|
return std::shared_ptr<Message>(new Message { draft });
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Context::setChatMuteDuration(uint32_t chatId, int64_t duration)
|
||||||
|
{
|
||||||
|
return dc_set_chat_mute_duration(m_context, chatId, duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Message> Context::newMessage(int viewtype)
|
||||||
|
{
|
||||||
|
dc_msg_t* message = dc_msg_new(m_context, viewtype);
|
||||||
|
return std::shared_ptr<Message>(new Message(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::sendMessage(uint32_t chatId, std::shared_ptr<Message>& message)
|
||||||
|
{
|
||||||
|
return dc_send_msg(m_context, chatId, message->m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Context::importBackup(QString tarfile)
|
||||||
|
{
|
||||||
|
QByteArray utf8Text = tarfile.toUtf8();
|
||||||
|
return dc_imex(m_context, DC_IMEX_IMPORT_BACKUP, utf8Text.constData(), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Lot> Context::checkQr(QString qr)
|
||||||
|
{
|
||||||
|
QByteArray data = qr.toUtf8();
|
||||||
|
auto ret = dc_check_qr(m_context, data.constData());
|
||||||
|
return std::shared_ptr<Lot>(new Lot(ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getSecurejoinQrSvg(uint32_t id)
|
||||||
|
{
|
||||||
|
auto str = dc_get_securejoin_qr_svg(m_context, id);
|
||||||
|
QString ret(str);
|
||||||
|
dc_str_unref(str);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Context::getSecurejoinQr(uint32_t id)
|
||||||
|
{
|
||||||
|
auto str = dc_get_securejoin_qr(m_context, id);
|
||||||
|
QString ret(str);
|
||||||
|
dc_str_unref(str);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::joinSecurejoin(QString qrcode)
|
||||||
|
{
|
||||||
|
auto qrdata = qrcode.toUtf8();
|
||||||
|
return dc_join_securejoin(m_context, qrdata.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
84
src/deltachat/context.h
Normal file
84
src/deltachat/context.h
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
#ifndef CONTEXT_H
|
||||||
|
#define CONTEXT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QVariantList>
|
||||||
|
#include <deltachat.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
|
||||||
|
class Message;
|
||||||
|
class Contact;
|
||||||
|
class Chat;
|
||||||
|
class Chatlist;
|
||||||
|
class Lot;
|
||||||
|
|
||||||
|
class Context : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
dc_context_t* m_context;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Context(dc_context_t* mctx);
|
||||||
|
~Context();
|
||||||
|
void configure();
|
||||||
|
bool isConfigured() const;
|
||||||
|
QString getInfo();
|
||||||
|
void startIo();
|
||||||
|
void stopIo();
|
||||||
|
void maybeNetwork();
|
||||||
|
/* chat untion */
|
||||||
|
std::shared_ptr<Chatlist> getChatlist(int flags, QString query);
|
||||||
|
uint32_t createChatByContactId(uint32_t contactId);
|
||||||
|
void setChatVisibility(uint32_t chatId, int visibility);
|
||||||
|
void deleteChat(uint32_t chatId);
|
||||||
|
void blockChat(uint32_t chatId);
|
||||||
|
void acceptChat(uint32_t chatId);
|
||||||
|
QString getChatEncrinfo(uint32_t chatId);
|
||||||
|
uint32_t getChatEphemeralTimer(uint32_t chatId);
|
||||||
|
std::shared_ptr<Chat> getChat(uint32_t chatId);
|
||||||
|
/* contatct function */
|
||||||
|
QList<int> getContacts(uint32_t flags, QString query);
|
||||||
|
QList<int> getMsgIdList(uint32_t chatId);
|
||||||
|
int getFreshMsgCnt(uint32_t chatId);
|
||||||
|
void marknoticedChat(uint32_t chatId);
|
||||||
|
void markseenMsgs(QVector<uint32_t> msg_ids);
|
||||||
|
std::shared_ptr<Message> getMessage(uint32_t msgId);
|
||||||
|
std::shared_ptr<Contact> getContact(uint32_t contactId);
|
||||||
|
// contact
|
||||||
|
uint32_t createContact(QString name, QString addr);
|
||||||
|
int deleteContact(uint32_t contact_id);
|
||||||
|
|
||||||
|
uint32_t sendTextMessage(uint32_t chatId, QString textToSend);
|
||||||
|
void setDraft(uint32_t chatId, std::shared_ptr<Message>& message);
|
||||||
|
std::shared_ptr<Message> getDraft(uint32_t chatId);
|
||||||
|
QString getBlobdir();
|
||||||
|
bool setConfig(QString key, QString value);
|
||||||
|
QString getConfig(QString key);
|
||||||
|
bool setChatMuteDuration(uint32_t chatId, int64_t duration);
|
||||||
|
QString getMessageInfo(uint32_t msgId);
|
||||||
|
QString getMessageHtml(uint32_t msgId);
|
||||||
|
std::shared_ptr<Message> newMessage(int viewtype);
|
||||||
|
uint32_t sendMessage(uint32_t chatId, std::shared_ptr<Message>& message);
|
||||||
|
void importBackup(QString tarfile);
|
||||||
|
// qr code funtion
|
||||||
|
std::shared_ptr<Lot> checkQr(QString qr);
|
||||||
|
// create a image to scan
|
||||||
|
QString getSecurejoinQrSvg(uint32_t id = 0);
|
||||||
|
// create qr
|
||||||
|
QString getSecurejoinQr(uint32_t id = 0);
|
||||||
|
uint32_t joinSecurejoin(QString qrcode);
|
||||||
|
|
||||||
|
/* for chat grop*/
|
||||||
|
uint32_t createGroupChat(const QString& name, bool secure = true);
|
||||||
|
int removeContactFromChat(uint32_t chat_id, uint32_t contact_id);
|
||||||
|
int addContactToChat(uint32_t chat_id, uint32_t contact_id);
|
||||||
|
|
||||||
|
/* id */
|
||||||
|
uint32_t getId();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // CONTEXT_H
|
12
src/deltachat/deltacpp.h
Normal file
12
src/deltachat/deltacpp.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef DELTACPP_H
|
||||||
|
#define DELTACPP_H
|
||||||
|
|
||||||
|
#include "account.h"
|
||||||
|
#include "chat.h"
|
||||||
|
#include "chatlist.h"
|
||||||
|
#include "contact.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "lot.h"
|
||||||
|
#include "message.h"
|
||||||
|
|
||||||
|
#endif // DELTACPP_H
|
42
src/deltachat/event.cpp
Normal file
42
src/deltachat/event.cpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include "event.h"
|
||||||
|
#include <QDebug>
|
||||||
|
namespace dc {
|
||||||
|
|
||||||
|
Event::Event(dc_event_t *event)
|
||||||
|
: m_event{event}
|
||||||
|
{}
|
||||||
|
|
||||||
|
Event::~Event()
|
||||||
|
{
|
||||||
|
dc_event_unref(m_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Event::getId()
|
||||||
|
{
|
||||||
|
return dc_event_get_id(m_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Event::getData1Int()
|
||||||
|
{
|
||||||
|
return dc_event_get_data1_int(m_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Event::getData2Int()
|
||||||
|
{
|
||||||
|
return dc_event_get_data2_int(m_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Event::getData2Str()
|
||||||
|
{
|
||||||
|
char *data2 = dc_event_get_data2_str(m_event);
|
||||||
|
QString result{data2};
|
||||||
|
dc_str_unref(data2);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Event::getAccountId()
|
||||||
|
{
|
||||||
|
return dc_event_get_account_id(m_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
26
src/deltachat/event.h
Normal file
26
src/deltachat/event.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef EVENT_H
|
||||||
|
#define EVENT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <deltachat.h>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
class Event : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
dc_event_t *m_event;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Event(dc_event_t *event);
|
||||||
|
~Event();
|
||||||
|
|
||||||
|
int getId();
|
||||||
|
int getData1Int();
|
||||||
|
int getData2Int();
|
||||||
|
QString getData2Str();
|
||||||
|
uint32_t getAccountId();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // EVENT_H
|
22
src/deltachat/eventemitter.cpp
Normal file
22
src/deltachat/eventemitter.cpp
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#include "eventemitter.h"
|
||||||
|
#include "event.h"
|
||||||
|
namespace dc {
|
||||||
|
|
||||||
|
EventEmitter::EventEmitter(dc_event_emitter_t *emiter)
|
||||||
|
: m_emiter{emiter}
|
||||||
|
{}
|
||||||
|
|
||||||
|
EventEmitter::~EventEmitter()
|
||||||
|
{
|
||||||
|
dc_event_emitter_unref(m_emiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventEmitter::run()
|
||||||
|
{
|
||||||
|
dc_event_t *evt = nullptr;
|
||||||
|
while ((evt = dc_get_next_event(m_emiter)) != nullptr) {
|
||||||
|
auto e = QSharedPointer<Event>(new Event(evt));
|
||||||
|
emit gotEvent(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace dc
|
30
src/deltachat/eventemitter.h
Normal file
30
src/deltachat/eventemitter.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef EVENTEMITTER_H
|
||||||
|
#define EVENTEMITTER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
#include <QThread>
|
||||||
|
#include <deltachat.h>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
|
||||||
|
class Event;
|
||||||
|
|
||||||
|
class EventEmitter : public QThread
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
dc_event_emitter_t *m_emiter;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit EventEmitter(dc_event_emitter_t *emiter);
|
||||||
|
~EventEmitter();
|
||||||
|
|
||||||
|
void run();
|
||||||
|
signals:
|
||||||
|
void gotEvent(QSharedPointer<Event> evt);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // EVENTEMITTER_H
|
49
src/deltachat/lot.cpp
Normal file
49
src/deltachat/lot.cpp
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#include "lot.h"
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
Lot::Lot(dc_lot_t *lot)
|
||||||
|
: m_lot{lot}
|
||||||
|
{}
|
||||||
|
|
||||||
|
Lot::~Lot()
|
||||||
|
{
|
||||||
|
dc_lot_unref(m_lot);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Lot::getText1() const
|
||||||
|
{
|
||||||
|
char *text1 = dc_lot_get_text1(m_lot);
|
||||||
|
QString result{text1};
|
||||||
|
dc_str_unref(text1);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Lot::getText2() const
|
||||||
|
{
|
||||||
|
char *text2 = dc_lot_get_text2(m_lot);
|
||||||
|
QString result{text2};
|
||||||
|
dc_str_unref(text2);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Lot::getText1Meaning() const
|
||||||
|
{
|
||||||
|
return dc_lot_get_text1_meaning(m_lot);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Lot::getState() const
|
||||||
|
{
|
||||||
|
return dc_lot_get_state(m_lot);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Lot::getId() const
|
||||||
|
{
|
||||||
|
return dc_lot_get_id(m_lot);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t Lot::getTimestamp() const
|
||||||
|
{
|
||||||
|
return dc_lot_get_timestamp(m_lot);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
25
src/deltachat/lot.h
Normal file
25
src/deltachat/lot.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#ifndef LOT_H
|
||||||
|
#define LOT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <deltachat.h>
|
||||||
|
namespace dc {
|
||||||
|
class Lot : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
dc_lot_t *m_lot{nullptr};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Lot(dc_lot_t *lot);
|
||||||
|
~Lot();
|
||||||
|
|
||||||
|
QString getText1() const;
|
||||||
|
QString getText2() const;
|
||||||
|
int getText1Meaning() const;
|
||||||
|
int getState() const;
|
||||||
|
uint32_t getId() const;
|
||||||
|
int64_t getTimestamp() const;
|
||||||
|
};
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // LOT_H
|
191
src/deltachat/message.cpp
Normal file
191
src/deltachat/message.cpp
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
#include "message.h"
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
Message::Message(dc_msg_t *mgs)
|
||||||
|
{
|
||||||
|
this->m_message = mgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
Message::~Message()
|
||||||
|
{
|
||||||
|
dc_msg_unref(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Message::getId()
|
||||||
|
{
|
||||||
|
return dc_msg_get_id(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Message::getFromId()
|
||||||
|
{
|
||||||
|
return dc_msg_get_from_id(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Message::getChatId()
|
||||||
|
{
|
||||||
|
return dc_msg_get_chat_id(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Message::getViewtype()
|
||||||
|
{
|
||||||
|
return dc_msg_get_viewtype(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Message::getState()
|
||||||
|
{
|
||||||
|
return dc_msg_get_state(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
QDateTime Message::getTimestamp()
|
||||||
|
{
|
||||||
|
return QDateTime::fromSecsSinceEpoch(dc_msg_get_timestamp(m_message), Qt::UTC);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Message::saveAttach(QString dest)
|
||||||
|
{
|
||||||
|
if (!dest.isNull()) {
|
||||||
|
char *file = dc_msg_get_file(m_message);
|
||||||
|
QString fileUrl{file};
|
||||||
|
dc_str_unref(file);
|
||||||
|
|
||||||
|
// We need to replace, so we delete the file first.
|
||||||
|
if (QFile::exists(dest)) {
|
||||||
|
if (!QFile::remove(dest))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return QFile::copy(fileUrl, dest);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Message::setText(QString text)
|
||||||
|
{
|
||||||
|
QByteArray utf8Text = text.toUtf8();
|
||||||
|
return dc_msg_set_text(m_message, utf8Text.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getText()
|
||||||
|
{
|
||||||
|
char *text = dc_msg_get_text(m_message);
|
||||||
|
QString result{text};
|
||||||
|
dc_str_unref(text);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Message::setFile(QString file)
|
||||||
|
{
|
||||||
|
QByteArray utf8File = file.toUtf8();
|
||||||
|
return dc_msg_set_file(m_message, utf8File.constData(), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getSubject()
|
||||||
|
{
|
||||||
|
char *subject = dc_msg_get_subject(m_message);
|
||||||
|
QString result{subject};
|
||||||
|
dc_str_unref(subject);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Message::setSubject(QString sub)
|
||||||
|
{
|
||||||
|
QByteArray data = sub.toUtf8();
|
||||||
|
dc_msg_set_subject(m_message, data.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getFile()
|
||||||
|
{
|
||||||
|
char *file = dc_msg_get_file(m_message);
|
||||||
|
QString result{file};
|
||||||
|
dc_str_unref(file);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getFilename()
|
||||||
|
{
|
||||||
|
char *filename = dc_msg_get_filename(m_message);
|
||||||
|
QString result{filename};
|
||||||
|
dc_str_unref(filename);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getFilemime()
|
||||||
|
{
|
||||||
|
char *filemime = dc_msg_get_filemime(m_message);
|
||||||
|
QString result{filemime};
|
||||||
|
dc_str_unref(filemime);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Message::getWidth()
|
||||||
|
{
|
||||||
|
return dc_msg_get_width(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Message::getHeight()
|
||||||
|
{
|
||||||
|
return dc_msg_get_height(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Message::getShowPadlock()
|
||||||
|
{
|
||||||
|
return dc_msg_get_showpadlock(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Message::getIsBot()
|
||||||
|
{
|
||||||
|
return dc_msg_is_bot(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getOverrideSenderName()
|
||||||
|
{
|
||||||
|
char *name = dc_msg_get_override_sender_name(m_message);
|
||||||
|
QString result{name};
|
||||||
|
dc_str_unref(name);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Message::isInfo()
|
||||||
|
{
|
||||||
|
return dc_msg_is_info(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getError()
|
||||||
|
{
|
||||||
|
char *error = dc_msg_get_error(m_message);
|
||||||
|
QString result{error};
|
||||||
|
dc_str_unref(error);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Message::hasHtml()
|
||||||
|
{
|
||||||
|
return dc_msg_has_html(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Message::getQuotedText()
|
||||||
|
{
|
||||||
|
char *text = dc_msg_get_quoted_text(m_message);
|
||||||
|
QString result{text};
|
||||||
|
dc_str_unref(text);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Message> Message::getQuotedMessage()
|
||||||
|
{
|
||||||
|
dc_msg_t *quote = dc_msg_get_quoted_msg(m_message);
|
||||||
|
if (quote) {
|
||||||
|
auto ret = std::shared_ptr<Message>(new Message(quote));
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Message::getInfoType()
|
||||||
|
{
|
||||||
|
return dc_msg_get_info_type(m_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dc
|
68
src/deltachat/message.h
Normal file
68
src/deltachat/message.h
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#ifndef MESSAGE_H
|
||||||
|
#define MESSAGE_H
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QObject>
|
||||||
|
#include <deltachat.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace dc {
|
||||||
|
class Message : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
dc_msg_t *m_message;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Message(dc_msg_t *m_message);
|
||||||
|
~Message();
|
||||||
|
|
||||||
|
// function
|
||||||
|
uint32_t getId();
|
||||||
|
uint32_t getFromId();
|
||||||
|
uint32_t getChatId();
|
||||||
|
int getViewtype();
|
||||||
|
int getState();
|
||||||
|
QDateTime getTimestamp();
|
||||||
|
// int64_t getReceivedTimestamp();
|
||||||
|
// int64_t getSortTimestamp();
|
||||||
|
bool saveAttach(QString);
|
||||||
|
void setText(QString);
|
||||||
|
void setFile(QString);
|
||||||
|
QString getText();
|
||||||
|
QString getSubject();
|
||||||
|
void setSubject(QString sub);
|
||||||
|
QString getFile();
|
||||||
|
QString getFilename();
|
||||||
|
QString getFilemime();
|
||||||
|
//uint64_t getFilebytes();
|
||||||
|
int getWidth();
|
||||||
|
int getHeight();
|
||||||
|
//int getDuration();
|
||||||
|
bool getShowPadlock();
|
||||||
|
bool getIsBot();
|
||||||
|
//uint32_t getEphemeralTimer();
|
||||||
|
//int64_t getEphemeralTimestamp();
|
||||||
|
//... getsummary ...
|
||||||
|
QString getOverrideSenderName();
|
||||||
|
//hasDeviatingTimestamp
|
||||||
|
//hasLocation
|
||||||
|
//isSent
|
||||||
|
//isStarred
|
||||||
|
//isForwarded
|
||||||
|
bool isInfo();
|
||||||
|
QString getError();
|
||||||
|
bool hasHtml();
|
||||||
|
//isIncreation
|
||||||
|
//isSetupmessage
|
||||||
|
QString getQuotedText();
|
||||||
|
std::shared_ptr<Message> getQuotedMessage();
|
||||||
|
|
||||||
|
int getInfoType();
|
||||||
|
|
||||||
|
//
|
||||||
|
friend class Context;
|
||||||
|
};
|
||||||
|
} // namespace dc
|
||||||
|
|
||||||
|
#endif // MESSAGE_H
|
44
src/main.cpp
Normal file
44
src/main.cpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <app/app.h>
|
||||||
|
#include <model/chat/chatcore.h>
|
||||||
|
|
||||||
|
using namespace dc;
|
||||||
|
static void init(Task* task)
|
||||||
|
{
|
||||||
|
Acc* m_acc = new Acc(task);
|
||||||
|
ContactUi* up = new ContactUi(task);
|
||||||
|
ChatUi* ui = new ChatUi(task);
|
||||||
|
(void)m_acc;
|
||||||
|
(void)up;
|
||||||
|
(void)ui;
|
||||||
|
}
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
ChatCore::init();
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
engine.addImportPath(":/qml");
|
||||||
|
engine.load(QUrl(QLatin1String("qrc:/qml/main.qml")));
|
||||||
|
if (engine.rootObjects().isEmpty())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
qDebug() << "start amneiht chat";
|
||||||
|
MsgShow msg;
|
||||||
|
auto acc = Account::getInstance();
|
||||||
|
QObject::connect(acc.get(), &Account::incomingMessage, &msg, &MsgShow::onIncomingMessage);
|
||||||
|
|
||||||
|
Task* task = new Task();
|
||||||
|
init(task);
|
||||||
|
QObject::connect(task, &Task::finish, &app, &QGuiApplication::quit);
|
||||||
|
task->start();
|
||||||
|
app.exec();
|
||||||
|
ChatCore::close();
|
||||||
|
task->disablerun();
|
||||||
|
task->wait();
|
||||||
|
delete task;
|
||||||
|
}
|
33
src/model/chat/chatcore.cpp
Normal file
33
src/model/chat/chatcore.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#include "chatcore.h"
|
||||||
|
#include "chatlistmodel.h"
|
||||||
|
#include "chatproxymodel.h"
|
||||||
|
#include "chatroommodel.h"
|
||||||
|
#include "messagemodel.h"
|
||||||
|
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <qqml.h>
|
||||||
|
|
||||||
|
ChatCore::ChatCore() { }
|
||||||
|
|
||||||
|
// contain declare
|
||||||
|
|
||||||
|
constexpr char ChatCore::QmlName[];
|
||||||
|
|
||||||
|
void ChatCore::init()
|
||||||
|
{
|
||||||
|
|
||||||
|
// for linux
|
||||||
|
auto path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/chat";
|
||||||
|
dc::Account::init(path);
|
||||||
|
// @uri Dcchat
|
||||||
|
qmlRegisterType<ChatProxyModel>(ChatCore::QmlName, 1, 0, "ChatProxyModel");
|
||||||
|
qmlRegisterType<ChatListModel>(ChatCore::QmlName, 1, 0, "ChatListModel");
|
||||||
|
qmlRegisterType<ChatRoomModel>(ChatCore::QmlName, 1, 0, "ChatRoomModel");
|
||||||
|
qmlRegisterType<MessageModel>(ChatCore::QmlName, 1, 0, "MessageModel");
|
||||||
|
dc::Account::getInstance()->startEventLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatCore::close()
|
||||||
|
{
|
||||||
|
dc::Account::close();
|
||||||
|
}
|
18
src/model/chat/chatcore.h
Normal file
18
src/model/chat/chatcore.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef CHATCORE_H
|
||||||
|
#define CHATCORE_H
|
||||||
|
|
||||||
|
#include <deltachat/deltacpp.h>
|
||||||
|
|
||||||
|
class ChatCore {
|
||||||
|
|
||||||
|
public:
|
||||||
|
ChatCore();
|
||||||
|
|
||||||
|
static void init();
|
||||||
|
static void close();
|
||||||
|
|
||||||
|
// constaince
|
||||||
|
static constexpr char QmlName[] = "Dcchat";
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CHATCORE_H
|
64
src/model/chat/chatlistmodel.cpp
Normal file
64
src/model/chat/chatlistmodel.cpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include "chatlistmodel.h"
|
||||||
|
#include "chatcore.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
ChatListModel::ChatListModel(QObject* parent)
|
||||||
|
: QAbstractListModel { parent }
|
||||||
|
{
|
||||||
|
auto acc = dc::Account::getInstance();
|
||||||
|
auto ctx = acc->getSelectedAccount();
|
||||||
|
if (ctx)
|
||||||
|
list = dc::Account::getInstance()->getSelectedAccount()->getChatlist(0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
int ChatListModel::rowCount(const QModelIndex& parent) const
|
||||||
|
{
|
||||||
|
|
||||||
|
if (list) {
|
||||||
|
return list->getChatCount();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> ChatListModel::roleNames() const
|
||||||
|
{
|
||||||
|
QHash<int, QByteArray> ret;
|
||||||
|
ret[ListRole::ChatID] = "$chatid";
|
||||||
|
ret[ListRole::Username] = "$name";
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant ChatListModel::data(const QModelIndex& index, int role) const
|
||||||
|
{
|
||||||
|
int pid = index.row();
|
||||||
|
auto chat_id = list->getChatId(pid);
|
||||||
|
std::shared_ptr<dc::Chat> chat;
|
||||||
|
switch (role) {
|
||||||
|
case ListRole::ChatID:
|
||||||
|
return chat_id;
|
||||||
|
case ListRole::Username:
|
||||||
|
chat = dc::Account::getInstance()->getSelectedAccount()->getChat(chat_id);
|
||||||
|
return chat->getName();
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ChatListModel::getName(const QVariant& index)
|
||||||
|
{
|
||||||
|
// row id
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
auto list = ctx->getChatlist(0, "");
|
||||||
|
int id = index.toInt();
|
||||||
|
|
||||||
|
auto chat_id = list->getChatId(id);
|
||||||
|
// qDebug() << "get chat with" + QString::number(chat_id);
|
||||||
|
if (chat_id >= 0) {
|
||||||
|
auto chat = ctx->getChat(chat_id);
|
||||||
|
return chat->getName();
|
||||||
|
}
|
||||||
|
qDebug() << "Error: can not get chat";
|
||||||
|
return "Error";
|
||||||
|
}
|
35
src/model/chat/chatlistmodel.h
Normal file
35
src/model/chat/chatlistmodel.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#ifndef CHATLISTMODEL_H
|
||||||
|
#define CHATLISTMODEL_H
|
||||||
|
|
||||||
|
#include "chatcore.h"
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
class ChatListModel : public QAbstractListModel {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum ListRole {
|
||||||
|
/** $chatid */
|
||||||
|
ChatID = Qt::UserRole,
|
||||||
|
/** $name */
|
||||||
|
Username //
|
||||||
|
};
|
||||||
|
std::shared_ptr<dc::Chatlist> list;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ChatListModel(QObject* parent = nullptr);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
|
||||||
|
// QAbstractItemModel interface
|
||||||
|
public:
|
||||||
|
int rowCount(const QModelIndex& parent) const;
|
||||||
|
QHash<int, QByteArray> roleNames() const;
|
||||||
|
QVariant data(const QModelIndex& index, int role) const;
|
||||||
|
|
||||||
|
Q_INVOKABLE QString getName(const QVariant& index);
|
||||||
|
|
||||||
|
// QAbstractItemModel interface
|
||||||
|
public:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CHATLISTMODEL_H
|
36
src/model/chat/chatproxymodel.cpp
Normal file
36
src/model/chat/chatproxymodel.cpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#include "chatproxymodel.h"
|
||||||
|
#include "chatlistmodel.h"
|
||||||
|
|
||||||
|
#include "chatcore.h"
|
||||||
|
|
||||||
|
ChatProxyModel::ChatProxyModel(QObject* parent)
|
||||||
|
: QSortFilterProxyModel { parent }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatProxyModel::setSourceModel(QAbstractItemModel* sourceModel)
|
||||||
|
{
|
||||||
|
model = static_cast<ChatListModel*>(sourceModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatProxyModel::setFilterString(const QString& filer)
|
||||||
|
{
|
||||||
|
this->filter = filer;
|
||||||
|
emit filterChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ChatProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
|
||||||
|
{
|
||||||
|
auto name = model->getName(source_parent);
|
||||||
|
if (filter != "") {
|
||||||
|
return name.contains(filter);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ChatProxyModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const
|
||||||
|
{
|
||||||
|
|
||||||
|
// todo sort by arrival time
|
||||||
|
return source_left.row() > source_right.row();
|
||||||
|
}
|
31
src/model/chat/chatproxymodel.h
Normal file
31
src/model/chat/chatproxymodel.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#ifndef CHATPROXYMODEL_H
|
||||||
|
#define CHATPROXYMODEL_H
|
||||||
|
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
|
class ChatListModel;
|
||||||
|
class ChatProxyModel : public QSortFilterProxyModel {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
ChatListModel* model;
|
||||||
|
QString filter = "";
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ChatProxyModel(QObject* parent = nullptr);
|
||||||
|
|
||||||
|
// QAbstractProxyModel interface
|
||||||
|
public:
|
||||||
|
void setSourceModel(QAbstractItemModel* sourceModel);
|
||||||
|
|
||||||
|
Q_INVOKABLE void setFilterString(const QString& filer);
|
||||||
|
// QSortFilterProxyModel interface
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
|
||||||
|
bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void filterChange();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CHATPROXYMODEL_H
|
145
src/model/chat/chatroommodel.cpp
Normal file
145
src/model/chat/chatroommodel.cpp
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
#include "chatroommodel.h"
|
||||||
|
#include "chatcore.h"
|
||||||
|
#include "messagemodel.h"
|
||||||
|
#include <QDebug>
|
||||||
|
ChatRoomModel::ChatRoomModel(QObject* parent)
|
||||||
|
: QAbstractListModel { parent }
|
||||||
|
{
|
||||||
|
mess_count = 10;
|
||||||
|
|
||||||
|
auto acc = dc::Account::getInstance();
|
||||||
|
connect(acc.get(), &dc::Account::incomingMessage, this, &ChatRoomModel::onIncomingMessage);
|
||||||
|
connect(acc.get(), &dc::Account::outGoingMessage, this, &ChatRoomModel::onOutGoingMessage);
|
||||||
|
connect(this, &ChatRoomModel::updateData, this, &ChatRoomModel::rowChange, Qt::DirectConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ChatRoomModel::rowCount(const QModelIndex& parent) const
|
||||||
|
{
|
||||||
|
return mess_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ChatRoomModel::getChatid() const
|
||||||
|
{
|
||||||
|
return m_chatid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatRoomModel::setChatid(int newChatid)
|
||||||
|
{
|
||||||
|
if (m_chatid == newChatid)
|
||||||
|
return;
|
||||||
|
m_chatid = newChatid;
|
||||||
|
auto list = dc::Account::getInstance()->getSelectedAccount()->getMsgIdList(m_chatid);
|
||||||
|
// limit mess display
|
||||||
|
current_count = list.count();
|
||||||
|
if (current_count < 20) {
|
||||||
|
mess_count = list.count();
|
||||||
|
} else
|
||||||
|
mess_count = 20;
|
||||||
|
emit chatidChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ChatRoomModel::loadMoredata()
|
||||||
|
{
|
||||||
|
|
||||||
|
int pad = 20;
|
||||||
|
if (current_count > mess_count + pad)
|
||||||
|
mess_count = mess_count + pad;
|
||||||
|
else {
|
||||||
|
pad = current_count - mess_count;
|
||||||
|
mess_count = current_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
rstart = 0;
|
||||||
|
rend = pad - 1;
|
||||||
|
emit this->updateData();
|
||||||
|
// for smooth
|
||||||
|
if (rend > 1)
|
||||||
|
rend = rend - 1;
|
||||||
|
return rend;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ChatRoomModel::chatName()
|
||||||
|
{
|
||||||
|
auto chat = dc::Account::getInstance()->getSelectedAccount()->getChat(m_chatid);
|
||||||
|
return chat->getName();
|
||||||
|
}
|
||||||
|
void ChatRoomModel::onIncomingMessage(uint32_t accountId, int chatId, int msgId)
|
||||||
|
{
|
||||||
|
|
||||||
|
auto id = dc::Account::getInstance()->getSelectedAccount()->getId();
|
||||||
|
if (accountId != id || chatId != m_chatid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rstart = mess_count;
|
||||||
|
rend = mess_count;
|
||||||
|
|
||||||
|
auto list = dc::Account::getInstance()->getSelectedAccount()->getMsgIdList(m_chatid);
|
||||||
|
current_count = list.count();
|
||||||
|
mess_count++;
|
||||||
|
emit this->updateData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatRoomModel::onOutGoingMessage(uint32_t accountId, int chatId)
|
||||||
|
{
|
||||||
|
// realy same as incomming
|
||||||
|
auto id = dc::Account::getInstance()->getSelectedAccount()->getId();
|
||||||
|
if (accountId != id || chatId != m_chatid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rstart = mess_count;
|
||||||
|
rend = mess_count;
|
||||||
|
auto list = dc::Account::getInstance()->getSelectedAccount()->getMsgIdList(m_chatid);
|
||||||
|
current_count = list.count();
|
||||||
|
mess_count++;
|
||||||
|
emit this->updateData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatRoomModel::rowChange()
|
||||||
|
{
|
||||||
|
|
||||||
|
// numver off message is display = messcount
|
||||||
|
beginInsertRows(QModelIndex(), rstart, rend);
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant ChatRoomModel::data(const QModelIndex& index, int role) const
|
||||||
|
{
|
||||||
|
|
||||||
|
auto lctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
auto list = lctx->getMsgIdList(m_chatid);
|
||||||
|
// revert show , lastest mess first
|
||||||
|
int id = (current_count - mess_count) + index.row();
|
||||||
|
// qDebug() << " run with" + QString::number(current_count) + " id:" + QString::number(index.row());
|
||||||
|
auto mess = lctx->getMessage(list.at(id));
|
||||||
|
|
||||||
|
if (role == Role::text) {
|
||||||
|
return mess->getText();
|
||||||
|
} else if (role == Role::date) {
|
||||||
|
return mess->getTimestamp();
|
||||||
|
} else if (role == Role::user) {
|
||||||
|
auto id = mess->getFromId();
|
||||||
|
if (id != DC_CONTACT_ID_SELF) {
|
||||||
|
auto contact = lctx->getContact(id);
|
||||||
|
return contact->getName();
|
||||||
|
}
|
||||||
|
} else if (role == Role::local) {
|
||||||
|
auto id = mess->getFromId();
|
||||||
|
return id == DC_CONTACT_ID_SELF;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> ChatRoomModel::roleNames() const
|
||||||
|
{
|
||||||
|
QHash<int, QByteArray> role;
|
||||||
|
role[Role::text] = "$text";
|
||||||
|
role[Role::local] = "$local";
|
||||||
|
role[Role::date] = "$date";
|
||||||
|
role[Role::user] = "$user";
|
||||||
|
return role;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatRoomModel::~ChatRoomModel()
|
||||||
|
{
|
||||||
|
}
|
50
src/model/chat/chatroommodel.h
Normal file
50
src/model/chat/chatroommodel.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#ifndef CHATROOMMODEL_H
|
||||||
|
#define CHATROOMMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
|
||||||
|
class ChatRoomModel : public QAbstractListModel {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(int chatid READ getChatid WRITE setChatid NOTIFY chatidChanged FINAL)
|
||||||
|
private:
|
||||||
|
int mess_count = 20;
|
||||||
|
int current_count;
|
||||||
|
int m_chatid;
|
||||||
|
// for insert row
|
||||||
|
int rstart, rend;
|
||||||
|
enum Role {
|
||||||
|
text = Qt::UserRole,
|
||||||
|
user,
|
||||||
|
local,
|
||||||
|
date
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ChatRoomModel(QObject* parent = nullptr);
|
||||||
|
~ChatRoomModel();
|
||||||
|
// QAbstractItemModel interface
|
||||||
|
public:
|
||||||
|
int rowCount(const QModelIndex& parent) const;
|
||||||
|
QVariant data(const QModelIndex& index, int role) const;
|
||||||
|
|
||||||
|
int getChatid() const;
|
||||||
|
void setChatid(int newChatid);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Q_INVOKABLE int loadMoredata();
|
||||||
|
Q_INVOKABLE QString chatName();
|
||||||
|
// QAbstractItemModel interface
|
||||||
|
QHash<int, QByteArray> roleNames() const;
|
||||||
|
public slots:
|
||||||
|
void onIncomingMessage(uint32_t accountId, int chatId, int msgId);
|
||||||
|
void onOutGoingMessage(uint32_t accountId, int chatId);
|
||||||
|
signals:
|
||||||
|
void updateData();
|
||||||
|
void chatidChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void rowChange();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CHATROOMMODEL_H
|
32
src/model/chat/messagemodel.cpp
Normal file
32
src/model/chat/messagemodel.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#include "messagemodel.h"
|
||||||
|
#include "chatcore.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
MessageModel::MessageModel(QObject* parent)
|
||||||
|
: QObject { parent }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageModel::~MessageModel()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int MessageModel::getID() const
|
||||||
|
{
|
||||||
|
return m_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessageModel::setId(int newId)
|
||||||
|
{
|
||||||
|
if (m_id == newId)
|
||||||
|
return;
|
||||||
|
m_id = newId;
|
||||||
|
emit idChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessageModel::sendText(const QString& Text)
|
||||||
|
{
|
||||||
|
auto ctx = dc::Account::getInstance()->getSelectedAccount();
|
||||||
|
ctx->sendTextMessage(m_id, Text);
|
||||||
|
emit dc::Account::getInstance()->outGoingMessage(ctx->getId(), m_id);
|
||||||
|
}
|
27
src/model/chat/messagemodel.h
Normal file
27
src/model/chat/messagemodel.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#ifndef MESSAGEMODEL_H
|
||||||
|
#define MESSAGEMODEL_H
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QObject>
|
||||||
|
class MessageModel : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(int chatid READ getID WRITE setId NOTIFY idChanged FINAL)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MessageModel(QObject* parent = nullptr);
|
||||||
|
~MessageModel();
|
||||||
|
|
||||||
|
int getID() const;
|
||||||
|
void setId(int newId);
|
||||||
|
|
||||||
|
Q_INVOKABLE void sendText(const QString& Text);
|
||||||
|
signals:
|
||||||
|
void idChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// chat id
|
||||||
|
int m_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(MessageModel*);
|
||||||
|
#endif // MESSAGEMODEL_H
|
Loading…
Add table
Add a link
Reference in a new issue