From a24366cd9cd20432c903ab98690d678f3b0c218e Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sat, 9 Oct 2021 17:48:05 +0800 Subject: [PATCH 1/7] extract GroupInfo --- src/iptux/DialogBase.h | 1 + src/iptux/DialogPeer.h | 1 + src/iptux/GroupInfo.cpp | 106 +++++++++++++++++++++++++++++++++++++++ src/iptux/GroupInfo.h | 77 ++++++++++++++++++++++++++++ src/iptux/UiCoreThread.h | 1 + src/iptux/UiModels.cpp | 102 ------------------------------------- src/iptux/UiModels.h | 66 +----------------------- src/iptux/meson.build | 1 + 8 files changed, 188 insertions(+), 167 deletions(-) create mode 100644 src/iptux/GroupInfo.cpp create mode 100644 src/iptux/GroupInfo.h diff --git a/src/iptux/DialogBase.h b/src/iptux/DialogBase.h index e4924e40a..720f0df5d 100644 --- a/src/iptux/DialogBase.h +++ b/src/iptux/DialogBase.h @@ -19,6 +19,7 @@ #include "iptux-core/Models.h" #include "iptux/Application.h" +#include "iptux/GroupInfo.h" #include "iptux/UiModels.h" #include "iptux/UiProgramData.h" diff --git a/src/iptux/DialogPeer.h b/src/iptux/DialogPeer.h index 76d7a59c1..e98ed4f6f 100644 --- a/src/iptux/DialogPeer.h +++ b/src/iptux/DialogPeer.h @@ -17,6 +17,7 @@ #include "iptux-core/Models.h" #include "iptux/Application.h" #include "iptux/DialogBase.h" +#include "iptux/GroupInfo.h" namespace iptux { diff --git a/src/iptux/GroupInfo.cpp b/src/iptux/GroupInfo.cpp new file mode 100644 index 000000000..dfe9e168a --- /dev/null +++ b/src/iptux/GroupInfo.cpp @@ -0,0 +1,106 @@ +#include "config.h" +#include "GroupInfo.h" + +#include "iptux-utils/output.h" +#include "iptux/DialogBase.h" + +using namespace std; + +namespace iptux { + +GroupInfo::GroupInfo(iptux::GroupBelongType t, + const vector& pals, + CPPalInfo me, + LogSystem* logSystem) + : grpid(0), + buffer(NULL), + dialogBase(NULL), + me(me), + members(pals), + type(t), + logSystem(logSystem) { + inputBuffer = gtk_text_buffer_new(NULL); +} + +GroupInfo::~GroupInfo() { + g_object_unref(buffer); +} + +bool GroupInfo::hasPal(PalInfo* pal) const { + for (auto i : members) { + if (i.get() == pal) { + return true; + } + } + return false; +} + +bool GroupInfo::hasPal(PPalInfo pal) const { + return hasPal(pal.get()); +} + +GroupInfo::GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem* logSystem) + : grpid(0), + buffer(NULL), + dialogBase(NULL), + me(me), + type(GROUP_BELONG_TYPE_REGULAR), + logSystem(logSystem) { + members.push_back(pal); + inputBuffer = gtk_text_buffer_new(NULL); +} + +GtkWidget* GroupInfo::getDialog() const { + return dialogBase ? GTK_WIDGET(dialogBase->getWindow()) : nullptr; +} + +bool GroupInfo::addPal(PPalInfo pal) { + if (type == GROUP_BELONG_TYPE_REGULAR) { + LOG_WARN("should not call addPal on GROUP_BELONG_TYPE_REGULAR"); + return false; + } + if (hasPal(pal)) { + return false; + } + members.push_back(pal); + return true; +} + +bool GroupInfo::delPal(PalInfo* pal) { + if (type == GROUP_BELONG_TYPE_REGULAR) { + LOG_WARN("should not call delPal on GROUP_BELONG_TYPE_REGULAR"); + return false; + } + + for (auto it = members.begin(); it != members.end(); ++it) { + if (it->get() == pal) { + members.erase(it); + return true; + } + } + return false; +} + +void GroupInfo::newFileReceived() { + this->signalNewFileReceived.emit(this); +} + +void GroupInfo::addMsgCount(int i) { + int oldCount = getUnreadMsgCount(); + allMsgCount += i; + signalUnreadMsgCountUpdated.emit(this, oldCount, getUnreadMsgCount()); +} + +void GroupInfo::readAllMsg() { + int oldCount = getUnreadMsgCount(); + if (oldCount != 0) { + readMsgCount = allMsgCount; + signalUnreadMsgCountUpdated.emit(this, oldCount, getUnreadMsgCount()); + } +} + +int GroupInfo::getUnreadMsgCount() const { + g_assert(allMsgCount >= readMsgCount); + return allMsgCount - readMsgCount; +} +} // namespace iptux diff --git a/src/iptux/GroupInfo.h b/src/iptux/GroupInfo.h new file mode 100644 index 000000000..9d05d2f2c --- /dev/null +++ b/src/iptux/GroupInfo.h @@ -0,0 +1,77 @@ +#ifndef IPTUX_GROUP_INFO_H +#define IPTUX_GROUP_INFO_H + +#include +#include + +#include "iptux-core/Models.h" +#include "iptux/LogSystem.h" + +namespace iptux { +/** + * 群组信息. + */ +class DialogBase; +class GroupInfo { + public: + GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem* logSystem); + GroupInfo(GroupBelongType type, + const std::vector& pals, + CPPalInfo me, + LogSystem* logSystem); + ~GroupInfo(); + + const std::vector& getMembers() const { return members; } + GroupBelongType getType() const { return type; } + + /** return true if successful added, noop for regular group */ + bool addPal(PPalInfo pal); + + /** return true if successful deleted, noop for regular group */ + bool delPal(PalInfo* pal); + + /** return true if successful deleted, noop for regulat group */ + bool delPal(PPalInfo pal); + + bool hasPal(PalInfo* pal) const; + bool hasPal(PPalInfo pal) const; + + void addMsgPara(const MsgPara& msg); + void readAllMsg(); + int getUnreadMsgCount() const; + void newFileReceived(); + + GtkTextBuffer* getInputBuffer() const { return inputBuffer; } + + void setDialogBase(DialogBase* dialogBase) { this->dialogBase = dialogBase; } + GtkWidget* getDialog() const; + void clearDialog() { dialogBase = nullptr; } + + public: + sigc::signal signalUnreadMsgCountUpdated; + sigc::signal signalNewFileReceived; + + public: + GQuark grpid; ///< 唯一标识 + std::string name; ///< 群组名称 * + GtkTextBuffer* buffer; ///< 历史消息缓冲区 * + + private: + DialogBase* dialogBase; + GtkTextBuffer* inputBuffer; /// 输入缓冲 + + private: + CPPalInfo me; + std::vector members; + GroupBelongType type; ///< 群组类型 + LogSystem* logSystem; + int allMsgCount = 0; /* all received message count */ + int readMsgCount = 0; /* already read message count */ + + private: + void addMsgCount(int i); +}; + +} // namespace iptux + +#endif diff --git a/src/iptux/UiCoreThread.h b/src/iptux/UiCoreThread.h index 46d862c7d..c7e69f3a8 100644 --- a/src/iptux/UiCoreThread.h +++ b/src/iptux/UiCoreThread.h @@ -23,6 +23,7 @@ #include "iptux-core/CoreThread.h" #include "iptux-core/Models.h" #include "iptux/Application.h" +#include "iptux/GroupInfo.h" #include "iptux/UiModels.h" #include "iptux/UiProgramData.h" diff --git a/src/iptux/UiModels.cpp b/src/iptux/UiModels.cpp index 18438a1e5..2677a5d18 100644 --- a/src/iptux/UiModels.cpp +++ b/src/iptux/UiModels.cpp @@ -309,108 +309,6 @@ void palTreeModelFillFromGroupInfo(GtkTreeModel* model, pango_attr_list_unref(attrs); } -// GroupInfo::GroupInfo() -// : grpid(0), -// type(GROUP_BELONG_TYPE_REGULAR), -// member(NULL), -// buffer(NULL), -// dialog(NULL) {} -GroupInfo::~GroupInfo() { - g_object_unref(buffer); -} - -bool GroupInfo::hasPal(PalInfo* pal) const { - for (auto i : members) { - if (i.get() == pal) { - return true; - } - } - return false; -} - -bool GroupInfo::hasPal(PPalInfo pal) const { - return hasPal(pal.get()); -} - -GroupInfo::GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem* logSystem) - : grpid(0), - buffer(NULL), - dialogBase(NULL), - me(me), - type(GROUP_BELONG_TYPE_REGULAR), - logSystem(logSystem) { - members.push_back(pal); - inputBuffer = gtk_text_buffer_new(NULL); -} - -GroupInfo::GroupInfo(iptux::GroupBelongType t, - const vector& pals, - CPPalInfo me, - LogSystem* logSystem) - : grpid(0), - buffer(NULL), - dialogBase(NULL), - me(me), - members(pals), - type(t), - logSystem(logSystem) { - inputBuffer = gtk_text_buffer_new(NULL); -} - -GtkWidget* GroupInfo::getDialog() const { - return dialogBase ? GTK_WIDGET(dialogBase->getWindow()) : nullptr; -} - -bool GroupInfo::addPal(PPalInfo pal) { - if (type == GROUP_BELONG_TYPE_REGULAR) { - LOG_WARN("should not call addPal on GROUP_BELONG_TYPE_REGULAR"); - return false; - } - if (hasPal(pal)) { - return false; - } - members.push_back(pal); - return true; -} - -bool GroupInfo::delPal(PalInfo* pal) { - if (type == GROUP_BELONG_TYPE_REGULAR) { - LOG_WARN("should not call delPal on GROUP_BELONG_TYPE_REGULAR"); - return false; - } - - for (auto it = members.begin(); it != members.end(); ++it) { - if (it->get() == pal) { - members.erase(it); - return true; - } - } - return false; -} - -void GroupInfo::newFileReceived() { - this->signalNewFileReceived.emit(this); -} - -void GroupInfo::addMsgCount(int i) { - int oldCount = getUnreadMsgCount(); - allMsgCount += i; - signalUnreadMsgCountUpdated.emit(this, oldCount, getUnreadMsgCount()); -} - -void GroupInfo::readAllMsg() { - int oldCount = getUnreadMsgCount(); - if (oldCount != 0) { - readMsgCount = allMsgCount; - signalUnreadMsgCountUpdated.emit(this, oldCount, getUnreadMsgCount()); - } -} - -int GroupInfo::getUnreadMsgCount() const { - g_assert(allMsgCount >= readMsgCount); - return allMsgCount - readMsgCount; -} - /** * 插入字符串到TextBuffer(非UI线程安全). * @param buffer text-buffer diff --git a/src/iptux/UiModels.h b/src/iptux/UiModels.h index 1c94388dc..a81e7db19 100644 --- a/src/iptux/UiModels.h +++ b/src/iptux/UiModels.h @@ -2,10 +2,10 @@ #define IPTUX_UIMODELS_H #include -#include #include "iptux-core/Models.h" #include "iptux-core/TransFileModel.h" +#include "iptux/GroupInfo.h" #include "iptux/LogSystem.h" namespace iptux { @@ -33,70 +33,6 @@ class SessionAbstract { virtual void OnNewMessageComing() = 0; ///< 窗口打开情况下有新消息 }; -/** - * 群组信息. - */ -class DialogBase; -class GroupInfo { - public: - GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem* logSystem); - GroupInfo(GroupBelongType type, - const std::vector& pals, - CPPalInfo me, - LogSystem* logSystem); - ~GroupInfo(); - - const std::vector& getMembers() const { return members; } - GroupBelongType getType() const { return type; } - - /** return true if successful added, noop for regular group */ - bool addPal(PPalInfo pal); - - /** return true if successful deleted, noop for regular group */ - bool delPal(PalInfo* pal); - - /** return true if successful deleted, noop for regulat group */ - bool delPal(PPalInfo pal); - - bool hasPal(PalInfo* pal) const; - bool hasPal(PPalInfo pal) const; - - void addMsgPara(const MsgPara& msg); - void readAllMsg(); - int getUnreadMsgCount() const; - void newFileReceived(); - - GtkTextBuffer* getInputBuffer() const { return inputBuffer; } - - void setDialogBase(DialogBase* dialogBase) { this->dialogBase = dialogBase; } - GtkWidget* getDialog() const; - void clearDialog() { dialogBase = nullptr; } - - public: - sigc::signal signalUnreadMsgCountUpdated; - sigc::signal signalNewFileReceived; - - public: - GQuark grpid; ///< 唯一标识 - std::string name; ///< 群组名称 * - GtkTextBuffer* buffer; ///< 历史消息缓冲区 * - - private: - DialogBase* dialogBase; - GtkTextBuffer* inputBuffer; /// 输入缓冲 - - private: - CPPalInfo me; - std::vector members; - GroupBelongType type; ///< 群组类型 - LogSystem* logSystem; - int allMsgCount = 0; /* all received message count */ - int readMsgCount = 0; /* already read message count */ - - private: - void addMsgCount(int i); -}; - enum class TransModelColumn { STATUS, TASK, diff --git a/src/iptux/meson.build b/src/iptux/meson.build index 1ad9b5c88..f925b13f5 100644 --- a/src/iptux/meson.build +++ b/src/iptux/meson.build @@ -16,6 +16,7 @@ sources = files([ 'DialogPeer.cpp', 'EventAdaptor.cpp', 'GioNotificationService.cpp', + 'GroupInfo.cpp', 'LogSystem.cpp', 'MainWindow.cpp', 'RevisePal.cpp', From 6192acbd7bc405b9099c1304e95a0201b88888a8 Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sat, 9 Oct 2021 17:54:22 +0800 Subject: [PATCH 2/7] always use LogSystem_S --- src/iptux/Application.cpp | 7 ++----- src/iptux/Application.h | 4 ++-- src/iptux/GroupInfo.cpp | 24 ++++++++++++------------ src/iptux/GroupInfo.h | 6 +++--- src/iptux/LogSystem.h | 2 ++ src/iptux/UiCoreThread.h | 4 ++-- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/iptux/Application.cpp b/src/iptux/Application.cpp index b78c5e319..50123a17f 100644 --- a/src/iptux/Application.cpp +++ b/src/iptux/Application.cpp @@ -49,7 +49,7 @@ void onWhatsNew() { iptux_open_url("https://github.com/iptux-src/iptux/blob/master/NEWS.md"); } -void iptux_init(LogSystem* logSystem) { +void iptux_init(LogSystem_S logSystem) { signal(SIGPIPE, SIG_IGN); logSystem->systemLog("%s", _("Loading the process successfully!")); } @@ -100,9 +100,6 @@ Application::~Application() { if (eventAdaptor) { delete eventAdaptor; } - if (logSystem) { - delete logSystem; - } delete window; delete notificationService; } @@ -125,7 +122,7 @@ void Application::onStartup(Application& self) { self.menuBuilder = gtk_builder_new_from_resource(IPTUX_RESOURCE "gtk/menus.ui"); self.data = make_shared(self.config); - self.logSystem = new LogSystem(self.data); + self.logSystem = make_shared(self.data); self.cthrd = make_shared(&self, self.data); self.window = new MainWindow(&self, *self.cthrd); self.eventAdaptor = new EventAdaptor( diff --git a/src/iptux/Application.h b/src/iptux/Application.h index 13c9fea20..14b390140 100644 --- a/src/iptux/Application.h +++ b/src/iptux/Application.h @@ -31,7 +31,7 @@ class Application { TransModel* getTransModel() { return transModel; } MainWindow* getMainWindow() { return window; } GtkBuilder* getMenuBuilder() { return menuBuilder; } - LogSystem* getLogSystem() { return logSystem; } + LogSystem_S getLogSystem() { return logSystem; } std::shared_ptr getProgramData() { return data; } std::shared_ptr getCoreThread() { return cthrd; } void refreshTransTasks(); @@ -51,7 +51,7 @@ class Application { ShareFile* shareFile = 0; TransWindow* transWindow = 0; EventAdaptor* eventAdaptor = 0; - LogSystem* logSystem = 0; + LogSystem_S logSystem; NotificationService* notificationService = 0; bool started{false}; diff --git a/src/iptux/GroupInfo.cpp b/src/iptux/GroupInfo.cpp index dfe9e168a..d73eb9bee 100644 --- a/src/iptux/GroupInfo.cpp +++ b/src/iptux/GroupInfo.cpp @@ -11,7 +11,7 @@ namespace iptux { GroupInfo::GroupInfo(iptux::GroupBelongType t, const vector& pals, CPPalInfo me, - LogSystem* logSystem) + LogSystem_S logSystem) : grpid(0), buffer(NULL), dialogBase(NULL), @@ -22,6 +22,17 @@ GroupInfo::GroupInfo(iptux::GroupBelongType t, inputBuffer = gtk_text_buffer_new(NULL); } +GroupInfo::GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem_S logSystem) + : grpid(0), + buffer(NULL), + dialogBase(NULL), + me(me), + type(GROUP_BELONG_TYPE_REGULAR), + logSystem(logSystem) { + members.push_back(pal); + inputBuffer = gtk_text_buffer_new(NULL); +} + GroupInfo::~GroupInfo() { g_object_unref(buffer); } @@ -39,17 +50,6 @@ bool GroupInfo::hasPal(PPalInfo pal) const { return hasPal(pal.get()); } -GroupInfo::GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem* logSystem) - : grpid(0), - buffer(NULL), - dialogBase(NULL), - me(me), - type(GROUP_BELONG_TYPE_REGULAR), - logSystem(logSystem) { - members.push_back(pal); - inputBuffer = gtk_text_buffer_new(NULL); -} - GtkWidget* GroupInfo::getDialog() const { return dialogBase ? GTK_WIDGET(dialogBase->getWindow()) : nullptr; } diff --git a/src/iptux/GroupInfo.h b/src/iptux/GroupInfo.h index 9d05d2f2c..c8198869c 100644 --- a/src/iptux/GroupInfo.h +++ b/src/iptux/GroupInfo.h @@ -14,11 +14,11 @@ namespace iptux { class DialogBase; class GroupInfo { public: - GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem* logSystem); + GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem_S logSystem); GroupInfo(GroupBelongType type, const std::vector& pals, CPPalInfo me, - LogSystem* logSystem); + LogSystem_S logSystem); ~GroupInfo(); const std::vector& getMembers() const { return members; } @@ -64,7 +64,7 @@ class GroupInfo { CPPalInfo me; std::vector members; GroupBelongType type; ///< 群组类型 - LogSystem* logSystem; + LogSystem_S logSystem; int allMsgCount = 0; /* all received message count */ int readMsgCount = 0; /* already read message count */ diff --git a/src/iptux/LogSystem.h b/src/iptux/LogSystem.h index 888faac4d..d2ae07df1 100644 --- a/src/iptux/LogSystem.h +++ b/src/iptux/LogSystem.h @@ -42,6 +42,8 @@ class LogSystem { void InitSublayer(); }; +using LogSystem_S = std::shared_ptr; + } // namespace iptux #endif diff --git a/src/iptux/UiCoreThread.h b/src/iptux/UiCoreThread.h index c7e69f3a8..66355d9e1 100644 --- a/src/iptux/UiCoreThread.h +++ b/src/iptux/UiCoreThread.h @@ -59,7 +59,7 @@ class UiCoreThread : public CoreThread { void PushItemToEnclosureList(FileInfo* file); void PopItemFromEnclosureList(FileInfo* file); - LogSystem* getLogSystem() { return logSystem; } + LogSystem_S getLogSystem() { return logSystem; } public: sigc::signal signalGroupInfoUpdated; @@ -79,7 +79,7 @@ class UiCoreThread : public CoreThread { private: std::shared_ptr programData; - LogSystem* logSystem; + LogSystem_S logSystem; std::queue messages; GSList *groupInfos, *sgmlist, *grplist, *brdlist; //群组链表(成员不能被删除) From 2415c887e7c6faa29f3d8230258a9cfc9db0940c Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sat, 9 Oct 2021 18:42:59 +0800 Subject: [PATCH 3/7] add groupInfoManager --- src/api/iptux-core/Models.h | 7 +++-- src/api/iptux-core/ProgramData.h | 3 ++ src/iptux-core/Models.cpp | 10 ++++++ src/iptux/GroupInfo.cpp | 7 +++++ src/iptux/GroupInfo.h | 4 +++ src/iptux/GroupInfoManager.cpp | 30 ++++++++++++++++++ src/iptux/GroupInfoManager.h | 28 +++++++++++++++++ src/iptux/UiCoreThread.cpp | 52 +++++++++++--------------------- src/iptux/UiCoreThread.h | 4 ++- src/iptux/UiProgramData.h | 3 ++ src/iptux/meson.build | 1 + 11 files changed, 111 insertions(+), 38 deletions(-) create mode 100644 src/iptux/GroupInfoManager.cpp create mode 100644 src/iptux/GroupInfoManager.h diff --git a/src/api/iptux-core/Models.h b/src/api/iptux-core/Models.h index a7cf11e01..51cd5ede0 100644 --- a/src/api/iptux-core/Models.h +++ b/src/api/iptux-core/Models.h @@ -58,6 +58,7 @@ class PalKey { PalKey(in_addr ipv4, int port); bool operator==(const PalKey& rhs) const; + bool operator<(const PalKey& rhs) const; in_addr GetIpv4() const { return ipv4; } std::string GetIpv4String() const; @@ -133,10 +134,12 @@ class PalInfo { }; /// pointer to PalInfo -using PPalInfo = std::shared_ptr; +using PalInfo_S = std::shared_ptr; +using PPalInfo = PalInfo_S; /// const pointer to PalInfo -using CPPalInfo = std::shared_ptr; +using PalInfo_SC = std::shared_ptr; +using CPPalInfo = PalInfo_SC; enum class FileAttr : std::uint32_t { UNKNOWN, REGULAR, DIRECTORY }; diff --git a/src/api/iptux-core/ProgramData.h b/src/api/iptux-core/ProgramData.h index 1ad383904..3ef1cbd29 100644 --- a/src/api/iptux-core/ProgramData.h +++ b/src/api/iptux-core/ProgramData.h @@ -104,6 +104,9 @@ class ProgramData { void WriteNetSegment(); void ReadNetSegment(); }; + +using ProgramData_S = std::shared_ptr; + } // namespace iptux #endif // IPTUX_PROGRAMDATACORE_H diff --git a/src/iptux-core/Models.cpp b/src/iptux-core/Models.cpp index 908e3ea2d..e5af8e13e 100644 --- a/src/iptux-core/Models.cpp +++ b/src/iptux-core/Models.cpp @@ -267,6 +267,16 @@ bool PalKey::operator==(const PalKey& rhs) const { return ipv4Equal(this->ipv4, rhs.ipv4) && this->port == rhs.port; } +bool PalKey::operator<(const PalKey& rhs) const { + if (ipv4Compare(this->ipv4, rhs.ipv4) < 0) { + return true; + } else if (ipv4Compare(this->ipv4, rhs.ipv4) > 0) { + return false; + } else { + return this->port < rhs.port; + } +} + string PalKey::ToString() const { return stringFormat("%s:%d", inAddrToString(ipv4).c_str(), port); } diff --git a/src/iptux/GroupInfo.cpp b/src/iptux/GroupInfo.cpp index d73eb9bee..0ba6dbcf3 100644 --- a/src/iptux/GroupInfo.cpp +++ b/src/iptux/GroupInfo.cpp @@ -54,6 +54,13 @@ GtkWidget* GroupInfo::getDialog() const { return dialogBase ? GTK_WIDGET(dialogBase->getWindow()) : nullptr; } +PalKey GroupInfo::getKey() const { + if (type == GROUP_BELONG_TYPE_REGULAR) { + return getMembers()[0]->GetKey(); + } + throw std::runtime_error("GroupInfo::getKey()"); +} + bool GroupInfo::addPal(PPalInfo pal) { if (type == GROUP_BELONG_TYPE_REGULAR) { LOG_WARN("should not call addPal on GROUP_BELONG_TYPE_REGULAR"); diff --git a/src/iptux/GroupInfo.h b/src/iptux/GroupInfo.h index c8198869c..68fdaa7e5 100644 --- a/src/iptux/GroupInfo.h +++ b/src/iptux/GroupInfo.h @@ -24,6 +24,8 @@ class GroupInfo { const std::vector& getMembers() const { return members; } GroupBelongType getType() const { return type; } + PalKey getKey() const; + /** return true if successful added, noop for regular group */ bool addPal(PPalInfo pal); @@ -72,6 +74,8 @@ class GroupInfo { void addMsgCount(int i); }; +using GroupInfo_S = std::shared_ptr; + } // namespace iptux #endif diff --git a/src/iptux/GroupInfoManager.cpp b/src/iptux/GroupInfoManager.cpp new file mode 100644 index 000000000..9b9f05288 --- /dev/null +++ b/src/iptux/GroupInfoManager.cpp @@ -0,0 +1,30 @@ +#include "config.h" +#include "GroupInfoManager.h" + +#include "iptux-utils/utils.h" + +namespace iptux { + +GroupInfoManager::GroupInfoManager(UiProgramData_S programData, + LogSystem_S logSystem) + : programData(programData), logSystem(logSystem) {} + +GroupInfo_S GroupInfoManager::addPal(PalInfo_S pal, PalInfo_SC me) { + auto grpinf = make_shared(pal, me, logSystem); + grpinf->grpid = inAddrToUint32(pal->ipv4); + grpinf->name = pal->getName(); + grpinf->buffer = gtk_text_buffer_new(programData->table); + grpinf->clearDialog(); + addGroupInfo(grpinf); + return grpinf; +} + +GroupInfo_S GroupInfoManager::getGroupInfo(const PalInfo* pal) { + return groupInfos[pal->GetKey()]; +} + +void GroupInfoManager::addGroupInfo(GroupInfo_S groupInfo) { + groupInfos[groupInfo->getKey()] = groupInfo; +} + +} // namespace iptux diff --git a/src/iptux/GroupInfoManager.h b/src/iptux/GroupInfoManager.h new file mode 100644 index 000000000..36d827e8c --- /dev/null +++ b/src/iptux/GroupInfoManager.h @@ -0,0 +1,28 @@ +#ifndef IPTUX_GROUP_INFO_MANAGER_H +#define IPTUX_GROUP_INFO_MANAGER_H + +#include "iptux/GroupInfo.h" +#include "iptux/LogSystem.h" +#include "iptux/UiProgramData.h" + +namespace iptux { + +class GroupInfoManager { + public: + GroupInfoManager(UiProgramData_S programData, LogSystem_S logSystem); + + void addGroupInfo(GroupInfo_S groupInfo); + GroupInfo_S addPal(PalInfo_S pal, PalInfo_SC me); + GroupInfo_S getGroupInfo(const PalInfo* pal); + + private: + UiProgramData_S programData; + LogSystem_S logSystem; + std::map groupInfos; +}; + +using GroupInfoManager_U = std::unique_ptr; + +} // namespace iptux + +#endif diff --git a/src/iptux/UiCoreThread.cpp b/src/iptux/UiCoreThread.cpp index 2a6a74ab7..fb0cf4786 100644 --- a/src/iptux/UiCoreThread.cpp +++ b/src/iptux/UiCoreThread.cpp @@ -24,7 +24,6 @@ #include "iptux-utils/utils.h" #include "iptux/LogSystem.h" #include "iptux/UiHelper.h" -#include "iptux/UiProgramData.h" using namespace std; @@ -36,13 +35,14 @@ namespace iptux { UiCoreThread::UiCoreThread(Application* app, shared_ptr data) : CoreThread(data), programData(data), - groupInfos(NULL), sgmlist(NULL), grplist(NULL), brdlist(NULL), pbn(1), prn(MAX_SHAREDFILE), ecsList(NULL) { + groupInfoManager = + make_unique(app->getProgramData(), app->getLogSystem()); logSystem = app->getLogSystem(); InitSublayer(); } @@ -63,17 +63,17 @@ void UiCoreThread::ClearAllPalFromList() { GroupInfo* grpinf; GSList* tlist; - /* 清空常规模式下所有群组的成员 */ - tlist = groupInfos; - while (tlist) { - grpinf = (GroupInfo*)tlist->data; - if (grpinf->getDialog()) { - session = (SessionAbstract*)g_object_get_data( - G_OBJECT(grpinf->getDialog()), "session-class"); - session->ClearAllPalData(); - } - tlist = g_slist_next(tlist); - } + // /* 清空常规模式下所有群组的成员 */ + // tlist = groupInfos; + // while (tlist) { + // grpinf = (GroupInfo*)tlist->data; + // if (grpinf->getDialog()) { + // session = (SessionAbstract*)g_object_get_data( + // G_OBJECT(grpinf->getDialog()), "session-class"); + // session->ClearAllPalData(); + // } + // tlist = g_slist_next(tlist); + // } /* 清空网段模式下所有群组的成员 */ tlist = sgmlist; while (tlist) { @@ -225,16 +225,8 @@ void UiCoreThread::AttachPalToList(shared_ptr pal2) { * @return 群组信息 */ GroupInfo* UiCoreThread::GetPalRegularItem(const PalInfo* pal) { - GSList* tlist; - - tlist = groupInfos; - while (tlist) { - if (((GroupInfo*)tlist->data)->grpid == inAddrToUint32(pal->ipv4)) - break; - tlist = g_slist_next(tlist); - } - - return (GroupInfo*)(tlist ? tlist->data : NULL); + auto res = groupInfoManager->getGroupInfo(pal); + return res ? res.get() : nullptr; } /** @@ -306,9 +298,6 @@ void UiCoreThread::ClearSublayer() { CoreThread::ClearSublayer(); - for (tlist = groupInfos; tlist; tlist = g_slist_next(tlist)) - delete (GroupInfo*)tlist->data; - g_slist_free(groupInfos); for (tlist = sgmlist; tlist; tlist = g_slist_next(tlist)) delete (GroupInfo*)tlist->data; g_slist_free(sgmlist); @@ -348,17 +337,10 @@ GroupInfo* UiCoreThread::GetPalPrevGroupItem(PalInfo* pal) { * @return 新加入的群组 */ GroupInfo* UiCoreThread::AttachPalRegularItem(PPalInfo pal) { - GroupInfo* grpinf; - - grpinf = new GroupInfo(pal, getMe(), logSystem); - grpinf->grpid = inAddrToUint32(pal->ipv4); - grpinf->name = pal->getName(); - grpinf->buffer = gtk_text_buffer_new(programData->table); - grpinf->clearDialog(); + auto grpinf = groupInfoManager->addPal(pal, getMe()); grpinf->signalUnreadMsgCountUpdated.connect( sigc::mem_fun(*this, &UiCoreThread::onGroupInfoMsgCountUpdate)); - groupInfos = g_slist_append(groupInfos, grpinf); - return grpinf; + return grpinf.get(); } /** diff --git a/src/iptux/UiCoreThread.h b/src/iptux/UiCoreThread.h index 66355d9e1..8b1f5c2ab 100644 --- a/src/iptux/UiCoreThread.h +++ b/src/iptux/UiCoreThread.h @@ -24,6 +24,7 @@ #include "iptux-core/Models.h" #include "iptux/Application.h" #include "iptux/GroupInfo.h" +#include "iptux/GroupInfoManager.h" #include "iptux/UiModels.h" #include "iptux/UiProgramData.h" @@ -82,7 +83,8 @@ class UiCoreThread : public CoreThread { LogSystem_S logSystem; std::queue messages; - GSList *groupInfos, *sgmlist, *grplist, *brdlist; //群组链表(成员不能被删除) + GroupInfoManager_U groupInfoManager; + GSList *sgmlist, *grplist, *brdlist; //群组链表(成员不能被删除) uint32_t pbn, prn; //当前已使用的文件编号(共享/私有) GSList* ecsList; //文件链表(好友发过来) diff --git a/src/iptux/UiProgramData.h b/src/iptux/UiProgramData.h index c095dee66..b07ea7742 100644 --- a/src/iptux/UiProgramData.h +++ b/src/iptux/UiProgramData.h @@ -30,6 +30,9 @@ class UiProgramData : public ProgramData { void CreateTagTable(); void CheckIconTheme(); }; + +using UiProgramData_S = std::shared_ptr; + } // namespace iptux #endif diff --git a/src/iptux/meson.build b/src/iptux/meson.build index f925b13f5..cc9ab59e4 100644 --- a/src/iptux/meson.build +++ b/src/iptux/meson.build @@ -17,6 +17,7 @@ sources = files([ 'EventAdaptor.cpp', 'GioNotificationService.cpp', 'GroupInfo.cpp', + 'GroupInfoManager.cpp', 'LogSystem.cpp', 'MainWindow.cpp', 'RevisePal.cpp', From 386a0ad6ddb88b9a14d9d0a420ce7fe20199db24 Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sat, 9 Oct 2021 18:54:54 +0800 Subject: [PATCH 4/7] add std --- src/iptux/GroupInfoManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/iptux/GroupInfoManager.cpp b/src/iptux/GroupInfoManager.cpp index 9b9f05288..1947d40f9 100644 --- a/src/iptux/GroupInfoManager.cpp +++ b/src/iptux/GroupInfoManager.cpp @@ -3,6 +3,8 @@ #include "iptux-utils/utils.h" +using namespace std; + namespace iptux { GroupInfoManager::GroupInfoManager(UiProgramData_S programData, From 44f1f9e7dc74def14d4566f0732fc2743227c9fe Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sat, 9 Oct 2021 20:24:47 +0800 Subject: [PATCH 5/7] friend class --- src/iptux/GroupInfo.cpp | 10 +++++++--- src/iptux/GroupInfo.h | 12 ++++++++++-- src/iptux/GroupInfoManager.cpp | 4 ++-- src/iptux/GroupInfoManager.h | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/iptux/GroupInfo.cpp b/src/iptux/GroupInfo.cpp index 0ba6dbcf3..ed078e6fa 100644 --- a/src/iptux/GroupInfo.cpp +++ b/src/iptux/GroupInfo.cpp @@ -54,11 +54,15 @@ GtkWidget* GroupInfo::getDialog() const { return dialogBase ? GTK_WIDGET(dialogBase->getWindow()) : nullptr; } -PalKey GroupInfo::getKey() const { +GroupInfo::KeyType GroupInfo::getKey() const { if (type == GROUP_BELONG_TYPE_REGULAR) { - return getMembers()[0]->GetKey(); + return make_pair(type, getMembers()[0]->GetKey().ToString()); } - throw std::runtime_error("GroupInfo::getKey()"); + return make_pair(type, name); +} + +GroupInfo::KeyType GroupInfo::genKey(const PalInfo* pal) { + return make_pair(GROUP_BELONG_TYPE_REGULAR, pal->GetKey().ToString()); } bool GroupInfo::addPal(PPalInfo pal) { diff --git a/src/iptux/GroupInfo.h b/src/iptux/GroupInfo.h index 68fdaa7e5..6feadfc30 100644 --- a/src/iptux/GroupInfo.h +++ b/src/iptux/GroupInfo.h @@ -12,19 +12,26 @@ namespace iptux { * 群组信息. */ class DialogBase; +class GroupInfoManager; class GroupInfo { - public: + private: + // only for friend class GroupInfoManager GroupInfo(PPalInfo pal, CPPalInfo me, LogSystem_S logSystem); + + public: GroupInfo(GroupBelongType type, const std::vector& pals, CPPalInfo me, LogSystem_S logSystem); + ~GroupInfo(); const std::vector& getMembers() const { return members; } GroupBelongType getType() const { return type; } - PalKey getKey() const; + using KeyType = std::pair; + KeyType getKey() const; + static KeyType genKey(const PalInfo* pal); /** return true if successful added, noop for regular group */ bool addPal(PPalInfo pal); @@ -72,6 +79,7 @@ class GroupInfo { private: void addMsgCount(int i); + friend GroupInfoManager; }; using GroupInfo_S = std::shared_ptr; diff --git a/src/iptux/GroupInfoManager.cpp b/src/iptux/GroupInfoManager.cpp index 1947d40f9..28486862d 100644 --- a/src/iptux/GroupInfoManager.cpp +++ b/src/iptux/GroupInfoManager.cpp @@ -12,7 +12,7 @@ GroupInfoManager::GroupInfoManager(UiProgramData_S programData, : programData(programData), logSystem(logSystem) {} GroupInfo_S GroupInfoManager::addPal(PalInfo_S pal, PalInfo_SC me) { - auto grpinf = make_shared(pal, me, logSystem); + GroupInfo_S grpinf(new GroupInfo(pal, me, logSystem)); grpinf->grpid = inAddrToUint32(pal->ipv4); grpinf->name = pal->getName(); grpinf->buffer = gtk_text_buffer_new(programData->table); @@ -22,7 +22,7 @@ GroupInfo_S GroupInfoManager::addPal(PalInfo_S pal, PalInfo_SC me) { } GroupInfo_S GroupInfoManager::getGroupInfo(const PalInfo* pal) { - return groupInfos[pal->GetKey()]; + return groupInfos[GroupInfo::genKey(pal)]; } void GroupInfoManager::addGroupInfo(GroupInfo_S groupInfo) { diff --git a/src/iptux/GroupInfoManager.h b/src/iptux/GroupInfoManager.h index 36d827e8c..22de1b2e5 100644 --- a/src/iptux/GroupInfoManager.h +++ b/src/iptux/GroupInfoManager.h @@ -18,7 +18,7 @@ class GroupInfoManager { private: UiProgramData_S programData; LogSystem_S logSystem; - std::map groupInfos; + std::map groupInfos; }; using GroupInfoManager_U = std::unique_ptr; From d3778c11bec78ec484295727391a1a52d02e459c Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sat, 9 Oct 2021 20:39:47 +0800 Subject: [PATCH 6/7] remove sgmlist --- src/iptux/GroupInfoManager.cpp | 16 +++++++++ src/iptux/GroupInfoManager.h | 4 +++ src/iptux/UiCoreThread.cpp | 64 +++++++++------------------------- src/iptux/UiCoreThread.h | 3 +- 4 files changed, 38 insertions(+), 49 deletions(-) diff --git a/src/iptux/GroupInfoManager.cpp b/src/iptux/GroupInfoManager.cpp index 28486862d..e3c4a0e6e 100644 --- a/src/iptux/GroupInfoManager.cpp +++ b/src/iptux/GroupInfoManager.cpp @@ -21,6 +21,22 @@ GroupInfo_S GroupInfoManager::addPal(PalInfo_S pal, PalInfo_SC me) { return grpinf; } +GroupInfo_S GroupInfoManager::getGroupInfo(const GroupInfo::KeyType& key) { + return groupInfos[key]; +} + +GroupInfo_S GroupInfoManager::addGroup(GroupBelongType type, + PalInfo_SC me, + std::string name) { + GroupInfo_S grpinf(new GroupInfo(type, vector(), me, logSystem)); + grpinf->grpid = g_quark_from_static_string(name.c_str()); + grpinf->name = name; + grpinf->buffer = gtk_text_buffer_new(programData->table); + grpinf->clearDialog(); + addGroupInfo(grpinf); + return grpinf; +} + GroupInfo_S GroupInfoManager::getGroupInfo(const PalInfo* pal) { return groupInfos[GroupInfo::genKey(pal)]; } diff --git a/src/iptux/GroupInfoManager.h b/src/iptux/GroupInfoManager.h index 22de1b2e5..e0db85316 100644 --- a/src/iptux/GroupInfoManager.h +++ b/src/iptux/GroupInfoManager.h @@ -12,8 +12,12 @@ class GroupInfoManager { GroupInfoManager(UiProgramData_S programData, LogSystem_S logSystem); void addGroupInfo(GroupInfo_S groupInfo); + GroupInfo_S addPal(PalInfo_S pal, PalInfo_SC me); + GroupInfo_S addGroup(GroupBelongType type, PalInfo_SC me, std::string name); + GroupInfo_S getGroupInfo(const PalInfo* pal); + GroupInfo_S getGroupInfo(const GroupInfo::KeyType& key); private: UiProgramData_S programData; diff --git a/src/iptux/UiCoreThread.cpp b/src/iptux/UiCoreThread.cpp index fb0cf4786..4a3a5f3dd 100644 --- a/src/iptux/UiCoreThread.cpp +++ b/src/iptux/UiCoreThread.cpp @@ -35,7 +35,6 @@ namespace iptux { UiCoreThread::UiCoreThread(Application* app, shared_ptr data) : CoreThread(data), programData(data), - sgmlist(NULL), grplist(NULL), brdlist(NULL), pbn(1), @@ -63,28 +62,6 @@ void UiCoreThread::ClearAllPalFromList() { GroupInfo* grpinf; GSList* tlist; - // /* 清空常规模式下所有群组的成员 */ - // tlist = groupInfos; - // while (tlist) { - // grpinf = (GroupInfo*)tlist->data; - // if (grpinf->getDialog()) { - // session = (SessionAbstract*)g_object_get_data( - // G_OBJECT(grpinf->getDialog()), "session-class"); - // session->ClearAllPalData(); - // } - // tlist = g_slist_next(tlist); - // } - /* 清空网段模式下所有群组的成员 */ - tlist = sgmlist; - while (tlist) { - grpinf = (GroupInfo*)tlist->data; - if (grpinf->getDialog()) { - session = (SessionAbstract*)g_object_get_data( - G_OBJECT(grpinf->getDialog()), "session-class"); - session->ClearAllPalData(); - } - tlist = g_slist_next(tlist); - } /* 清空分组模式下所有群组的成员 */ tlist = grplist; while (tlist) { @@ -235,21 +212,12 @@ GroupInfo* UiCoreThread::GetPalRegularItem(const PalInfo* pal) { * @return 群组信息 */ GroupInfo* UiCoreThread::GetPalSegmentItem(const PalInfo* pal) { - GSList* tlist; - GQuark grpid; - /* 获取局域网网段ID */ auto name = ipv4_get_lan_name(pal->ipv4); - grpid = g_quark_from_string(name.empty() ? _("Others") : name.c_str()); - - tlist = sgmlist; - while (tlist) { - if (((GroupInfo*)tlist->data)->grpid == grpid) - break; - tlist = g_slist_next(tlist); - } - - return (GroupInfo*)(tlist ? tlist->data : NULL); + auto key = make_pair(GROUP_BELONG_TYPE_SEGMENT, + name.empty() ? _("Others") : name.c_str()); + auto res = groupInfoManager->getGroupInfo(key); + return res ? res.get() : nullptr; } /** @@ -298,9 +266,6 @@ void UiCoreThread::ClearSublayer() { CoreThread::ClearSublayer(); - for (tlist = sgmlist; tlist; tlist = g_slist_next(tlist)) - delete (GroupInfo*)tlist->data; - g_slist_free(sgmlist); for (tlist = grplist; tlist; tlist = g_slist_next(tlist)) delete (GroupInfo*)tlist->data; g_slist_free(grplist); @@ -357,15 +322,18 @@ GroupInfo* UiCoreThread::AttachPalSegmentItem(PPalInfo pal) { name = _("Others"); } - grpinf = new GroupInfo(GROUP_BELONG_TYPE_SEGMENT, vector(), getMe(), - logSystem); - grpinf->grpid = g_quark_from_static_string(name.c_str()); - grpinf->name = name; - grpinf->buffer = gtk_text_buffer_new(programData->table); - grpinf->clearDialog(); - sgmlist = g_slist_append(sgmlist, grpinf); - - return grpinf; + auto res = + groupInfoManager->addGroup(GROUP_BELONG_TYPE_SEGMENT, getMe(), name); + return res.get(); + + // grpinf = new GroupInfo(GROUP_BELONG_TYPE_SEGMENT, vector(), + // getMe(), + // logSystem); + // grpinf->grpid = g_quark_from_static_string(name.c_str()); + // grpinf->name = name; + // grpinf->buffer = gtk_text_buffer_new(programData->table); + // grpinf->clearDialog(); + // sgmlist = g_slist_append(sgmlist, grpinf); } /** diff --git a/src/iptux/UiCoreThread.h b/src/iptux/UiCoreThread.h index 8b1f5c2ab..05c898b6a 100644 --- a/src/iptux/UiCoreThread.h +++ b/src/iptux/UiCoreThread.h @@ -84,7 +84,8 @@ class UiCoreThread : public CoreThread { std::queue messages; GroupInfoManager_U groupInfoManager; - GSList *sgmlist, *grplist, *brdlist; //群组链表(成员不能被删除) + // GSList *sgmlist; + GSList *grplist, *brdlist; //群组链表(成员不能被删除) uint32_t pbn, prn; //当前已使用的文件编号(共享/私有) GSList* ecsList; //文件链表(好友发过来) From 48413c3e438268264bc692405191e83f2a9b9be6 Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Wed, 17 Nov 2021 14:58:56 +0800 Subject: [PATCH 7/7] fix compile problem --- src/iptux/GroupInfoManager.cpp | 9 +++++---- src/iptux/GroupInfoManager.h | 6 +++--- src/iptux/UiCoreThread.cpp | 3 +-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/iptux/GroupInfoManager.cpp b/src/iptux/GroupInfoManager.cpp index e3c4a0e6e..2a31ba02a 100644 --- a/src/iptux/GroupInfoManager.cpp +++ b/src/iptux/GroupInfoManager.cpp @@ -2,20 +2,21 @@ #include "GroupInfoManager.h" #include "iptux-utils/utils.h" +#include "iptux/UiCoreThread.h" using namespace std; namespace iptux { -GroupInfoManager::GroupInfoManager(UiProgramData_S programData, +GroupInfoManager::GroupInfoManager(UiCoreThread* coreThread, LogSystem_S logSystem) - : programData(programData), logSystem(logSystem) {} + : core_thread_(coreThread), logSystem(logSystem) {} GroupInfo_S GroupInfoManager::addPal(PalInfo_S pal, PalInfo_SC me) { GroupInfo_S grpinf(new GroupInfo(pal, me, logSystem)); grpinf->grpid = inAddrToUint32(pal->ipv4); grpinf->name = pal->getName(); - grpinf->buffer = gtk_text_buffer_new(programData->table); + grpinf->buffer = gtk_text_buffer_new(core_thread_->tag_table()); grpinf->clearDialog(); addGroupInfo(grpinf); return grpinf; @@ -31,7 +32,7 @@ GroupInfo_S GroupInfoManager::addGroup(GroupBelongType type, GroupInfo_S grpinf(new GroupInfo(type, vector(), me, logSystem)); grpinf->grpid = g_quark_from_static_string(name.c_str()); grpinf->name = name; - grpinf->buffer = gtk_text_buffer_new(programData->table); + grpinf->buffer = gtk_text_buffer_new(core_thread_->tag_table()); grpinf->clearDialog(); addGroupInfo(grpinf); return grpinf; diff --git a/src/iptux/GroupInfoManager.h b/src/iptux/GroupInfoManager.h index e0db85316..665d23ba8 100644 --- a/src/iptux/GroupInfoManager.h +++ b/src/iptux/GroupInfoManager.h @@ -3,13 +3,13 @@ #include "iptux/GroupInfo.h" #include "iptux/LogSystem.h" -#include "iptux/UiProgramData.h" namespace iptux { +class UiCoreThread; class GroupInfoManager { public: - GroupInfoManager(UiProgramData_S programData, LogSystem_S logSystem); + GroupInfoManager(UiCoreThread* coreThread, LogSystem_S logSystem); void addGroupInfo(GroupInfo_S groupInfo); @@ -20,7 +20,7 @@ class GroupInfoManager { GroupInfo_S getGroupInfo(const GroupInfo::KeyType& key); private: - UiProgramData_S programData; + UiCoreThread* core_thread_; LogSystem_S logSystem; std::map groupInfos; }; diff --git a/src/iptux/UiCoreThread.cpp b/src/iptux/UiCoreThread.cpp index ef011f64e..de0066123 100644 --- a/src/iptux/UiCoreThread.cpp +++ b/src/iptux/UiCoreThread.cpp @@ -40,8 +40,7 @@ UiCoreThread::UiCoreThread(Application* app, shared_ptr data) pbn(1), prn(MAX_SHAREDFILE), ecsList(NULL) { - groupInfoManager = - make_unique(app->getProgramData(), app->getLogSystem()); + groupInfoManager = make_unique(this, app->getLogSystem()); tag_table_ = CreateTagTable(); CheckIconTheme(); logSystem = app->getLogSystem();