diff options
Diffstat (limited to 'xbmc/filesystem/DAVFile.cpp')
-rw-r--r-- | xbmc/filesystem/DAVFile.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/xbmc/filesystem/DAVFile.cpp b/xbmc/filesystem/DAVFile.cpp new file mode 100644 index 0000000..a0ff2fd --- /dev/null +++ b/xbmc/filesystem/DAVFile.cpp @@ -0,0 +1,145 @@ +/* + * 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 "DAVFile.h" + +#include "DAVCommon.h" +#include "DllLibCurl.h" +#include "URL.h" +#include "utils/RegExp.h" +#include "utils/XBMCTinyXML.h" +#include "utils/log.h" + +using namespace XFILE; +using namespace XCURL; + +CDAVFile::CDAVFile(void) + : CCurlFile() +{ +} + +CDAVFile::~CDAVFile(void) = default; + +bool CDAVFile::Execute(const CURL& url) +{ + CURL url2(url); + ParseAndCorrectUrl(url2); + + CLog::Log(LOGDEBUG, "CDAVFile::Execute({}) {}", fmt::ptr(this), m_url); + + assert(!(!m_state->m_easyHandle ^ !m_state->m_multiHandle)); + if( m_state->m_easyHandle == NULL ) + g_curlInterface.easy_acquire(url2.GetProtocol().c_str(), + url2.GetHostName().c_str(), + &m_state->m_easyHandle, + &m_state->m_multiHandle); + + // setup common curl options + SetCommonOptions(m_state); + SetRequestHeaders(m_state); + + m_lastResponseCode = m_state->Connect(m_bufferSize); + if (m_lastResponseCode < 0 || m_lastResponseCode >= 400) + return false; + + char* efurl; + if (CURLE_OK == g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_EFFECTIVE_URL,&efurl) && efurl) + m_url = efurl; + + if (m_lastResponseCode == 207) + { + std::string strResponse; + ReadData(strResponse); + + CXBMCTinyXML davResponse; + davResponse.Parse(strResponse); + + if (!davResponse.Parse(strResponse)) + { + CLog::Log(LOGERROR, "CDAVFile::Execute - Unable to process dav response ({})", + CURL(m_url).GetRedacted()); + Close(); + return false; + } + + TiXmlNode *pChild; + // Iterate over all responses + for (pChild = davResponse.RootElement()->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) + { + if (CDAVCommon::ValueWithoutNamespace(pChild, "response")) + { + std::string sRetCode = CDAVCommon::GetStatusTag(pChild->ToElement()); + CRegExp rxCode; + rxCode.RegComp("HTTP/.+\\s(\\d+)\\s.*"); + if (rxCode.RegFind(sRetCode) >= 0) + { + if (rxCode.GetSubCount()) + { + m_lastResponseCode = atoi(rxCode.GetMatch(1).c_str()); + if (m_lastResponseCode < 0 || m_lastResponseCode >= 400) + return false; + } + } + + } + } + } + + return true; +} + +bool CDAVFile::Delete(const CURL& url) +{ + if (m_opened) + return false; + + CDAVFile dav; + std::string strRequest = "DELETE"; + + dav.SetCustomRequest(strRequest); + + CLog::Log(LOGDEBUG, "CDAVFile::Delete - Execute DELETE ({})", url.GetRedacted()); + if (!dav.Execute(url)) + { + CLog::Log(LOGERROR, "CDAVFile::Delete - Unable to delete dav resource ({})", url.GetRedacted()); + return false; + } + + dav.Close(); + + return true; +} + +bool CDAVFile::Rename(const CURL& url, const CURL& urlnew) +{ + if (m_opened) + return false; + + CDAVFile dav; + + CURL url2(urlnew); + std::string strProtocol = url2.GetTranslatedProtocol(); + url2.SetProtocol(strProtocol); + + std::string strRequest = "MOVE"; + dav.SetCustomRequest(strRequest); + dav.SetRequestHeader("Destination", url2.GetWithoutUserDetails()); + + CLog::Log(LOGDEBUG, "CDAVFile::Rename - Execute MOVE ({} -> {})", url.GetRedacted(), + url2.GetRedacted()); + if (!dav.Execute(url)) + { + CLog::Log(LOGERROR, "CDAVFile::Rename - Unable to rename dav resource ({} -> {})", + url.GetRedacted(), url2.GetRedacted()); + return false; + } + + dav.Close(); + + return true; +} |