1 /*
2 * This file is part of Wireless Display Software for Linux OS
3 *
4 * Copyright (C) 2014 Intel Corporation.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 */
21
22 #include "libwds/sink/session_state.h"
23
24 #include "libwds/public/media_manager.h"
25
26 #include "libwds/rtsp/play.h"
27 #include "libwds/rtsp/reply.h"
28 #include "libwds/rtsp/setup.h"
29 #include "libwds/rtsp/transportheader.h"
30 #include "libwds/sink/cap_negotiation_state.h"
31 #include "libwds/sink/streaming_state.h"
32
33 namespace wds {
34 using rtsp::Message;
35 using rtsp::Request;
36 using rtsp::Reply;
37
38 namespace sink {
39
M16Handler(const InitParams & init_params,unsigned & keep_alive_timer)40 M16Handler::M16Handler(const InitParams& init_params, unsigned& keep_alive_timer)
41 : MessageReceiver<Request::M16>(init_params),
42 keep_alive_timer_(keep_alive_timer) { }
43
HandleTimeoutEvent(unsigned timer_id) const44 bool M16Handler::HandleTimeoutEvent(unsigned timer_id) const {
45 return timer_id == keep_alive_timer_;
46 }
47
HandleMessage(Message * message)48 std::unique_ptr<Reply> M16Handler::HandleMessage(Message* message) {
49 // Reset keep alive timer;
50 sender_->ReleaseTimer(keep_alive_timer_);
51 keep_alive_timer_ = sender_->CreateTimer(60);
52
53 return std::unique_ptr<Reply>(new Reply(rtsp::STATUS_OK));
54 }
55
M6Handler(const InitParams & init_params,unsigned & keep_alive_timer)56 M6Handler::M6Handler(const InitParams& init_params, unsigned& keep_alive_timer)
57 : SequencedMessageSender(init_params),
58 keep_alive_timer_(keep_alive_timer) {}
59
CreateMessage()60 std::unique_ptr<Message> M6Handler::CreateMessage() {
61 auto setup = new rtsp::Setup(ToSinkMediaManager(manager_)->GetPresentationUrl());
62 auto transport = new rtsp::TransportHeader();
63 // we assume here that there is no coupled secondary sink
64 transport->set_client_port(ToSinkMediaManager(manager_)->GetLocalRtpPorts().first);
65 setup->header().set_transport(transport);
66 setup->header().set_cseq(sender_->GetNextCSeq());
67 setup->header().set_require_wfd_support(true);
68
69 return std::unique_ptr<Message>(setup);
70 }
71
HandleReply(Reply * reply)72 bool M6Handler::HandleReply(Reply* reply) {
73 const std::string& session_id = reply->header().session();
74 if(reply->response_code() == rtsp::STATUS_OK && !session_id.empty()) {
75 ToSinkMediaManager(manager_)->SetSessionId(session_id);
76 // FIXME : take timeout value from session.
77 keep_alive_timer_ = sender_->CreateTimer(60);
78 return true;
79 }
80
81 return false;
82 }
83
84 class M7Handler final : public SequencedMessageSender {
85 public:
86 using SequencedMessageSender::SequencedMessageSender;
87 private:
CreateMessage()88 std::unique_ptr<Message> CreateMessage() override {
89 rtsp::Play* play = new rtsp::Play(ToSinkMediaManager(manager_)->GetPresentationUrl());
90 play->header().set_session(manager_->GetSessionId());
91 play->header().set_cseq(sender_->GetNextCSeq());
92 play->header().set_require_wfd_support(true);
93
94 return std::unique_ptr<Message>(play);
95 }
96
HandleReply(Reply * reply)97 bool HandleReply(Reply* reply) override {
98 return (reply->response_code() == rtsp::STATUS_OK);
99 }
100 };
101
SessionState(const InitParams & init_params,MessageHandlerPtr m6_handler,MessageHandlerPtr m16_handler)102 SessionState::SessionState(const InitParams& init_params, MessageHandlerPtr m6_handler, MessageHandlerPtr m16_handler)
103 : MessageSequenceWithOptionalSetHandler(init_params) {
104 AddSequencedHandler(m6_handler);
105 AddSequencedHandler(make_ptr(new M7Handler(init_params)));
106
107 AddOptionalHandler(make_ptr(new M3Handler(init_params)));
108 AddOptionalHandler(make_ptr(new M4Handler(init_params)));
109 AddOptionalHandler(make_ptr(new TeardownHandler(init_params)));
110 AddOptionalHandler(m16_handler);
111 }
112
113 } // namespace sink
114 } // namespace wds
115