[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / filesystem / FileFactory.cpp
blobb248255e260ce714e62ad91441cd715c824bee5f
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "network/Network.h"
10 #include "FileFactory.h"
11 #ifdef TARGET_POSIX
12 #include "platform/posix/filesystem/PosixFile.h"
13 #elif defined(TARGET_WINDOWS)
14 #include "platform/win32/filesystem/Win32File.h"
15 #ifdef TARGET_WINDOWS_STORE
16 #include "platform/win10/filesystem/WinLibraryFile.h"
17 #endif
18 #endif // TARGET_WINDOWS
19 #include "CurlFile.h"
20 #include "DAVFile.h"
21 #include "ShoutcastFile.h"
22 #ifdef HAS_FILESYSTEM_SMB
23 #ifdef TARGET_WINDOWS
24 #include "platform/win32/filesystem/Win32SMBFile.h"
25 #else
26 #include "platform/posix/filesystem/SMBFile.h"
27 #endif
28 #endif
29 #include "CDDAFile.h"
30 #if defined(HAS_ISO9660PP)
31 #include "ISO9660File.h"
32 #endif
33 #if defined(TARGET_ANDROID)
34 #include "platform/android/filesystem/APKFile.h"
35 #endif
36 #include "XbtFile.h"
37 #include "ZipFile.h"
38 #ifdef HAS_FILESYSTEM_NFS
39 #include "NFSFile.h"
40 #endif
41 #if defined(TARGET_ANDROID)
42 #include "platform/android/filesystem/AndroidAppFile.h"
43 #endif
44 #if defined(TARGET_DARWIN_TVOS)
45 #include "platform/darwin/tvos/filesystem/TVOSFile.h"
46 #endif // TARGET_DARWIN_TVOS
47 #ifdef HAS_UPNP
48 #include "UPnPFile.h"
49 #endif
50 #ifdef HAVE_LIBBLURAY
51 #include "BlurayFile.h"
52 #endif
53 #include "PipeFile.h"
54 #include "MusicDatabaseFile.h"
55 #include "VideoDatabaseFile.h"
56 #include "PluginFile.h"
57 #include "SpecialProtocolFile.h"
58 #include "MultiPathFile.h"
59 #if defined(HAS_UDFREAD)
60 #include "UDFFile.h"
61 #endif
62 #include "ImageFile.h"
63 #include "ResourceFile.h"
64 #include "URL.h"
65 #include "utils/log.h"
66 #include "network/WakeOnAccess.h"
67 #include "utils/StringUtils.h"
68 #include "ServiceBroker.h"
69 #include "addons/VFSEntry.h"
71 using namespace ADDON;
72 using namespace XFILE;
74 CFileFactory::CFileFactory() = default;
76 CFileFactory::~CFileFactory() = default;
78 IFile* CFileFactory::CreateLoader(const std::string& strFileName)
80 CURL url(strFileName);
81 return CreateLoader(url);
84 IFile* CFileFactory::CreateLoader(const CURL& url)
86 if (!CWakeOnAccess::GetInstance().WakeUpHost(url))
87 return NULL;
89 if (!url.GetProtocol().empty() && CServiceBroker::IsAddonInterfaceUp())
91 for (const auto& vfsAddon : CServiceBroker::GetVFSAddonCache().GetAddonInstances())
93 auto prots = StringUtils::Split(vfsAddon->GetProtocols(), "|");
95 if (vfsAddon->HasFiles() && std::find(prots.begin(), prots.end(), url.GetProtocol()) != prots.end())
96 return new CVFSEntryIFileWrapper(vfsAddon);
100 #if defined(TARGET_ANDROID)
101 if (url.IsProtocol("apk")) return new CAPKFile();
102 #endif
103 if (url.IsProtocol("zip")) return new CZipFile();
104 else if (url.IsProtocol("xbt")) return new CXbtFile();
105 else if (url.IsProtocol("musicdb")) return new CMusicDatabaseFile();
106 else if (url.IsProtocol("videodb")) return new CVideoDatabaseFile();
107 else if (url.IsProtocol("plugin")) return new CPluginFile();
108 else if (url.IsProtocol("library")) return nullptr;
109 else if (url.IsProtocol("pvr")) return nullptr;
110 else if (url.IsProtocol("special")) return new CSpecialProtocolFile();
111 else if (url.IsProtocol("multipath")) return new CMultiPathFile();
112 else if (url.IsProtocol("image")) return new CImageFile();
113 #ifdef TARGET_POSIX
114 else if (url.IsProtocol("file") || url.GetProtocol().empty())
116 #if defined(TARGET_DARWIN_TVOS)
117 if (CTVOSFile::WantsFile(url))
118 return new CTVOSFile();
119 #endif
120 return new CPosixFile();
122 #elif defined(TARGET_WINDOWS)
123 else if (url.IsProtocol("file") || url.GetProtocol().empty())
125 #ifdef TARGET_WINDOWS_STORE
126 if (CWinLibraryFile::IsInAccessList(url))
127 return new CWinLibraryFile();
128 #endif
129 return new CWin32File();
131 #endif // TARGET_WINDOWS
132 #if defined(HAS_DVD_DRIVE)
133 else if (url.IsProtocol("cdda")) return new CFileCDDA();
134 #endif
135 #if defined(HAS_ISO9660PP)
136 else if (url.IsProtocol("iso9660"))
137 return new CISO9660File();
138 #endif
139 #if defined(HAS_UDFREAD)
140 else if(url.IsProtocol("udf"))
141 return new CUDFFile();
142 #endif
143 #if defined(TARGET_ANDROID)
144 else if (url.IsProtocol("androidapp")) return new CFileAndroidApp();
145 #endif
146 else if (url.IsProtocol("pipe")) return new CPipeFile();
147 #ifdef HAVE_LIBBLURAY
148 else if (url.IsProtocol("bluray")) return new CBlurayFile();
149 #endif
150 else if (url.IsProtocol("resource")) return new CResourceFile();
151 #ifdef TARGET_WINDOWS_STORE
152 else if (CWinLibraryFile::IsValid(url)) return new CWinLibraryFile();
153 #endif
155 if (url.IsProtocol("ftp")
156 || url.IsProtocol("ftps")
157 || url.IsProtocol("rss")
158 || url.IsProtocol("rsss")
159 || url.IsProtocol("http")
160 || url.IsProtocol("https")) return new CCurlFile();
161 else if (url.IsProtocol("dav") || url.IsProtocol("davs")) return new CDAVFile();
162 else if (url.IsProtocol("shout") || url.IsProtocol("shouts")) return new CShoutcastFile();
163 #ifdef HAS_FILESYSTEM_SMB
164 #ifdef TARGET_WINDOWS
165 else if (url.IsProtocol("smb")) return new CWin32SMBFile();
166 #else
167 else if (url.IsProtocol("smb")) return new CSMBFile();
168 #endif
169 #endif
170 #ifdef HAS_FILESYSTEM_NFS
171 else if (url.IsProtocol("nfs")) return new CNFSFile();
172 #endif
173 #ifdef HAS_UPNP
174 else if (url.IsProtocol("upnp")) return new CUPnPFile();
175 #endif
177 CLog::Log(LOGWARNING, "{} - unsupported protocol({}) in {}", __FUNCTION__, url.GetProtocol(),
178 url.GetRedacted());
179 return NULL;