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.
9 #include "Win32SMBFile.h"
12 #include "Win32SMBDirectory.h"
14 #include "platform/win32/WIN32Util.h"
20 using namespace XFILE
;
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
)
35 CWin32SMBDirectory smbDir
;
36 return smbDir
.ConnectAndAuthenticate(authUrl
, false);
39 CWin32SMBFile::CWin32SMBFile() : CWin32File(true)
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
))
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
))
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
))
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
))
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())
93 DWORD attrs
= GetFileAttributesW(pathnameW
.c_str());
94 if (attrs
== INVALID_FILE_ATTRIBUTES
)
96 if (!worthTryToConnect(GetLastError()) || !ConnectAndAuthenticate(url
))
98 attrs
= GetFileAttributesW(pathnameW
.c_str());
99 if (attrs
== INVALID_FILE_ATTRIBUTES
)
103 if ((attrs
& FILE_ATTRIBUTE_DIRECTORY
) != 0)
106 // check whether attribute is already set/cleared
107 if (((attrs
& FILE_ATTRIBUTE_HIDDEN
) != 0) == 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())
122 DWORD attrs
= GetFileAttributesW(pathnameW
.c_str());
123 if (attrs
== INVALID_FILE_ATTRIBUTES
)
125 if (!worthTryToConnect(GetLastError()) || !ConnectAndAuthenticate(url
))
127 attrs
= GetFileAttributesW(pathnameW
.c_str());
128 if (attrs
== INVALID_FILE_ATTRIBUTES
)
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)
141 if (!worthTryToConnect(m_lastSMBFileErr
) || !ConnectAndAuthenticate(url
))
144 return CWin32File::Stat(url
, statData
);