diff --git a/solanaceae/tox_messages/obj_components.hpp b/solanaceae/tox_messages/obj_components.hpp index 9148375..f423fe8 100644 --- a/solanaceae/tox_messages/obj_components.hpp +++ b/solanaceae/tox_messages/obj_components.hpp @@ -2,6 +2,8 @@ #include // contains the alias +#include + #include namespace ObjectStore::Components { @@ -34,6 +36,12 @@ namespace ObjectStore::Components { uint32_t transfer_number; }; + // TODO: replace this with something generic + struct ToxMessage { + // the message, if the ft is visible as a message + Message3Handle m; + }; + } // Ephemeral } // ObjectStore::Components diff --git a/solanaceae/tox_messages/obj_components_id.inl b/solanaceae/tox_messages/obj_components_id.inl index c084c1b..8d93d7e 100644 --- a/solanaceae/tox_messages/obj_components_id.inl +++ b/solanaceae/tox_messages/obj_components_id.inl @@ -26,6 +26,7 @@ DEFINE_COMP_ID(ObjComp::Tox::TagIncomming) DEFINE_COMP_ID(ObjComp::Tox::TagOutgoing) DEFINE_COMP_ID(ObjComp::Ephemeral::ToxTransferFriend) +DEFINE_COMP_ID(ObjComp::Ephemeral::ToxMessage) #undef DEFINE_COMP_ID diff --git a/solanaceae/tox_messages/tox_transfer_manager.cpp b/solanaceae/tox_messages/tox_transfer_manager.cpp index 77714bd..c6c0757 100644 --- a/solanaceae/tox_messages/tox_transfer_manager.cpp +++ b/solanaceae/tox_messages/tox_transfer_manager.cpp @@ -532,6 +532,8 @@ bool ToxTransferManager::onToxEvent(const Tox_Event_File_Recv* e) { } msg.emplace(o); + o.emplace(msg); + _os.throwEventConstruct(o); _rmm.throwEventConstruct(msg); @@ -611,22 +613,25 @@ bool ToxTransferManager::onToxEvent(const Tox_Event_File_Recv_Chunk* e) { o.emplace_or_replace(); -#if 0 // TODO: track back msg - // re-unread a finished transfer - msg.emplace_or_replace(); - msg.remove(); - - auto c = _tcm.getContactFriend(friend_number); - if (static_cast(c)) { - auto self_c = _cr.get(c).self; - auto& rb = msg.get_or_emplace().ts; - rb.try_emplace(self_c, ts); // on completion - } -#endif - _os.throwEventUpdate(o); - //_rmm.throwEventUpdate(msg); + // TODO: move out generic? do we want to update on EVERY chunk? + if (const auto* msg_ptr = o.try_get(); msg_ptr != nullptr && static_cast(msg_ptr->m)) { + const auto& msg = msg_ptr->m; + + // re-unread a finished transfer + msg.emplace_or_replace(); + msg.remove(); + + auto c = _tcm.getContactFriend(friend_number); + if (static_cast(c)) { + auto self_c = _cr.get(c).self; + auto& rb = msg.get_or_emplace().ts; + rb.try_emplace(self_c, ts); // on completion + } + + _rmm.throwEventUpdate(msg); + } } else if (!o.all_of() || !o.get().file || !o.get().file->isGood()) { std::cerr << "TTM error: file not good f" << friend_number << " t" << file_number << ", closing\n"; _t.toxFileControl(friend_number, file_number, Tox_File_Control::TOX_FILE_CONTROL_CANCEL);