1 /*
2  * Copyright (C) 2020 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.ims.rcs.uce.presence.pidfparser.capabilities;
18 
19 import com.android.ims.rcs.uce.presence.pidfparser.ElementBase;
20 
21 import org.xmlpull.v1.XmlPullParser;
22 import org.xmlpull.v1.XmlPullParserException;
23 import org.xmlpull.v1.XmlSerializer;
24 
25 import java.io.IOException;
26 import java.util.ArrayList;
27 import java.util.List;
28 
29 /**
30  * The "servicecaps" element is the root element of service capabilities.
31  */
32 public class ServiceCaps extends ElementBase {
33     /** The name of this element */
34     public static final String ELEMENT_NAME = "servcaps";
35 
36     // The elements in the "servcaps" element.
37     private final List<ElementBase> mElements = new ArrayList<>();
38 
ServiceCaps()39     public ServiceCaps() {
40     }
41 
42     @Override
initNamespace()43     protected String initNamespace() {
44         return CapsConstant.NAMESPACE;
45     }
46 
47     @Override
initElementName()48     protected String initElementName() {
49         return ELEMENT_NAME;
50     }
51 
addElement(ElementBase element)52     public void addElement(ElementBase element) {
53         mElements.add(element);
54     }
55 
getElements()56     public List<ElementBase> getElements() {
57         return mElements;
58     }
59 
60     @Override
serialize(XmlSerializer serializer)61     public void serialize(XmlSerializer serializer) throws IOException {
62         if (mElements.isEmpty()) {
63             return;
64         }
65         String namespace = getNamespace();
66         String elementName = getElementName();
67         serializer.startTag(namespace, elementName);
68         for (ElementBase element : mElements) {
69             element.serialize(serializer);
70         }
71         serializer.endTag(namespace, elementName);
72 
73     }
74 
75     @Override
parse(XmlPullParser parser)76     public void parse(XmlPullParser parser) throws IOException, XmlPullParserException {
77         String namespace = parser.getNamespace();
78         String name = parser.getName();
79 
80         if (!verifyParsingElement(namespace, name)) {
81             throw new XmlPullParserException("Incorrect element: " + namespace + ", " + name);
82         }
83 
84         // Move to the next event.
85         int eventType = parser.next();
86 
87         while(!(eventType == XmlPullParser.END_TAG
88                 && getNamespace().equals(parser.getNamespace())
89                 && getElementName().equals(parser.getName()))) {
90 
91             if (eventType == XmlPullParser.START_TAG) {
92                 String tagName = parser.getName();
93 
94                 if (Audio.ELEMENT_NAME.equals(tagName)) {
95                     Audio audio = new Audio();
96                     audio.parse(parser);
97                     mElements.add(audio);
98                 } else if (Video.ELEMENT_NAME.equals(tagName)) {
99                     Video video = new Video();
100                     video.parse(parser);
101                     mElements.add(video);
102                 } else if (Duplex.ELEMENT_NAME.equals(tagName)) {
103                     Duplex duplex = new Duplex();
104                     duplex.parse(parser);
105                     mElements.add(duplex);
106                 }
107             }
108 
109             eventType = parser.next();
110 
111             // Leave directly if the event type is the end of the document.
112             if (eventType == XmlPullParser.END_DOCUMENT) {
113                 return;
114             }
115         }
116     }
117 }
118