#pragma once #include #include "Properties.h" #include "PermissionManager.h" #include "BasicChannel.h" #include "../Group.h" #include "../rtc/lib.h" #include #include namespace ts { namespace server { class VirtualServer; class ConnectedClient; } class ServerChannelTree; class ServerChannel : public BasicChannel { friend class ServerChannelTree; public: ServerChannel(uint32_t rtc_channel_id, ChannelId parentId, ChannelId channelId); ~ServerChannel() override; void setProperties(const std::shared_ptr &ptr) override; uint32_t rtc_channel_id; std::shared_mutex client_lock; std::deque> clients; void unregister_client(const std::shared_ptr& /* client */); void register_client(const std::shared_ptr& /* client */); bool deleted = false; size_t client_count(); }; class ServerChannelTree : public BasicChannelTree { public: ServerChannelTree(const std::shared_ptr&, sql::SqlManager*); ~ServerChannelTree() override; void loadChannelsFromDatabase(); std::shared_ptr createChannel(ChannelId parentId, ChannelId orderId, const std::string &name) override; virtual std::deque deleteChannelRoot(const std::shared_ptr &channel); void deleteSemiPermanentChannels(); std::shared_ptr tree_head() { return this->head; } protected: ChannelId generateChannelId() override; void on_channel_entry_deleted(const std::shared_ptr &channel) override; std::shared_ptr allocateChannel(const std::shared_ptr &parent, ChannelId channelId) override; private: std::weak_ptr server_ref; ServerId getServerId(); sql::SqlManager* sql; std::deque> tmpChannelList; bool initializeTempParents(); bool buildChannelTreeFromTemp(); bool updateOrderIds(); bool validateChannelNames(); bool validateChannelIcons(); int loadChannelFromData(int argc, char** data, char** column); }; }