Skip to content

Commit 973f7f1

Browse files
committed
fix incorrect reading of data
fix not halting sending packets after disconnect
1 parent adf6ce0 commit 973f7f1

File tree

1 file changed

+78
-84
lines changed

1 file changed

+78
-84
lines changed

src/lib.rs

Lines changed: 78 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,32 @@ macro_rules! as_c_string {
1414
}
1515
pub enum DispatchResult {
1616
Null,
17-
Exception(SIMCONNECT_RECV_EXCEPTION),
18-
Open(SIMCONNECT_RECV_OPEN),
19-
Quit(SIMCONNECT_RECV_QUIT),
20-
Event(SIMCONNECT_RECV_EVENT),
21-
EventObjectAddRemove(SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE),
22-
EventFilename(SIMCONNECT_RECV_EVENT_FILENAME),
23-
EventFrame(SIMCONNECT_RECV_EVENT_FRAME),
24-
SimobjectData(SIMCONNECT_RECV_SIMOBJECT_DATA),
25-
SimobjectDataBytype(SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE),
26-
WeatherObservation(SIMCONNECT_RECV_WEATHER_OBSERVATION),
27-
CloudState(SIMCONNECT_RECV_CLOUD_STATE),
28-
AssignedObjectId(SIMCONNECT_RECV_ASSIGNED_OBJECT_ID),
29-
ReservedKey(SIMCONNECT_RECV_RESERVED_KEY),
30-
CustomAction(SIMCONNECT_RECV_CUSTOM_ACTION),
31-
SystemState(SIMCONNECT_RECV_SYSTEM_STATE),
32-
ClientData(SIMCONNECT_RECV_CLIENT_DATA),
33-
EventWeatherMode(SIMCONNECT_RECV_EVENT_WEATHER_MODE),
34-
AirportList(SIMCONNECT_RECV_AIRPORT_LIST),
35-
VorList(SIMCONNECT_RECV_VOR_LIST),
36-
NdbList(SIMCONNECT_RECV_NDB_LIST),
37-
WaypointList(SIMCONNECT_RECV_WAYPOINT_LIST),
38-
EventMultiplayerServerStarted(SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED),
39-
EventMultiplayerClientStarted(SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED),
40-
EventMultiplayerSessionEnded(SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED),
41-
EventRaceEnd(SIMCONNECT_RECV_EVENT_RACE_END),
42-
EventRaceLap(SIMCONNECT_RECV_EVENT_RACE_LAP),
17+
Exception(*const SIMCONNECT_RECV_EXCEPTION),
18+
Open(*const SIMCONNECT_RECV_OPEN),
19+
Quit(*const SIMCONNECT_RECV_QUIT),
20+
Event(*const SIMCONNECT_RECV_EVENT),
21+
EventObjectAddRemove(*const SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE),
22+
EventFilename(*const SIMCONNECT_RECV_EVENT_FILENAME),
23+
EventFrame(*const SIMCONNECT_RECV_EVENT_FRAME),
24+
SimobjectData(*const SIMCONNECT_RECV_SIMOBJECT_DATA),
25+
SimobjectDataBytype(*const SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE),
26+
WeatherObservation(*const SIMCONNECT_RECV_WEATHER_OBSERVATION),
27+
CloudState(*const SIMCONNECT_RECV_CLOUD_STATE),
28+
AssignedObjectId(*const SIMCONNECT_RECV_ASSIGNED_OBJECT_ID),
29+
ReservedKey(*const SIMCONNECT_RECV_RESERVED_KEY),
30+
CustomAction(*const SIMCONNECT_RECV_CUSTOM_ACTION),
31+
SystemState(*const SIMCONNECT_RECV_SYSTEM_STATE),
32+
ClientData(*const SIMCONNECT_RECV_CLIENT_DATA),
33+
EventWeatherMode(*const SIMCONNECT_RECV_EVENT_WEATHER_MODE),
34+
AirportList(*const SIMCONNECT_RECV_AIRPORT_LIST),
35+
VorList(*const SIMCONNECT_RECV_VOR_LIST),
36+
NdbList(*const SIMCONNECT_RECV_NDB_LIST),
37+
WaypointList(*const SIMCONNECT_RECV_WAYPOINT_LIST),
38+
EventMultiplayerServerStarted(*const SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED),
39+
EventMultiplayerClientStarted(*const SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED),
40+
EventMultiplayerSessionEnded(*const SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED),
41+
EventRaceEnd(*const SIMCONNECT_RECV_EVENT_RACE_END),
42+
EventRaceLap(*const SIMCONNECT_RECV_EVENT_RACE_LAP),
4343
}
4444

4545
pub struct SimConnector {
@@ -87,121 +87,115 @@ impl SimConnector {
8787
return match (*data_buf).dwID as SIMCONNECT_RECV_ID {
8888
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_NULL => Ok(DispatchResult::Null),
8989
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EXCEPTION => {
90-
let point: *const SIMCONNECT_RECV_EXCEPTION = mem::transmute_copy(&data_buf);
91-
return Ok(DispatchResult::Exception(*point));
90+
let point:*const SIMCONNECT_RECV_EXCEPTION = mem::transmute_copy(&data_buf);
91+
return Ok(DispatchResult::Exception(point));
9292
}
9393
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_OPEN => {
94-
let point: *const SIMCONNECT_RECV_OPEN = mem::transmute_copy(&data_buf);
95-
return Ok(DispatchResult::Open(*point))
94+
let point:*const SIMCONNECT_RECV_OPEN = mem::transmute_copy(&data_buf);
95+
return Ok(DispatchResult::Open(point));
9696
}
9797
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_QUIT => {
98-
let point: *const SIMCONNECT_RECV_QUIT = mem::transmute_copy(&data_buf);
99-
return Ok(DispatchResult::Quit(*point))
98+
let point:*const SIMCONNECT_RECV_QUIT = mem::transmute_copy(&data_buf);
99+
return Ok(DispatchResult::Quit(point));
100100
}
101101
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT => {
102-
let point: *const SIMCONNECT_RECV_EVENT = mem::transmute_copy(&data_buf);
103-
return Ok(DispatchResult::Event(*point))
102+
let point:*const SIMCONNECT_RECV_EVENT = mem::transmute_copy(&data_buf);
103+
return Ok(DispatchResult::Event(point));
104104
}
105105
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE => {
106-
let point: *const SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE = mem::transmute_copy(&data_buf);
107-
return Ok(DispatchResult::EventObjectAddRemove(*point))
106+
let point:*const SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE = mem::transmute_copy(&data_buf);
107+
return Ok(DispatchResult::EventObjectAddRemove(point));
108108
}
109109
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_FILENAME => {
110-
let point: *const SIMCONNECT_RECV_EVENT_FILENAME = mem::transmute_copy(&data_buf);
111-
return Ok(DispatchResult::EventFilename(*point))
110+
let point:*const SIMCONNECT_RECV_EVENT_FILENAME = mem::transmute_copy(&data_buf);
111+
return Ok(DispatchResult::EventFilename(point));
112112
}
113113
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_FRAME => {
114-
let point: *const SIMCONNECT_RECV_EVENT_FRAME = mem::transmute_copy(&data_buf);
115-
return Ok(DispatchResult::EventFrame(*point))
114+
let point:*const SIMCONNECT_RECV_EVENT_FRAME = mem::transmute_copy(&data_buf);
115+
return Ok(DispatchResult::EventFrame(point));
116116
}
117117
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_SIMOBJECT_DATA => {
118-
let point: *const SIMCONNECT_RECV_SIMOBJECT_DATA = mem::transmute_copy(&data_buf);
119-
return Ok(DispatchResult::SimobjectData(*point))
118+
let point:*const SIMCONNECT_RECV_SIMOBJECT_DATA = mem::transmute_copy(&data_buf);
119+
return Ok(DispatchResult::SimobjectData(point));
120120
}
121121
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE => {
122-
let point: *const SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE = mem::transmute_copy(&data_buf);
123-
return Ok(DispatchResult::SimobjectDataBytype(*point))
122+
let point:*const SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE = mem::transmute_copy(&data_buf);
123+
return Ok(DispatchResult::SimobjectDataBytype(point));
124124
}
125125
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_WEATHER_OBSERVATION => {
126-
let point: *const SIMCONNECT_RECV_WEATHER_OBSERVATION = mem::transmute_copy(&data_buf);
127-
return Ok(DispatchResult::WeatherObservation(*point))
126+
let point:*const SIMCONNECT_RECV_WEATHER_OBSERVATION = mem::transmute_copy(&data_buf);
127+
return Ok(DispatchResult::WeatherObservation(point));
128128
}
129129
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_CLOUD_STATE => {
130-
let point: *const SIMCONNECT_RECV_CLOUD_STATE = mem::transmute_copy(&data_buf);
131-
return Ok(DispatchResult::CloudState(*point))
130+
let point:*const SIMCONNECT_RECV_CLOUD_STATE = mem::transmute_copy(&data_buf);
131+
return Ok(DispatchResult::CloudState(point));
132132
}
133133
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID => {
134-
let point: *const SIMCONNECT_RECV_ASSIGNED_OBJECT_ID = mem::transmute_copy(&data_buf);
135-
return Ok(DispatchResult::AssignedObjectId(*point))
134+
let point:*const SIMCONNECT_RECV_ASSIGNED_OBJECT_ID = mem::transmute_copy(&data_buf);
135+
return Ok(DispatchResult::AssignedObjectId(point));
136136
}
137137
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_RESERVED_KEY => {
138-
let point: *const SIMCONNECT_RECV_RESERVED_KEY = mem::transmute_copy(&data_buf);
139-
return Ok(DispatchResult::ReservedKey(*point))
138+
let point:*const SIMCONNECT_RECV_RESERVED_KEY = mem::transmute_copy(&data_buf);
139+
return Ok(DispatchResult::ReservedKey(point));
140140
}
141141
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_CUSTOM_ACTION => {
142-
let point: *const SIMCONNECT_RECV_CUSTOM_ACTION = mem::transmute_copy(&data_buf);
143-
return Ok(DispatchResult::CustomAction(*point))
142+
let point:*const SIMCONNECT_RECV_CUSTOM_ACTION = mem::transmute_copy(&data_buf);
143+
return Ok(DispatchResult::CustomAction(point));
144144
}
145145
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_SYSTEM_STATE => {
146-
let point: *const SIMCONNECT_RECV_SYSTEM_STATE = mem::transmute_copy(&data_buf);
147-
return Ok(DispatchResult::SystemState(*point))
146+
let point:*const SIMCONNECT_RECV_SYSTEM_STATE = mem::transmute_copy(&data_buf);
147+
return Ok(DispatchResult::SystemState(point));
148148
}
149149
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_CLIENT_DATA => {
150-
let point: *const SIMCONNECT_RECV_CLIENT_DATA = mem::transmute_copy(&data_buf);
151-
return Ok(DispatchResult::ClientData(*point))
150+
let point:*const SIMCONNECT_RECV_CLIENT_DATA = mem::transmute_copy(&data_buf);
151+
return Ok(DispatchResult::ClientData(point));
152152
}
153153
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE => {
154-
let point: *const SIMCONNECT_RECV_EVENT_WEATHER_MODE = mem::transmute_copy(&data_buf);
155-
return Ok(DispatchResult::EventWeatherMode(*point))
154+
let point:*const SIMCONNECT_RECV_EVENT_WEATHER_MODE = mem::transmute_copy(&data_buf);
155+
return Ok(DispatchResult::EventWeatherMode(point));
156156
}
157157
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_AIRPORT_LIST => {
158-
let point: *const SIMCONNECT_RECV_AIRPORT_LIST = mem::transmute_copy(&data_buf);
159-
return Ok(DispatchResult::AirportList(*point))
158+
let point:*const SIMCONNECT_RECV_AIRPORT_LIST = mem::transmute_copy(&data_buf);
159+
return Ok(DispatchResult::AirportList(point));
160160
}
161161
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_VOR_LIST => {
162-
let point: *const SIMCONNECT_RECV_VOR_LIST = mem::transmute_copy(&data_buf);
163-
return Ok(DispatchResult::VorList(*point))
162+
let point:*const SIMCONNECT_RECV_VOR_LIST = mem::transmute_copy(&data_buf);
163+
return Ok(DispatchResult::VorList(point));
164164
}
165165
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_NDB_LIST => {
166-
let point: *const SIMCONNECT_RECV_NDB_LIST = mem::transmute_copy(&data_buf);
167-
return Ok(DispatchResult::NdbList(*point))
166+
let point:*const SIMCONNECT_RECV_NDB_LIST = mem::transmute_copy(&data_buf);
167+
return Ok(DispatchResult::NdbList(point));
168168
}
169169
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_WAYPOINT_LIST => {
170-
let point: *const SIMCONNECT_RECV_WAYPOINT_LIST = mem::transmute_copy(&data_buf);
171-
return Ok(DispatchResult::WaypointList(*point))
170+
let point:*const SIMCONNECT_RECV_WAYPOINT_LIST = mem::transmute_copy(&data_buf);
171+
return Ok(DispatchResult::WaypointList(point));
172172
}
173173
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED => {
174-
let point: *const SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED = mem::transmute_copy(&data_buf);
175-
return Ok(DispatchResult::EventMultiplayerServerStarted(*point))
174+
let point:*const SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED = mem::transmute_copy(&data_buf);
175+
return Ok(DispatchResult::EventMultiplayerServerStarted(point));
176176
}
177177
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED => {
178-
let point: *const SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED = mem::transmute_copy(&data_buf);
179-
return Ok(DispatchResult::EventMultiplayerClientStarted(*point))
178+
let point:*const SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED = mem::transmute_copy(&data_buf);
179+
return Ok(DispatchResult::EventMultiplayerClientStarted(point));
180180
}
181181
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED => {
182-
let point: *const SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED = mem::transmute_copy(&data_buf);
183-
return Ok(DispatchResult::EventMultiplayerSessionEnded(*point))
182+
let point:*const SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED = mem::transmute_copy(&data_buf);
183+
return Ok(DispatchResult::EventMultiplayerSessionEnded(point));
184184
}
185185
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_RACE_END => {
186-
let point: *const SIMCONNECT_RECV_EVENT_RACE_END = mem::transmute_copy(&data_buf);
187-
return Ok(DispatchResult::EventRaceEnd(*point))
186+
let point:*const SIMCONNECT_RECV_EVENT_RACE_END = mem::transmute_copy(&data_buf);
187+
return Ok(DispatchResult::EventRaceEnd(point));
188188
}
189189
SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT_RACE_LAP => {
190-
let point: *const SIMCONNECT_RECV_EVENT_RACE_LAP = mem::transmute_copy(&data_buf);
191-
return Ok(DispatchResult::EventRaceLap(*point))
190+
let point:*const SIMCONNECT_RECV_EVENT_RACE_LAP = mem::transmute_copy(&data_buf);
191+
return Ok(DispatchResult::EventRaceLap(point));
192192
}
193193
_ => Err("Unhandled RECV_ID")
194194
}
195195
}
196196
}
197197
}
198198

199-
pub fn get_data_as_struct<T>(data: DWORD) -> T {
200-
unsafe {
201-
return mem::transmute_copy(&data);
202-
}
203-
}
204-
205199
#[cfg(test)]
206200
mod tests {
207201
use super::*;

0 commit comments

Comments
 (0)