summaryrefslogtreecommitdiffstats
path: root/xbmc/URL.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/URL.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/xbmc/URL.h b/xbmc/URL.h
new file mode 100644
index 0000000..77c12cc
--- /dev/null
+++ b/xbmc/URL.h
@@ -0,0 +1,202 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "utils/UrlOptions.h"
+
+#include <stdlib.h>
+#include <string>
+
+#ifdef TARGET_WINDOWS
+#undef SetPort // WIN32INCLUDES this is defined as SetPortA in WinSpool.h which is being included _somewhere_
+#endif
+
+class CURL
+{
+public:
+ explicit CURL(const std::string& strURL)
+ {
+ Parse(strURL);
+ }
+
+ CURL() = default;
+ virtual ~CURL(void);
+
+ // explicit equals operator for std::string comparison
+ bool operator==(const std::string &url) const { return Get() == url; }
+
+ void Reset();
+ void Parse(const std::string& strURL);
+ void SetFileName(const std::string& strFileName);
+ void SetHostName(const std::string& strHostName)
+ {
+ m_strHostName = strHostName;
+ }
+
+ void SetUserName(const std::string& strUserName)
+ {
+ m_strUserName = strUserName;
+ }
+
+ void SetDomain(const std::string& strDomain)
+ {
+ m_strDomain = strDomain;
+ }
+
+ void SetPassword(const std::string& strPassword)
+ {
+ m_strPassword = strPassword;
+ }
+
+ void SetProtocol(const std::string& strProtocol);
+ void SetOptions(const std::string& strOptions);
+ void SetProtocolOptions(const std::string& strOptions);
+ void SetPort(int port)
+ {
+ m_iPort = port;
+ }
+
+ bool HasPort() const
+ {
+ return (m_iPort != 0);
+ }
+
+ int GetPort() const
+ {
+ return m_iPort;
+ }
+
+ const std::string& GetHostName() const
+ {
+ return m_strHostName;
+ }
+
+ const std::string& GetDomain() const
+ {
+ return m_strDomain;
+ }
+
+ const std::string& GetUserName() const
+ {
+ return m_strUserName;
+ }
+
+ const std::string& GetPassWord() const
+ {
+ return m_strPassword;
+ }
+
+ const std::string& GetFileName() const
+ {
+ return m_strFileName;
+ }
+
+ const std::string& GetProtocol() const
+ {
+ return m_strProtocol;
+ }
+
+ const std::string GetTranslatedProtocol() const;
+
+ const std::string& GetFileType() const
+ {
+ return m_strFileType;
+ }
+
+ const std::string& GetShareName() const
+ {
+ return m_strShareName;
+ }
+
+ const std::string& GetOptions() const
+ {
+ return m_strOptions;
+ }
+
+ const std::string& GetProtocolOptions() const
+ {
+ return m_strProtocolOptions;
+ }
+
+ const std::string GetFileNameWithoutPath() const; /* return the filename excluding path */
+
+ char GetDirectorySeparator() const;
+
+ std::string Get() const;
+ std::string GetWithoutOptions() const;
+ std::string GetWithoutUserDetails(bool redact = false) const;
+ std::string GetWithoutFilename() const;
+ std::string GetRedacted() const;
+ static std::string GetRedacted(const std::string& path);
+ bool IsLocal() const;
+ bool IsLocalHost() const;
+ static bool IsFileOnly(const std::string &url); ///< return true if there are no directories in the url.
+ static bool IsFullPath(const std::string &url); ///< return true if the url includes the full path
+ static std::string Decode(const std::string& strURLData);
+ static std::string Encode(const std::string& strURLData);
+
+ /*! \brief Check whether a URL is a given URL scheme.
+ Comparison is case-insensitive as per RFC1738
+ \param type a lower-case scheme name, e.g. "smb".
+ \return true if the url is of the given scheme, false otherwise.
+ */
+ bool IsProtocol(const char *type) const
+ {
+ return IsProtocolEqual(m_strProtocol, type);
+ }
+
+ /*! \brief Check whether a URL protocol is a given URL scheme.
+ Both parameters MUST be lower-case. Typically this would be called using
+ the result of TranslateProtocol() which enforces this for protocol.
+ \param protocol a lower-case scheme name, e.g. "ftp"
+ \param type a lower-case scheme name, e.g. "smb".
+ \return true if the url is of the given scheme, false otherwise.
+ */
+ static bool IsProtocolEqual(const std::string& protocol, const char *type);
+
+ /*! \brief Check whether a URL is a given filetype.
+ Comparison is effectively case-insensitive as both the parameter
+ and m_strFileType are lower-case.
+ \param type a lower-case filetype, e.g. "mp3".
+ \return true if the url is of the given filetype, false otherwise.
+ */
+ bool IsFileType(const char *type) const
+ {
+ return m_strFileType == type;
+ }
+
+ void GetOptions(std::map<std::string, std::string> &options) const;
+ bool HasOption(const std::string &key) const;
+ bool GetOption(const std::string &key, std::string &value) const;
+ std::string GetOption(const std::string &key) const;
+ void SetOption(const std::string &key, const std::string &value);
+ void RemoveOption(const std::string &key);
+
+ void GetProtocolOptions(std::map<std::string, std::string> &options) const;
+ bool HasProtocolOption(const std::string &key) const;
+ bool GetProtocolOption(const std::string &key, std::string &value) const;
+ std::string GetProtocolOption(const std::string &key) const;
+ void SetProtocolOption(const std::string &key, const std::string &value);
+ void RemoveProtocolOption(const std::string &key);
+
+protected:
+ int m_iPort = 0;
+ std::string m_strHostName;
+ std::string m_strShareName;
+ std::string m_strDomain;
+ std::string m_strUserName;
+ std::string m_strPassword;
+ std::string m_strFileName;
+ std::string m_strProtocol;
+ std::string m_strFileType;
+ std::string m_strOptions;
+ std::string m_strProtocolOptions;
+ CUrlOptions m_options;
+ CUrlOptions m_protocolOptions;
+};