Skip to content

Commit 8f9fe64

Browse files
committed
add: features for winebridge and server
1 parent d969ffa commit 8f9fe64

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

Cargo.toml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ name = "bottles-core"
33
version = "0.1.0"
44
edition = "2021"
55

6+
[features]
7+
default = []
8+
winebridge = ["dep:windows"]
9+
server = ["default"]
10+
611
[dependencies]
712
serde = { version = "1.0.217", features = ["derive"] }
813
serde_json = "1.0.134"
@@ -12,6 +17,17 @@ tonic = "0.12.3"
1217
tokio = { version = "1.28.2", features = ["full"] }
1318
prost = "0.13.4"
1419

20+
[dependencies.windows]
21+
version = "0.58.0"
22+
optional = true
23+
features = [
24+
"Data_Xml_Dom",
25+
"Win32_Foundation",
26+
"Win32_Security",
27+
"Win32_System_Threading",
28+
"Win32_UI_WindowsAndMessaging",
29+
]
30+
1531
[build-dependencies]
1632
tonic-build = "0.12.3"
1733

src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@ pub mod proto {
55
tonic::include_proto!("winebridge");
66
tonic::include_proto!("bottles");
77
}
8+
9+
#[cfg(feature = "winebridge")]
10+
pub mod winebridge;
11+
12+
#[cfg(feature = "server")]
13+
pub mod server;

src/server.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use crate::proto::{self, bottles_server::Bottles, wine_bridge_client::WineBridgeClient};
2+
3+
#[derive(Debug, Default)]
4+
pub struct BottlesService;
5+
6+
#[tonic::async_trait]
7+
impl Bottles for BottlesService {
8+
async fn health(
9+
&self,
10+
request: tonic::Request<proto::HealthRequest>,
11+
) -> Result<tonic::Response<proto::HealthResponse>, tonic::Status> {
12+
let request = request.get_ref();
13+
println!("Received request: {:?}", request);
14+
Ok(tonic::Response::new(proto::HealthResponse { ok: true }))
15+
}
16+
17+
async fn notify(
18+
&self,
19+
request: tonic::Request<proto::NotifyRequest>,
20+
) -> Result<tonic::Response<proto::NotifyResponse>, tonic::Status> {
21+
let request = request.get_ref();
22+
println!("Received request: {:?}", request);
23+
let mut client = WineBridgeClient::connect("http://[::1]:50051")
24+
.await
25+
.map_err(|e| tonic::Status::from_error(Box::new(e)))?;
26+
27+
let request = proto::MessageRequest {
28+
message: request.message.clone(),
29+
};
30+
let response = client.message(request).await?;
31+
let response = response.get_ref();
32+
Ok(tonic::Response::new(proto::NotifyResponse {
33+
success: response.success,
34+
}))
35+
}
36+
}

src/winebridge.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use super::proto::{self, wine_bridge_server::WineBridge};
2+
#[cfg(feature = "winebridge")]
3+
use windows::{
4+
core::{s, PCSTR},
5+
Win32::UI::WindowsAndMessaging::{MessageBoxA, MB_OK},
6+
};
7+
8+
#[derive(Debug, Default)]
9+
pub struct WineBridgeService;
10+
11+
#[tonic::async_trait]
12+
impl WineBridge for WineBridgeService {
13+
async fn message(
14+
&self,
15+
request: tonic::Request<proto::MessageRequest>,
16+
) -> Result<tonic::Response<proto::MessageResponse>, tonic::Status> {
17+
let request = request.get_ref();
18+
println!("Got a request: {:?}", request);
19+
let message = request.message.as_str();
20+
let c_message = std::ffi::CString::new(message).unwrap();
21+
unsafe {
22+
MessageBoxA(
23+
None,
24+
PCSTR(c_message.as_ptr() as *const u8),
25+
s!("Hello"),
26+
MB_OK,
27+
);
28+
}
29+
Ok(tonic::Response::new(proto::MessageResponse {
30+
success: true,
31+
}))
32+
}
33+
}

0 commit comments

Comments
 (0)