Refactor: Move FileManager to common, add macOS file management support
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
#import "InputHandler.h"
|
||||
#import "../client/IOCPClient.h"
|
||||
#import "../common/commands.h"
|
||||
#import "../common/FileTransferV2.h"
|
||||
#import "../common/logger.h"
|
||||
#import "Permissions.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <chrono>
|
||||
@@ -280,6 +282,72 @@ void ScreenHandler::OnReceive(uint8_t* data, ULONG size)
|
||||
}
|
||||
break;
|
||||
|
||||
case COMMAND_GET_FILE:
|
||||
// Server requests file download: [cmd:1][targetDir\0][file1\0file2\0...\0]
|
||||
// Use V2 protocol to upload files
|
||||
{
|
||||
if (size < 3) break;
|
||||
|
||||
// Parse target directory (GBK encoding)
|
||||
const char* ptr = (const char*)(data + 1);
|
||||
const char* end = (const char*)(data + size);
|
||||
std::string targetDirGbk = ptr;
|
||||
std::string targetDir = FileTransferV2::gbkToUtf8(targetDirGbk);
|
||||
ptr += targetDirGbk.length() + 1;
|
||||
|
||||
// Parse file list
|
||||
std::vector<std::string> files;
|
||||
while (ptr < end && *ptr != '\0') {
|
||||
std::string fileGbk = ptr;
|
||||
files.push_back(FileTransferV2::gbkToUtf8(fileGbk));
|
||||
ptr += fileGbk.length() + 1;
|
||||
}
|
||||
|
||||
// TODO: If no file list, get from clipboard (ClipboardHandler not implemented yet)
|
||||
|
||||
if (!files.empty() && !targetDir.empty()) {
|
||||
NSLog(@">>> COMMAND_GET_FILE: %zu files -> %s", files.size(), targetDir.c_str());
|
||||
|
||||
// Use V2 protocol to send files
|
||||
IOCPClient* client = m_client;
|
||||
std::thread([files, targetDir, client]() {
|
||||
// Collect all files (expand directories)
|
||||
std::vector<std::string> allFiles;
|
||||
std::vector<std::string> rootCandidates;
|
||||
|
||||
for (const auto& path : files) {
|
||||
struct stat st;
|
||||
if (stat(path.c_str(), &st) != 0) continue;
|
||||
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
std::string dirPath = path;
|
||||
if (dirPath.back() != '/') dirPath += '/';
|
||||
size_t pos = dirPath.rfind('/', dirPath.length() - 2);
|
||||
std::string parentPath = (pos != std::string::npos) ? dirPath.substr(0, pos + 1) : dirPath;
|
||||
rootCandidates.push_back(parentPath);
|
||||
FileTransferV2::CollectFiles(dirPath, allFiles);
|
||||
} else {
|
||||
rootCandidates.push_back(path);
|
||||
allFiles.push_back(path);
|
||||
}
|
||||
}
|
||||
|
||||
if (allFiles.empty()) {
|
||||
NSLog(@"*** No files to send");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string commonRoot = FileTransferV2::GetCommonRoot(rootCandidates);
|
||||
NSLog(@">>> Sending %zu files, root=%s", allFiles.size(), commonRoot.c_str());
|
||||
|
||||
FileTransferV2::SendFilesV2(allFiles, targetDir, commonRoot, client, g_myClientID);
|
||||
}).detach();
|
||||
} else {
|
||||
NSLog(@"*** COMMAND_GET_FILE: no files or empty target");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user