add ability to extract files from remote server
This commit is contained in:
+1
-1
@@ -70,7 +70,7 @@ add_executable(ezremote_client
|
||||
|
||||
add_self(ezremote_client)
|
||||
|
||||
add_pkg(ezremote_client ${CMAKE_SOURCE_DIR}/data "RMTC00001" "ezRemote Client" "01.13" 32 0)
|
||||
add_pkg(ezremote_client ${CMAKE_SOURCE_DIR}/data "RMTC00001" "ezRemote Client" "01.14" 32 0)
|
||||
|
||||
target_link_libraries(ezremote_client
|
||||
c
|
||||
|
||||
@@ -877,6 +877,49 @@ namespace Actions
|
||||
}
|
||||
}
|
||||
|
||||
void *ExtractRemoteZipThread(void *argp)
|
||||
{
|
||||
FS::MkDirs(extract_zip_folder);
|
||||
std::vector<DirEntry> files;
|
||||
if (multi_selected_remote_files.size() > 0)
|
||||
std::copy(multi_selected_remote_files.begin(), multi_selected_remote_files.end(), std::back_inserter(files));
|
||||
else
|
||||
files.push_back(selected_remote_file);
|
||||
|
||||
for (std::vector<DirEntry>::iterator it = files.begin(); it != files.end(); ++it)
|
||||
{
|
||||
if (stop_activity)
|
||||
break;
|
||||
if (!it->isDir)
|
||||
{
|
||||
int ret = ZipUtil::Extract(*it, extract_zip_folder, true);
|
||||
if (ret == 0)
|
||||
{
|
||||
sprintf(status_message, "%s %s", lang_strings[STR_FAILED_TO_EXTRACT], it->name);
|
||||
sceKernelUsleep(100000);
|
||||
}
|
||||
}
|
||||
}
|
||||
activity_inprogess = false;
|
||||
multi_selected_remote_files.clear();
|
||||
Windows::SetModalMode(false);
|
||||
selected_action = ACTION_REFRESH_LOCAL_FILES;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ExtractRemoteZips()
|
||||
{
|
||||
sprintf(status_message, "%s", "");
|
||||
int res = pthread_create(&bk_activity_thid, NULL, ExtractRemoteZipThread, NULL);
|
||||
if (res != 0)
|
||||
{
|
||||
file_transfering = false;
|
||||
activity_inprogess = false;
|
||||
multi_selected_remote_files.clear();
|
||||
Windows::SetModalMode(false);
|
||||
}
|
||||
}
|
||||
|
||||
void *MakeZipThread(void *argp)
|
||||
{
|
||||
zipFile zf = zipOpen64(zip_file_path, APPEND_STATUS_CREATE);
|
||||
|
||||
+4
-1
@@ -56,7 +56,8 @@ enum ACTIONS
|
||||
ACTION_VIEW_LOCAL_IMAGE,
|
||||
ACTION_VIEW_REMOTE_IMAGE,
|
||||
ACTION_VIEW_LOCAL_PKG,
|
||||
ACTION_VIEW_REMOTE_PKG
|
||||
ACTION_VIEW_REMOTE_PKG,
|
||||
ACTION_EXTRACT_REMOTE_ZIP,
|
||||
};
|
||||
|
||||
enum OverWriteType
|
||||
@@ -103,6 +104,8 @@ namespace Actions
|
||||
void *KeepAliveThread(void *argp);
|
||||
void *ExtractZipThread(void *argp);
|
||||
void ExtractLocalZips();
|
||||
void *ExtractRemoteZipThread(void *argp);
|
||||
void ExtractRemoteZips();
|
||||
void *MakeZipThread(void *argp);
|
||||
void MakeLocalZip();
|
||||
void *MoveLocalFilesThread(void *argp);
|
||||
|
||||
@@ -20,7 +20,8 @@ enum RemoteActions
|
||||
REMOTE_ACTION_INSTALL = 256,
|
||||
REMOTE_ACTION_EDIT = 512,
|
||||
REMOTE_ACTION_NEW_FILE = 1024,
|
||||
REMOTE_ACTION_ALL = 2047
|
||||
REMOTE_ACTION_EXTRACT = 2048,
|
||||
REMOTE_ACTION_ALL = 4095
|
||||
};
|
||||
|
||||
enum ClientType
|
||||
|
||||
+35
-18
@@ -1049,26 +1049,29 @@ namespace Windows
|
||||
ImGui::PopID();
|
||||
ImGui::Separator();
|
||||
|
||||
ImGui::PushID("Extract##settings");
|
||||
if (ImGui::Selectable(lang_strings[STR_EXTRACT], false, getSelectableFlag(REMOTE_ACTION_EXTRACT) | ImGuiSelectableFlags_DontClosePopups, ImVec2(220, 0)))
|
||||
{
|
||||
ResetImeCallbacks();
|
||||
sprintf(extract_zip_folder, "%s", getExtractFolder().c_str());
|
||||
ime_single_field = extract_zip_folder;
|
||||
ime_field_size = 255;
|
||||
ime_callback = SingleValueImeCallback;
|
||||
if (local_browser_selected)
|
||||
ime_after_update = AfterExtractFolderCallback;
|
||||
else
|
||||
ime_after_update = AfterExtractRemoteFolderCallback;
|
||||
Dialog::initImeDialog(lang_strings[STR_EXTRACT_LOCATION], extract_zip_folder, 255, ORBIS_TYPE_BASIC_LATIN, 600, 350);
|
||||
gui_mode = GUI_MODE_IME;
|
||||
file_transfering = false;
|
||||
SetModalMode(false);
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::PopID();
|
||||
ImGui::Separator();
|
||||
|
||||
if (local_browser_selected)
|
||||
{
|
||||
ImGui::PushID("Extract##settings");
|
||||
if (ImGui::Selectable(lang_strings[STR_EXTRACT], false, getSelectableFlag(REMOTE_ACTION_NONE) | ImGuiSelectableFlags_DontClosePopups, ImVec2(220, 0)))
|
||||
{
|
||||
ResetImeCallbacks();
|
||||
sprintf(extract_zip_folder, "%s", getExtractFolder().c_str());
|
||||
ime_single_field = extract_zip_folder;
|
||||
ime_field_size = 255;
|
||||
ime_callback = SingleValueImeCallback;
|
||||
ime_after_update = AfterExtractFolderCallback;
|
||||
Dialog::initImeDialog(lang_strings[STR_EXTRACT_LOCATION], extract_zip_folder, 255, ORBIS_TYPE_BASIC_LATIN, 600, 350);
|
||||
gui_mode = GUI_MODE_IME;
|
||||
file_transfering = false;
|
||||
SetModalMode(false);
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::PopID();
|
||||
ImGui::Separator();
|
||||
|
||||
ImGui::PushID("Compress##settings");
|
||||
if (ImGui::Selectable(lang_strings[STR_COMPRESS], false, getSelectableFlag(REMOTE_ACTION_NONE) | ImGuiSelectableFlags_DontClosePopups, ImVec2(220, 0)))
|
||||
{
|
||||
@@ -2027,6 +2030,15 @@ namespace Windows
|
||||
selected_action = ACTION_NONE;
|
||||
Actions::ExtractLocalZips();
|
||||
break;
|
||||
case ACTION_EXTRACT_REMOTE_ZIP:
|
||||
sprintf(status_message, "%s", "");
|
||||
activity_inprogess = true;
|
||||
sprintf(activity_message, "%s", "");
|
||||
stop_activity = false;
|
||||
file_transfering = false;
|
||||
selected_action = ACTION_NONE;
|
||||
Actions::ExtractRemoteZips();
|
||||
break;
|
||||
case ACTION_CREATE_LOCAL_ZIP:
|
||||
sprintf(status_message, "%s", "");
|
||||
activity_inprogess = true;
|
||||
@@ -2406,6 +2418,11 @@ namespace Windows
|
||||
selected_action = ACTION_EXTRACT_LOCAL_ZIP;
|
||||
}
|
||||
|
||||
void AfterExtractRemoteFolderCallback(int ime_result)
|
||||
{
|
||||
selected_action = ACTION_EXTRACT_REMOTE_ZIP;
|
||||
}
|
||||
|
||||
void AfterZipFileCallback(int ime_result)
|
||||
{
|
||||
selected_action = ACTION_CREATE_LOCAL_ZIP;
|
||||
|
||||
@@ -206,6 +206,7 @@ namespace Windows
|
||||
void AfterPackageUrlCallback(int ime_result);
|
||||
void AfterFavoriteUrlCallback(int ime_result);
|
||||
void AfterExtractFolderCallback(int ime_result);
|
||||
void AfterExtractRemoteFolderCallback(int ime_result);
|
||||
void AfterZipFileCallback(int ime_result);
|
||||
void AferServerChangeCallback(int ime_result);
|
||||
void AfterHttpPortChangeCallback(int ime_result);
|
||||
|
||||
+80
-6
@@ -12,6 +12,8 @@
|
||||
#include <archive.h>
|
||||
#include <archive_entry.h>
|
||||
|
||||
#include "clients/remote_client.h"
|
||||
#include "config.h"
|
||||
#include "common.h"
|
||||
#include "fs.h"
|
||||
#include "ime_dialog.h"
|
||||
@@ -20,13 +22,22 @@
|
||||
#include "windows.h"
|
||||
#include "zip_util.h"
|
||||
|
||||
#define TRANSFER_SIZE (16 * 1024)
|
||||
#define TRANSFER_SIZE (512 * 1024)
|
||||
|
||||
namespace ZipUtil
|
||||
{
|
||||
static char filename_extracted[256];
|
||||
static char password[128];
|
||||
|
||||
struct RemoteArchiveData
|
||||
{
|
||||
std::string path;
|
||||
ssize_t size;
|
||||
ssize_t offset;
|
||||
uint8_t buf[TRANSFER_SIZE];
|
||||
RemoteClient *client;
|
||||
};
|
||||
|
||||
void callback_7zip(const char *fileName, unsigned long fileSize, unsigned fileNum, unsigned numFiles)
|
||||
{
|
||||
sprintf(activity_message, "%s %s: %s", lang_strings[STR_EXTRACTING], filename_extracted, fileName);
|
||||
@@ -422,14 +433,58 @@ namespace ZipUtil
|
||||
return password;
|
||||
}
|
||||
|
||||
static RemoteArchiveData *OpenRemoteArchive(const DirEntry &file)
|
||||
{
|
||||
RemoteArchiveData *data;
|
||||
|
||||
data = (RemoteArchiveData*)malloc(sizeof(RemoteArchiveData));
|
||||
memset(data, 0, sizeof(RemoteArchiveData));
|
||||
|
||||
data->offset = 0;
|
||||
remoteclient->Size(file.path, &data->size);
|
||||
data->client = remoteclient;
|
||||
data->path = file.path;
|
||||
return data;
|
||||
}
|
||||
|
||||
static ssize_t ReadRemoteArchive(struct archive *a, void *client_data, const void **buff)
|
||||
{
|
||||
ssize_t to_read;
|
||||
int ret;
|
||||
RemoteArchiveData *data;
|
||||
|
||||
data = (RemoteArchiveData*)client_data;
|
||||
*buff = data->buf;
|
||||
|
||||
to_read = data->size - data->offset;
|
||||
if (to_read == 0)
|
||||
return 0;
|
||||
|
||||
to_read = MIN(to_read, TRANSFER_SIZE);
|
||||
ret = data->client->GetRange(data->path, data->buf, to_read, data->offset);
|
||||
if (ret == 0)
|
||||
return -1;
|
||||
data->offset = data->offset + to_read;
|
||||
|
||||
return to_read;
|
||||
}
|
||||
|
||||
static int CloseRemoteArchive(struct archive *a, void *client_data)
|
||||
{
|
||||
if (client_data != nullptr)
|
||||
free(client_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Main loop: open the zipfile, iterate over its contents and decide what
|
||||
* to do with each entry.
|
||||
*/
|
||||
int Extract(const DirEntry &file, const std::string &basepath)
|
||||
int Extract(const DirEntry &file, const std::string &basepath, bool is_remote)
|
||||
{
|
||||
struct archive *a;
|
||||
struct archive_entry *e;
|
||||
void *client_data;
|
||||
int ret;
|
||||
uintmax_t total_size, file_count, error_count;
|
||||
|
||||
@@ -440,11 +495,30 @@ namespace ZipUtil
|
||||
archive_read_support_filter_all(a);
|
||||
archive_read_set_passphrase_callback(a, NULL, &passphrase_callback);
|
||||
|
||||
ret = archive_read_open_filename(a, file.path, TRANSFER_SIZE);
|
||||
if (ret < ARCHIVE_OK)
|
||||
if (!is_remote)
|
||||
{
|
||||
sprintf(status_message, "%s", "archive_read_open_filename failed");
|
||||
return 0;
|
||||
ret = archive_read_open_filename(a, file.path, TRANSFER_SIZE);
|
||||
if (ret < ARCHIVE_OK)
|
||||
{
|
||||
sprintf(status_message, "%s", "archive_read_open_filename failed");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
client_data = OpenRemoteArchive(file);
|
||||
if (client_data == nullptr)
|
||||
{
|
||||
sprintf(status_message, "%s", "archive_read_open_filename failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = archive_read_open(a, client_data, NULL, ReadRemoteArchive, CloseRemoteArchive);
|
||||
if (ret < ARCHIVE_OK)
|
||||
{
|
||||
sprintf(status_message, "%s", "archive_read_open_filename failed");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
|
||||
+1
-1
@@ -27,6 +27,6 @@ enum CompressFileType {
|
||||
namespace ZipUtil
|
||||
{
|
||||
int ZipAddPath(zipFile zf, const std::string &path, int filename_start, int level);
|
||||
int Extract(const DirEntry &file, const std::string &dir);
|
||||
int Extract(const DirEntry &file, const std::string &dir, bool is_remote = false);
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user