content: /*
   * Copyright (C) 2014 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.android.internal.telephony;
  
  import android.telephony.Rlog;
  import java.util.BitSet;
  import android.telephony.ServiceState;
  
  /**
   * {@hide}
   *
   * hardware configuration information reported by the ril layer and for
   * use by the telephone framework.
   *
   * the hardware configuration is managed by the TelephonyDevController
   * (aka: the 'TDC').
   *
   * the hardware resources are:
   *    - modem: physical entity providing acces technology.
   *    - sim: physicaly entity providing a slot interface.
   */
  public class HardwareConfig {
      static final String LOG_TAG = "HardwareConfig";
  
      /**
       * hardware configuration kind.
       */
      public static final int DEV_HARDWARE_TYPE_MODEM = 0;
      public static final int DEV_HARDWARE_TYPE_SIM   = 1;
      /**
       * ril attachment model.  if single, there is a one-to-one
       * relationship between a modem hardware and a ril daemon.
       * if multiple, there is a one-to-many relatioship between a
       * modem hardware and several ril simultaneous ril daemons.
       */
      public static final int DEV_MODEM_RIL_MODEL_SINGLE   = 0;
      public static final int DEV_MODEM_RIL_MODEL_MULTIPLE = 1;
      /**
       * hardware state of the resource.
       *
       *   enabled: the resource can be used by the msim-framework,
       *            call activity can be handled on it.
       *   standby: the resource can be used by the msim-framework but
       *            only for non call related activity.  as example:
       *            reading the address book from a sim device. attempt
       *            to use this resource for call activity leads to
       *            undetermined results.
       *   disabled: the resource  cannot be used and attempt to use
       *             it leads to undetermined results.
       *
       * by default, all resources are 'enabled', what causes a resource
       * to be marked otherwise is a property of the underlying hardware
       * knowledge and implementation and it is out of scope of the TDC.
       */
      public static final int DEV_HARDWARE_STATE_ENABLED  = 0;
      public static final int DEV_HARDWARE_STATE_STANDBY  = 1;
      public static final int DEV_HARDWARE_STATE_DISABLED = 2;
  
      /**
       * common hardware configuration.
       *
       * type - see DEV_HARDWARE_TYPE_
       * uuid - unique identifier for this hardware.
       * state - see DEV_HARDWARE_STATE_
       */
      public int type;
      public String uuid;
      public int state;
      /**
       * following is some specific hardware configuration based on the hardware type.
       */
      /**
       * DEV_HARDWARE_TYPE_MODEM.
       *
       * rilModel - see DEV_MODEM_RIL_MODEL_
       * rat - BitSet value, based on android.telephony.ServiceState
       * maxActiveVoiceCall - maximum number of concurent active voice calls.
       * maxActiveDataCall - maximum number of concurent active data calls.
       * maxStandby - maximum number of concurent standby connections.
       *
       * note: the maxStandby is not necessarily an equal sum of the maxActiveVoiceCall
       * and maxActiveDataCall (nor a derivative of it) since it really depends on the
       * modem capability, hence it is left for the hardware to define.
       */
      public int rilModel;
      public BitSet rat;
      public int maxActiveVoiceCall;
      public int maxActiveDataCall;
      public int maxStandby;
      /**
       * DEV_HARDWARE_TYPE_SIM.
       *
       * modemUuid - unique association to a modem for a sim.
       */
      public String modemUuid;
  
      /**
       * default constructor.
       */
      public HardwareConfig(int type) {
          this.type = type;
      }
  
      /**
       * create from a resource string format.
       */
      public HardwareConfig(String res) {
          String split[] = res.split(",");
  
          type = Integer.parseInt(split[0]);
  
          switch (type) {
              case DEV_HARDWARE_TYPE_MODEM: {
                  assignModem(
                      split[1].trim(),            /* uuid */
                      Integer.parseInt(split[2]), /* state */
                      Integer.parseInt(split[3]), /* ril-model */
                      Integer.parseInt(split[4]), /* rat */
                      Integer.parseInt(split[5]), /* max-voice */
                      Integer.parseInt(split[6]), /* max-data */
                      Integer.parseInt(split[7])  /* max-standby */
                  );
                  break;
              }
              case DEV_HARDWARE_TYPE_SIM: {
                  assignSim(
                      split[1].trim(),            /* uuid */
                      Integer.parseInt(split[2]), /* state */
                      split[3].trim()             /* modem-uuid */
                  );
                  break;
              }
          }
      }
  
      public void assignModem(String id, int state, int model, int ratBits,
          int maxV, int maxD, int maxS) {
          if (type == DEV_HARDWARE_TYPE_MODEM) {
              char[] bits = Integer.toBinaryString(ratBits).toCharArray();
              uuid = id;
              this.state = state;
              rilModel = model;
              rat = new BitSet(bits.length);
              for (int i = 0 ; i < bits.length ; i++) {
                  rat.set(i, (bits[i] == '1' ? true : false));
              }
              maxActiveVoiceCall = maxV;
              maxActiveDataCall = maxD;
              maxStandby = maxS;
          }
      }
  
      public void assignSim(String id, int state, String link) {
          if (type == DEV_HARDWARE_TYPE_SIM) {
              uuid = id;
              modemUuid = link;
              this.state = state;
          }
      }
  
      public String toString() {
          StringBuilder builder = new StringBuilder();
          if (type == DEV_HARDWARE_TYPE_MODEM) {
              builder.append("Modem ");
              builder.append("{ uuid=" + uuid);
              builder.append(", state=" + state);
              builder.append(", rilModel=" + rilModel);
              builder.append(", rat=" + rat.toString());
              builder.append(", maxActiveVoiceCall=" + maxActiveVoiceCall);
              builder.append(", maxActiveDataCall=" + maxActiveDataCall);
              builder.append(", maxStandby=" + maxStandby);
              builder.append(" }");
          } else if (type == DEV_HARDWARE_TYPE_SIM) {
              builder.append("Sim ");
              builder.append("{ uuid=" + uuid);
              builder.append(", modemUuid=" + modemUuid);
              builder.append(", state=" + state);
              builder.append(" }");
          } else {
              builder.append("Invalid Configration");
          }
          return builder.toString();
      }
  
      public int compareTo(HardwareConfig hw) {
          String one = this.toString();
          String two = hw.toString();
  
          return (one.compareTo(two));
      }
  }
  