Merge pull request #26350 from jjd-uk/estuary_media_align
[xbmc.git] / xbmc / platform / win32 / filesystem / Win32SMBFile.cpp
blobf05b4e4cda1d9415ced038482636e42a32ebcd8f
1 /*
2 * Copyright (C) 2014-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.
7 */
9 #include "Win32SMBFile.h"
11 #include "URL.h"
12 #include "Win32SMBDirectory.h"
14 #include "platform/win32/WIN32Util.h"
16 #include <cassert>
18 #include <Windows.h>
20 using namespace XFILE;
22 // local helper
23 static bool worthTryToConnect(const DWORD lastErr)
25 return lastErr != ERROR_INVALID_DATA && // used to indicate internal errors
26 lastErr != ERROR_FILE_NOT_FOUND && lastErr != ERROR_BAD_NET_NAME &&
27 lastErr != ERROR_NO_NET_OR_BAD_PATH && lastErr != ERROR_NO_NETWORK &&
28 lastErr != ERROR_BAD_NETPATH;
32 bool CWin32SMBFile::ConnectAndAuthenticate(const CURL& url)
34 CURL authUrl(url);
35 CWin32SMBDirectory smbDir;
36 return smbDir.ConnectAndAuthenticate(authUrl, false);
39 CWin32SMBFile::CWin32SMBFile() : CWin32File(true)
40 { }
42 CWin32SMBFile::~CWin32SMBFile()
43 { /* cleanup by CWin32File destructor */ }
45 bool CWin32SMBFile::Open(const CURL& url)
47 assert(url.IsProtocol("smb")); // function suitable only for SMB files
48 if (CWin32File::Open(url))
49 return true;
51 return worthTryToConnect(m_lastSMBFileErr) && ConnectAndAuthenticate(url) && CWin32File::Open(url);
54 bool CWin32SMBFile::OpenForWrite(const CURL& url, bool bOverWrite /*= false*/)
56 assert(url.IsProtocol("smb")); // function suitable only for SMB files
57 if (CWin32File::OpenForWrite(url, bOverWrite))
58 return true;
60 return worthTryToConnect(m_lastSMBFileErr) && ConnectAndAuthenticate(url) && CWin32File::OpenForWrite(url, bOverWrite);
63 bool CWin32SMBFile::Delete(const CURL& url)
65 assert(url.IsProtocol("smb")); // function suitable only for SMB files
67 if (CWin32File::Delete(url))
68 return true;
70 return worthTryToConnect(m_lastSMBFileErr) && ConnectAndAuthenticate(url) && CWin32File::Delete(url);
73 bool CWin32SMBFile::Rename(const CURL& urlCurrentName, const CURL& urlNewName)
75 assert(urlCurrentName.IsProtocol("smb")); // function suitable only for SMB files
76 assert(urlNewName.IsProtocol("smb")); // function suitable only for SMB files
78 if (CWin32File::Rename(urlCurrentName, urlNewName))
79 return true;
81 return worthTryToConnect(m_lastSMBFileErr) && ConnectAndAuthenticate(urlCurrentName) && ConnectAndAuthenticate(urlNewName) &&
82 CWin32File::Rename(urlCurrentName, urlNewName);
85 bool CWin32SMBFile::SetHidden(const CURL& url, bool hidden)
87 assert(url.IsProtocol("smb")); // function suitable only for SMB files
89 std::wstring pathnameW(CWIN32Util::ConvertPathToWin32Form(url));
90 if (pathnameW.empty())
91 return false;
93 DWORD attrs = GetFileAttributesW(pathnameW.c_str());
94 if (attrs == INVALID_FILE_ATTRIBUTES)
96 if (!worthTryToConnect(GetLastError()) || !ConnectAndAuthenticate(url))
97 return false;
98 attrs = GetFileAttributesW(pathnameW.c_str());
99 if (attrs == INVALID_FILE_ATTRIBUTES)
100 return false;
103 if ((attrs & FILE_ATTRIBUTE_DIRECTORY) != 0)
104 return false;
106 // check whether attribute is already set/cleared
107 if (((attrs & FILE_ATTRIBUTE_HIDDEN) != 0) == hidden)
108 return true;
110 if (hidden)
111 return SetFileAttributesW(pathnameW.c_str(), attrs | FILE_ATTRIBUTE_HIDDEN) != 0;
112 return SetFileAttributesW(pathnameW.c_str(), attrs & ~FILE_ATTRIBUTE_HIDDEN) != 0;
115 bool CWin32SMBFile::Exists(const CURL& url)
117 assert(url.IsProtocol("smb")); // function suitable only for SMB files
118 std::wstring pathnameW(CWIN32Util::ConvertPathToWin32Form(url));
119 if (pathnameW.empty())
120 return false;
122 DWORD attrs = GetFileAttributesW(pathnameW.c_str());
123 if (attrs == INVALID_FILE_ATTRIBUTES)
125 if (!worthTryToConnect(GetLastError()) || !ConnectAndAuthenticate(url))
126 return false;
127 attrs = GetFileAttributesW(pathnameW.c_str());
128 if (attrs == INVALID_FILE_ATTRIBUTES)
129 return false;
131 return (attrs & FILE_ATTRIBUTE_DIRECTORY) == 0;
134 int CWin32SMBFile::Stat(const CURL& url, struct __stat64* statData)
136 assert(url.IsProtocol("smb")); // function suitable only for SMB files
138 if (CWin32File::Stat(url, statData) == 0)
139 return 0;
141 if (!worthTryToConnect(m_lastSMBFileErr) || !ConnectAndAuthenticate(url))
142 return -1;
144 return CWin32File::Stat(url, statData);