Coverage Report

Created: 2024-05-20 06:11

/src/FreeRDP/channels/rdpsnd/client/fake/rdpsnd_fake.c
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * Audio Output Virtual Channel
4
 *
5
 * Copyright 2019 Armin Novak <armin.novak@thincast.com>
6
 * Copyright 2019 Thincast Technologies GmbH
7
 *
8
 * Licensed under the Apache License, Version 2.0 (the "License");
9
 * you may not use this file except in compliance with the License.
10
 * You may obtain a copy of the License at
11
 *
12
 *     http://www.apache.org/licenses/LICENSE-2.0
13
 *
14
 * Unless required by applicable law or agreed to in writing, software
15
 * distributed under the License is distributed on an "AS IS" BASIS,
16
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
 * See the License for the specific language governing permissions and
18
 * limitations under the License.
19
 */
20
21
#include <freerdp/config.h>
22
23
#include <stdio.h>
24
#include <stdlib.h>
25
#include <string.h>
26
27
#include <winpr/crt.h>
28
#include <winpr/stream.h>
29
#include <winpr/cmdline.h>
30
31
#include <freerdp/types.h>
32
#include <freerdp/settings.h>
33
34
#include "rdpsnd_main.h"
35
36
typedef struct
37
{
38
  rdpsndDevicePlugin device;
39
} rdpsndFakePlugin;
40
41
static BOOL rdpsnd_fake_open(rdpsndDevicePlugin* device, const AUDIO_FORMAT* format, UINT32 latency)
42
0
{
43
0
  return TRUE;
44
0
}
45
46
static void rdpsnd_fake_close(rdpsndDevicePlugin* device)
47
0
{
48
0
}
49
50
static BOOL rdpsnd_fake_set_volume(rdpsndDevicePlugin* device, UINT32 value)
51
0
{
52
0
  return TRUE;
53
0
}
54
55
static void rdpsnd_fake_free(rdpsndDevicePlugin* device)
56
0
{
57
0
  rdpsndFakePlugin* fake = (rdpsndFakePlugin*)device;
58
59
0
  if (!fake)
60
0
    return;
61
62
0
  free(fake);
63
0
}
64
65
static BOOL rdpsnd_fake_format_supported(rdpsndDevicePlugin* device, const AUDIO_FORMAT* format)
66
0
{
67
0
  return TRUE;
68
0
}
69
70
static UINT rdpsnd_fake_play(rdpsndDevicePlugin* device, const BYTE* data, size_t size)
71
0
{
72
0
  return CHANNEL_RC_OK;
73
0
}
74
75
/**
76
 * Function description
77
 *
78
 * @return 0 on success, otherwise a Win32 error code
79
 */
80
static UINT rdpsnd_fake_parse_addin_args(rdpsndFakePlugin* fake, const ADDIN_ARGV* args)
81
0
{
82
0
  int status = 0;
83
0
  DWORD flags = 0;
84
0
  const COMMAND_LINE_ARGUMENT_A* arg = NULL;
85
0
  COMMAND_LINE_ARGUMENT_A rdpsnd_fake_args[] = { { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL } };
86
0
  flags =
87
0
      COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON | COMMAND_LINE_IGN_UNKNOWN_KEYWORD;
88
0
  status = CommandLineParseArgumentsA(args->argc, args->argv, rdpsnd_fake_args, flags, fake, NULL,
89
0
                                      NULL);
90
91
0
  if (status < 0)
92
0
    return ERROR_INVALID_DATA;
93
94
0
  arg = rdpsnd_fake_args;
95
96
0
  do
97
0
  {
98
0
    if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT))
99
0
      continue;
100
101
0
    CommandLineSwitchStart(arg) CommandLineSwitchEnd(arg)
102
0
  } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
103
104
0
  return CHANNEL_RC_OK;
105
0
}
106
107
/**
108
 * Function description
109
 *
110
 * @return 0 on success, otherwise a Win32 error code
111
 */
112
FREERDP_ENTRY_POINT(UINT fake_freerdp_rdpsnd_client_subsystem_entry(
113
    PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints))
114
0
{
115
0
  const ADDIN_ARGV* args = NULL;
116
0
  rdpsndFakePlugin* fake = NULL;
117
0
  UINT ret = CHANNEL_RC_OK;
118
0
  fake = (rdpsndFakePlugin*)calloc(1, sizeof(rdpsndFakePlugin));
119
120
0
  if (!fake)
121
0
    return CHANNEL_RC_NO_MEMORY;
122
123
0
  fake->device.Open = rdpsnd_fake_open;
124
0
  fake->device.FormatSupported = rdpsnd_fake_format_supported;
125
0
  fake->device.SetVolume = rdpsnd_fake_set_volume;
126
0
  fake->device.Play = rdpsnd_fake_play;
127
0
  fake->device.Close = rdpsnd_fake_close;
128
0
  fake->device.Free = rdpsnd_fake_free;
129
0
  args = pEntryPoints->args;
130
131
0
  if (args->argc > 1)
132
0
  {
133
0
    ret = rdpsnd_fake_parse_addin_args(fake, args);
134
135
0
    if (ret != CHANNEL_RC_OK)
136
0
    {
137
0
      WLog_ERR(TAG, "error parsing arguments");
138
0
      goto error;
139
0
    }
140
0
  }
141
142
0
  pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, &fake->device);
143
0
  return ret;
144
0
error:
145
0
  rdpsnd_fake_free(&fake->device);
146
0
  return ret;
147
0
}