server: proxy: capture: refactor path creation

This commit is contained in:
kubistika 2019-10-23 12:39:58 +03:00 committed by akallabeth
parent c723980a2f
commit d92485899d
2 changed files with 107 additions and 21 deletions

View File

@ -19,6 +19,10 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <winpr/image.h>
#include <winpr/sysinfo.h>
#include <winpr/path.h>
#include <winpr/file.h>
#include "pf_capture.h" #include "pf_capture.h"
@ -30,6 +34,82 @@ static BOOL pf_capture_create_dir_if_not_exists(const char* path)
return CreateDirectoryA(path, NULL); return CreateDirectoryA(path, NULL);
} }
static BOOL pf_capture_create_user_captures_dir(const char* base_dir, const char* username)
{
int rc;
size_t size;
char* buf = NULL;
BOOL ret = FALSE;
/* create sub-directory in base captures directory for current username, if it doesn't already exists. */
rc = _snprintf(NULL, 0, "%s/%s", base_dir, username);
if (rc < 0)
return FALSE;
size = (size_t) rc;
buf = malloc(size + 1);
if (!buf)
return FALSE;
rc = sprintf(buf, "%s/%s", base_dir, username);
if (rc < 0 || (size_t) rc != size)
goto out;
if (!pf_capture_create_dir_if_not_exists(buf))
goto out;
ret = TRUE;
out:
free(buf);
return ret;
}
static BOOL pf_capture_create_current_session_captures_dir(pClientContext* pc)
{
proxyConfig* config = pc->pdata->config;
rdpSettings* settings = pc->context.settings;
const char* fmt = "%s/%s/%s_%02u-%02u-%"PRIu16"_%02u-%02u-%02u-%03u";
int rc;
size_t size;
SYSTEMTIME localTime;
GetLocalTime(&localTime);
/* create sub-directory in current user's captures directory, for the specific session. */
rc = _snprintf(NULL, 0, fmt, config->CapturesDirectory, settings->Username,
settings->ServerHostname, localTime.wDay, localTime.wMonth, localTime.wYear,
localTime.wHour, localTime.wMinute, localTime.wSecond, localTime.wMilliseconds);
if (rc < 0)
return FALSE;
size = (size_t) rc;
/* `pc->frames_dir` will be used by proxy client for saving frames to storage. */
pc->frames_dir = malloc(size + 1);
if (!pc->frames_dir)
return FALSE;
rc = sprintf(pc->frames_dir, fmt, config->CapturesDirectory, settings->Username,
settings->ServerHostname, localTime.wDay, localTime.wMonth, localTime.wYear,
localTime.wHour, localTime.wMinute, localTime.wSecond, localTime.wMilliseconds);
if (rc < 0 || (size_t) rc != size)
goto error;
if (!pf_capture_create_dir_if_not_exists(pc->frames_dir))
goto error;
return TRUE;
error:
free(pc->frames_dir);
return FALSE;
}
/* creates a directory to store captured session frames. /* creates a directory to store captured session frames.
* *
* @context: current session. * @context: current session.
@ -44,34 +124,45 @@ BOOL pf_capture_create_session_directory(pClientContext* pc)
{ {
proxyConfig* config = pc->pdata->config; proxyConfig* config = pc->pdata->config;
rdpSettings* settings = pc->context.settings; rdpSettings* settings = pc->context.settings;
SYSTEMTIME localTime;
char tmp[MAX_PATH];
const char* fmt = "%s/%s/%s_%02u-%02u-%"PRIu16"_%02u-%02u-%02u-%03u";
_snprintf(tmp, sizeof(tmp), "%s/%s", config->CapturesDirectory, settings->Username); if (!pf_capture_create_user_captures_dir(config->CapturesDirectory, settings->Username))
if (!pf_capture_create_dir_if_not_exists(tmp))
return FALSE; return FALSE;
pc->frames_dir = malloc(MAX_PATH); if (!pf_capture_create_current_session_captures_dir(pc))
if (!pc->frames_dir)
return FALSE; return FALSE;
GetLocalTime(&localTime); return TRUE;
sprintf_s(pc->frames_dir, MAX_PATH, fmt, config->CapturesDirectory, settings->Username,
settings->ServerHostname, localTime.wDay, localTime.wMonth, localTime.wYear,
localTime.wHour, localTime.wMinute, localTime.wSecond, localTime.wMilliseconds);
return pf_capture_create_dir_if_not_exists(pc->frames_dir);
} }
/* saves a captured frame in a BMP format. */ /* saves a captured frame in a BMP format. */
BOOL pf_capture_save_frame(pClientContext* pc, const BYTE* frame) BOOL pf_capture_save_frame(pClientContext* pc, const BYTE* frame)
{ {
rdpSettings* settings = pc->context.settings; rdpSettings* settings = pc->context.settings;
int rc;
const char* fmt = "%s/%"PRIu64".bmp"; const char* fmt = "%s/%"PRIu64".bmp";
char file_path[MAX_PATH]; char* file_path = NULL;
size_t size;
sprintf_s(file_path, sizeof(file_path), fmt, pc->frames_dir, pc->frames_count++); if (!pc->frames_dir)
return winpr_bitmap_write(file_path, frame, settings->DesktopWidth, settings->DesktopHeight, return FALSE;
rc = _snprintf(NULL, 0, fmt, pc->frames_dir, pc->frames_count++);
if (rc < 0)
return FALSE;
size = (size_t) rc;
file_path = malloc(size + 1);
if (!file_path)
return FALSE;
rc = sprintf(file_path, fmt, pc->frames_dir, pc->frames_count++);
if (rc < 0 || (size_t) rc != size)
goto out;
rc = winpr_bitmap_write(file_path, frame, settings->DesktopWidth, settings->DesktopHeight,
settings->ColorDepth); settings->ColorDepth);
out:
free(file_path);
return rc;
} }

View File

@ -20,11 +20,6 @@
#ifndef FREERDP_SERVER_PROXY_CAPTURE_H #ifndef FREERDP_SERVER_PROXY_CAPTURE_H
#define FREERDP_SERVER_PROXY_CAPTURE_H #define FREERDP_SERVER_PROXY_CAPTURE_H
#include <winpr/image.h>
#include <winpr/sysinfo.h>
#include <winpr/path.h>
#include <winpr/file.h>
#include "pf_context.h" #include "pf_context.h"
BOOL pf_capture_create_session_directory(pClientContext* context); BOOL pf_capture_create_session_directory(pClientContext* context);