1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * RDP Server Peer
4  *
5  * Copyright 2011 Vic Lee
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 FREERDP_PEER_H
21 #define FREERDP_PEER_H
22 
23 #include <freerdp/api.h>
24 #include <freerdp/types.h>
25 #include <freerdp/settings.h>
26 #include <freerdp/input.h>
27 #include <freerdp/update.h>
28 #include <freerdp/autodetect.h>
29 
30 #include <winpr/sspi.h>
31 #include <winpr/ntlm.h>
32 
33 typedef BOOL (*psPeerContextNew)(freerdp_peer* peer, rdpContext* context);
34 typedef void (*psPeerContextFree)(freerdp_peer* peer, rdpContext* context);
35 
36 typedef BOOL (*psPeerInitialize)(freerdp_peer* peer);
37 typedef BOOL (*psPeerGetFileDescriptor)(freerdp_peer* peer, void** rfds, int* rcount);
38 typedef HANDLE (*psPeerGetEventHandle)(freerdp_peer* peer);
39 typedef DWORD (*psPeerGetEventHandles)(freerdp_peer* peer, HANDLE* events, DWORD count);
40 typedef HANDLE (*psPeerGetReceiveEventHandle)(freerdp_peer* peer);
41 typedef BOOL (*psPeerCheckFileDescriptor)(freerdp_peer* peer);
42 typedef BOOL (*psPeerIsWriteBlocked)(freerdp_peer* peer);
43 typedef int (*psPeerDrainOutputBuffer)(freerdp_peer* peer);
44 typedef BOOL (*psPeerHasMoreToRead)(freerdp_peer* peer);
45 typedef BOOL (*psPeerClose)(freerdp_peer* peer);
46 typedef void (*psPeerDisconnect)(freerdp_peer* peer);
47 typedef BOOL (*psPeerCapabilities)(freerdp_peer* peer);
48 typedef BOOL (*psPeerPostConnect)(freerdp_peer* peer);
49 typedef BOOL (*psPeerActivate)(freerdp_peer* peer);
50 typedef BOOL (*psPeerLogon)(freerdp_peer* peer, SEC_WINNT_AUTH_IDENTITY* identity, BOOL automatic);
51 typedef BOOL (*psPeerAdjustMonitorsLayout)(freerdp_peer* peer);
52 typedef BOOL (*psPeerClientCapabilities)(freerdp_peer* peer);
53 
54 typedef BOOL (*psPeerSendChannelData)(freerdp_peer* peer, UINT16 channelId, const BYTE* data,
55                                       size_t size);
56 typedef BOOL (*psPeerReceiveChannelData)(freerdp_peer* peer, UINT16 channelId, const BYTE* data,
57                                          size_t size, UINT32 flags, size_t totalSize);
58 
59 typedef HANDLE (*psPeerVirtualChannelOpen)(freerdp_peer* peer, const char* name, UINT32 flags);
60 typedef BOOL (*psPeerVirtualChannelClose)(freerdp_peer* peer, HANDLE hChannel);
61 typedef int (*psPeerVirtualChannelRead)(freerdp_peer* peer, HANDLE hChannel, BYTE* buffer,
62                                         UINT32 length);
63 typedef int (*psPeerVirtualChannelWrite)(freerdp_peer* peer, HANDLE hChannel, const BYTE* buffer,
64                                          UINT32 length);
65 typedef void* (*psPeerVirtualChannelGetData)(freerdp_peer* peer, HANDLE hChannel);
66 typedef int (*psPeerVirtualChannelSetData)(freerdp_peer* peer, HANDLE hChannel, void* data);
67 
68 /** @brief the result of the license callback */
69 typedef enum
70 {
71 	LICENSE_CB_INTERNAL_ERROR, /** an internal error happened in the callback */
72 	LICENSE_CB_ABORT,          /** licensing process failed, abort the connection */
73 	LICENSE_CB_IN_PROGRESS, /** incoming packet has been treated, we're waiting for further packets
74 	                           to complete the workflow */
75 	LICENSE_CB_COMPLETED    /** the licensing workflow has completed, go to next step */
76 } LicenseCallbackResult;
77 
78 typedef LicenseCallbackResult (*psPeerLicenseCallback)(freerdp_peer* peer, wStream* s);
79 
80 struct rdp_freerdp_peer
81 {
82 	rdpContext* context;
83 
84 	int sockfd;
85 	char hostname[50];
86 
87 	rdpInput* input;
88 	rdpUpdate* update;
89 	rdpSettings* settings;
90 	rdpAutoDetect* autodetect;
91 
92 	void* ContextExtra;
93 	size_t ContextSize;
94 	psPeerContextNew ContextNew;
95 	psPeerContextFree ContextFree;
96 
97 	psPeerInitialize Initialize;
98 	psPeerGetFileDescriptor GetFileDescriptor;
99 	psPeerGetEventHandle GetEventHandle;
100 	psPeerGetReceiveEventHandle GetReceiveEventHandle;
101 	psPeerCheckFileDescriptor CheckFileDescriptor;
102 	psPeerClose Close;
103 	psPeerDisconnect Disconnect;
104 
105 	psPeerCapabilities Capabilities;
106 	psPeerPostConnect PostConnect;
107 	psPeerActivate Activate;
108 	psPeerLogon Logon;
109 
110 	psPeerSendChannelData SendChannelData;
111 	psPeerReceiveChannelData ReceiveChannelData;
112 
113 	psPeerVirtualChannelOpen VirtualChannelOpen;
114 	psPeerVirtualChannelClose VirtualChannelClose;
115 	psPeerVirtualChannelRead VirtualChannelRead;
116 	psPeerVirtualChannelWrite VirtualChannelWrite;
117 	psPeerVirtualChannelGetData VirtualChannelGetData;
118 	psPeerVirtualChannelSetData VirtualChannelSetData;
119 
120 	int pId;
121 	UINT32 ack_frame_id;
122 	BOOL local;
123 	BOOL connected;
124 	BOOL activated;
125 	BOOL authenticated;
126 	SEC_WINNT_AUTH_IDENTITY identity;
127 
128 	psPeerIsWriteBlocked IsWriteBlocked;
129 	psPeerDrainOutputBuffer DrainOutputBuffer;
130 	psPeerHasMoreToRead HasMoreToRead;
131 	psPeerGetEventHandles GetEventHandles;
132 	psPeerAdjustMonitorsLayout AdjustMonitorsLayout;
133 	psPeerClientCapabilities ClientCapabilities;
134 	psPeerComputeNtlmHash ComputeNtlmHash;
135 	psPeerLicenseCallback LicenseCallback;
136 };
137 
138 #ifdef __cplusplus
139 extern "C"
140 {
141 #endif
142 
143 	FREERDP_API BOOL freerdp_peer_context_new(freerdp_peer* client);
144 	FREERDP_API void freerdp_peer_context_free(freerdp_peer* client);
145 
146 	FREERDP_API freerdp_peer* freerdp_peer_new(int sockfd);
147 	FREERDP_API void freerdp_peer_free(freerdp_peer* client);
148 
149 #ifdef __cplusplus
150 }
151 #endif
152 
153 #endif /* FREERDP_PEER_H */
154