mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
commit
efebf20366
@ -111,6 +111,7 @@ p3discovery2::p3discovery2(
|
||||
|
||||
if(rsEvents)
|
||||
rsEvents->registerEventsHandler(
|
||||
RsEventType::GOSSIP_DISCOVERY,
|
||||
[this](std::shared_ptr<const RsEvent> event)
|
||||
{
|
||||
rsEventsHandler(*event);
|
||||
@ -1345,8 +1346,3 @@ void p3discovery2::rsEventsHandler(const RsEvent& event)
|
||||
//
|
||||
// /* ignore other operations */
|
||||
// }
|
||||
|
||||
// (cyril) do we still need this??
|
||||
RsGossipDiscoveryFriendInviteReceivedEvent::RsGossipDiscoveryFriendInviteReceivedEvent(const std::string& invite) :
|
||||
RsEvent(RsEventType::GOSSIP_DISCOVERY_INVITE_RECEIVED),
|
||||
mInvite(invite) {}
|
||||
|
@ -146,6 +146,7 @@ bool RsJsonApi::parseToken(
|
||||
|
||||
JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||
mService(std::make_shared<restbed::Service>()),
|
||||
mServiceMutex("JsonApiServer restbed ptr"),
|
||||
mListeningPort(RsJsonApi::DEFAULT_PORT),
|
||||
mBindingAddress(RsJsonApi::DEFAULT_BINDING_ADDRESS)
|
||||
{
|
||||
@ -223,7 +224,7 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||
rsLoginHelper->attemptLogin(account, password);
|
||||
|
||||
if( retval == RsInit::OK )
|
||||
authorizeUser(account.toStdString(),password);
|
||||
authorizeUser(account.toStdString(), password);
|
||||
|
||||
// serialize out parameters and return value to JSON
|
||||
{
|
||||
@ -310,6 +311,7 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||
registerHandler("/rsEvents/registerEventsHandler",
|
||||
[this](const std::shared_ptr<rb::Session> session)
|
||||
{
|
||||
const std::weak_ptr<rb::Service> weakService(mService);
|
||||
const std::multimap<std::string, std::string> headers
|
||||
{
|
||||
{ "Connection", "keep-alive" },
|
||||
@ -319,7 +321,7 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||
|
||||
size_t reqSize = static_cast<size_t>(
|
||||
session->get_request()->get_header("Content-Length", 0) );
|
||||
session->fetch( reqSize, [this](
|
||||
session->fetch( reqSize, [weakService](
|
||||
const std::shared_ptr<rb::Session> session,
|
||||
const rb::Bytes& body )
|
||||
{
|
||||
@ -329,12 +331,29 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||
rsEvents, "rsEvents", cAns, session ) )
|
||||
return;
|
||||
|
||||
RsEventType eventType = RsEventType::NONE;
|
||||
|
||||
// deserialize input parameters from JSON
|
||||
{
|
||||
RsGenericSerializer::SerializeContext& ctx(cReq);
|
||||
RsGenericSerializer::SerializeJob j(RsGenericSerializer::FROM_JSON);
|
||||
RS_SERIAL_PROCESS(eventType);
|
||||
}
|
||||
|
||||
const std::weak_ptr<rb::Session> weakSession(session);
|
||||
RsEventsHandlerId_t hId = rsEvents->generateUniqueHandlerId();
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> multiCallback =
|
||||
[this, weakSession, hId](std::shared_ptr<const RsEvent> event)
|
||||
[weakSession, weakService, hId](
|
||||
std::shared_ptr<const RsEvent> event )
|
||||
{
|
||||
mService->schedule( [weakSession, hId, event]()
|
||||
auto lService = weakService.lock();
|
||||
if(!lService || lService->is_down())
|
||||
{
|
||||
if(rsEvents) rsEvents->unregisterEventsHandler(hId);
|
||||
return;
|
||||
}
|
||||
|
||||
lService->schedule( [weakSession, hId, event]()
|
||||
{
|
||||
auto session = weakSession.lock();
|
||||
if(!session || session->is_closed())
|
||||
@ -355,7 +374,7 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||
} );
|
||||
};
|
||||
|
||||
bool retval = rsEvents->registerEventsHandler(multiCallback, hId);
|
||||
bool retval = rsEvents->registerEventsHandler(eventType,multiCallback, hId);
|
||||
|
||||
{
|
||||
RsGenericSerializer::SerializeContext& ctx(cAns);
|
||||
@ -500,10 +519,10 @@ bool JsonApiServer::authorizeUser(
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!librs::util::is_alphanumeric(passwd))
|
||||
if(passwd.empty())
|
||||
{
|
||||
RsErr() << __PRETTY_FUNCTION__ << " Password is not alphanumeric"
|
||||
<< std::endl;
|
||||
RsWarn() << __PRETTY_FUNCTION__ << " Password is empty, are you sure "
|
||||
<< "this what you wanted?" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -581,21 +600,21 @@ std::vector<std::shared_ptr<rb::Resource> > JsonApiServer::getResources() const
|
||||
return tab;
|
||||
}
|
||||
|
||||
bool JsonApiServer::restart()
|
||||
void JsonApiServer::restart()
|
||||
{
|
||||
fullstop();
|
||||
RsThread::start("JSON API Server");
|
||||
|
||||
return true;
|
||||
/* It is important to wrap into async(...) because fullstop() method can't
|
||||
* be called from same thread of execution hence from JSON API thread! */
|
||||
RsThread::async([this]()
|
||||
{
|
||||
fullstop();
|
||||
RsThread::start("JSON API Server");
|
||||
});
|
||||
}
|
||||
|
||||
void JsonApiServer::onStopRequested()
|
||||
{ if(mService->is_up()) mService->stop(); }
|
||||
|
||||
bool JsonApiServer::fullstop()
|
||||
{
|
||||
RsThread::fullstop();
|
||||
return true;
|
||||
RS_STACK_MUTEX(mServiceMutex);
|
||||
mService->stop();
|
||||
}
|
||||
|
||||
uint16_t JsonApiServer::listeningPort() const { return mListeningPort; }
|
||||
@ -611,16 +630,12 @@ void JsonApiServer::run()
|
||||
settings->set_bind_address(mBindingAddress);
|
||||
settings->set_default_header("Connection", "close");
|
||||
|
||||
if(mService->is_up())
|
||||
{
|
||||
RsWarn() << __PRETTY_FUNCTION__ << " restbed is already running. "
|
||||
<< " stopping it before starting again!" << std::endl;
|
||||
mService->stop();
|
||||
}
|
||||
|
||||
/* re-allocating mService is important because it deletes the existing
|
||||
* service and therefore leaves the listening port open */
|
||||
mService = std::make_shared<restbed::Service>();
|
||||
{
|
||||
RS_STACK_MUTEX(mServiceMutex);
|
||||
mService = std::make_shared<restbed::Service>();
|
||||
}
|
||||
|
||||
for(auto& r: getResources()) mService->publish(r);
|
||||
|
||||
@ -628,8 +643,8 @@ void JsonApiServer::run()
|
||||
{
|
||||
RsUrl apiUrl; apiUrl.setScheme("http").setHost(mBindingAddress)
|
||||
.setPort(mListeningPort);
|
||||
RsDbg() << __PRETTY_FUNCTION__ << " JSON API server listening on "
|
||||
<< apiUrl.toString() << std::endl;
|
||||
RsInfo() << __PRETTY_FUNCTION__ << " JSON API server listening on "
|
||||
<< apiUrl.toString() << std::endl;
|
||||
mService->start(settings);
|
||||
}
|
||||
catch(std::exception& e)
|
||||
@ -640,7 +655,7 @@ void JsonApiServer::run()
|
||||
return;
|
||||
}
|
||||
|
||||
RsInfo() << __PRETTY_FUNCTION__ << " finished!" << std::endl;
|
||||
RsDbg() << __PRETTY_FUNCTION__ << " finished!" << std::endl;
|
||||
}
|
||||
|
||||
/*static*/ void RsJsonApi::version(
|
||||
|
@ -63,10 +63,13 @@ public:
|
||||
std::vector<std::shared_ptr<rb::Resource>> getResources() const;
|
||||
|
||||
/// @see RsJsonApi
|
||||
bool restart() override;
|
||||
void fullstop() override { RsThread::fullstop(); }
|
||||
|
||||
/// @see RsJsonApi
|
||||
bool fullstop() override;
|
||||
void restart() override;
|
||||
|
||||
/// @see RsJsonApi
|
||||
void askForStop() override { RsThread::askForStop(); }
|
||||
|
||||
/// @see RsJsonApi
|
||||
inline bool isRunning() override { return RsThread::isRunning(); }
|
||||
@ -193,6 +196,10 @@ private:
|
||||
std::less<const JsonApiResourceProvider> > mResourceProviders;
|
||||
|
||||
std::shared_ptr<restbed::Service> mService;
|
||||
/** Protect service only during very critical operation like resetting the
|
||||
* pointer, still not 100% thread safe, but hopefully we can avoid
|
||||
* crashes/freeze with this */
|
||||
RsMutex mServiceMutex;
|
||||
|
||||
uint16_t mListeningPort;
|
||||
std::string mBindingAddress;
|
||||
|
@ -71,23 +71,32 @@ struct RsBroadcastDiscoveryResult : RsSerializable
|
||||
* @brief Event emitted when a non friend new peer is found in the local network
|
||||
* @see RsEvents
|
||||
*/
|
||||
struct RsBroadcastDiscoveryPeerFoundEvent : RsEvent
|
||||
{
|
||||
RsBroadcastDiscoveryPeerFoundEvent(
|
||||
const RsBroadcastDiscoveryResult& eventData ) :
|
||||
RsEvent(RsEventType::BROADCAST_DISCOVERY_PEER_FOUND), mData(eventData) {}
|
||||
enum class RsBroadcastDiscoveryEventType: uint32_t {
|
||||
UNKNOWN = 0x00,
|
||||
PEER_FOUND = 0x01
|
||||
};
|
||||
|
||||
RsBroadcastDiscoveryResult mData;
|
||||
struct RsBroadcastDiscoveryEvent : RsEvent
|
||||
{
|
||||
RsBroadcastDiscoveryEvent()
|
||||
: RsEvent(RsEventType::BROADCAST_DISCOVERY),
|
||||
mDiscoveryEventType(RsBroadcastDiscoveryEventType::UNKNOWN)
|
||||
{}
|
||||
|
||||
virtual ~RsBroadcastDiscoveryEvent() override = default;
|
||||
|
||||
RsBroadcastDiscoveryEventType mDiscoveryEventType;
|
||||
RsBroadcastDiscoveryResult mData;
|
||||
|
||||
/// @see RsSerializable
|
||||
void serial_process( RsGenericSerializer::SerializeJob j,
|
||||
RsGenericSerializer::SerializeContext& ctx) override
|
||||
{
|
||||
RsEvent::serial_process(j, ctx);
|
||||
|
||||
RS_SERIAL_PROCESS(mDiscoveryEventType);
|
||||
RS_SERIAL_PROCESS(mData);
|
||||
}
|
||||
|
||||
~RsBroadcastDiscoveryPeerFoundEvent() override;
|
||||
};
|
||||
|
||||
|
||||
|
@ -53,10 +53,10 @@ enum class RsEventType : uint32_t
|
||||
NONE = 0, /// Used to detect uninitialized event
|
||||
|
||||
/// @see RsBroadcastDiscovery
|
||||
BROADCAST_DISCOVERY_PEER_FOUND = 1,
|
||||
BROADCAST_DISCOVERY = 1,
|
||||
|
||||
/// @see RsDiscPendingPgpReceivedEvent
|
||||
GOSSIP_DISCOVERY_INVITE_RECEIVED = 2,
|
||||
GOSSIP_DISCOVERY = 2,
|
||||
|
||||
/// @see AuthSSL
|
||||
AUTHSSL_CONNECTION_AUTENTICATION = 3,
|
||||
@ -64,14 +64,14 @@ enum class RsEventType : uint32_t
|
||||
/// @see pqissl
|
||||
PEER_CONNECTION = 4,
|
||||
|
||||
/// @see RsGxsChanges
|
||||
/// @see RsGxsChanges // this one is used in RsGxsBroadcast
|
||||
GXS_CHANGES = 5,
|
||||
|
||||
/// Emitted when a peer state changes, @see RsPeers
|
||||
PEER_STATE_CHANGED = 6,
|
||||
|
||||
/// @see RsMailStatusEvent
|
||||
MAIL_STATUS_CHANGE = 7,
|
||||
MAIL_STATUS = 7,
|
||||
|
||||
/// @see RsGxsCircleEvent
|
||||
GXS_CIRCLES = 8,
|
||||
@ -163,6 +163,7 @@ public:
|
||||
* Every time an event is dispatced the registered events handlers will get
|
||||
* their method handleEvent called with the event passed as paramether.
|
||||
* @jsonapi{development,manualwrapper}
|
||||
* @param eventType Type of event for which the callback is called
|
||||
* @param multiCallback Function that will be called each time an event
|
||||
* is dispatched.
|
||||
* @param[inout] hId Optional storage for handler id, useful to
|
||||
@ -173,6 +174,7 @@ public:
|
||||
* @return False on error, true otherwise.
|
||||
*/
|
||||
virtual bool registerEventsHandler(
|
||||
RsEventType eventType,
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> multiCallback,
|
||||
RsEventsHandlerId_t& hId = RS_DEFAULT_STORAGE_PARAM(RsEventsHandlerId_t, 0)
|
||||
) = 0;
|
||||
|
@ -45,11 +45,18 @@ extern std::shared_ptr<RsGossipDiscovery> rsGossipDiscovery;
|
||||
/**
|
||||
* @brief Emitted when a pending PGP certificate is received
|
||||
*/
|
||||
struct RsGossipDiscoveryFriendInviteReceivedEvent : RsEvent
|
||||
{
|
||||
RsGossipDiscoveryFriendInviteReceivedEvent(
|
||||
const std::string& invite );
|
||||
|
||||
enum class RsGossipDiscoveryEventType: uint32_t {
|
||||
UNKNOWN = 0x00,
|
||||
PEER_INVITE_RECEIVED = 0x01
|
||||
};
|
||||
|
||||
struct RsGossipDiscoveryEvent : RsEvent
|
||||
{
|
||||
RsGossipDiscoveryEvent(): RsEvent(RsEventType::GOSSIP_DISCOVERY) {}
|
||||
virtual ~RsGossipDiscoveryEvent() override {}
|
||||
|
||||
RsGossipDiscoveryEventType mGossipDiscoveryEventType;
|
||||
std::string mInvite;
|
||||
|
||||
/// @see RsSerializable
|
||||
@ -57,6 +64,7 @@ struct RsGossipDiscoveryFriendInviteReceivedEvent : RsEvent
|
||||
RsGenericSerializer::SerializeContext& ctx )
|
||||
{
|
||||
RsEvent::serial_process(j,ctx);
|
||||
RS_SERIAL_PROCESS(mGossipDiscoveryEventType);
|
||||
RS_SERIAL_PROCESS(mInvite);
|
||||
}
|
||||
};
|
||||
|
@ -43,18 +43,25 @@ public:
|
||||
static const std::string DEFAULT_BINDING_ADDRESS; // 127.0.0.1
|
||||
|
||||
/**
|
||||
* @brief Restart RsJsonApi server
|
||||
* @brief Restart RsJsonApi server asynchronously.
|
||||
* @jsonapi{development}
|
||||
*/
|
||||
virtual bool restart() = 0;
|
||||
virtual void restart() = 0;
|
||||
|
||||
/** @brief Request RsJsonApi to stop and wait until it has stopped.
|
||||
* Do not expose this method to JSON API as fullstop must not be called from
|
||||
* the same thread of service execution.
|
||||
*/
|
||||
virtual void fullstop() = 0;
|
||||
|
||||
/**
|
||||
* @brief Request RsJsonApi to stop and wait until ti has stopped.
|
||||
* @brief Request RsJsonApi to stop asynchronously.
|
||||
* @jsonapi{development}
|
||||
* Be expecially carefull to call this from JSON API because you will loose
|
||||
* access to the API.
|
||||
* @jsonapi{development}
|
||||
* If you need to wait until stopping has completed @see isRunning().
|
||||
*/
|
||||
virtual bool fullstop() = 0;
|
||||
virtual void askForStop() = 0;
|
||||
|
||||
/**
|
||||
* @brief Get status of the json api server
|
||||
@ -128,8 +135,7 @@ public:
|
||||
std::string& user, std::string& passwd );
|
||||
|
||||
/**
|
||||
* Add new auth (user,passwd) token to the authorized set, creating the
|
||||
* token user:passwd internally.
|
||||
* Add new API auth (user,passwd) token to the authorized set.
|
||||
* @jsonapi{development}
|
||||
* @param[in] user user name to autorize, must be alphanumerinc
|
||||
* @param[in] password password for the user, must be alphanumerinc
|
||||
|
@ -296,7 +296,6 @@ struct MsgTagType : RsSerializable
|
||||
} //namespace Rs
|
||||
} //namespace Msgs
|
||||
|
||||
|
||||
enum class RsMailStatusEventCode: uint8_t
|
||||
{
|
||||
NEW_MESSAGE = 0x00,
|
||||
@ -312,9 +311,9 @@ enum class RsMailStatusEventCode: uint8_t
|
||||
|
||||
struct RsMailStatusEvent : RsEvent
|
||||
{
|
||||
RsMailStatusEvent() : RsEvent(RsEventType::MAIL_STATUS_CHANGE) {}
|
||||
RsMailStatusEvent() : RsEvent(RsEventType::MAIL_STATUS) {}
|
||||
|
||||
RsMailStatusEventCode mMailStatusEventCode;
|
||||
RsMailStatusEventCode mMailStatusEventCode;
|
||||
std::set<RsMailMessageId> mChangedMsgIds;
|
||||
|
||||
/// @see RsEvent
|
||||
@ -326,7 +325,7 @@ struct RsMailStatusEvent : RsEvent
|
||||
RS_SERIAL_PROCESS(mMailStatusEventCode);
|
||||
}
|
||||
|
||||
~RsMailStatusEvent() override;
|
||||
~RsMailStatusEvent() override = default;
|
||||
};
|
||||
|
||||
#define RS_CHAT_PUBLIC 0x0001
|
||||
@ -335,7 +334,7 @@ struct RsMailStatusEvent : RsEvent
|
||||
|
||||
#define RS_DISTANT_CHAT_STATUS_UNKNOWN 0x0000
|
||||
#define RS_DISTANT_CHAT_STATUS_TUNNEL_DN 0x0001
|
||||
#define RS_DISTANT_CHAT_STATUS_CAN_TALK 0x0002
|
||||
#define RS_DISTANT_CHAT_STATUS_CAN_TALK 0x0002
|
||||
#define RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED 0x0003
|
||||
|
||||
#define RS_DISTANT_CHAT_ERROR_NO_ERROR 0x0000
|
||||
|
@ -33,8 +33,8 @@ void RsGxsPostedPostItem::serial_process(RsGenericSerializer::SerializeJob j,RsG
|
||||
// and do not expect to deserialize mImage member if the data block has been consummed entirely (keeps compatibility
|
||||
// of new RS with older posts.
|
||||
|
||||
if(j == RsGenericSerializer::DESERIALIZE && ctx.mOffset == ctx.mSize)
|
||||
return ;
|
||||
if(j == RsGenericSerializer::DESERIALIZE && ctx.mOffset == ctx.mSize)
|
||||
return ;
|
||||
|
||||
if((j == RsGenericSerializer::SIZE_ESTIMATE || j == RsGenericSerializer::SERIALIZE) && mImage.empty())
|
||||
return ;
|
||||
|
@ -538,8 +538,7 @@ bool p3Msgs::initiateDistantChatConnexion(
|
||||
const RsGxsId& to_gxs_id, const RsGxsId& from_gxs_id,
|
||||
DistantChatPeerId& pid, uint32_t& error_code, bool notify )
|
||||
{
|
||||
return mChatSrv->initiateDistantChatConnexion( to_gxs_id, from_gxs_id,
|
||||
pid, error_code, notify );
|
||||
return mChatSrv->initiateDistantChatConnexion( to_gxs_id, from_gxs_id, pid, error_code, notify );
|
||||
}
|
||||
bool p3Msgs::getDistantChatStatus(const DistantChatPeerId& pid,DistantChatPeerInfo& info)
|
||||
{
|
||||
@ -559,7 +558,6 @@ uint32_t p3Msgs::getDistantChatPermissionFlags()
|
||||
}
|
||||
|
||||
RsMsgs::~RsMsgs() = default;
|
||||
RsMailStatusEvent::~RsMailStatusEvent() = default;
|
||||
Rs::Msgs::MessageInfo::~MessageInfo() = default;
|
||||
MsgInfoSummary::~MsgInfoSummary() = default;
|
||||
VisibleChatLobbyRecord::~VisibleChatLobbyRecord() = default;
|
||||
|
@ -182,10 +182,15 @@ void BroadcastDiscoveryService::threadTick()
|
||||
}
|
||||
else if(!isFriend)
|
||||
{
|
||||
typedef RsBroadcastDiscoveryPeerFoundEvent Evt_t;
|
||||
if(rsEvents)
|
||||
rsEvents->postEvent(
|
||||
std::shared_ptr<Evt_t>(new Evt_t(rbdr)) );
|
||||
{
|
||||
auto ev = std::make_shared<RsBroadcastDiscoveryEvent>();
|
||||
|
||||
ev->mDiscoveryEventType = RsBroadcastDiscoveryEventType::PEER_FOUND;
|
||||
ev->mData = rbdr;
|
||||
|
||||
rsEvents->postEvent(ev);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -307,5 +312,4 @@ bool BroadcastDiscoveryService::assertMulticastLockIsvalid()
|
||||
|
||||
RsBroadcastDiscovery::~RsBroadcastDiscovery() = default;
|
||||
RsBroadcastDiscoveryResult::~RsBroadcastDiscoveryResult() = default;
|
||||
RsBroadcastDiscoveryPeerFoundEvent::~RsBroadcastDiscoveryPeerFoundEvent() = default;
|
||||
BroadcastDiscoveryPack::~BroadcastDiscoveryPack() = default;
|
||||
|
@ -247,7 +247,7 @@ void p3GxsChannels::notifyChanges(std::vector<RsGxsNotify *> &changes)
|
||||
RsGxsMsgChange *msgChange = dynamic_cast<RsGxsMsgChange *>(*it);
|
||||
if (msgChange)
|
||||
{
|
||||
if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW)
|
||||
if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW|| msgChange->getType() == RsGxsNotify::TYPE_PUBLISHED)
|
||||
{
|
||||
/* message received */
|
||||
if (rsEvents)
|
||||
|
@ -501,7 +501,7 @@ void p3GxsCircles::notifyChanges(std::vector<RsGxsNotify *> &changes)
|
||||
RsGxsCircleDetails details;
|
||||
getCircleDetails(circle_id,details);
|
||||
|
||||
if(rsEvents && (c->getType() == RsGxsNotify::TYPE_RECEIVED_NEW) )
|
||||
if(rsEvents && (c->getType() == RsGxsNotify::TYPE_RECEIVED_NEW|| c->getType() == RsGxsNotify::TYPE_PUBLISHED) )
|
||||
for (auto msgIdIt(mit->second.begin()), end(mit->second.end()); msgIdIt != end; ++msgIdIt)
|
||||
{
|
||||
RsGxsCircleMsg msg;
|
||||
|
@ -191,7 +191,7 @@ void p3GxsForums::notifyChanges(std::vector<RsGxsNotify *> &changes)
|
||||
RsGxsMsgChange *msgChange = dynamic_cast<RsGxsMsgChange *>(*it);
|
||||
if (msgChange)
|
||||
{
|
||||
if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW) /* message received */
|
||||
if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW || msgChange->getType() == RsGxsNotify::TYPE_PUBLISHED) /* message received */
|
||||
if (rsEvents)
|
||||
{
|
||||
std::map<RsGxsGroupId, std::set<RsGxsMessageId> >& msgChangeMap = msgChange->msgChangeMap;
|
||||
|
@ -2134,8 +2134,7 @@ bool p3MsgService::receiveGxsTransMail( const RsGxsId& authorId,
|
||||
|
||||
{
|
||||
RS_STACK_MUTEX(recentlyReceivedMutex);
|
||||
if( mRecentlyReceivedMessageHashes.find(hash) !=
|
||||
mRecentlyReceivedMessageHashes.end() )
|
||||
if( mRecentlyReceivedMessageHashes.find(hash) != mRecentlyReceivedMessageHashes.end() )
|
||||
{
|
||||
RsInfo() << __PRETTY_FUNCTION__ << " (II) receiving "
|
||||
<< "message of hash " << hash << " more than once. "
|
||||
@ -2143,14 +2142,12 @@ bool p3MsgService::receiveGxsTransMail( const RsGxsId& authorId,
|
||||
<< std::endl;
|
||||
return true;
|
||||
}
|
||||
mRecentlyReceivedMessageHashes[hash] =
|
||||
static_cast<uint32_t>(time(nullptr));
|
||||
mRecentlyReceivedMessageHashes[hash] = static_cast<uint32_t>(time(nullptr));
|
||||
}
|
||||
|
||||
IndicateConfigChanged();
|
||||
|
||||
RsItem *item = _serialiser->deserialise(
|
||||
const_cast<uint8_t*>(data), &dataSize );
|
||||
RsItem *item = _serialiser->deserialise( const_cast<uint8_t*>(data), &dataSize );
|
||||
RsMsgItem *msg_item = dynamic_cast<RsMsgItem*>(item);
|
||||
|
||||
if(msg_item)
|
||||
|
@ -112,7 +112,7 @@ void p3PostBase::notifyChanges(std::vector<RsGxsNotify *> &changes)
|
||||
// It could be taken a step further and directly request these msgs for an update.
|
||||
addGroupForProcessing(mit->first);
|
||||
|
||||
if (rsEvents && msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW)
|
||||
if (rsEvents && (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW || msgChange->getType() == RsGxsNotify::TYPE_PUBLISHED))
|
||||
for (auto mit1 = mit->second.begin(); mit1 != mit->second.end(); ++mit1)
|
||||
{
|
||||
auto ev = std::make_shared<RsGxsPostedEvent>();
|
||||
|
@ -100,22 +100,42 @@ RsEventsHandlerId_t RsEventsService::generateUniqueHandlerId_unlocked()
|
||||
}
|
||||
|
||||
bool RsEventsService::registerEventsHandler(
|
||||
RsEventType eventType,
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> multiCallback,
|
||||
RsEventsHandlerId_t& hId )
|
||||
{
|
||||
RS_STACK_MUTEX(mHandlerMapMtx);
|
||||
if(!hId) hId = generateUniqueHandlerId_unlocked();
|
||||
mHandlerMap[hId] = multiCallback;
|
||||
|
||||
if( (int)eventType > mHandlerMaps.size() + 10)
|
||||
{
|
||||
RsErr() << "Cannot register an event handler for an event type larger than 10 plus the max pre-defined event (value passed was " << (int)eventType << " whereas max is " << (int)RsEventType::MAX << ")" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( (int)eventType >= mHandlerMaps.size())
|
||||
mHandlerMaps.resize( (int)eventType +1 );
|
||||
|
||||
if(!hId)
|
||||
hId = generateUniqueHandlerId_unlocked();
|
||||
|
||||
mHandlerMaps[(int)eventType][hId] = multiCallback;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RsEventsService::unregisterEventsHandler(RsEventsHandlerId_t hId)
|
||||
{
|
||||
RS_STACK_MUTEX(mHandlerMapMtx);
|
||||
auto it = mHandlerMap.find(hId);
|
||||
if(it == mHandlerMap.end()) return false;
|
||||
mHandlerMap.erase(it);
|
||||
return true;
|
||||
|
||||
for(uint32_t i=0;i<mHandlerMaps.size();++i)
|
||||
{
|
||||
auto it = mHandlerMaps[i].find(hId);
|
||||
if(it != mHandlerMaps[i].end())
|
||||
{
|
||||
mHandlerMaps[i].erase(it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void RsEventsService::threadTick()
|
||||
@ -156,23 +176,25 @@ void RsEventsService::handleEvent(std::shared_ptr<const RsEvent> event)
|
||||
{
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> mCallback;
|
||||
|
||||
mHandlerMapMtx.lock();
|
||||
auto cbpt = mHandlerMap.begin();
|
||||
mHandlerMapMtx.unlock();
|
||||
uint32_t event_type_index = static_cast<uint32_t>(event->mType);
|
||||
|
||||
getHandlerFromMapLock:
|
||||
mHandlerMapMtx.lock();
|
||||
if(cbpt != mHandlerMap.end())
|
||||
{
|
||||
mCallback = cbpt->second;
|
||||
++cbpt;
|
||||
}
|
||||
mHandlerMapMtx.unlock();
|
||||
RS_STACK_MUTEX(mHandlerMapMtx); /* LOCKED AREA */
|
||||
|
||||
if(mCallback)
|
||||
{
|
||||
mCallback(event); // It is relevant that this happens outside mutex
|
||||
mCallback = std::function<void(std::shared_ptr<const RsEvent>)>(nullptr);
|
||||
goto getHandlerFromMapLock;
|
||||
if(event_type_index >= mHandlerMaps.size() || event_type_index < 1)
|
||||
{
|
||||
RsErr() << "Cannot handle an event of type " << event_type_index << ": out of scope!" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// Call all clients that registered a callback for this event type
|
||||
|
||||
for(auto cbit: mHandlerMaps[event_type_index])
|
||||
cbit.second(event);
|
||||
|
||||
// Also call all clients that registered with NONE, meaning that they expect all events
|
||||
|
||||
for(auto cbit: mHandlerMaps[static_cast<uint32_t>(RsEventType::NONE)])
|
||||
cbit.second(event);
|
||||
}
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ class RsEventsService :
|
||||
public:
|
||||
RsEventsService():
|
||||
mHandlerMapMtx("RsEventsService::mHandlerMapMtx"), mLastHandlerId(1),
|
||||
mHandlerMaps(static_cast<int>(RsEventType::MAX)),
|
||||
mEventQueueMtx("RsEventsService::mEventQueueMtx") {}
|
||||
|
||||
/// @see RsEvents
|
||||
@ -54,6 +55,7 @@ public:
|
||||
|
||||
/// @see RsEvents
|
||||
bool registerEventsHandler(
|
||||
RsEventType eventType,
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> multiCallback,
|
||||
RsEventsHandlerId_t& hId = RS_DEFAULT_STORAGE_PARAM(RsEventsHandlerId_t, 0)
|
||||
) override;
|
||||
@ -64,9 +66,11 @@ public:
|
||||
protected:
|
||||
RsMutex mHandlerMapMtx;
|
||||
RsEventsHandlerId_t mLastHandlerId;
|
||||
std::map<
|
||||
RsEventsHandlerId_t,
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> > mHandlerMap;
|
||||
|
||||
std::vector<
|
||||
std::map<
|
||||
RsEventsHandlerId_t,
|
||||
std::function<void(std::shared_ptr<const RsEvent>)> > > mHandlerMaps;
|
||||
|
||||
RsMutex mEventQueueMtx;
|
||||
std::deque< std::shared_ptr<const RsEvent> > mEventQueue;
|
||||
|
@ -1886,11 +1886,15 @@ void p3turtle::handleTunnelResult(RsTurtleTunnelOkItem *item)
|
||||
// because there is not too much file hashes to be active at a time,
|
||||
// and this mostly prevents from sending the hash back in the tunnel.
|
||||
|
||||
bool found = false ;
|
||||
#ifdef P3TURTLE_DEBUG
|
||||
bool ext_found = false ;
|
||||
#endif
|
||||
for(std::map<TurtleFileHash,TurtleHashInfo>::iterator it(_incoming_file_hashes.begin());it!=_incoming_file_hashes.end();++it)
|
||||
if(it->second.last_request == item->request_id)
|
||||
{
|
||||
found = true ;
|
||||
#ifdef P3TURTLE_DEBUG
|
||||
ext_found = true ;
|
||||
#endif
|
||||
|
||||
{
|
||||
// add the tunnel uniquely
|
||||
@ -1917,7 +1921,7 @@ void p3turtle::handleTunnelResult(RsTurtleTunnelOkItem *item)
|
||||
}
|
||||
}
|
||||
#ifdef P3TURTLE_DEBUG
|
||||
if(!found)
|
||||
if(!ext_found)
|
||||
std::cerr << "p3turtle: error. Could not find hash that emmitted tunnel request " << reinterpret_cast<void*>(item->tunnel_id) << std::endl ;
|
||||
#endif
|
||||
}
|
||||
|
@ -207,15 +207,14 @@ bool ConvertUtf16ToUtf8(const std::wstring& source, std::string& dest)
|
||||
|
||||
bool is_alphanumeric(char c)
|
||||
{
|
||||
return (c>='0' && c<'9') || (c>='a' && c<='z') || (c>='A' && c<='Z') ;
|
||||
return (c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z');
|
||||
}
|
||||
|
||||
bool is_alphanumeric(const std::string& s)
|
||||
{
|
||||
for(uint32_t i=0;i<s.size();++i)
|
||||
if(!is_alphanumeric(s[i]))
|
||||
return false;
|
||||
return true;
|
||||
for( uint32_t i=0; i < s.size(); ++i)
|
||||
if(!is_alphanumeric(s[i])) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
} } // librs::util
|
||||
|
@ -85,7 +85,7 @@ int RS_pthread_setname_np(pthread_t __target_thread, const char *__buf) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RsThread::RsThread() : mHasStopped(true), mShouldStop(false)
|
||||
void RsThread::resetTid()
|
||||
{
|
||||
#ifdef WINDOWS_SYS
|
||||
memset (&mTid, 0, sizeof(mTid));
|
||||
@ -94,6 +94,9 @@ RsThread::RsThread() : mHasStopped(true), mShouldStop(false)
|
||||
#endif
|
||||
}
|
||||
|
||||
RsThread::RsThread() : mHasStopped(true), mShouldStop(false), mLastTid()
|
||||
{ resetTid(); }
|
||||
|
||||
bool RsThread::isRunning() { return !mHasStopped; }
|
||||
|
||||
bool RsThread::shouldStop() { return mShouldStop; }
|
||||
@ -102,13 +105,13 @@ void RsThread::askForStop()
|
||||
{
|
||||
/* Call onStopRequested() only once even if askForStop() is called multiple
|
||||
* times */
|
||||
if(!mShouldStop.exchange(true))
|
||||
RsThread::async([&](){ onStopRequested(); });
|
||||
if(!mShouldStop.exchange(true)) onStopRequested();
|
||||
}
|
||||
|
||||
void RsThread::wrapRun()
|
||||
{
|
||||
run();
|
||||
resetTid();
|
||||
mHasStopped = true;
|
||||
}
|
||||
|
||||
@ -122,7 +125,8 @@ void RsThread::fullstop()
|
||||
RsErr() << __PRETTY_FUNCTION__ << " called by same thread. This should "
|
||||
<< "never happen! this: " << static_cast<void*>(this)
|
||||
<< std::hex << ", callerTid: " << callerTid
|
||||
<< ", mTid: " << mTid << std::dec << std::endl;
|
||||
<< ", mTid: " << mTid << std::dec
|
||||
<< ", mFullName: " << mFullName << std::endl;
|
||||
print_stacktrace();
|
||||
return;
|
||||
}
|
||||
@ -134,9 +138,9 @@ void RsThread::fullstop()
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
++i;
|
||||
if(!(i%5))
|
||||
RsInfo() << __PRETTY_FUNCTION__ << " " << i*0.2 << " seconds passed"
|
||||
<< " waiting for thread: " << mTid << " " << mFullName
|
||||
<< " to stop" << std::endl;
|
||||
RsDbg() << __PRETTY_FUNCTION__ << " " << i*0.2 << " seconds passed"
|
||||
<< " waiting for thread: " << std::hex << mLastTid
|
||||
<< std::dec << " " << mFullName << " to stop" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,6 +162,9 @@ bool RsThread::start(const std::string& threadName)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Store an extra copy of thread id for debugging */
|
||||
mLastTid = mTid;
|
||||
|
||||
/* Store thread full name as PThread is not able to keep it entirely */
|
||||
mFullName = threadName;
|
||||
|
||||
@ -266,10 +273,10 @@ double RsStackMutex::getCurrentTS()
|
||||
|
||||
RsThread::~RsThread()
|
||||
{
|
||||
if(isRunning())
|
||||
if(!mHasStopped)
|
||||
{
|
||||
RsErr() << __PRETTY_FUNCTION__ << " deleting thread: " << mTid << " "
|
||||
<< mFullName << " that is still "
|
||||
RsErr() << __PRETTY_FUNCTION__ << " deleting thread: " << mLastTid
|
||||
<< " " << mFullName << " that is still "
|
||||
<< "running! Something seems very wrong here and RetroShare is "
|
||||
<< "likely to crash because of this." << std::endl;
|
||||
print_stacktrace();
|
||||
|
@ -264,9 +264,19 @@ private:
|
||||
|
||||
/// Store the id of the corresponding pthread
|
||||
pthread_t mTid;
|
||||
void resetTid();
|
||||
|
||||
/// Store thread full name
|
||||
/** Store thread full name for debugging because PThread is limited to 15
|
||||
* char thread names */
|
||||
std::string mFullName;
|
||||
|
||||
/** Store a copy of thread id which is never reset to 0 after initialization
|
||||
* due to RsThread functioning. After RsThread initialization this member is
|
||||
* only re-written with a new tread id in start(...).
|
||||
* This is useful for debugging because mTid is reset at the end of wrapRun
|
||||
* and that might happens concurrently (or just before) a debug message
|
||||
* being printed, thus causing the debug message to print a mangled value.*/
|
||||
pthread_t mLastTid;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -47,8 +47,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void removeItem();
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
|
||||
void readAndClearItem();
|
||||
void copyLink();
|
||||
@ -61,9 +60,7 @@ private:
|
||||
|
||||
RsFeedReader *mFeedReader;
|
||||
FeedReaderNotify *mNotify;
|
||||
FeedHolder *mParent;
|
||||
|
||||
std::string mFeedId;
|
||||
std::string mMsgId;
|
||||
QString mLink;
|
||||
|
||||
|
@ -72,8 +72,21 @@ static NewsFeed *instance = NULL;
|
||||
/** Constructor */
|
||||
NewsFeed::NewsFeed(QWidget *parent) : MainPage(parent), ui(new Ui::NewsFeed)
|
||||
{
|
||||
mEventHandlerId =0; // needed to force intialization by registerEventsHandler()
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { handleEvent(event); }, mEventHandlerId );
|
||||
mEventTypes = {
|
||||
RsEventType::AUTHSSL_CONNECTION_AUTENTICATION,
|
||||
RsEventType::PEER_CONNECTION ,
|
||||
RsEventType::GXS_CIRCLES ,
|
||||
RsEventType::GXS_CHANNELS ,
|
||||
RsEventType::GXS_FORUMS ,
|
||||
RsEventType::GXS_POSTED ,
|
||||
RsEventType::MAIL_STATUS
|
||||
};
|
||||
|
||||
for(uint32_t i=0;i<mEventTypes.size();++i)
|
||||
{
|
||||
mEventHandlerIds.push_back(0); // needed to force intialization by registerEventsHandler()
|
||||
rsEvents->registerEventsHandler(mEventTypes[i], [this](std::shared_ptr<const RsEvent> event) { handleEvent(event); }, mEventHandlerIds.back() );
|
||||
}
|
||||
|
||||
/* Invoke the Qt Designer generated object setup routine */
|
||||
ui->setupUi(this);
|
||||
@ -117,7 +130,8 @@ QString hlp_str = tr(
|
||||
|
||||
NewsFeed::~NewsFeed()
|
||||
{
|
||||
rsEvents->unregisterEventsHandler(mEventHandlerId);
|
||||
for(uint32_t i=0;i<mEventHandlerIds.size();++i)
|
||||
rsEvents->unregisterEventsHandler(mEventHandlerIds[i]);
|
||||
|
||||
// save settings
|
||||
processSettings(false);
|
||||
@ -188,10 +202,10 @@ void NewsFeed::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
|
||||
handleForumEvent(event);
|
||||
|
||||
if(event->mType == RsEventType::GXS_POSTED && (flags & RS_FEED_TYPE_POSTED))
|
||||
handleMailEvent(event);
|
||||
|
||||
if(event->mType == RsEventType::MAIL_STATUS_CHANGE && (flags & RS_FEED_TYPE_MSG))
|
||||
handlePostedEvent(event);
|
||||
|
||||
if(event->mType == RsEventType::MAIL_STATUS && (flags & RS_FEED_TYPE_MSG))
|
||||
handleMailEvent(event);
|
||||
}
|
||||
|
||||
void NewsFeed::handleMailEvent(std::shared_ptr<const RsEvent> event)
|
||||
@ -200,6 +214,7 @@ void NewsFeed::handleMailEvent(std::shared_ptr<const RsEvent> event)
|
||||
dynamic_cast<const RsMailStatusEvent*>(event.get());
|
||||
if(!pe) return;
|
||||
|
||||
|
||||
switch(pe->mMailStatusEventCode)
|
||||
{
|
||||
case RsMailStatusEventCode::NEW_MESSAGE:
|
||||
@ -480,14 +495,10 @@ void NewsFeed::addFeedItemIfUnique(FeedItem *item, bool replace)
|
||||
|
||||
void NewsFeed::remUniqueFeedItem(FeedItem *item)
|
||||
{
|
||||
FeedItem *feedItem = ui->feedWidget->findFeedItem(item->uniqueIdentifier());
|
||||
//FeedItem *feedItem = ui->feedWidget->findFeedItem(item->uniqueIdentifier());
|
||||
|
||||
if (feedItem)
|
||||
{
|
||||
ui->feedWidget->removeFeedItem(item);
|
||||
delete item;
|
||||
|
||||
ui->feedWidget->removeFeedItem(feedItem);
|
||||
}
|
||||
}
|
||||
|
||||
/* FeedHolder Functions (for FeedItem functionality) */
|
||||
@ -496,7 +507,7 @@ QScrollArea *NewsFeed::getScrollArea()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void NewsFeed::deleteFeedItem(QWidget *item, uint32_t /*type*/)
|
||||
void NewsFeed::deleteFeedItem(FeedItem *item, uint32_t /*type*/)
|
||||
{
|
||||
#ifdef NEWS_DEBUG
|
||||
std::cerr << "NewsFeed::deleteFeedItem()";
|
||||
@ -504,6 +515,7 @@ void NewsFeed::deleteFeedItem(QWidget *item, uint32_t /*type*/)
|
||||
#endif
|
||||
|
||||
if (item) {
|
||||
ui->feedWidget->removeFeedItem(item);
|
||||
item->close ();
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ public:
|
||||
|
||||
/* FeedHolder Functions (for FeedItem functionality) */
|
||||
virtual QScrollArea *getScrollArea();
|
||||
virtual void deleteFeedItem(QWidget *item, uint32_t type);
|
||||
virtual void deleteFeedItem(FeedItem *item, uint32_t type);
|
||||
virtual void openChat(const RsPeerId& peerId);
|
||||
virtual void openComments(uint32_t type, const RsGxsGroupId &groupId, const QVector<RsGxsMessageId> &versions, const RsGxsMessageId &msgId, const QString &title);
|
||||
|
||||
@ -118,7 +118,8 @@ private:
|
||||
/* UI - from Designer */
|
||||
Ui::NewsFeed *ui;
|
||||
|
||||
RsEventsHandlerId_t mEventHandlerId;
|
||||
std::vector<RsEventsHandlerId_t> mEventHandlerIds;
|
||||
std::vector<RsEventType> mEventTypes;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -49,7 +49,7 @@ public:
|
||||
const RsPostedPost &getPost() const;
|
||||
RsPostedPost &post();
|
||||
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("PostedItem " + mMessageId.toStdString()); }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("PostedItem " + messageId().toStdString()); }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
@ -60,7 +60,7 @@ private slots:
|
||||
void makeDownVote();
|
||||
void readToggled(bool checked);
|
||||
void readAndClearItem();
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
void copyMessageLink();
|
||||
void toggleNotes();
|
||||
|
||||
|
@ -143,7 +143,7 @@ QScrollArea *PostedListWidget::getScrollArea()
|
||||
return ui->scrollArea;
|
||||
}
|
||||
|
||||
void PostedListWidget::deleteFeedItem(QWidget */*item*/, uint32_t /*type*/)
|
||||
void PostedListWidget::deleteFeedItem(FeedItem *, uint32_t /*type*/)
|
||||
{
|
||||
#ifdef DEBUG_POSTED_LIST_WIDGET
|
||||
std::cerr << "PostedListWidget::deleteFeedItem() Nah";
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
|
||||
/* FeedHolder */
|
||||
virtual QScrollArea *getScrollArea();
|
||||
virtual void deleteFeedItem(QWidget *item, uint32_t type);
|
||||
virtual void deleteFeedItem(FeedItem *item, uint32_t type);
|
||||
virtual void openChat(const RsPeerId& peerId);
|
||||
virtual void openComments(uint32_t type, const RsGxsGroupId &groupId, const QVector<RsGxsMessageId> &versions, const RsGxsMessageId &msgId, const QString &title);
|
||||
|
||||
|
@ -178,7 +178,7 @@ NewFriendList::NewFriendList(QWidget *parent) : /* RsAutoUpdatePage(5000,parent)
|
||||
ui->filterLineEdit->showFilterIcon();
|
||||
|
||||
mEventHandlerId=0; // forces initialization
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId );
|
||||
rsEvents->registerEventsHandler( RsEventType::PEER_CONNECTION, [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId );
|
||||
|
||||
mModel = new RsFriendListModel();
|
||||
mProxyModel = new FriendListSortFilterProxyModel(ui->peerTreeWidget->header(),this);
|
||||
@ -258,13 +258,10 @@ NewFriendList::NewFriendList(QWidget *parent) : /* RsAutoUpdatePage(5000,parent)
|
||||
|
||||
void NewFriendList::handleEvent(std::shared_ptr<const RsEvent> e)
|
||||
{
|
||||
if(e->mType == RsEventType::PEER_CONNECTION)
|
||||
{
|
||||
// /!\ The function we're in is called from a different thread. It's very important
|
||||
// to use this trick in order to avoid data races.
|
||||
// /!\ The function we're in is called from a different thread. It's very important
|
||||
// to use this trick in order to avoid data races.
|
||||
|
||||
RsQThreadUtils::postToObject( [=]() { forceUpdateDisplay() ; }, this ) ;
|
||||
}
|
||||
RsQThreadUtils::postToObject( [=]() { forceUpdateDisplay() ; }, this ) ;
|
||||
}
|
||||
|
||||
NewFriendList::~NewFriendList()
|
||||
|
@ -111,7 +111,6 @@ bool RSFeedWidget::eventFilter(QObject *object, QEvent *event)
|
||||
FeedItem *feedItem = feedItemFromTreeItem(treeItem);
|
||||
if (feedItem) {
|
||||
disconnectSignals(feedItem);
|
||||
feedRemoved(feedItem);
|
||||
delete(feedItem);
|
||||
}
|
||||
delete(treeItem);
|
||||
@ -135,23 +134,19 @@ void RSFeedWidget::feedAdded(FeedItem *feedItem, QTreeWidgetItem *treeItem)
|
||||
{
|
||||
}
|
||||
|
||||
void RSFeedWidget::feedRemoved(FeedItem *feedItem)
|
||||
{
|
||||
}
|
||||
|
||||
void RSFeedWidget::feedsCleared()
|
||||
{
|
||||
}
|
||||
|
||||
void RSFeedWidget::connectSignals(FeedItem *feedItem)
|
||||
{
|
||||
connect(feedItem, SIGNAL(feedItemDestroyed(FeedItem*)), this, SLOT(feedItemDestroyed(FeedItem*)));
|
||||
connect(feedItem, SIGNAL(feedItemNeedsClosing(qulonglong)), this, SLOT(feedItemDestroyed(qulonglong)));
|
||||
connect(feedItem, SIGNAL(sizeChanged(FeedItem*)), this, SLOT(feedItemSizeChanged(FeedItem*)));
|
||||
}
|
||||
|
||||
void RSFeedWidget::disconnectSignals(FeedItem *feedItem)
|
||||
{
|
||||
disconnect(feedItem, SIGNAL(feedItemDestroyed(FeedItem*)), this, SLOT(feedItemDestroyed(FeedItem*)));
|
||||
disconnect(feedItem, SIGNAL(feedItemNeedsClosing(qulonglong)), this, SLOT(feedItemDestroyed(qulonglong)));
|
||||
disconnect(feedItem, SIGNAL(sizeChanged(FeedItem*)), this, SLOT(feedItemSizeChanged(FeedItem*)));
|
||||
}
|
||||
|
||||
@ -384,11 +379,10 @@ FeedItem *RSFeedWidget::feedItem(int index)
|
||||
|
||||
void RSFeedWidget::removeFeedItem(FeedItem *feedItem)
|
||||
{
|
||||
if (!feedItem) {
|
||||
if (!feedItem)
|
||||
return;
|
||||
}
|
||||
|
||||
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem->uniqueIdentifier());
|
||||
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem);// WARNING: do not use the other function based on identifier here, because some items change their identifier when loading.
|
||||
|
||||
if (treeItem)
|
||||
{
|
||||
@ -396,11 +390,10 @@ void RSFeedWidget::removeFeedItem(FeedItem *feedItem)
|
||||
|
||||
if(treeItem_index < 0)
|
||||
{
|
||||
std::cerr << "(EE) Cannot remove designated item \"" << feedItem->uniqueIdentifier() << "\": not found!" << std::endl;
|
||||
std::cerr << "(EE) Cannot remove designated item \"" << (void*)feedItem << "\": not found!" << std::endl;
|
||||
return ;
|
||||
}
|
||||
|
||||
feedRemoved(feedItem);
|
||||
disconnectSignals(feedItem);
|
||||
|
||||
delete ui->treeWidget->takeTopLevelItem(treeItem_index);
|
||||
@ -424,20 +417,39 @@ void RSFeedWidget::feedItemSizeChanged(FeedItem */*feedItem*/)
|
||||
ui->treeWidget->doItemsLayout();
|
||||
}
|
||||
|
||||
void RSFeedWidget::feedItemDestroyed(FeedItem *feedItem)
|
||||
void RSFeedWidget::feedItemDestroyed(qulonglong id)
|
||||
{
|
||||
/* No need to disconnect when object will be destroyed */
|
||||
|
||||
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem->uniqueIdentifier());
|
||||
QTreeWidgetItem *treeItem = findTreeWidgetItem(id);
|
||||
|
||||
feedRemoved(feedItem);
|
||||
if (treeItem)
|
||||
if(treeItem)
|
||||
delete(treeItem);
|
||||
|
||||
if (!mCountChangedDisabled)
|
||||
emit feedCountChanged();
|
||||
}
|
||||
|
||||
QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(const FeedItem *w)
|
||||
{
|
||||
QTreeWidgetItemIterator it(ui->treeWidget);
|
||||
QTreeWidgetItem *treeItem=NULL;
|
||||
|
||||
// this search could probably be automatised by giving the tree items the identifier as data for some specific role, then calling QTreeWidget::findItems()
|
||||
#warning TODO
|
||||
while (*it)
|
||||
{
|
||||
FeedItem *feedItem = feedItemFromTreeItem(*it);
|
||||
|
||||
if (feedItem == w)
|
||||
return *it;
|
||||
|
||||
++it;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(uint64_t identifier)
|
||||
{
|
||||
QList<QTreeWidgetItem*> list = ui->treeWidget->findItems(QString("%1").arg(identifier,8,16,QChar('0')),Qt::MatchExactly,COLUMN_IDENTIFIER);
|
||||
@ -490,27 +502,21 @@ void RSFeedWidget::withAll(RSFeedWidgetCallbackFunction callback, void *data)
|
||||
|
||||
FeedItem *RSFeedWidget::findFeedItem(uint64_t identifier)
|
||||
{
|
||||
QTreeWidgetItemIterator it(ui->treeWidget);
|
||||
QTreeWidgetItem *treeItem=NULL;
|
||||
QList<QTreeWidgetItem*> list = ui->treeWidget->findItems(QString("%1").arg(identifier,8,16,QChar('0')),Qt::MatchExactly,COLUMN_IDENTIFIER);
|
||||
|
||||
// this search could probably be automatised by giving the tree items the identifier as data for some specific role, then calling QTreeWidget::findItems()
|
||||
#warning TODO
|
||||
while ((treeItem = *it) != NULL) {
|
||||
++it;
|
||||
|
||||
FeedItem *feedItem = feedItemFromTreeItem(treeItem);
|
||||
if (!feedItem)
|
||||
continue;
|
||||
|
||||
uint64_t id = feedItem->uniqueIdentifier();
|
||||
|
||||
if (id == identifier)
|
||||
return feedItem;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
if(list.empty())
|
||||
return nullptr;
|
||||
else if(list.size() == 1)
|
||||
return feedItemFromTreeItem(list.front());
|
||||
else
|
||||
{
|
||||
std::cerr << "(EE) More than a single item with identifier \"" << identifier << "\" in the feed tree widget. This shouldn't happen!" << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void RSFeedWidget::selectedFeedItems(QList<FeedItem*> &feedItems)
|
||||
{
|
||||
foreach (QTreeWidgetItem *treeItem, ui->treeWidget->selectedItems()) {
|
||||
|
@ -87,11 +87,10 @@ public slots:
|
||||
protected:
|
||||
bool eventFilter(QObject *object, QEvent *event);
|
||||
virtual void feedAdded(FeedItem *feedItem, QTreeWidgetItem *treeItem);
|
||||
virtual void feedRemoved(FeedItem *feedItem);
|
||||
virtual void feedsCleared();
|
||||
|
||||
private slots:
|
||||
void feedItemDestroyed(FeedItem *feedItem);
|
||||
void feedItemDestroyed(qulonglong id);
|
||||
void feedItemSizeChanged(FeedItem *feedItem);
|
||||
|
||||
private:
|
||||
@ -99,6 +98,7 @@ private:
|
||||
void disconnectSignals(FeedItem *feedItem);
|
||||
FeedItem *feedItemFromTreeItem(QTreeWidgetItem *treeItem);
|
||||
QTreeWidgetItem *findTreeWidgetItem(uint64_t identifier);
|
||||
QTreeWidgetItem *findTreeWidgetItem(const FeedItem *w);
|
||||
void filterItems();
|
||||
void filterItem(QTreeWidgetItem *treeItem, FeedItem *feedItem);
|
||||
|
||||
|
@ -43,7 +43,7 @@
|
||||
|
||||
/** Constructor */
|
||||
ChatMsgItem::ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, const std::string &message) :
|
||||
FeedItem(NULL), mParent(parent), mFeedId(feedId), mPeerId(peerId)
|
||||
FeedItem(parent,feedId,NULL), mPeerId(peerId)
|
||||
{
|
||||
/* Invoke the Qt Designer generated object setup routine */
|
||||
setupUi(this);
|
||||
@ -153,26 +153,6 @@ void ChatMsgItem::insertChat(const std::string &message)
|
||||
chatTextlabel->setText(formatMsg);
|
||||
}
|
||||
|
||||
void ChatMsgItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "ChatMsgItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, true);
|
||||
}
|
||||
|
||||
hide();
|
||||
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, false);
|
||||
|
||||
mParent->deleteFeedItem(this, mFeedId);
|
||||
}
|
||||
}
|
||||
|
||||
void ChatMsgItem::gotoHome()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
@ -191,7 +171,7 @@ void ChatMsgItem::sendMsg()
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
if (mParent)
|
||||
if (mFeedHolder)
|
||||
{
|
||||
|
||||
MessageComposer *nMsgDialog = MessageComposer::newMsg();
|
||||
@ -214,15 +194,15 @@ void ChatMsgItem::openChat()
|
||||
std::cerr << "ChatMsgItem::openChat()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
if (mParent)
|
||||
if (mFeedHolder)
|
||||
{
|
||||
mParent->openChat(mPeerId);
|
||||
mFeedHolder->openChat(mPeerId);
|
||||
}
|
||||
}
|
||||
|
||||
void ChatMsgItem::togglequickmessage()
|
||||
{
|
||||
mParent->lockLayout(this, true);
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
|
||||
if (messageFrame->isHidden())
|
||||
{
|
||||
@ -239,7 +219,7 @@ void ChatMsgItem::togglequickmessage()
|
||||
|
||||
emit sizeChanged(this);
|
||||
|
||||
mParent->lockLayout(this, false);
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
}
|
||||
|
||||
void ChatMsgItem::sendMessage()
|
||||
|
@ -45,7 +45,6 @@ protected:
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void gotoHome();
|
||||
void removeItem();
|
||||
|
||||
void sendMsg();
|
||||
void openChat();
|
||||
@ -60,9 +59,6 @@ private slots:
|
||||
private:
|
||||
void insertChat(const std::string &message);
|
||||
|
||||
FeedHolder *mParent;
|
||||
uint32_t mFeedId;
|
||||
|
||||
RsPeerId mPeerId;
|
||||
};
|
||||
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <retroshare/rsgxschannels.h> // WRONG ONE - BUT IT'LL DO FOR NOW.
|
||||
|
||||
class QScrollArea;
|
||||
class FeedItem;
|
||||
|
||||
class FeedHolder
|
||||
{
|
||||
@ -34,7 +35,7 @@ public:
|
||||
FeedHolder();
|
||||
|
||||
virtual QScrollArea *getScrollArea() = 0;
|
||||
virtual void deleteFeedItem(QWidget *item, uint32_t type) = 0;
|
||||
virtual void deleteFeedItem(FeedItem *item, uint32_t type) = 0;
|
||||
virtual void openChat(const RsPeerId& peerId) = 0;
|
||||
virtual void openComments(uint32_t type, const RsGxsGroupId &groupId, const QVector<RsGxsMessageId> &msg_versions, const RsGxsMessageId &msgId, const QString &title)=0;
|
||||
|
||||
|
@ -20,17 +20,15 @@
|
||||
|
||||
#include <iostream>
|
||||
#include "FeedItem.h"
|
||||
#include "FeedHolder.h"
|
||||
|
||||
/** Constructor */
|
||||
FeedItem::FeedItem(QWidget *parent) : QWidget(parent), mHash(0)
|
||||
FeedItem::FeedItem(FeedHolder *fh, uint32_t feedId, QWidget *parent) : QWidget(parent), mHash(0),mFeedHolder(fh),mFeedId(feedId)
|
||||
{
|
||||
mWasExpanded = false;
|
||||
}
|
||||
|
||||
FeedItem::~FeedItem()
|
||||
{
|
||||
emit feedItemDestroyed(this);
|
||||
}
|
||||
FeedItem::~FeedItem() { }
|
||||
|
||||
void FeedItem::expand(bool open)
|
||||
{
|
||||
@ -48,12 +46,28 @@ void FeedItem::expand(bool open)
|
||||
uint64_t FeedItem::hash_64bits(const std::string& s) const
|
||||
{
|
||||
if(mHash == 0)
|
||||
{
|
||||
mHash = 0x01110bbfa09;
|
||||
|
||||
for(uint32_t i=0;i<s.size();++i)
|
||||
mHash = ~(((mHash << 31) ^ (mHash >> 3)) + s[i]*0x217898fbba7 + 0x0294379);
|
||||
}
|
||||
mHash = hash64(s);
|
||||
|
||||
return mHash;
|
||||
}
|
||||
|
||||
uint64_t FeedItem::hash64(const std::string& s)
|
||||
{
|
||||
uint64_t hash = 0x01110bbfa09;
|
||||
|
||||
for(uint32_t i=0;i<s.size();++i)
|
||||
hash = ~(((hash << 31) ^ (hash >> 3)) + s[i]*0x217898fbba7 + 0x0294379);
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
void FeedItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "MsgItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mFeedHolder->deleteFeedItem(this,0);
|
||||
}
|
||||
|
||||
|
@ -23,13 +23,15 @@
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class FeedHolder;
|
||||
|
||||
class FeedItem : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
/** Default Constructor */
|
||||
FeedItem(QWidget *parent = 0);
|
||||
FeedItem(FeedHolder *fh,uint32_t feedId,QWidget *parent = 0);
|
||||
/** Default Destructor */
|
||||
virtual ~FeedItem();
|
||||
|
||||
@ -42,14 +44,25 @@ public:
|
||||
* would contain the same information. It should therefore sumarise the data represented by the item.
|
||||
*/
|
||||
virtual uint64_t uniqueIdentifier() const =0;
|
||||
|
||||
static uint64_t hash64(const std::string& s);
|
||||
|
||||
protected slots:
|
||||
void removeItem();
|
||||
|
||||
protected:
|
||||
virtual void doExpand(bool open) = 0;
|
||||
virtual void expandFill(bool /*first*/) {}
|
||||
|
||||
virtual void toggle() {}
|
||||
|
||||
uint64_t hash_64bits(const std::string& s) const;
|
||||
|
||||
FeedHolder *mFeedHolder;
|
||||
uint32_t mFeedId;
|
||||
signals:
|
||||
void sizeChanged(FeedItem *feedItem);
|
||||
void feedItemDestroyed(FeedItem *feedItem);
|
||||
void feedItemNeedsClosing(qulonglong);
|
||||
|
||||
private:
|
||||
bool mWasExpanded;
|
||||
|
@ -53,7 +53,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
|
||||
void subscribeChannel();
|
||||
|
||||
|
@ -46,12 +46,14 @@
|
||||
GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, const RsGxsMessageId &messageId, bool isHome, bool autoUpdate,const std::set<RsGxsMessageId>& older_versions) :
|
||||
GxsFeedItem(feedHolder, feedId, groupId, messageId, isHome, rsGxsChannels, autoUpdate)
|
||||
{
|
||||
mPost.mMeta.mMsgId = messageId; // useful for uniqueIdentifer() before the post is loaded
|
||||
init(messageId,older_versions) ;
|
||||
}
|
||||
|
||||
GxsChannelPostItem::GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelPost& post, bool isHome, bool autoUpdate,const std::set<RsGxsMessageId>& older_versions) :
|
||||
GxsFeedItem(feedHolder, feedId, post.mMeta.mGroupId, post.mMeta.mMsgId, isHome, rsGxsChannels, autoUpdate)
|
||||
{
|
||||
mPost.mMeta.mMsgId.clear(); // security
|
||||
init(post.mMeta.mMsgId,older_versions) ;
|
||||
mPost = post ;
|
||||
}
|
||||
@ -71,7 +73,6 @@ void GxsChannelPostItem::init(const RsGxsMessageId& messageId,const std::set<RsG
|
||||
|
||||
setup();
|
||||
|
||||
mPost.mMeta.mMsgId = messageId; // useful for uniqueIdentifer() before the post is loaded
|
||||
mLoaded = false ;
|
||||
}
|
||||
|
||||
@ -326,12 +327,14 @@ void GxsChannelPostItem::loadMessage(const uint32_t &token)
|
||||
|
||||
if (posts.size() == 1)
|
||||
{
|
||||
std::cerr << (void*)this << ": Obtained post, with msgId = " << posts[0].mMeta.mMsgId << std::endl;
|
||||
setPost(posts[0]);
|
||||
}
|
||||
else if (cmts.size() == 1)
|
||||
{
|
||||
RsGxsComment cmt = cmts[0];
|
||||
|
||||
std::cerr << (void*)this << ": Obtained comment, setting messageId to threadID = " << cmt.mMeta.mThreadId << std::endl;
|
||||
ui->newCommentLabel->show();
|
||||
ui->commLabel->show();
|
||||
ui->commLabel->setText(QString::fromUtf8(cmt.mComment.c_str()));
|
||||
|
@ -53,7 +53,7 @@ public:
|
||||
//GxsChannelPostItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsChannelPost &post, bool isHome, bool autoUpdate);
|
||||
virtual ~GxsChannelPostItem();
|
||||
|
||||
uint64_t uniqueIdentifier() const override { hash_64bits("GxsChannelPostItem " + mPost.mMeta.mMsgId.toStdString()) ; }
|
||||
uint64_t uniqueIdentifier() const override { hash_64bits("GxsChannelPostItem " + messageId().toStdString()) ; }
|
||||
|
||||
bool setGroup(const RsGxsChannelGroup &group, bool doFill = true);
|
||||
bool setPost(const RsGxsChannelPost &post, bool doFill = true);
|
||||
@ -66,6 +66,7 @@ public:
|
||||
|
||||
bool isUnread() const ;
|
||||
|
||||
static uint64_t computeIdentifier(const RsGxsMessageId& msgid) { return hash64("GxsChannelPostItem " + msgid.toStdString()) ; }
|
||||
protected:
|
||||
void init(const RsGxsMessageId& messageId,const std::set<RsGxsMessageId>& older_versions);
|
||||
|
||||
@ -90,7 +91,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
void readAndClearItem();
|
||||
void download();
|
||||
void play();
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
|
||||
GxsCircleItem::GxsCircleItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsCircleId &circleId, const RsGxsId &gxsId, const uint32_t type)
|
||||
:FeedItem(NULL), mFeedHolder(feedHolder), mFeedId(feedId), mType(type), mCircleId(circleId), mGxsId(gxsId)
|
||||
:FeedItem(feedHolder,feedId,NULL), mType(type), mCircleId(circleId), mGxsId(gxsId)
|
||||
{
|
||||
setup();
|
||||
}
|
||||
@ -172,22 +172,6 @@ uint64_t GxsCircleItem::uniqueIdentifier() const
|
||||
return hash_64bits("GxsCircle " + mCircleId.toStdString() + " " + mGxsId.toStdString() + " " + QString::number(mType).toStdString());
|
||||
}
|
||||
|
||||
void GxsCircleItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "GxsCircleItem::removeItem()" << std::endl;
|
||||
#endif
|
||||
|
||||
if (mFeedHolder)
|
||||
{
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
hide();
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
|
||||
mFeedHolder->deleteFeedItem(this, mFeedId);
|
||||
}
|
||||
}
|
||||
|
||||
void GxsCircleItem::loadRequest(const TokenQueue * queue, const TokenRequest &req)
|
||||
{
|
||||
#ifdef ID_DEBUG
|
||||
|
@ -65,9 +65,6 @@ protected:
|
||||
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void removeItem();
|
||||
|
||||
void showCircleDetails();
|
||||
void acceptCircleSubscription();
|
||||
void grantCircleMembership() ;
|
||||
@ -76,8 +73,6 @@ private slots:
|
||||
private:
|
||||
void setup();
|
||||
|
||||
FeedHolder *mFeedHolder;
|
||||
uint32_t mFeedId;
|
||||
uint32_t mType;
|
||||
|
||||
RsGxsCircleId mCircleId;
|
||||
|
@ -158,7 +158,6 @@ void GxsForumGroupItem::fill()
|
||||
ui->clearButton->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
void GxsForumGroupItem::toggle()
|
||||
{
|
||||
expand(ui->expandFrame->isHidden());
|
||||
|
@ -46,6 +46,7 @@ public:
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
void toggle() override;
|
||||
|
||||
/* GxsGroupFeedItem */
|
||||
virtual QString groupName();
|
||||
@ -53,9 +54,6 @@ protected:
|
||||
virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_FORUM; }
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void toggle();
|
||||
|
||||
void subscribeForum();
|
||||
|
||||
private:
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
bool setGroup(const RsGxsForumGroup &group, bool doFill = true);
|
||||
bool setMessage(const RsGxsForumMsg &msg, bool doFill = true);
|
||||
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumMsgItem " + mMessage.mMeta.mMsgId.toStdString()) ; }
|
||||
uint64_t uniqueIdentifier() const override { return hash_64bits("GxsForumMsgItem " + messageId().toStdString()) ; }
|
||||
protected:
|
||||
/* FeedItem */
|
||||
virtual void doExpand(bool open);
|
||||
@ -67,7 +67,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
void readAndClearItem();
|
||||
|
||||
void unsubscribeForum();
|
||||
|
@ -43,7 +43,7 @@
|
||||
|
||||
/** Constructor */
|
||||
MsgItem::MsgItem(FeedHolder *parent, uint32_t feedId, const std::string &msgId, bool isHome) :
|
||||
FeedItem(NULL), mParent(parent), mFeedId(feedId), mMsgId(msgId), mIsHome(isHome)
|
||||
FeedItem(parent,feedId,NULL), mMsgId(msgId), mIsHome(isHome)
|
||||
{
|
||||
/* Invoke the Qt Designer generated object setup routine */
|
||||
setupUi(this);
|
||||
@ -222,15 +222,10 @@ void MsgItem::updateItem()
|
||||
}
|
||||
}
|
||||
|
||||
void MsgItem::toggle()
|
||||
{
|
||||
expand(expandFrame->isHidden());
|
||||
}
|
||||
|
||||
void MsgItem::doExpand(bool open)
|
||||
{
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, true);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
}
|
||||
|
||||
if (open)
|
||||
@ -252,8 +247,8 @@ void MsgItem::doExpand(bool open)
|
||||
|
||||
emit sizeChanged(this);
|
||||
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, false);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -266,23 +261,6 @@ void MsgItem::expandFill(bool first)
|
||||
}
|
||||
}
|
||||
|
||||
void MsgItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "MsgItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mParent->lockLayout(this, true);
|
||||
hide();
|
||||
mParent->lockLayout(this, false);
|
||||
|
||||
if (mParent)
|
||||
{
|
||||
mParent->deleteFeedItem(this, mFeedId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MsgItem::gotoHome()
|
||||
{
|
||||
@ -315,7 +293,7 @@ void MsgItem::replyMsg()
|
||||
std::cerr << "MsgItem::replyMsg()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
if (mParent)
|
||||
if (mFeedHolder)
|
||||
{
|
||||
//mParent->openMsg(FEEDHOLDER_MSG_MESSAGE, mPeerId, mMsgId);
|
||||
|
||||
@ -339,6 +317,11 @@ void MsgItem::playMedia()
|
||||
#endif
|
||||
}
|
||||
|
||||
void MsgItem::toggle()
|
||||
{
|
||||
expand(expandFrame->isHidden());
|
||||
}
|
||||
|
||||
void MsgItem::checkMessageReadStatus()
|
||||
{
|
||||
if (!mCloseOnRead) {
|
||||
|
@ -50,7 +50,6 @@ private:
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void gotoHome();
|
||||
void removeItem();
|
||||
void toggle();
|
||||
|
||||
void playMedia();
|
||||
@ -62,9 +61,6 @@ private slots:
|
||||
void updateItem();
|
||||
|
||||
private:
|
||||
FeedHolder *mParent;
|
||||
uint32_t mFeedId;
|
||||
|
||||
std::string mMsgId;
|
||||
QString mMsg;
|
||||
|
||||
|
@ -41,7 +41,7 @@
|
||||
|
||||
/** Constructor */
|
||||
PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, uint32_t type, bool isHome) :
|
||||
FeedItem(NULL), mParent(parent), mFeedId(feedId),
|
||||
FeedItem(parent,feedId,NULL),
|
||||
mPeerId(peerId), mType(type), mIsHome(isHome)
|
||||
{
|
||||
/* Invoke the Qt Designer generated object setup routine */
|
||||
@ -50,12 +50,12 @@ PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId,
|
||||
sendmsgButton->setEnabled(false);
|
||||
|
||||
/* general ones */
|
||||
connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) );
|
||||
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) );
|
||||
connect( expandButton, SIGNAL( clicked() ), this, SLOT( toggle() ) );
|
||||
connect( clearButton, SIGNAL( clicked() ), this, SLOT( removeItem() ) );
|
||||
|
||||
/* specific ones */
|
||||
connect( chatButton, SIGNAL( clicked( void ) ), this, SLOT( openChat ( void ) ) );
|
||||
connect( sendmsgButton, SIGNAL( clicked( ) ), this, SLOT( sendMsg() ) );
|
||||
connect( chatButton, SIGNAL( clicked() ), this, SLOT( openChat() ) );
|
||||
connect( sendmsgButton, SIGNAL( clicked() ), this, SLOT( sendMsg() ) );
|
||||
|
||||
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem()));
|
||||
|
||||
@ -225,7 +225,7 @@ void PeerItem::updateItem()
|
||||
/* slow Tick */
|
||||
int msec_rate = 10129;
|
||||
|
||||
QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) ));
|
||||
QTimer::singleShot( msec_rate, this, SLOT(updateItem() ));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -236,8 +236,8 @@ void PeerItem::toggle()
|
||||
|
||||
void PeerItem::doExpand(bool open)
|
||||
{
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, true);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
}
|
||||
|
||||
if (open)
|
||||
@ -255,25 +255,8 @@ void PeerItem::doExpand(bool open)
|
||||
|
||||
emit sizeChanged(this);
|
||||
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
void PeerItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "PeerItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mParent->lockLayout(this, true);
|
||||
hide();
|
||||
mParent->lockLayout(this, false);
|
||||
|
||||
if (mParent)
|
||||
{
|
||||
mParent->deleteFeedItem(this, mFeedId);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -321,9 +304,9 @@ void PeerItem::openChat()
|
||||
std::cerr << "PeerItem::openChat()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
if (mParent)
|
||||
if (mFeedHolder)
|
||||
{
|
||||
mParent->openChat(mPeerId);
|
||||
mFeedHolder->openChat(mPeerId);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -51,8 +51,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void removeItem();
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
|
||||
void addFriend();
|
||||
void removeFriend();
|
||||
@ -63,8 +62,6 @@ private slots:
|
||||
|
||||
|
||||
private:
|
||||
FeedHolder *mParent;
|
||||
uint32_t mFeedId;
|
||||
|
||||
RsPeerId mPeerId;
|
||||
uint32_t mType;
|
||||
|
@ -54,9 +54,7 @@ protected:
|
||||
virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_UNKNOWN; }
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void toggle();
|
||||
|
||||
void toggle() override;
|
||||
void subscribePosted();
|
||||
|
||||
private:
|
||||
|
@ -40,14 +40,14 @@
|
||||
|
||||
/** Constructor */
|
||||
SecurityIpItem::SecurityIpItem(FeedHolder *parent, const RsPeerId &sslId, const std::string &ipAddr, uint32_t result, uint32_t type, bool isTest) :
|
||||
FeedItem(NULL), mParent(parent), mType(type), mSslId(sslId), mIpAddr(ipAddr), mResult(result), mIsTest(isTest),
|
||||
FeedItem(parent,0,NULL), mType(type), mSslId(sslId), mIpAddr(ipAddr), mResult(result), mIsTest(isTest),
|
||||
ui(new(Ui::SecurityIpItem))
|
||||
{
|
||||
setup();
|
||||
}
|
||||
|
||||
SecurityIpItem::SecurityIpItem(FeedHolder *parent, const RsPeerId &sslId, const std::string& ipAddr, const std::string& ipAddrReported, uint32_t type, bool isTest) :
|
||||
FeedItem(NULL), mParent(parent), mType(type), mSslId(sslId), mIpAddr(ipAddr), mIpAddrReported(ipAddrReported), mResult(0), mIsTest(isTest),
|
||||
FeedItem(parent,0,NULL), mType(type), mSslId(sslId), mIpAddr(ipAddr), mIpAddrReported(ipAddrReported), mResult(0), mIsTest(isTest),
|
||||
ui(new(Ui::SecurityIpItem))
|
||||
{
|
||||
setup();
|
||||
@ -192,8 +192,8 @@ void SecurityIpItem::toggle()
|
||||
|
||||
void SecurityIpItem::doExpand(bool open)
|
||||
{
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, true);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
}
|
||||
|
||||
if (open)
|
||||
@ -211,25 +211,8 @@ void SecurityIpItem::doExpand(bool open)
|
||||
|
||||
emit sizeChanged(this);
|
||||
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
void SecurityIpItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "SecurityIpItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mParent->lockLayout(this, true);
|
||||
hide();
|
||||
mParent->lockLayout(this, false);
|
||||
|
||||
if (mParent)
|
||||
{
|
||||
mParent->deleteFeedItem(this, mFeedId);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,16 +54,12 @@ private:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void removeItem();
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
void peerDetails();
|
||||
void updateItem();
|
||||
void banIpListChanged(const QString &ipAddress);
|
||||
|
||||
private:
|
||||
FeedHolder *mParent;
|
||||
uint32_t mFeedId;
|
||||
|
||||
uint32_t mType;
|
||||
RsPeerId mSslId;
|
||||
std::string mIpAddr;
|
||||
|
@ -44,7 +44,7 @@
|
||||
|
||||
/** Constructor */
|
||||
SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &gpgId, const RsPeerId &sslId, const std::string &sslCn, const std::string& ip_address,uint32_t type, bool isHome) :
|
||||
FeedItem(NULL), mParent(parent), mFeedId(feedId),
|
||||
FeedItem(parent,feedId,NULL),
|
||||
mGpgId(gpgId), mSslId(sslId), mSslCn(sslCn), mIP(ip_address), mType(type), mIsHome(isHome)
|
||||
{
|
||||
/* Invoke the Qt Designer generated object setup routine */
|
||||
@ -288,8 +288,8 @@ void SecurityItem::toggle()
|
||||
|
||||
void SecurityItem::doExpand(bool open)
|
||||
{
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, true);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
}
|
||||
|
||||
if (open)
|
||||
@ -307,25 +307,8 @@ void SecurityItem::doExpand(bool open)
|
||||
|
||||
emit sizeChanged(this);
|
||||
|
||||
if (mParent) {
|
||||
mParent->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
void SecurityItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "SecurityItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mParent->lockLayout(this, true);
|
||||
hide();
|
||||
mParent->lockLayout(this, false);
|
||||
|
||||
if (mParent)
|
||||
{
|
||||
mParent->deleteFeedItem(this, mFeedId);
|
||||
if (mFeedHolder) {
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -413,8 +396,8 @@ void SecurityItem::openChat()
|
||||
std::cerr << "SecurityItem::openChat()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
if (mParent)
|
||||
if (mFeedHolder)
|
||||
{
|
||||
mParent->openChat(mSslId);
|
||||
mFeedHolder->openChat(mSslId);
|
||||
}
|
||||
}
|
||||
|
@ -50,8 +50,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* default stuff */
|
||||
void removeItem();
|
||||
void toggle();
|
||||
void toggle() override;
|
||||
|
||||
void friendRequest();
|
||||
void removeFriend();
|
||||
@ -62,9 +61,6 @@ private slots:
|
||||
void updateItem();
|
||||
|
||||
private:
|
||||
FeedHolder *mParent;
|
||||
uint32_t mFeedId;
|
||||
|
||||
RsPgpId mGpgId;
|
||||
RsPeerId mSslId;
|
||||
std::string mSslCn;
|
||||
|
@ -46,8 +46,6 @@ void GxsFeedWidget::feedAdded(FeedItem *feedItem, QTreeWidgetItem *treeItem)
|
||||
|
||||
void GxsFeedWidget::feedRemoved(FeedItem *feedItem)
|
||||
{
|
||||
RSFeedWidget::feedRemoved(feedItem);
|
||||
|
||||
GxsFeedItem *gxsFeedItem = dynamic_cast<GxsFeedItem*>(feedItem);
|
||||
if (!gxsFeedItem) {
|
||||
return;
|
||||
|
@ -32,7 +32,7 @@
|
||||
**/
|
||||
|
||||
GxsGroupFeedItem::GxsGroupFeedItem(FeedHolder *feedHolder, uint32_t feedId, const RsGxsGroupId &groupId, bool isHome, RsGxsIfaceHelper *iface, bool autoUpdate) :
|
||||
FeedItem(NULL)
|
||||
FeedItem(feedHolder,feedId,NULL)
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "GxsGroupFeedItem::GxsGroupFeedItem()";
|
||||
@ -40,8 +40,6 @@ GxsGroupFeedItem::GxsGroupFeedItem(FeedHolder *feedHolder, uint32_t feedId, cons
|
||||
#endif
|
||||
|
||||
/* this are just generally useful for all children */
|
||||
mFeedHolder = feedHolder;
|
||||
mFeedId = feedId;
|
||||
mIsHome = isHome;
|
||||
|
||||
/* load data if we can */
|
||||
@ -93,27 +91,6 @@ bool GxsGroupFeedItem::initLoadQueue()
|
||||
return (mLoadQueue != NULL);
|
||||
}
|
||||
|
||||
void GxsGroupFeedItem::removeItem()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
std::cerr << "GxsGroupFeedItem::removeItem()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
if (mFeedHolder)
|
||||
{
|
||||
mFeedHolder->lockLayout(this, true);
|
||||
}
|
||||
|
||||
hide();
|
||||
|
||||
if (mFeedHolder)
|
||||
{
|
||||
mFeedHolder->lockLayout(this, false);
|
||||
mFeedHolder->deleteFeedItem(this, mFeedId);
|
||||
}
|
||||
}
|
||||
|
||||
void GxsGroupFeedItem::unsubscribe()
|
||||
{
|
||||
#ifdef DEBUG_ITEM
|
||||
|
@ -64,12 +64,9 @@ protected:
|
||||
protected slots:
|
||||
void subscribe();
|
||||
void unsubscribe();
|
||||
void removeItem();
|
||||
void copyGroupLink();
|
||||
|
||||
protected:
|
||||
FeedHolder *mFeedHolder;
|
||||
uint32_t mFeedId;
|
||||
bool mIsHome;
|
||||
RsGxsIfaceHelper *mGxsIface;
|
||||
TokenQueue *mLoadQueue;
|
||||
|
@ -52,17 +52,15 @@ GxsChannelDialog::GxsChannelDialog(QWidget *parent)
|
||||
{
|
||||
mEventHandlerId = 0;
|
||||
// Needs to be asynced because this function is likely to be called by another thread!
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
rsEvents->registerEventsHandler(RsEventType::GXS_CHANNELS, [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
}
|
||||
|
||||
void GxsChannelDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
|
||||
{
|
||||
if(event->mType == RsEventType::GXS_CHANNELS)
|
||||
{
|
||||
const RsGxsChannelEvent *e = dynamic_cast<const RsGxsChannelEvent*>(event.get());
|
||||
const RsGxsChannelEvent *e = dynamic_cast<const RsGxsChannelEvent*>(event.get());
|
||||
|
||||
if(!e)
|
||||
return;
|
||||
if(!e)
|
||||
return;
|
||||
|
||||
switch(e->mChannelEventCode)
|
||||
{
|
||||
@ -71,7 +69,6 @@ void GxsChannelDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> ev
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GxsChannelDialog::~GxsChannelDialog()
|
||||
|
@ -132,17 +132,15 @@ GxsChannelPostsWidget::GxsChannelPostsWidget(const RsGxsGroupId &channelId, QWid
|
||||
mEventHandlerId = 0;
|
||||
// Needs to be asynced because this function is likely to be called by another thread!
|
||||
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
rsEvents->registerEventsHandler(RsEventType::GXS_CHANNELS, [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
}
|
||||
|
||||
void GxsChannelPostsWidget::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
|
||||
{
|
||||
if(event->mType == RsEventType::GXS_CHANNELS)
|
||||
{
|
||||
const RsGxsChannelEvent *e = dynamic_cast<const RsGxsChannelEvent*>(event.get());
|
||||
const RsGxsChannelEvent *e = dynamic_cast<const RsGxsChannelEvent*>(event.get());
|
||||
|
||||
if(!e)
|
||||
return;
|
||||
if(!e)
|
||||
return;
|
||||
|
||||
switch(e->mChannelEventCode)
|
||||
{
|
||||
@ -156,7 +154,6 @@ void GxsChannelPostsWidget::handleEvent_main_thread(std::shared_ptr<const RsEven
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GxsChannelPostsWidget::~GxsChannelPostsWidget()
|
||||
@ -233,8 +230,12 @@ QScrollArea *GxsChannelPostsWidget::getScrollArea()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void GxsChannelPostsWidget::deleteFeedItem(QWidget * /*item*/, uint32_t /*type*/)
|
||||
void GxsChannelPostsWidget::deleteFeedItem(FeedItem *feedItem, uint32_t /*type*/)
|
||||
{
|
||||
if (!feedItem)
|
||||
return;
|
||||
|
||||
ui->feedWidget->removeFeedItem(feedItem);
|
||||
}
|
||||
|
||||
void GxsChannelPostsWidget::openChat(const RsPeerId & /*peerId*/)
|
||||
@ -460,7 +461,7 @@ void GxsChannelPostsWidget::createPostItem(const RsGxsChannelPost& post, bool re
|
||||
|
||||
if(!post.mMeta.mOrigMsgId.isNull())
|
||||
{
|
||||
FeedItem *feedItem = ui->feedWidget->findGxsFeedItem(post.mMeta.mGroupId, post.mMeta.mOrigMsgId);
|
||||
FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(post.mMeta.mOrigMsgId)) ;
|
||||
item = dynamic_cast<GxsChannelPostItem*>(feedItem);
|
||||
|
||||
if(item)
|
||||
@ -476,7 +477,7 @@ void GxsChannelPostsWidget::createPostItem(const RsGxsChannelPost& post, bool re
|
||||
|
||||
if (related)
|
||||
{
|
||||
FeedItem *feedItem = ui->feedWidget->findGxsFeedItem(post.mMeta.mGroupId, post.mMeta.mMsgId);
|
||||
FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(post.mMeta.mMsgId)) ;
|
||||
item = dynamic_cast<GxsChannelPostItem*>(feedItem);
|
||||
}
|
||||
if (item) {
|
||||
@ -669,7 +670,7 @@ void GxsChannelPostsWidget::blank()
|
||||
|
||||
bool GxsChannelPostsWidget::navigatePostItem(const RsGxsMessageId &msgId)
|
||||
{
|
||||
FeedItem *feedItem = ui->feedWidget->findGxsFeedItem(groupId(), msgId);
|
||||
FeedItem *feedItem = ui->feedWidget->findFeedItem(GxsChannelPostItem::computeIdentifier(msgId));
|
||||
if (!feedItem) {
|
||||
return false;
|
||||
}
|
||||
@ -718,17 +719,17 @@ void GxsChannelPostsWidget::toggleAutoDownload()
|
||||
return;
|
||||
}
|
||||
|
||||
RsQThreadUtils::postToObject( [=]()
|
||||
{
|
||||
/* Here it goes any code you want to be executed on the Qt Gui
|
||||
* thread, for example to update the data model with new information
|
||||
* after a blocking call to RetroShare API complete, note that
|
||||
* Qt::QueuedConnection is important!
|
||||
*/
|
||||
|
||||
std::cerr << __PRETTY_FUNCTION__ << " Has been executed on GUI "
|
||||
<< "thread but was scheduled by async thread" << std::endl;
|
||||
}, this );
|
||||
// RsQThreadUtils::postToObject( [=]()
|
||||
// {
|
||||
// /* Here it goes any code you want to be executed on the Qt Gui
|
||||
// * thread, for example to update the data model with new information
|
||||
// * after a blocking call to RetroShare API complete, note that
|
||||
// * Qt::QueuedConnection is important!
|
||||
// */
|
||||
//
|
||||
// std::cerr << __PRETTY_FUNCTION__ << " Has been executed on GUI "
|
||||
// << "thread but was scheduled by async thread" << std::endl;
|
||||
// }, this );
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -58,7 +58,7 @@ public:
|
||||
|
||||
/* FeedHolder */
|
||||
virtual QScrollArea *getScrollArea();
|
||||
virtual void deleteFeedItem(QWidget *item, uint32_t type);
|
||||
virtual void deleteFeedItem(FeedItem *feedItem, uint32_t type);
|
||||
virtual void openChat(const RsPeerId& peerId);
|
||||
virtual void openComments(uint32_t type, const RsGxsGroupId &groupId, const QVector<RsGxsMessageId> &msg_versions, const RsGxsMessageId &msgId, const QString &title);
|
||||
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>880</width>
|
||||
<height>557</height>
|
||||
<width>977</width>
|
||||
<height>628</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
@ -369,7 +369,7 @@
|
||||
<string notr="true"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
|
||||
</style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Description</span></p></body></html></string>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
@ -525,7 +525,7 @@ p, li { white-space: pre-wrap; }
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="GxsFeedWidget" name="feedWidget" native="true">
|
||||
<widget class="RSFeedWidget" name="feedWidget" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -572,22 +572,22 @@ p, li { white-space: pre-wrap; }
|
||||
<extends>QLineEdit</extends>
|
||||
<header location="global">gui/common/LineEditClear.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>GxsFeedWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>gui/gxs/GxsFeedWidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>GxsChannelFilesWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>gui/gxschannels/GxsChannelFilesWidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>RSFeedWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>gui/common/RSFeedWidget.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../images.qrc"/>
|
||||
<include location="../icons.qrc"/>
|
||||
<include location="../images.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
@ -436,7 +436,7 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget
|
||||
mEventHandlerId = 0;
|
||||
// Needs to be asynced because this function is likely to be called by another thread!
|
||||
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
rsEvents->registerEventsHandler(RsEventType::GXS_FORUMS, [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
}
|
||||
|
||||
void GxsForumThreadWidget::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
|
||||
|
@ -45,7 +45,7 @@ GxsForumsDialog::GxsForumsDialog(QWidget *parent)
|
||||
mEventHandlerId = 0;
|
||||
// Needs to be asynced because this function is likely to be called by another thread!
|
||||
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
rsEvents->registerEventsHandler(RsEventType::GXS_FORUMS, [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
|
||||
}
|
||||
|
||||
void GxsForumsDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
|
||||
|
@ -39,11 +39,9 @@ RsGxsUpdateBroadcast::RsGxsUpdateBroadcast(RsGxsIfaceHelper *ifaceImpl) :
|
||||
{
|
||||
mEventHandlerId = 0; // forces initialization in registerEventsHandler()
|
||||
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event)
|
||||
rsEvents->registerEventsHandler(RsEventType::GXS_CHANGES, [this](std::shared_ptr<const RsEvent> event)
|
||||
{
|
||||
if(event->mType == RsEventType::GXS_CHANGES)
|
||||
onChangesReceived(*dynamic_cast<const RsGxsChanges*>(event.get()));
|
||||
|
||||
onChangesReceived(*dynamic_cast<const RsGxsChanges*>(event.get()));
|
||||
}, mEventHandlerId );
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user