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