1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.telephony.tools.configdatagenerate;
18 
19 import com.android.internal.telephony.satellite.SatelliteConfigData;
20 
21 import com.google.protobuf.ByteString;
22 
23 import java.io.File;
24 import java.io.FileInputStream;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 
29 public class SatelliteConfigProtoGenerator {
30 
31     private static final String TAG = "ProtoGenerator";
32     public static String sProtoResultFile = "telephony_config.pb";
33     public static int sVersion;
34     public static ArrayList<ServiceProto> sServiceProtoList;
35     public static RegionProto sRegionProto;
36 
37     /**
38      * Generate Protobuf.
39      *
40      * The output file is a binary file of TelephonyConfigProto.
41      *
42      * The format of TelephonyConfigProto is defined in
43      * https://source.corp.google.com/android/frameworks/opt/telephony/proto/src/
44      * telephony_config_update.proto
45      */
generateProto()46     public static void generateProto() {
47         SatelliteConfigData.TelephonyConfigProto.Builder telephonyConfigBuilder =
48                 SatelliteConfigData.TelephonyConfigProto.newBuilder();
49         SatelliteConfigData.SatelliteConfigProto.Builder satelliteConfigBuilder =
50                 SatelliteConfigData.SatelliteConfigProto.newBuilder();
51 
52         satelliteConfigBuilder.setVersion(sVersion);    // Input version
53 
54         if (sServiceProtoList != null) {
55             // carrierSupportedSatelliteServiceBuilder
56             SatelliteConfigData.CarrierSupportedSatelliteServicesProto.Builder
57                     carrierSupportedSatelliteServiceBuilder =
58                     SatelliteConfigData.CarrierSupportedSatelliteServicesProto.newBuilder();
59             for (int i = 0; i < sServiceProtoList.size(); i++) {
60                 ServiceProto proto = sServiceProtoList.get(i);
61                 carrierSupportedSatelliteServiceBuilder.setCarrierId(proto.mCarrierId);
62                 SatelliteConfigData.SatelliteProviderCapabilityProto.Builder
63                         satelliteProviderCapabilityBuilder =
64                         SatelliteConfigData.SatelliteProviderCapabilityProto.newBuilder();
65                 ProviderCapabilityProto[] capabilityProtoList = proto.mCapabilityProtoList;
66                 for (int j = 0; j < capabilityProtoList.length; j++) {
67                     ProviderCapabilityProto capabilityProto = capabilityProtoList[j];
68                     satelliteProviderCapabilityBuilder.setCarrierPlmn(capabilityProto.mPlmn);
69                     int[] allowedServiceList = capabilityProto.mAllowedServices;
70                     for (int k = 0; k < allowedServiceList.length; k++) {
71                         satelliteProviderCapabilityBuilder
72                                 .addAllowedServices(allowedServiceList[k]);
73                     }
74                     carrierSupportedSatelliteServiceBuilder
75                             .addSupportedSatelliteProviderCapabilities(
76                                     satelliteProviderCapabilityBuilder);
77                     satelliteProviderCapabilityBuilder.clear();
78                 }
79                 satelliteConfigBuilder.addCarrierSupportedSatelliteServices(
80                         carrierSupportedSatelliteServiceBuilder);
81                 carrierSupportedSatelliteServiceBuilder.clear();
82             }
83         } else {
84             System.out.print("ServiceProtoList does not exist");
85         }
86 
87         if (sRegionProto != null) {
88             // satelliteRegionBuilder
89             SatelliteConfigData.SatelliteRegionProto.Builder satelliteRegionBuilder =
90                     SatelliteConfigData.SatelliteRegionProto.newBuilder();
91             byte[] binaryData;
92             try {
93                 binaryData = readFileToByteArray(sRegionProto.mS2CellFileName);
94             } catch (IOException e) {
95                 throw new RuntimeException("Got exception in reading the file "
96                         + sRegionProto.mS2CellFileName + ", e=" + e);
97             }
98             if (binaryData != null) {
99                 satelliteRegionBuilder.setS2CellFile(ByteString.copyFrom(binaryData));
100             }
101 
102             String[] countryCodeList = sRegionProto.mCountryCodeList;
103             for (int i = 0; i < countryCodeList.length; i++) {
104                 satelliteRegionBuilder.addCountryCodes(countryCodeList[i]);
105             }
106             satelliteRegionBuilder.setIsAllowed(sRegionProto.mIsAllowed);
107             satelliteConfigBuilder.setDeviceSatelliteRegion(satelliteRegionBuilder);
108         } else {
109             System.out.print("RegionProto does not exist");
110         }
111 
112         telephonyConfigBuilder.setSatellite(satelliteConfigBuilder);
113 
114         writeToResultFile(telephonyConfigBuilder);
115     }
116 
writeToResultFile(SatelliteConfigData .TelephonyConfigProto.Builder telephonyConfigBuilder)117     private static void writeToResultFile(SatelliteConfigData
118             .TelephonyConfigProto.Builder telephonyConfigBuilder) {
119         try {
120             File file = new File(sProtoResultFile);
121             if (file.exists()) {
122                 file.delete();
123             }
124             FileOutputStream fos = new FileOutputStream(file);
125             SatelliteConfigData.TelephonyConfigProto telephonyConfigData =
126                     telephonyConfigBuilder.build();
127             telephonyConfigData.writeTo(fos);
128 
129             fos.close();
130         } catch (Exception e) {
131             throw new RuntimeException("Got exception in writing the file "
132                     + sProtoResultFile + ", e=" + e);
133         }
134     }
135 
readFileToByteArray(String fileName)136     private static byte[] readFileToByteArray(String fileName) throws IOException {
137         File sat2File = new File(fileName);
138         if (!sat2File.exists()) {
139             throw new IOException("sat2File " + fileName + " does not exist");
140         }
141 
142         if (sat2File.exists() && sat2File.canRead()) {
143             FileInputStream fileInputStream = new FileInputStream(sat2File);
144             long fileSize = fileInputStream.available();
145             byte[] bytes = new byte[(int) fileSize];
146             int bytesRead = fileInputStream.read(bytes);
147             fileInputStream.close();
148             if (bytesRead != fileSize) {
149                 throw new IOException("file read fail: " + sat2File.getCanonicalPath());
150             }
151             return bytes;
152         }
153         return null;
154     }
155 }
156