1package com.android.hotspot2.osu;
2
3import com.android.hotspot2.omadm.OMAConstants;
4import com.android.hotspot2.omadm.OMAException;
5import com.android.hotspot2.omadm.XMLNode;
6
7import java.util.HashMap;
8import java.util.Map;
9
10public abstract class OSUResponse {
11    private static final String SPPVersionAttribute = "sppVersion";
12    private static final String SPPStatusAttribute = "sppStatus";
13    private static final String SPPSessionIDAttribute = "sessionID";
14
15    private final OSUMessageType mMessageType;
16    private final String mVersion;
17    private final String mSessionID;
18    private final OSUStatus mStatus;
19    private final OSUError mError;
20    private final Map<String, String> mAttributes;
21
22    protected OSUResponse(XMLNode root, OSUMessageType messageType, String... attributes)
23            throws OMAException {
24        mMessageType = messageType;
25        String ns = root.getNameSpace() + ":";
26        mVersion = root.getAttributeValue(ns + SPPVersionAttribute);
27        mSessionID = root.getAttributeValue(ns + SPPSessionIDAttribute);
28
29        String status = root.getAttributeValue(ns + SPPStatusAttribute);
30        if (status == null) {
31            throw new OMAException("Missing status");
32        }
33        mStatus = OMAConstants.mapStatus(status);
34
35        if (mVersion == null || mSessionID == null || mStatus == null) {
36            throw new OMAException("Incomplete request: " + root.getAttributes());
37        }
38
39        if (attributes != null) {
40            mAttributes = new HashMap<>();
41            for (String attribute : attributes) {
42                String value = root.getAttributeValue(ns + attribute);
43                if (value == null) {
44                    throw new OMAException("Missing attribute: " + attribute);
45                }
46                mAttributes.put(attribute, value);
47            }
48        } else {
49            mAttributes = null;
50        }
51
52        if (mStatus == OSUStatus.Error) {
53            OSUError error = null;
54            String errorTag = ns + "sppError";
55            for (XMLNode child : root.getChildren()) {
56                if (child.getTag().equals(errorTag)) {
57                    error = OMAConstants.mapError(child.getAttributeValue("errorCode"));
58                    break;
59                }
60            }
61            mError = error;
62        } else {
63            mError = null;
64        }
65    }
66
67    public OSUMessageType getMessageType() {
68        return mMessageType;
69    }
70
71    public String getVersion() {
72        return mVersion;
73    }
74
75    public String getSessionID() {
76        return mSessionID;
77    }
78
79    public OSUStatus getStatus() {
80        return mStatus;
81    }
82
83    public OSUError getError() {
84        return mError;
85    }
86
87    protected Map<String, String> getAttributes() {
88        return mAttributes;
89    }
90
91    @Override
92    public String toString() {
93        return String.format("%s version '%s', status %s, session-id '%s'%s",
94                mMessageType, mVersion, mStatus, mSessionID, mError != null
95                        ? (" (" + mError + ")") : "");
96    }
97}
98