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.
9 #include "network/Network.h"
10 #include "FileFactory.h"
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"
18 #endif // TARGET_WINDOWS
21 #include "ShoutcastFile.h"
22 #ifdef HAS_FILESYSTEM_SMB
24 #include "platform/win32/filesystem/Win32SMBFile.h"
26 #include "platform/posix/filesystem/SMBFile.h"
30 #if defined(HAS_ISO9660PP)
31 #include "ISO9660File.h"
33 #if defined(TARGET_ANDROID)
34 #include "platform/android/filesystem/APKFile.h"
38 #ifdef HAS_FILESYSTEM_NFS
41 #if defined(TARGET_ANDROID)
42 #include "platform/android/filesystem/AndroidAppFile.h"
44 #if defined(TARGET_DARWIN_TVOS)
45 #include "platform/darwin/tvos/filesystem/TVOSFile.h"
46 #endif // TARGET_DARWIN_TVOS
51 #include "BlurayFile.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)
62 #include "ImageFile.h"
63 #include "ResourceFile.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
))
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();
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();
114 else if (url
.IsProtocol("file") || url
.GetProtocol().empty())
116 #if defined(TARGET_DARWIN_TVOS)
117 if (CTVOSFile::WantsFile(url
))
118 return new CTVOSFile();
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();
129 return new CWin32File();
131 #endif // TARGET_WINDOWS
132 #if defined(HAS_DVD_DRIVE)
133 else if (url
.IsProtocol("cdda")) return new CFileCDDA();
135 #if defined(HAS_ISO9660PP)
136 else if (url
.IsProtocol("iso9660"))
137 return new CISO9660File();
139 #if defined(HAS_UDFREAD)
140 else if(url
.IsProtocol("udf"))
141 return new CUDFFile();
143 #if defined(TARGET_ANDROID)
144 else if (url
.IsProtocol("androidapp")) return new CFileAndroidApp();
146 else if (url
.IsProtocol("pipe")) return new CPipeFile();
147 #ifdef HAVE_LIBBLURAY
148 else if (url
.IsProtocol("bluray")) return new CBlurayFile();
150 else if (url
.IsProtocol("resource")) return new CResourceFile();
151 #ifdef TARGET_WINDOWS_STORE
152 else if (CWinLibraryFile::IsValid(url
)) return new CWinLibraryFile();
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();
167 else if (url
.IsProtocol("smb")) return new CSMBFile();
170 #ifdef HAS_FILESYSTEM_NFS
171 else if (url
.IsProtocol("nfs")) return new CNFSFile();
174 else if (url
.IsProtocol("upnp")) return new CUPnPFile();
177 CLog::Log(LOGWARNING
, "{} - unsupported protocol({}) in {}", __FUNCTION__
, url
.GetProtocol(),