Fix changelog email address
[freerdp-ubuntu-pcb-backport.git] / libfreerdp-core / mcs.h
1 /**
2  * FreeRDP: A Remote Desktop Protocol Client
3  * T.125 Multipoint Communication Service (MCS) Protocol
4  *
5  * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 #ifndef __MCS_H
21 #define __MCS_H
22
23 #include "ber.h"
24 #include "transport.h"
25
26 #include <freerdp/types.h>
27 #include <freerdp/utils/stream.h>
28
29 #define MCS_BASE_CHANNEL_ID     1001
30 #define MCS_GLOBAL_CHANNEL_ID   1003
31
32 enum MCS_Result
33 {
34         MCS_Result_successful = 0,
35         MCS_Result_domain_merging = 1,
36         MCS_Result_domain_not_hierarchical = 2,
37         MCS_Result_no_such_channel = 3,
38         MCS_Result_no_such_domain = 4,
39         MCS_Result_no_such_user = 5,
40         MCS_Result_not_admitted = 6,
41         MCS_Result_other_user_id = 7,
42         MCS_Result_parameters_unacceptable = 8,
43         MCS_Result_token_not_available = 9,
44         MCS_Result_token_not_possessed = 10,
45         MCS_Result_too_many_channels = 11,
46         MCS_Result_too_many_tokens = 12,
47         MCS_Result_too_many_users = 13,
48         MCS_Result_unspecified_failure = 14,
49         MCS_Result_user_rejected = 15,
50         MCS_Result_enum_length = 16
51 };
52
53 enum DomainMCSPDU
54 {
55         DomainMCSPDU_PlumbDomainIndication = 0,
56         DomainMCSPDU_ErectDomainRequest = 1,
57         DomainMCSPDU_MergeChannelsRequest = 2,
58         DomainMCSPDU_MergeChannelsConfirm = 3,
59         DomainMCSPDU_PurgeChannelsIndication = 4,
60         DomainMCSPDU_MergeTokensRequest = 5,
61         DomainMCSPDU_MergeTokensConfirm = 6,
62         DomainMCSPDU_PurgeTokensIndication = 7,
63         DomainMCSPDU_DisconnectProviderUltimatum = 8,
64         DomainMCSPDU_RejectMCSPDUUltimatum = 9,
65         DomainMCSPDU_AttachUserRequest = 10,
66         DomainMCSPDU_AttachUserConfirm = 11,
67         DomainMCSPDU_DetachUserRequest = 12,
68         DomainMCSPDU_DetachUserIndication = 13,
69         DomainMCSPDU_ChannelJoinRequest = 14,
70         DomainMCSPDU_ChannelJoinConfirm = 15,
71         DomainMCSPDU_ChannelLeaveRequest = 16,
72         DomainMCSPDU_ChannelConveneRequest = 17,
73         DomainMCSPDU_ChannelConveneConfirm = 18,
74         DomainMCSPDU_ChannelDisbandRequest = 19,
75         DomainMCSPDU_ChannelDisbandIndication = 20,
76         DomainMCSPDU_ChannelAdmitRequest = 21,
77         DomainMCSPDU_ChannelAdmitIndication = 22,
78         DomainMCSPDU_ChannelExpelRequest = 23,
79         DomainMCSPDU_ChannelExpelIndication = 24,
80         DomainMCSPDU_SendDataRequest = 25,
81         DomainMCSPDU_SendDataIndication = 26,
82         DomainMCSPDU_UniformSendDataRequest = 27,
83         DomainMCSPDU_UniformSendDataIndication = 28,
84         DomainMCSPDU_TokenGrabRequest = 29,
85         DomainMCSPDU_TokenGrabConfirm = 30,
86         DomainMCSPDU_TokenInhibitRequest = 31,
87         DomainMCSPDU_TokenInhibitConfirm = 32,
88         DomainMCSPDU_TokenGiveRequest = 33,
89         DomainMCSPDU_TokenGiveIndication = 34,
90         DomainMCSPDU_TokenGiveResponse = 35,
91         DomainMCSPDU_TokenGiveConfirm = 36,
92         DomainMCSPDU_TokenPleaseRequest = 37,
93         DomainMCSPDU_TokenPleaseConfirm = 38,
94         DomainMCSPDU_TokenReleaseRequest = 39,
95         DomainMCSPDU_TokenReleaseConfirm = 40,
96         DomainMCSPDU_TokenTestRequest = 41,
97         DomainMCSPDU_TokenTestConfirm = 42,
98         DomainMCSPDU_enum_length = 43
99 };
100
101 typedef struct
102 {
103         uint32 maxChannelIds;
104         uint32 maxUserIds;
105         uint32 maxTokenIds;
106         uint32 numPriorities;
107         uint32 minThroughput;
108         uint32 maxHeight;
109         uint32 maxMCSPDUsize;
110         uint32 protocolVersion;
111 } DomainParameters;
112
113 struct rdp_mcs
114 {
115         uint16 user_id;
116         struct rdp_transport* transport;
117         DomainParameters domainParameters;
118         DomainParameters targetParameters;
119         DomainParameters minimumParameters;
120         DomainParameters maximumParameters;
121
122         boolean user_channel_joined;
123         boolean global_channel_joined;
124 };
125 typedef struct rdp_mcs rdpMcs;
126
127 #define MCS_SEND_DATA_HEADER_MAX_LENGTH         8
128
129 #define MCS_TYPE_CONNECT_INITIAL                0x65
130 #define MCS_TYPE_CONNECT_RESPONSE               0x66
131
132 void mcs_write_connect_initial(STREAM* s, rdpMcs* mcs, STREAM* user_data);
133 void mcs_write_connect_response(STREAM* s, rdpMcs* mcs, STREAM* user_data);
134
135 boolean mcs_recv_connect_initial(rdpMcs* mcs, STREAM* s);
136 boolean mcs_send_connect_initial(rdpMcs* mcs);
137 boolean mcs_recv_connect_response(rdpMcs* mcs, STREAM* s);
138 boolean mcs_send_connect_response(rdpMcs* mcs);
139 boolean mcs_recv_erect_domain_request(rdpMcs* mcs, STREAM* s);
140 boolean mcs_send_erect_domain_request(rdpMcs* mcs);
141 boolean mcs_recv_attach_user_request(rdpMcs* mcs, STREAM* s);
142 boolean mcs_send_attach_user_request(rdpMcs* mcs);
143 boolean mcs_recv_attach_user_confirm(rdpMcs* mcs, STREAM* s);
144 boolean mcs_send_attach_user_confirm(rdpMcs* mcs);
145 boolean mcs_recv_channel_join_request(rdpMcs* mcs, STREAM* s, uint16* channel_id);
146 boolean mcs_send_channel_join_request(rdpMcs* mcs, uint16 channel_id);
147 boolean mcs_recv_channel_join_confirm(rdpMcs* mcs, STREAM* s, uint16* channel_id);
148 boolean mcs_send_channel_join_confirm(rdpMcs* mcs, uint16 channel_id);
149 boolean mcs_send_disconnect_provider_ultimatum(rdpMcs* mcs);
150 boolean mcs_read_domain_mcspdu_header(STREAM* s, enum DomainMCSPDU* domainMCSPDU, uint16* length);
151 void mcs_write_domain_mcspdu_header(STREAM* s, enum DomainMCSPDU domainMCSPDU, uint16 length, uint8 options);
152
153 rdpMcs* mcs_new(rdpTransport* transport);
154 void mcs_free(rdpMcs* mcs);
155
156 #endif /* __MCS_H */