Start the drdynvc channel within xrdp_wm
The responsibility for starting the drdynvc channel is moved out of libxrdp into the application. This will make it easier to allow the application to check the channel is enabled before starting it.
This commit is contained in:
parent
0187daeb59
commit
697dcbb24d
@ -1406,6 +1406,23 @@ libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
int
|
||||||
|
libxrdp_drdynvc_start(struct xrdp_session *session)
|
||||||
|
{
|
||||||
|
struct xrdp_rdp *rdp;
|
||||||
|
struct xrdp_sec *sec;
|
||||||
|
struct xrdp_channel *chan;
|
||||||
|
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "libxrdp_drdynvc_start:");
|
||||||
|
|
||||||
|
rdp = (struct xrdp_rdp *) (session->rdp);
|
||||||
|
sec = rdp->sec_layer;
|
||||||
|
chan = sec->chan_layer;
|
||||||
|
return xrdp_channel_drdynvc_start(chan);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
int
|
int
|
||||||
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
|
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
|
||||||
|
@ -241,6 +241,8 @@ int
|
|||||||
libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
|
libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
|
||||||
int is_disabled);
|
int is_disabled);
|
||||||
int
|
int
|
||||||
|
libxrdp_drdynvc_start(struct xrdp_session *session);
|
||||||
|
int
|
||||||
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
|
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
|
||||||
int flags, struct xrdp_drdynvc_procs *procs,
|
int flags, struct xrdp_drdynvc_procs *procs,
|
||||||
int *chan_id);
|
int *chan_id);
|
||||||
|
@ -752,46 +752,53 @@ xrdp_channel_drdynvc_send_capability_request(struct xrdp_channel *self)
|
|||||||
int
|
int
|
||||||
xrdp_channel_drdynvc_start(struct xrdp_channel *self)
|
xrdp_channel_drdynvc_start(struct xrdp_channel *self)
|
||||||
{
|
{
|
||||||
int index;
|
int rv = 0;
|
||||||
int count;
|
LOG_DEVEL(LOG_LEVEL_INFO,
|
||||||
struct mcs_channel_item *ci;
|
"xrdp_channel_drdynvc_start: drdynvc_channel_id %d",
|
||||||
struct mcs_channel_item *dci;
|
self->drdynvc_channel_id);
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_INFO, "xrdp_channel_drdynvc_start: drdynvc_channel_id %d", self->drdynvc_channel_id);
|
|
||||||
if (self->drdynvc_channel_id != -1)
|
if (self->drdynvc_channel_id != -1)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_INFO, "xrdp_channel_drdynvc_start: already started");
|
LOG_DEVEL(LOG_LEVEL_INFO,
|
||||||
return 0;
|
"xrdp_channel_drdynvc_start: already started");
|
||||||
}
|
|
||||||
dci = NULL;
|
|
||||||
count = self->mcs_layer->channel_list->count;
|
|
||||||
for (index = 0; index < count; index++)
|
|
||||||
{
|
|
||||||
ci = (struct mcs_channel_item *)
|
|
||||||
list_get_item(self->mcs_layer->channel_list, index);
|
|
||||||
if (ci != NULL)
|
|
||||||
{
|
|
||||||
if (g_strcasecmp(ci->name, "drdynvc") == 0)
|
|
||||||
{
|
|
||||||
dci = ci;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (dci != NULL)
|
|
||||||
{
|
|
||||||
self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1;
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG,
|
|
||||||
"Initializing Dynamic Virtual Channel with channel id %d",
|
|
||||||
self->drdynvc_channel_id);
|
|
||||||
xrdp_channel_drdynvc_send_capability_request(self);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_WARNING,
|
int index;
|
||||||
"Dynamic Virtual Channel named 'drdynvc' not found, "
|
int count;
|
||||||
"channel not initialized");
|
struct mcs_channel_item *ci;
|
||||||
|
struct mcs_channel_item *dci;
|
||||||
|
dci = NULL;
|
||||||
|
count = self->mcs_layer->channel_list->count;
|
||||||
|
for (index = 0; index < count; index++)
|
||||||
|
{
|
||||||
|
ci = (struct mcs_channel_item *)
|
||||||
|
list_get_item(self->mcs_layer->channel_list, index);
|
||||||
|
if (ci != NULL)
|
||||||
|
{
|
||||||
|
if (g_strcasecmp(ci->name, DRDYNVC_SVC_CHANNEL_NAME) == 0)
|
||||||
|
{
|
||||||
|
dci = ci;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dci != NULL)
|
||||||
|
{
|
||||||
|
self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1;
|
||||||
|
LOG_DEVEL(LOG_LEVEL_DEBUG, DRDYNVC_SVC_CHANNEL_NAME
|
||||||
|
"Initializing Dynamic Virtual Channel with channel id %d",
|
||||||
|
self->drdynvc_channel_id);
|
||||||
|
xrdp_channel_drdynvc_send_capability_request(self);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_WARNING,
|
||||||
|
"Static channel '%s' not found. "
|
||||||
|
"Channel not initialized", DRDYNVC_SVC_CHANNEL_NAME);
|
||||||
|
rv = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1323,7 +1323,6 @@ xrdp_rdp_process_data_font(struct xrdp_rdp *self, struct stream *s)
|
|||||||
self->session->callback(self->session->id, 0x555a, 0, 0,
|
self->session->callback(self->session->id, 0x555a, 0, 0,
|
||||||
0, 0);
|
0, 0);
|
||||||
}
|
}
|
||||||
xrdp_channel_drdynvc_start(self->sec_layer->chan_layer);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2031,6 +2031,7 @@ callback(intptr_t id, int msg, intptr_t param1, intptr_t param2,
|
|||||||
LOWORD(param3), HIWORD(param3));
|
LOWORD(param3), HIWORD(param3));
|
||||||
case 0x555a:
|
case 0x555a:
|
||||||
// "yeah, up_and_running"
|
// "yeah, up_and_running"
|
||||||
|
libxrdp_drdynvc_start(wm->session);
|
||||||
xrdp_mm_up_and_running(wm->mm);
|
xrdp_mm_up_and_running(wm->mm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user