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