xref: /aosp_15_r20/system/server_configurable_flags/aconfigd/srcs/AconfigdClientSocketImpl.java (revision 207333786ba243bc7d4d69ef6b05487aa7071806)
1*20733378SAndroid Build Coastguard Worker /*
2*20733378SAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*20733378SAndroid Build Coastguard Worker  *
4*20733378SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*20733378SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*20733378SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*20733378SAndroid Build Coastguard Worker  *
8*20733378SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*20733378SAndroid Build Coastguard Worker  *
10*20733378SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*20733378SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*20733378SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*20733378SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*20733378SAndroid Build Coastguard Worker  * limitations under the License.
15*20733378SAndroid Build Coastguard Worker  */
16*20733378SAndroid Build Coastguard Worker 
17*20733378SAndroid Build Coastguard Worker package android.aconfigd;
18*20733378SAndroid Build Coastguard Worker 
19*20733378SAndroid Build Coastguard Worker import android.net.LocalSocket;
20*20733378SAndroid Build Coastguard Worker import android.net.LocalSocketAddress;
21*20733378SAndroid Build Coastguard Worker import android.util.Slog;
22*20733378SAndroid Build Coastguard Worker 
23*20733378SAndroid Build Coastguard Worker import java.io.DataInputStream;
24*20733378SAndroid Build Coastguard Worker import java.io.DataOutputStream;
25*20733378SAndroid Build Coastguard Worker import java.io.IOException;
26*20733378SAndroid Build Coastguard Worker import java.io.InputStream;
27*20733378SAndroid Build Coastguard Worker 
28*20733378SAndroid Build Coastguard Worker /** @hide */
29*20733378SAndroid Build Coastguard Worker public class AconfigdClientSocketImpl implements AconfigdClientSocket {
30*20733378SAndroid Build Coastguard Worker 
31*20733378SAndroid Build Coastguard Worker     private static String TAG = "AconfigdClientSocketImpl";
32*20733378SAndroid Build Coastguard Worker 
33*20733378SAndroid Build Coastguard Worker     private LocalSocket mLocalSocket;
34*20733378SAndroid Build Coastguard Worker     private LocalSocketAddress mLocalSocketAddress;
35*20733378SAndroid Build Coastguard Worker 
AconfigdClientSocketImpl(LocalSocketAddress address)36*20733378SAndroid Build Coastguard Worker     public AconfigdClientSocketImpl(LocalSocketAddress address) {
37*20733378SAndroid Build Coastguard Worker         mLocalSocket = new LocalSocket();
38*20733378SAndroid Build Coastguard Worker         mLocalSocketAddress = address;
39*20733378SAndroid Build Coastguard Worker     }
40*20733378SAndroid Build Coastguard Worker 
AconfigdClientSocketImpl()41*20733378SAndroid Build Coastguard Worker     AconfigdClientSocketImpl() {
42*20733378SAndroid Build Coastguard Worker         this(new LocalSocketAddress(
43*20733378SAndroid Build Coastguard Worker                      "aconfigd_system",
44*20733378SAndroid Build Coastguard Worker                      LocalSocketAddress.Namespace.RESERVED));
45*20733378SAndroid Build Coastguard Worker     }
46*20733378SAndroid Build Coastguard Worker 
47*20733378SAndroid Build Coastguard Worker     /**
48*20733378SAndroid Build Coastguard Worker      * Connect the socket
49*20733378SAndroid Build Coastguard Worker      *
50*20733378SAndroid Build Coastguard Worker      * @hide
51*20733378SAndroid Build Coastguard Worker      */
connect()52*20733378SAndroid Build Coastguard Worker     public void connect() throws IOException {
53*20733378SAndroid Build Coastguard Worker         if (mLocalSocket.isConnected()) return;
54*20733378SAndroid Build Coastguard Worker         mLocalSocket.connect(mLocalSocketAddress);
55*20733378SAndroid Build Coastguard Worker     }
56*20733378SAndroid Build Coastguard Worker 
57*20733378SAndroid Build Coastguard Worker     /**
58*20733378SAndroid Build Coastguard Worker      * send request
59*20733378SAndroid Build Coastguard Worker      *
60*20733378SAndroid Build Coastguard Worker      * @param requests stream of requests
61*20733378SAndroid Build Coastguard Worker      * @hide
62*20733378SAndroid Build Coastguard Worker      */
63*20733378SAndroid Build Coastguard Worker     @Override
send(byte[] requests)64*20733378SAndroid Build Coastguard Worker     public InputStream send(byte[] requests) {
65*20733378SAndroid Build Coastguard Worker         if (!mLocalSocket.isConnected()) {
66*20733378SAndroid Build Coastguard Worker             try {
67*20733378SAndroid Build Coastguard Worker                 connect();
68*20733378SAndroid Build Coastguard Worker             } catch (IOException e) {
69*20733378SAndroid Build Coastguard Worker                 Slog.e(TAG, "fail to connect to the server socket", e);
70*20733378SAndroid Build Coastguard Worker                 return null;
71*20733378SAndroid Build Coastguard Worker             }
72*20733378SAndroid Build Coastguard Worker         }
73*20733378SAndroid Build Coastguard Worker 
74*20733378SAndroid Build Coastguard Worker         DataInputStream inputStream = null;
75*20733378SAndroid Build Coastguard Worker         DataOutputStream outputStream = null;
76*20733378SAndroid Build Coastguard Worker         try {
77*20733378SAndroid Build Coastguard Worker             inputStream = new DataInputStream(mLocalSocket.getInputStream());
78*20733378SAndroid Build Coastguard Worker             outputStream = new DataOutputStream(mLocalSocket.getOutputStream());
79*20733378SAndroid Build Coastguard Worker         } catch (IOException ioe) {
80*20733378SAndroid Build Coastguard Worker             Slog.e(TAG, "failed to get local socket iostreams", ioe);
81*20733378SAndroid Build Coastguard Worker             return null;
82*20733378SAndroid Build Coastguard Worker         }
83*20733378SAndroid Build Coastguard Worker 
84*20733378SAndroid Build Coastguard Worker         // send requests
85*20733378SAndroid Build Coastguard Worker         try {
86*20733378SAndroid Build Coastguard Worker             outputStream.writeInt(requests.length);
87*20733378SAndroid Build Coastguard Worker             outputStream.write(requests);
88*20733378SAndroid Build Coastguard Worker             Slog.i(TAG, "flag requests sent to aconfigd");
89*20733378SAndroid Build Coastguard Worker         } catch (IOException ioe) {
90*20733378SAndroid Build Coastguard Worker             Slog.e(TAG, "failed to send requests to aconfigd", ioe);
91*20733378SAndroid Build Coastguard Worker             return null;
92*20733378SAndroid Build Coastguard Worker         }
93*20733378SAndroid Build Coastguard Worker 
94*20733378SAndroid Build Coastguard Worker         // read return
95*20733378SAndroid Build Coastguard Worker         try {
96*20733378SAndroid Build Coastguard Worker             int num_bytes = inputStream.readInt();
97*20733378SAndroid Build Coastguard Worker             Slog.i(TAG, "received " + num_bytes + " bytes back from aconfigd");
98*20733378SAndroid Build Coastguard Worker             return mLocalSocket.getInputStream();
99*20733378SAndroid Build Coastguard Worker         } catch (IOException ioe) {
100*20733378SAndroid Build Coastguard Worker             Slog.e(TAG, "failed to read requests return from aconfigd", ioe);
101*20733378SAndroid Build Coastguard Worker             return null;
102*20733378SAndroid Build Coastguard Worker         }
103*20733378SAndroid Build Coastguard Worker     }
104*20733378SAndroid Build Coastguard Worker 
105*20733378SAndroid Build Coastguard Worker     /**
106*20733378SAndroid Build Coastguard Worker      * Close the local socket
107*20733378SAndroid Build Coastguard Worker      *
108*20733378SAndroid Build Coastguard Worker      * @hide
109*20733378SAndroid Build Coastguard Worker      */
110*20733378SAndroid Build Coastguard Worker     @Override
close()111*20733378SAndroid Build Coastguard Worker     public void close() {
112*20733378SAndroid Build Coastguard Worker         try {
113*20733378SAndroid Build Coastguard Worker             mLocalSocket.shutdownInput();
114*20733378SAndroid Build Coastguard Worker             mLocalSocket.shutdownOutput();
115*20733378SAndroid Build Coastguard Worker             mLocalSocket.close();
116*20733378SAndroid Build Coastguard Worker         } catch (IOException e) {
117*20733378SAndroid Build Coastguard Worker             Slog.e(TAG, "failed to close socket", e);
118*20733378SAndroid Build Coastguard Worker         }
119*20733378SAndroid Build Coastguard Worker     }
120*20733378SAndroid Build Coastguard Worker 
121*20733378SAndroid Build Coastguard Worker }
122