diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/filesystem/FTPDirectory.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/filesystem/FTPDirectory.cpp')
-rw-r--r-- | xbmc/filesystem/FTPDirectory.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/xbmc/filesystem/FTPDirectory.cpp b/xbmc/filesystem/FTPDirectory.cpp new file mode 100644 index 0000000..46d3d7d --- /dev/null +++ b/xbmc/filesystem/FTPDirectory.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "FTPDirectory.h" + +#include "CurlFile.h" +#include "FTPParse.h" +#include "FileItem.h" +#include "URL.h" +#include "utils/CharsetConverter.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" + +#include <climits> + +using namespace XFILE; + +CFTPDirectory::CFTPDirectory(void) = default; +CFTPDirectory::~CFTPDirectory(void) = default; + +bool CFTPDirectory::GetDirectory(const CURL& url2, CFileItemList &items) +{ + CCurlFile reader; + + CURL url(url2); + + std::string path = url.GetFileName(); + if( !path.empty() && !StringUtils::EndsWith(path, "/") ) + { + path += "/"; + url.SetFileName(path); + } + + if (!reader.Open(url)) + return false; + + bool serverNotUseUTF8 = url.GetProtocolOption("utf8") == "0"; + + char buffer[MAX_PATH + 1024]; + while( reader.ReadString(buffer, sizeof(buffer)) ) + { + std::string strBuffer = buffer; + + StringUtils::RemoveCRLF(strBuffer); + + CFTPParse parse; + if (parse.FTPParse(strBuffer)) + { + if( parse.getName().length() == 0 ) + continue; + + if( parse.getFlagtrycwd() == 0 && parse.getFlagtryretr() == 0 ) + continue; + + /* buffer name */ + std::string name; + name.assign(parse.getName()); + + if( name == ".." || name == "." ) + continue; + + // server returned filename could in utf8 or non-utf8 encoding + // we need utf8, so convert it to utf8 anyway + g_charsetConverter.unknownToUTF8(name); + + // convert got empty result, ignore it + if (name.empty()) + continue; + + if (serverNotUseUTF8 || name != parse.getName()) + // non-utf8 name path, tag it with protocol option. + // then we can talk to server with the same encoding in CurlFile according to this tag. + url.SetProtocolOption("utf8", "0"); + else + url.RemoveProtocolOption("utf8"); + + CFileItemPtr pItem(new CFileItem(name)); + + pItem->m_bIsFolder = parse.getFlagtrycwd() != 0; + std::string filePath = path + name; + if (pItem->m_bIsFolder) + URIUtils::AddSlashAtEnd(filePath); + + /* qualify the url with host and all */ + url.SetFileName(filePath); + pItem->SetPath(url.Get()); + + pItem->m_dwSize = parse.getSize(); + pItem->m_dateTime=parse.getTime(); + + items.Add(pItem); + } + } + + return true; +} + +bool CFTPDirectory::Exists(const CURL& url) +{ + // make sure ftp dir ends with slash, + // curl need to known it's a dir to check ftp directory existence. + std::string file = url.Get(); + URIUtils::AddSlashAtEnd(file); + + CCurlFile ftp; + CURL url2(file); + return ftp.Exists(url2); +} |