From 7fef6f5f106fa303258d654ca63e85d0756cfc85 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 4 Apr 2018 18:34:52 -0700 Subject: [PATCH] modules/client/rooms/messages: json::stack retrofit. --- modules/client/rooms/messages.cc | 94 +++++++++++++++++++------------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/modules/client/rooms/messages.cc b/modules/client/rooms/messages.cc index 781a36952..c164794bc 100644 --- a/modules/client/rooms/messages.cc +++ b/modules/client/rooms/messages.cc @@ -42,56 +42,72 @@ get__messages(client &client, room_id }; - m::event::id::buf start, end; - std::vector ret; - ret.reserve(page.limit); - m::room::messages it { room, page.from }; - // Spec sez the 'from' token is exclusive - if(it && page.dir == 'b') - --it; - else if(it) - ++it; - - for(; it; page.dir == 'b'? --it : ++it) + //TODO: chunk directly to socket + const unique_buffer buf { - const m::event &event{*it}; - if(page.to && at<"event_id"_>(event) == page.to) - { - if(page.dir != 'b') - start = at<"event_id"_>(event); - - break; - } - - ret.emplace_back(event); - if(ret.size() >= page.limit) - { - if(page.dir == 'b') - end = at<"event_id"_>(event); - else - start = at<"event_id"_>(event); - - break; - } - } - - const json::value chunk - { - ret.data(), ret.size() + (1 + page.limit) * m::event::MAX_SIZE //TODO: XXX }; + json::stack out{buf}; + { + json::stack::object ret{out}; + + // Spec sez the 'from' token is exclusive + if(it && page.dir == 'b') + --it; + else if(it) + ++it; + + size_t count{0}; + m::event::id::buf start, end; + { + json::stack::member chunk{ret, "chunk"}; + json::stack::array messages{chunk}; + for(; it; page.dir == 'b'? --it : ++it) + { + const m::event &event{*it}; + if(page.to && at<"event_id"_>(event) == page.to) + { + if(page.dir != 'b') + start = at<"event_id"_>(event); + + break; + } + + messages.append(event); + if(++count >= page.limit) + { + if(page.dir == 'b') + end = at<"event_id"_>(event); + else + start = at<"event_id"_>(event); + + break; + } + } + } + + json::stack::member + { + ret, "start", json::value{start} + }; + + json::stack::member + { + ret, "end", json::value{end} + }; + } + return resource::response { - client, json::members + client, json::object { - { "start", start }, - { "end", end }, - { "chunk", chunk }, + out.completed() } }; }