int CControlSocket::CheckOverwriteFile() { if (!m_pCurOpData) { LogMessage(__TFILE__, __LINE__, this, MessageType::Debug_Info, _T("Empty m_pCurOpData")); ResetOperation(FZ_REPLY_INTERNALERROR); return FZ_REPLY_ERROR; } CFileTransferOpData *pData = static_cast<CFileTransferOpData *>(m_pCurOpData); if (pData->download) { if (!wxFile::Exists(pData->localFile)) return FZ_REPLY_OK; } CDirentry entry; bool dirDidExist; bool matchedCase; CServerPath remotePath; if (pData->tryAbsolutePath || m_CurrentPath.empty()) remotePath = pData->remotePath; else remotePath = m_CurrentPath; bool found = engine_.GetDirectoryCache().LookupFile(entry, *m_pCurrentServer, remotePath, pData->remoteFile, dirDidExist, matchedCase); // Ignore entries with wrong case if (found && !matchedCase) found = false; if (!pData->download) { if (!found && pData->remoteFileSize < 0 && !pData->fileTime.empty()) return FZ_REPLY_OK; } CFileExistsNotification *pNotification = new CFileExistsNotification; pNotification->download = pData->download; pNotification->localFile = pData->localFile; pNotification->remoteFile = pData->remoteFile; pNotification->remotePath = pData->remotePath; pNotification->localSize = pData->localFileSize; pNotification->remoteSize = pData->remoteFileSize; pNotification->ascii = !pData->transferSettings.binary; if (pData->download && pNotification->localSize >= 0) pNotification->canResume = true; else if (!pData->download && pNotification->remoteSize >= 0) pNotification->canResume = true; else pNotification->canResume = false; pNotification->localTime = fz::local_filesys::get_modification_time(fz::to_native(pData->localFile)); if (pData->fileTime.empty()) pNotification->remoteTime = pData->fileTime; if (found) { if (!pData->fileTime.empty()) { if (entry.has_date()) { pNotification->remoteTime = entry.time; pData->fileTime = entry.time; } } } SendAsyncRequest(pNotification); return FZ_REPLY_WOULDBLOCK; }
int CControlSocket::CheckOverwriteFile() { if (!m_pCurOpData) { LogMessage(__TFILE__, __LINE__, this, Debug_Info, _T("Empty m_pCurOpData")); ResetOperation(FZ_REPLY_INTERNALERROR); return FZ_REPLY_ERROR; } CFileTransferOpData *pData = static_cast<CFileTransferOpData *>(m_pCurOpData); if (pData->download) { if (!wxFile::Exists(pData->localFile)) return FZ_REPLY_OK; } CDirentry entry; bool dirDidExist; bool matchedCase; CDirectoryCache cache; CServerPath remotePath; if (pData->tryAbsolutePath || m_CurrentPath.IsEmpty()) remotePath = pData->remotePath; else remotePath = m_CurrentPath; bool found = cache.LookupFile(entry, *m_pCurrentServer, remotePath, pData->remoteFile, dirDidExist, matchedCase); // Ignore entries with wrong case if (found && !matchedCase) found = false; if (!pData->download) { if (!found && pData->remoteFileSize == -1 && !pData->fileTime.IsValid()) return FZ_REPLY_OK; } CFileExistsNotification *pNotification = new CFileExistsNotification; pNotification->download = pData->download; pNotification->localFile = pData->localFile; pNotification->remoteFile = pData->remoteFile; pNotification->remotePath = pData->remotePath; pNotification->localSize = pData->localFileSize; pNotification->remoteSize = pData->remoteFileSize; pNotification->ascii = !pData->transferSettings.binary; if (pData->download && pNotification->localSize != -1) pNotification->canResume = true; else if (!pData->download && pNotification->remoteSize != -1) pNotification->canResume = true; else pNotification->canResume = false; wxStructStat buf; int result; result = wxStat(pData->localFile, &buf); if (!result) { pNotification->localTime = wxDateTime(buf.st_mtime); if (!pNotification->localTime.IsValid()) pNotification->localTime = wxDateTime(buf.st_ctime); } if (pData->fileTime.IsValid()) pNotification->remoteTime = pData->fileTime; if (found) { if (!pData->fileTime.IsValid()) { if (entry.hasDate) { pNotification->remoteTime = entry.time; pData->fileTime = entry.time; } } } SendAsyncRequest(pNotification); return FZ_REPLY_WOULDBLOCK; }