[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / filesystem / UDFDirectory.cpp
blob236b281303c51c0967b578974163b45048ddf31c
1 /*
2 * Copyright (C) 2010 Team Boxee
3 * http://www.boxee.tv
5 * Copyright (C) 2010-2018 Team Kodi
6 * This file is part of Kodi - https://kodi.tv
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 * See LICENSES/README.md for more information.
12 #include "UDFDirectory.h"
14 #include "FileItem.h"
15 #include "URL.h"
16 #include "Util.h"
17 #include "filesystem/UDFBlockInput.h"
18 #include "utils/URIUtils.h"
20 #include <udfread/udfread.h>
22 using namespace XFILE;
24 bool CUDFDirectory::GetDirectory(const CURL& url, CFileItemList& items)
26 CURL url2(url);
27 if (!url2.IsProtocol("udf"))
29 url2.Reset();
30 url2.SetProtocol("udf");
31 url2.SetHostName(url.Get());
34 std::string strRoot(url2.Get());
35 std::string strSub(url2.GetFileName());
37 URIUtils::AddSlashAtEnd(strRoot);
38 URIUtils::AddSlashAtEnd(strSub);
40 auto udf = udfread_init();
42 if (!udf)
43 return false;
45 CUDFBlockInput udfbi;
47 auto bi = udfbi.GetBlockInput(url2.GetHostName());
49 if (udfread_open_input(udf, bi) < 0)
51 udfread_close(udf);
52 return false;
55 auto path = udfread_opendir(udf, strSub.c_str());
56 if (!path)
58 udfread_close(udf);
59 return false;
62 struct udfread_dirent dirent;
64 while (udfread_readdir(path, &dirent))
66 if (dirent.d_type == UDF_DT_DIR)
68 std::string filename = dirent.d_name;
69 if (filename != "." && filename != "..")
71 CFileItemPtr pItem(new CFileItem(filename));
72 std::string strDir(strRoot + filename);
73 URIUtils::AddSlashAtEnd(strDir);
74 pItem->SetPath(strDir);
75 pItem->m_bIsFolder = true;
77 items.Add(pItem);
80 else
82 std::string filename = dirent.d_name;
83 std::string filenameWithPath{strSub + filename};
84 auto file = udfread_file_open(udf, filenameWithPath.c_str());
85 if (!file)
86 continue;
88 CFileItemPtr pItem(new CFileItem(filename));
89 pItem->SetPath(strRoot + filename);
90 pItem->m_bIsFolder = false;
91 pItem->m_dwSize = udfread_file_size(file);
92 items.Add(pItem);
94 udfread_file_close(file);
98 udfread_closedir(path);
99 udfread_close(udf);
101 return true;
104 bool CUDFDirectory::Exists(const CURL& url)
106 CFileItemList items;
107 return GetDirectory(url, items);