package com.android.server.wifi.hotspot2.omadm; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class OMAConstants { private OMAConstants() { } public static final String TAG_PostDevData = "spp:sppPostDevData"; public static final String TAG_SupportedVersions = "spp:supportedSPPVersions"; public static final String TAG_SupportedMOs = "spp:supportedMOList"; public static final String TAG_MO_Add = "spp:addMO"; public static final String TAG_MO_Container = "spp:moContainer"; public static final String ATTR_URN = "spp:moURN"; // Following strings excludes the trailing version number (e.g. :1.0) public static final String LOC_PPS = "urn:wfa:mo:hotspot2dot0-perprovidersubscription"; public static final String LOC_DEVINFO = "urn:oma:mo:oma-dm-devinfo:1.0 urn:oma:mo:oma-dm-devdetail"; public static final String LOC_DEVDETAIL = "urn:wfa:mo-ext:hotspot2dot0-devdetail-ext"; public static final String SyncMLVersionTag = "VerDTD"; public static final String RequiredSyncMLVersion = "1.2"; private static final Set<String> sMOContainers = new HashSet<String>(); static { sMOContainers.add(TAG_MO_Add); sMOContainers.add(TAG_MO_Container); } public static boolean isMOContainer(String tag) { return sMOContainers.contains(tag); } private static final byte[] INDENT = new byte[1024]; static { Arrays.fill(INDENT, (byte) ' '); } public static void serializeString(String s, OutputStream out) throws IOException { byte[] octets = s.getBytes(StandardCharsets.UTF_8); byte[] prefix = String.format("%x:", octets.length).getBytes(StandardCharsets.UTF_8); out.write(prefix); out.write(octets); } public static void indent(int level, OutputStream out) throws IOException { out.write(INDENT, 0, level); } public static String deserializeString(InputStream in) throws IOException { StringBuilder prefix = new StringBuilder(); for (; ; ) { byte b = (byte) in.read(); if (b == '.') return null; else if (b == ':') break; else if (b > ' ') prefix.append((char) b); } int length = Integer.parseInt(prefix.toString(), 16); byte[] octets = new byte[length]; int offset = 0; while (offset < octets.length) { int amount = in.read(octets, offset, octets.length - offset); if (amount <= 0) throw new EOFException(); offset += amount; } return new String(octets, StandardCharsets.UTF_8); } public static String readURN(InputStream in) throws IOException { StringBuilder urn = new StringBuilder(); for (; ; ) { byte b = (byte) in.read(); if (b == ')') break; urn.append((char) b); } return urn.toString(); } }