mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-08-07 14:50:22 +00:00
spice-qxl: Remove QXLWorker definition
It was made obsolete more than 6 years ago by
commit fe0941fb02
Author: Marc-André Lureau <marcandre.lureau@gmail.com>
Date: Thu Oct 3 22:52:38 2013 +0200
server: mark deprecated symbols
For compatibility with spice_replay_next_cmd pass a QXLInstance
pointer. For more information see comment on
red-qxl.c:red_qxl_attach_worker.
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
2f130edfdd
commit
6aa1a17c69
126
server/red-qxl.c
126
server/red-qxl.c
@ -42,7 +42,6 @@
|
||||
#define MAX_MONITORS_COUNT 16
|
||||
|
||||
struct QXLState {
|
||||
QXLWorker qxl_worker;
|
||||
QXLInstance *qxl;
|
||||
Dispatcher *dispatcher;
|
||||
uint32_t pending;
|
||||
@ -129,15 +128,6 @@ static void red_qxl_update_area_async(QXLState *qxl_state,
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_update_area(QXLWorker *qxl_worker, uint32_t surface_id,
|
||||
QXLRect *qxl_area, QXLRect *qxl_dirty_rects,
|
||||
uint32_t num_dirty_rects, uint32_t clear_dirty_region)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_update_area(qxl_state, surface_id, qxl_area,
|
||||
qxl_dirty_rects, num_dirty_rects, clear_dirty_region);
|
||||
}
|
||||
|
||||
static void red_qxl_add_memslot(QXLState *qxl_state, QXLDevMemSlot *mem_slot)
|
||||
{
|
||||
RedWorkerMessageAddMemslot payload;
|
||||
@ -148,12 +138,6 @@ static void red_qxl_add_memslot(QXLState *qxl_state, QXLDevMemSlot *mem_slot)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_add_memslot(qxl_state, mem_slot);
|
||||
}
|
||||
|
||||
static void red_qxl_add_memslot_async(QXLState *qxl_state, QXLDevMemSlot *mem_slot, uint64_t cookie)
|
||||
{
|
||||
RedWorkerMessageAddMemslotAsync payload;
|
||||
@ -174,12 +158,6 @@ static void red_qxl_del_memslot(QXLState *qxl_state, uint32_t slot_group_id, uin
|
||||
dispatcher_send_message(qxl_state->dispatcher, message, &payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_del_memslot(QXLWorker *qxl_worker, uint32_t slot_group_id, uint32_t slot_id)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_del_memslot(qxl_state, slot_group_id, slot_id);
|
||||
}
|
||||
|
||||
static void red_qxl_destroy_surfaces(QXLState *qxl_state)
|
||||
{
|
||||
RedWorkerMessageDestroySurfaces payload;
|
||||
@ -189,12 +167,6 @@ static void red_qxl_destroy_surfaces(QXLState *qxl_state)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_destroy_surfaces(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_destroy_surfaces(qxl_state);
|
||||
}
|
||||
|
||||
static void red_qxl_destroy_surfaces_async(QXLState *qxl_state, uint64_t cookie)
|
||||
{
|
||||
RedWorkerMessageDestroySurfacesAsync payload;
|
||||
@ -250,12 +222,6 @@ red_qxl_destroy_primary_surface(QXLState *qxl_state,
|
||||
}
|
||||
}
|
||||
|
||||
static void qxl_worker_destroy_primary_surface(QXLWorker *qxl_worker, uint32_t surface_id)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_destroy_primary_surface(qxl_state, surface_id, 0, 0);
|
||||
}
|
||||
|
||||
/* used by RedWorker */
|
||||
void red_qxl_create_primary_surface_complete(QXLState *qxl_state, const QXLDevSurfaceCreate *surface)
|
||||
{
|
||||
@ -295,13 +261,6 @@ red_qxl_create_primary_surface_sync(QXLState *qxl_state, uint32_t surface_id,
|
||||
red_qxl_create_primary_surface_complete(qxl_state, surface);
|
||||
}
|
||||
|
||||
static void qxl_worker_create_primary_surface(QXLWorker *qxl_worker, uint32_t surface_id,
|
||||
QXLDevSurfaceCreate *surface)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_create_primary_surface_sync(qxl_state, surface_id, surface);
|
||||
}
|
||||
|
||||
static void red_qxl_reset_image_cache(QXLState *qxl_state)
|
||||
{
|
||||
RedWorkerMessageResetImageCache payload;
|
||||
@ -311,12 +270,6 @@ static void red_qxl_reset_image_cache(QXLState *qxl_state)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_reset_image_cache(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_reset_image_cache(qxl_state);
|
||||
}
|
||||
|
||||
static void red_qxl_reset_cursor(QXLState *qxl_state)
|
||||
{
|
||||
RedWorkerMessageResetCursor payload;
|
||||
@ -326,12 +279,6 @@ static void red_qxl_reset_cursor(QXLState *qxl_state)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_reset_cursor(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_reset_cursor(qxl_state);
|
||||
}
|
||||
|
||||
static void red_qxl_destroy_surface_wait_sync(QXLState *qxl_state,
|
||||
uint32_t surface_id)
|
||||
{
|
||||
@ -355,12 +302,6 @@ static void red_qxl_destroy_surface_wait_async(QXLState *qxl_state,
|
||||
dispatcher_send_message(qxl_state->dispatcher, message, &payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_destroy_surface_wait(QXLWorker *qxl_worker, uint32_t surface_id)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_destroy_surface_wait_sync(qxl_state, surface_id);
|
||||
}
|
||||
|
||||
static void red_qxl_reset_memslots(QXLState *qxl_state)
|
||||
{
|
||||
RedWorkerMessageResetMemslots payload;
|
||||
@ -370,12 +311,6 @@ static void red_qxl_reset_memslots(QXLState *qxl_state)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_reset_memslots(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_reset_memslots(qxl_state);
|
||||
}
|
||||
|
||||
static bool red_qxl_set_pending(QXLState *qxl_state, int pending)
|
||||
{
|
||||
// this is not atomic but is not an issue
|
||||
@ -399,12 +334,6 @@ static void red_qxl_wakeup(QXLState *qxl_state)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_wakeup(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_wakeup(qxl_state);
|
||||
}
|
||||
|
||||
static void red_qxl_oom(QXLState *qxl_state)
|
||||
{
|
||||
RedWorkerMessageOom payload;
|
||||
@ -417,12 +346,6 @@ static void red_qxl_oom(QXLState *qxl_state)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_oom(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_oom(qxl_state);
|
||||
}
|
||||
|
||||
void red_qxl_start(QXLInstance *qxl)
|
||||
{
|
||||
RedWorkerMessageStart payload;
|
||||
@ -432,12 +355,6 @@ void red_qxl_start(QXLInstance *qxl)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_start(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_start(state->qxl);
|
||||
}
|
||||
|
||||
static void red_qxl_flush_surfaces_async(QXLState *qxl_state, uint64_t cookie)
|
||||
{
|
||||
RedWorkerMessageFlushSurfacesAsync payload;
|
||||
@ -481,12 +398,6 @@ void red_qxl_stop(QXLInstance *qxl)
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_stop(QXLWorker *qxl_worker)
|
||||
{
|
||||
QXLState *state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_stop(state->qxl);
|
||||
}
|
||||
|
||||
static void red_qxl_loadvm_commands(QXLState *qxl_state,
|
||||
struct QXLCommandExt *ext,
|
||||
uint32_t count)
|
||||
@ -500,14 +411,6 @@ static void red_qxl_loadvm_commands(QXLState *qxl_state,
|
||||
&payload);
|
||||
}
|
||||
|
||||
static void qxl_worker_loadvm_commands(QXLWorker *qxl_worker,
|
||||
struct QXLCommandExt *ext,
|
||||
uint32_t count)
|
||||
{
|
||||
QXLState *qxl_state = SPICE_CONTAINEROF(qxl_worker, QXLState, qxl_worker);
|
||||
red_qxl_loadvm_commands(qxl_state, ext, count);
|
||||
}
|
||||
|
||||
uint32_t red_qxl_get_ram_size(QXLInstance *qxl)
|
||||
{
|
||||
QXLDevInitInfo qxl_info;
|
||||
@ -848,24 +751,6 @@ void red_qxl_init(RedsState *reds, QXLInstance *qxl)
|
||||
qxl_state->scanout.drm_dma_buf_fd = -1;
|
||||
qxl_state->gl_draw_cookie = GL_DRAW_COOKIE_INVALID;
|
||||
qxl_state->dispatcher = dispatcher_new(RED_WORKER_MESSAGE_COUNT);
|
||||
qxl_state->qxl_worker.major_version = SPICE_INTERFACE_QXL_MAJOR;
|
||||
qxl_state->qxl_worker.minor_version = SPICE_INTERFACE_QXL_MINOR;
|
||||
qxl_state->qxl_worker.wakeup = qxl_worker_wakeup;
|
||||
qxl_state->qxl_worker.oom = qxl_worker_oom;
|
||||
qxl_state->qxl_worker.start = qxl_worker_start;
|
||||
qxl_state->qxl_worker.stop = qxl_worker_stop;
|
||||
qxl_state->qxl_worker.update_area = qxl_worker_update_area;
|
||||
qxl_state->qxl_worker.add_memslot = qxl_worker_add_memslot;
|
||||
qxl_state->qxl_worker.del_memslot = qxl_worker_del_memslot;
|
||||
qxl_state->qxl_worker.reset_memslots = qxl_worker_reset_memslots;
|
||||
qxl_state->qxl_worker.destroy_surfaces = qxl_worker_destroy_surfaces;
|
||||
qxl_state->qxl_worker.create_primary_surface = qxl_worker_create_primary_surface;
|
||||
qxl_state->qxl_worker.destroy_primary_surface = qxl_worker_destroy_primary_surface;
|
||||
|
||||
qxl_state->qxl_worker.reset_image_cache = qxl_worker_reset_image_cache;
|
||||
qxl_state->qxl_worker.reset_cursor = qxl_worker_reset_cursor;
|
||||
qxl_state->qxl_worker.destroy_surface_wait = qxl_worker_destroy_surface_wait;
|
||||
qxl_state->qxl_worker.loadvm_commands = qxl_worker_loadvm_commands;
|
||||
|
||||
qxl_state->max_monitors = UINT_MAX;
|
||||
qxl->st = qxl_state;
|
||||
@ -975,7 +860,16 @@ RedsState* red_qxl_get_server(QXLState *qxl_state)
|
||||
void red_qxl_attach_worker(QXLInstance *qxl)
|
||||
{
|
||||
QXLInterface *qxl_interface = qxl_get_interface(qxl);
|
||||
qxl_interface->attache_worker(qxl, &qxl->st->qxl_worker);
|
||||
|
||||
/* cast for compatibility with spice_replay_next_cmd
|
||||
* In the past spice_replay_next_cmd received a QXLWorker instead of
|
||||
* a QXLInstance. Users of this function could have retrieved this pointer
|
||||
* only by attache_worker callback but this structure was all deprecated.
|
||||
* Passing QXLInstance pointer instead allows these programs to keep working
|
||||
* although spice_replay_next_cmd declaration changed */
|
||||
if (qxl_interface->attache_worker) {
|
||||
qxl_interface->attache_worker(qxl, (QXLWorker *) qxl);
|
||||
}
|
||||
}
|
||||
|
||||
void red_qxl_set_compression_level(QXLInstance *qxl, int level)
|
||||
|
||||
@ -1247,7 +1247,7 @@ static void red_replay_cursor_cmd_free(SpiceReplay *replay, QXLCursorCmd *qxl)
|
||||
g_free(qxl);
|
||||
}
|
||||
|
||||
static void replay_handle_create_primary(QXLWorker *worker, SpiceReplay *replay)
|
||||
static void replay_handle_create_primary(QXLInstance *instance, SpiceReplay *replay)
|
||||
{
|
||||
QXLDevSurfaceCreate surface = { 0, };
|
||||
size_t size;
|
||||
@ -1256,7 +1256,7 @@ static void replay_handle_create_primary(QXLWorker *worker, SpiceReplay *replay)
|
||||
if (replay->created_primary) {
|
||||
g_warning("WARNING: %d: original recording event not preceded by a destroy primary",
|
||||
replay->counter);
|
||||
worker->destroy_primary_surface(worker, 0);
|
||||
spice_qxl_destroy_primary_surface(instance, 0);
|
||||
}
|
||||
replay->created_primary = TRUE;
|
||||
|
||||
@ -1273,26 +1273,26 @@ static void replay_handle_create_primary(QXLWorker *worker, SpiceReplay *replay)
|
||||
replay->allocated = g_list_remove(replay->allocated, mem);
|
||||
replay->primary_mem = mem;
|
||||
surface.mem = QXLPHYSICAL_FROM_PTR(mem);
|
||||
worker->create_primary_surface(worker, 0, &surface);
|
||||
spice_qxl_create_primary_surface(instance, 0, &surface);
|
||||
}
|
||||
|
||||
static void replay_handle_dev_input(QXLWorker *worker, SpiceReplay *replay,
|
||||
static void replay_handle_dev_input(QXLInstance *instance, SpiceReplay *replay,
|
||||
RedWorkerMessage message)
|
||||
{
|
||||
switch (message) {
|
||||
case RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE:
|
||||
case RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC:
|
||||
replay_handle_create_primary(worker, replay);
|
||||
replay_handle_create_primary(instance, replay);
|
||||
break;
|
||||
case RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE:
|
||||
replay->created_primary = FALSE;
|
||||
worker->destroy_primary_surface(worker, 0);
|
||||
spice_qxl_destroy_primary_surface(instance, 0);
|
||||
g_free(replay->primary_mem);
|
||||
replay->primary_mem = NULL;
|
||||
break;
|
||||
case RED_WORKER_MESSAGE_DESTROY_SURFACES:
|
||||
replay->created_primary = FALSE;
|
||||
worker->destroy_surfaces(worker);
|
||||
spice_qxl_destroy_surfaces(instance);
|
||||
break;
|
||||
case RED_WORKER_MESSAGE_UPDATE:
|
||||
// XXX do anything? we record the correct bitmaps already.
|
||||
@ -1311,7 +1311,7 @@ static void replay_handle_dev_input(QXLWorker *worker, SpiceReplay *replay,
|
||||
* since it will block reading from the dispatcher pipe.
|
||||
*/
|
||||
SPICE_GNUC_VISIBLE QXLCommandExt* spice_replay_next_cmd(SpiceReplay *replay,
|
||||
QXLWorker *worker)
|
||||
QXLInstance *instance)
|
||||
{
|
||||
QXLCommandExt* cmd = NULL;
|
||||
uint64_t timestamp;
|
||||
@ -1326,7 +1326,7 @@ SPICE_GNUC_VISIBLE QXLCommandExt* spice_replay_next_cmd(SpiceReplay *replay,
|
||||
goto error;
|
||||
}
|
||||
if (what == 1) {
|
||||
replay_handle_dev_input(worker, replay, type);
|
||||
replay_handle_dev_input(instance, replay, type);
|
||||
}
|
||||
}
|
||||
cmd = replay_malloc0(replay, sizeof(QXLCommandExt));
|
||||
|
||||
@ -41,30 +41,6 @@ typedef struct QXLWorker QXLWorker;
|
||||
typedef struct QXLDevMemSlot QXLDevMemSlot;
|
||||
typedef struct QXLDevSurfaceCreate QXLDevSurfaceCreate;
|
||||
|
||||
struct QXLWorker {
|
||||
uint32_t minor_version;
|
||||
uint32_t major_version;
|
||||
/* These calls are deprecated. Please use the spice_qxl_* calls instead */
|
||||
void (*wakeup)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*oom)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*start)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*stop)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*update_area)(QXLWorker *qxl_worker, uint32_t surface_id,
|
||||
struct QXLRect *area, struct QXLRect *dirty_rects,
|
||||
uint32_t num_dirty_rects, uint32_t clear_dirty_region) SPICE_GNUC_DEPRECATED;
|
||||
void (*add_memslot)(QXLWorker *worker, QXLDevMemSlot *slot) SPICE_GNUC_DEPRECATED;
|
||||
void (*del_memslot)(QXLWorker *worker, uint32_t slot_group_id, uint32_t slot_id) SPICE_GNUC_DEPRECATED;
|
||||
void (*reset_memslots)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*destroy_surfaces)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*destroy_primary_surface)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
|
||||
void (*create_primary_surface)(QXLWorker *worker, uint32_t surface_id,
|
||||
QXLDevSurfaceCreate *surface) SPICE_GNUC_DEPRECATED;
|
||||
void (*reset_image_cache)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*reset_cursor)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
|
||||
void (*destroy_surface_wait)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
|
||||
void (*loadvm_commands)(QXLWorker *worker, struct QXLCommandExt *ext, uint32_t count) SPICE_GNUC_DEPRECATED;
|
||||
};
|
||||
|
||||
void spice_qxl_wakeup(QXLInstance *instance);
|
||||
void spice_qxl_oom(QXLInstance *instance);
|
||||
/* deprecated since 0.11.2, spice_server_vm_start replaces it */
|
||||
|
||||
@ -30,7 +30,7 @@ typedef struct SpiceReplay SpiceReplay;
|
||||
|
||||
/* reads until encountering a cmd, processing any recorded messages (io) on the
|
||||
* way */
|
||||
QXLCommandExt* spice_replay_next_cmd(SpiceReplay *replay, QXLWorker *worker);
|
||||
QXLCommandExt* spice_replay_next_cmd(SpiceReplay *replay, QXLInstance *instance);
|
||||
void spice_replay_free_cmd(SpiceReplay *replay, QXLCommandExt *cmd);
|
||||
void spice_replay_free(SpiceReplay *replay);
|
||||
SpiceReplay * spice_replay_new(FILE *file, int nsurfaces);
|
||||
|
||||
@ -43,7 +43,6 @@
|
||||
static SpiceCoreInterface *core;
|
||||
static SpiceServer *server;
|
||||
static SpiceReplay *replay;
|
||||
static QXLWorker *qxl_worker = NULL;
|
||||
static gboolean started = FALSE;
|
||||
static QXLInstance display_sin;
|
||||
static gint slow = 0;
|
||||
@ -74,7 +73,7 @@ static QXLDevMemSlot slot = {
|
||||
.qxl_ram_size = ~0,
|
||||
};
|
||||
|
||||
static void attach_worker(QXLInstance *qin, QXLWorker *_qxl_worker)
|
||||
static void attach_worker(QXLInstance *qin, SPICE_GNUC_UNUSED QXLWorker *_qxl_worker)
|
||||
{
|
||||
static int count = 0;
|
||||
if (++count > 1) {
|
||||
@ -82,7 +81,6 @@ static void attach_worker(QXLInstance *qin, QXLWorker *_qxl_worker)
|
||||
return;
|
||||
}
|
||||
g_debug("%s\n", __func__);
|
||||
qxl_worker = _qxl_worker;
|
||||
spice_qxl_add_memslot(qin, &slot);
|
||||
spice_server_vm_start(server);
|
||||
}
|
||||
@ -112,7 +110,7 @@ static gboolean fill_queue_idle(gpointer user_data)
|
||||
|
||||
while ((g_async_queue_length(display_queue) +
|
||||
g_async_queue_length(cursor_queue)) < 50) {
|
||||
QXLCommandExt *cmd = spice_replay_next_cmd(replay, qxl_worker);
|
||||
QXLCommandExt *cmd = spice_replay_next_cmd(replay, &display_sin);
|
||||
if (!cmd) {
|
||||
g_async_queue_push(display_queue, GINT_TO_POINTER(-1));
|
||||
g_async_queue_push(cursor_queue, GINT_TO_POINTER(-1));
|
||||
|
||||
@ -423,7 +423,7 @@ static QXLDevMemSlot slot = {
|
||||
.qxl_ram_size = ~0,
|
||||
};
|
||||
|
||||
static void attache_worker(QXLInstance *qin, QXLWorker *_qxl_worker)
|
||||
static void attache_worker(QXLInstance *qin, SPICE_GNUC_UNUSED QXLWorker *_qxl_worker)
|
||||
{
|
||||
Test *test = SPICE_CONTAINEROF(qin, Test, qxl_instance);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user