1 /*
2  *  Copyright (C) 2012-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "FileItem.h"
12 #include "interfaces/IAnnouncer.h"
13 #include "utils/logtypes.h"
14 
15 #include <utility>
16 
17 #include <Platinum/Source/Devices/MediaConnect/PltMediaConnect.h>
18 
19 class CVariant;
20 class CThumbLoader;
21 class PLT_MediaObject;
22 class PLT_HttpRequestContext;
23 
24 namespace UPNP
25 {
26 
27 class CUPnPServer : public PLT_MediaConnect,
28                     public PLT_FileMediaConnectDelegate,
29                     public ANNOUNCEMENT::IAnnouncer
30 {
31 public:
32     CUPnPServer(const char* friendly_name, const char* uuid = NULL, int port = 0);
33     ~CUPnPServer() override;
34     void Announce(ANNOUNCEMENT::AnnouncementFlag flag,
35                   const std::string& sender,
36                   const std::string& message,
37                   const CVariant& data) override;
38 
39     // PLT_MediaServer methods
40     NPT_Result OnBrowseMetadata(PLT_ActionReference&          action,
41                                 const char*                   object_id,
42                                 const char*                   filter,
43                                 NPT_UInt32                    starting_index,
44                                 NPT_UInt32                    requested_count,
45                                 const char*                   sort_criteria,
46                                 const PLT_HttpRequestContext& context) override;
47     NPT_Result OnBrowseDirectChildren(PLT_ActionReference&          action,
48                                       const char*                   object_id,
49                                       const char*                   filter,
50                                       NPT_UInt32                    starting_index,
51                                       NPT_UInt32                    requested_count,
52                                       const char*                   sort_criteria,
53                                       const PLT_HttpRequestContext& context) override;
54     NPT_Result OnSearchContainer(PLT_ActionReference&          action,
55                                  const char*                   container_id,
56                                  const char*                   search_criteria,
57                                  const char*                   filter,
58                                  NPT_UInt32                    starting_index,
59                                  NPT_UInt32                    requested_count,
60                                  const char*                   sort_criteria,
61                                  const PLT_HttpRequestContext& context) override;
62 
63     NPT_Result OnUpdateObject(PLT_ActionReference&             action,
64                               const char*                      object_id,
65                               NPT_Map<NPT_String,NPT_String>&  current_vals,
66                               NPT_Map<NPT_String,NPT_String>&  new_vals,
67                               const PLT_HttpRequestContext&    context) override;
68 
69     // PLT_FileMediaServer methods
70     NPT_Result ServeFile(const NPT_HttpRequest&        request,
71                          const NPT_HttpRequestContext& context,
72                          NPT_HttpResponse&             response,
73                          const NPT_String&             file_path) override;
74 
75     // PLT_DeviceHost methods
76     NPT_Result ProcessGetSCPD(PLT_Service*                  service,
77                               NPT_HttpRequest&              request,
78                               const NPT_HttpRequestContext& context,
79                               NPT_HttpResponse&             response) override;
80 
81     NPT_Result SetupServices() override;
82     NPT_Result SetupIcons() override;
83     NPT_String BuildSafeResourceUri(const NPT_HttpUrl &rooturi,
84                                     const char*        host,
85                                     const char*        file_path);
86 
AddSafeResourceUri(PLT_MediaObject * object,const NPT_HttpUrl & rooturi,const NPT_List<NPT_IpAddress> & ips,const char * file_path,const NPT_String & info)87     void AddSafeResourceUri(PLT_MediaObject* object,
88                             const NPT_HttpUrl& rooturi,
89                             const NPT_List<NPT_IpAddress>& ips,
90                             const char* file_path,
91                             const NPT_String& info)
92     {
93         PLT_MediaItemResource res;
94         for(NPT_List<NPT_IpAddress>::Iterator ip = ips.GetFirstItem(); ip; ++ip) {
95             res.m_ProtocolInfo = PLT_ProtocolInfo(info);
96             res.m_Uri          = BuildSafeResourceUri(rooturi, (*ip).ToString(), file_path);
97             object->m_Resources.Add(res);
98         }
99     }
100 
101     /* Samsung's devices get subtitles from header in response (for movie file), not from didl.
102        It's a way to store subtitle uri generated when building didl, to use later in http response*/
103     NPT_Result AddSubtitleUriForSecResponse(const NPT_String& movie_md5,
104                                             const NPT_String& subtitle_uri);
105 
106 
107   private:
108     void OnScanCompleted(int type);
109     void UpdateContainer(const std::string& id);
110     void PropagateUpdates();
111 
112     PLT_MediaObject* Build(const CFileItemPtr& item,
113                            bool with_count,
114                            const PLT_HttpRequestContext& context,
115                            NPT_Reference<CThumbLoader>& thumbLoader,
116                            const char* parent_id = NULL);
117     NPT_Result BuildResponse(PLT_ActionReference&          action,
118                              CFileItemList&                items,
119                              const char*                   filter,
120                              NPT_UInt32                    starting_index,
121                              NPT_UInt32                    requested_count,
122                              const char*                   sort_criteria,
123                              const PLT_HttpRequestContext& context,
124                              const char*                   parent_id /* = NULL */);
125 
126     // class methods
127     static void DefaultSortItems(CFileItemList& items);
GetParentFolder(const NPT_String & file_path)128     static NPT_String GetParentFolder(const NPT_String& file_path)
129     {
130       int index = file_path.ReverseFind("\\");
131       if (index == -1)
132         return "";
133 
134       return file_path.Left(index);
135     }
136 
137     NPT_Mutex m_CacheMutex;
138 
139     NPT_Mutex m_FileMutex;
140     NPT_Map<NPT_String, NPT_String> m_FileMap;
141 
142     std::map<std::string, std::pair<bool, unsigned long> > m_UpdateIDs;
143     bool m_scanning;
144 
145     Logger m_logger;
146 
147   public:
148     // class members
149     static NPT_UInt32 m_MaxReturnedItems;
150 };
151 
152 } /* namespace UPNP */
153 
154