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