33
44use super :: { Message , SocketState } ;
55use cosmic:: iced:: Subscription ;
6+ use futures_channel:: mpsc:: Sender ;
67use futures_util:: SinkExt ;
78use greetd_ipc:: codec:: TokioCodec ;
89use std:: sync:: Arc ;
@@ -17,131 +18,127 @@ pub fn subscription() -> Subscription<Message> {
1718 Subscription :: run_with_id (
1819 std:: any:: TypeId :: of :: < GreetdSubscription > ( ) ,
1920 cosmic:: iced_futures:: stream:: channel ( 1 , |mut sender| async move {
20- let ( tx, mut rx) = mpsc:: channel :: < greetd_ipc:: Request > ( 1 ) ;
21+ let ( tx, rx) = mpsc:: channel :: < greetd_ipc:: Request > ( 1 ) ;
2122 _ = sender. send ( Message :: GreetdChannel ( tx) ) . await ;
23+ service ( sender, rx) . await
24+ } ) ,
25+ )
26+ }
2227
23- let socket_path =
24- std:: env:: var_os ( "GREETD_SOCK" ) . expect ( "GREETD_SOCK environment not set" ) ;
28+ pub async fn service ( mut sender : Sender < Message > , mut rx : mpsc :: Receiver < greetd_ipc :: Request > ) {
29+ let socket_path = std:: env:: var_os ( "GREETD_SOCK" ) . expect ( "GREETD_SOCK environment not set" ) ;
2530
26- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 1 ) ) ;
31+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 1 ) ) ;
2732
28- loop {
29- _ = sender. send ( Message :: Reconnect ) . await ;
33+ loop {
34+ _ = sender. send ( Message :: Reconnect ) . await ;
3035
31- let mut stream = match UnixStream :: connect ( & socket_path) . await {
32- Ok ( stream) => stream,
33- Err ( why) => {
34- log:: error!( "greetd IPC socket connection failed: {why:?}" ) ;
35- _ = sender. send ( Message :: Socket ( SocketState :: Error ( Arc :: new ( why) ) ) ) ;
36+ let mut stream = match UnixStream :: connect ( & socket_path) . await {
37+ Ok ( stream) => stream,
38+ Err ( why) => {
39+ log:: error!( "greetd IPC socket connection failed: {why:?}" ) ;
40+ _ = sender. send ( Message :: Socket ( SocketState :: Error ( Arc :: new ( why) ) ) ) ;
3641
37- break ;
38- }
39- } ;
42+ break ;
43+ }
44+ } ;
4045
41- _ = sender. send ( Message :: Socket ( SocketState :: Open ) ) . await ;
46+ _ = sender. send ( Message :: Socket ( SocketState :: Open ) ) . await ;
4247
43- while let Some ( request) = rx. recv ( ) . await {
44- if let Err ( why) = request. write_to ( & mut stream) . await {
45- log:: error!( "error writing to GREETD_SOCK stream: {why:?}" ) ;
46- break ;
47- }
48+ while let Some ( request) = rx. recv ( ) . await {
49+ if let Err ( why) = request. write_to ( & mut stream) . await {
50+ log:: error!( "error writing to GREETD_SOCK stream: {why:?}" ) ;
51+ break ;
52+ }
4853
49- match greetd_ipc:: Response :: read_from ( & mut stream) . await {
50- Ok ( response) => {
51- match response {
52- greetd_ipc:: Response :: AuthMessage {
53- auth_message_type,
54- auth_message,
55- } => match auth_message_type {
56- greetd_ipc:: AuthMessageType :: Secret => {
57- _ = sender
58- . send (
59- common:: Message :: Prompt (
60- auth_message,
61- true ,
62- Some ( String :: new ( ) ) ,
63- )
64- . into ( ) ,
65- )
66- . await ;
67- }
68- greetd_ipc:: AuthMessageType :: Visible => {
69- _ = sender
70- . send (
71- common:: Message :: Prompt (
72- auth_message,
73- false ,
74- Some ( String :: new ( ) ) ,
75- )
76- . into ( ) ,
77- )
78- . await ;
79- }
80- //TODO: treat error type differently?
81- greetd_ipc:: AuthMessageType :: Info
82- | greetd_ipc:: AuthMessageType :: Error => {
83- _ = sender
84- . send (
85- common:: Message :: Prompt ( auth_message, false , None )
86- . into ( ) ,
87- )
88- . await ;
89- }
90- } ,
91- greetd_ipc:: Response :: Error {
92- error_type : _,
93- description,
94- } => {
95- //TODO: use error_type?
96- match request {
97- greetd_ipc:: Request :: CancelSession => {
98- // Do not send errors for cancel session to gui
99- log:: warn!(
100- "error while cancelling session: {}" ,
101- description
102- ) ;
54+ match greetd_ipc:: Response :: read_from ( & mut stream) . await {
55+ Ok ( response) => {
56+ match response {
57+ greetd_ipc:: Response :: AuthMessage {
58+ auth_message_type,
59+ auth_message,
60+ } => match auth_message_type {
61+ greetd_ipc:: AuthMessageType :: Secret => {
62+ _ = sender
63+ . send (
64+ common:: Message :: Prompt (
65+ auth_message,
66+ true ,
67+ Some ( String :: new ( ) ) ,
68+ )
69+ . into ( ) ,
70+ )
71+ . await ;
72+ }
73+ greetd_ipc:: AuthMessageType :: Visible => {
74+ _ = sender
75+ . send (
76+ common:: Message :: Prompt (
77+ auth_message,
78+ false ,
79+ Some ( String :: new ( ) ) ,
80+ )
81+ . into ( ) ,
82+ )
83+ . await ;
84+ }
85+ //TODO: treat error type differently?
86+ greetd_ipc:: AuthMessageType :: Info
87+ | greetd_ipc:: AuthMessageType :: Error => {
88+ _ = sender
89+ . send ( common:: Message :: Prompt ( auth_message, false , None ) . into ( ) )
90+ . await ;
91+ }
92+ } ,
93+ greetd_ipc:: Response :: Error {
94+ error_type : _,
95+ description,
96+ } => {
97+ //TODO: use error_type?
98+ match request {
99+ greetd_ipc:: Request :: CancelSession => {
100+ // Do not send errors for cancel session to gui
101+ log:: warn!( "error while cancelling session: {}" , description) ;
103102
104- // Reconnect to socket
105- break ;
106- }
107- _ => {
108- _ = sender. send ( Message :: Error ( description) ) . await ;
109- }
110- }
103+ // Reconnect to socket
104+ break ;
105+ }
106+ _ => {
107+ _ = sender. send ( Message :: Error ( description) ) . await ;
111108 }
112- greetd_ipc:: Response :: Success => match request {
113- greetd_ipc:: Request :: CreateSession { .. } => {
114- // User has no auth required, proceed to login
115- _ = sender. send ( Message :: Login ) . await ;
116- }
117- greetd_ipc:: Request :: PostAuthMessageResponse { .. } => {
118- // All auth is completed, proceed to login
119- _ = sender. send ( Message :: Login ) . await ;
120- }
121- greetd_ipc:: Request :: StartSession { .. } => {
122- // Session has been started, exit greeter
123- _ = sender. send ( Message :: Exit ) . await ;
124- }
125- greetd_ipc:: Request :: CancelSession => {
126- log:: info!( "greetd IPC session canceled" ) ;
127- // Reconnect to socket
128- break ;
129- }
130- } ,
131109 }
132110 }
133- Err ( err) => {
134- log:: error!( "failed to read socket: {:?}" , err) ;
135- break ;
136- }
111+ greetd_ipc:: Response :: Success => match request {
112+ greetd_ipc:: Request :: CreateSession { .. } => {
113+ // User has no auth required, proceed to login
114+ _ = sender. send ( Message :: Login ) . await ;
115+ }
116+ greetd_ipc:: Request :: PostAuthMessageResponse { .. } => {
117+ // All auth is completed, proceed to login
118+ _ = sender. send ( Message :: Login ) . await ;
119+ }
120+ greetd_ipc:: Request :: StartSession { .. } => {
121+ // Session has been started, exit greeter
122+ _ = sender. send ( Message :: Exit ) . await ;
123+ }
124+ greetd_ipc:: Request :: CancelSession => {
125+ log:: info!( "greetd IPC session canceled" ) ;
126+ // Reconnect to socket
127+ break ;
128+ }
129+ } ,
137130 }
138131 }
139-
140- log:: info!( "reconnecting to greetd IPC socket" ) ;
141- interval. tick ( ) . await ;
132+ Err ( err) => {
133+ log:: error!( "failed to read socket: {:?}" , err) ;
134+ break ;
135+ }
142136 }
137+ }
143138
144- futures_util:: future:: pending ( ) . await
145- } ) ,
146- )
139+ log:: info!( "reconnecting to greetd IPC socket" ) ;
140+ interval. tick ( ) . await ;
141+ }
142+
143+ futures_util:: future:: pending ( ) . await
147144}
0 commit comments