1192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta/*
2192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Copyright (C) 2014 The Android Open Source Project
3192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *
4192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License");
5192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * you may not use this file except in compliance with the License.
6192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * You may obtain a copy of the License at
7192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *
8192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *      http://www.apache.org/licenses/LICENSE-2.0
9192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta *
10192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Unless required by applicable law or agreed to in writing, software
11192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS,
12192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * See the License for the specific language governing permissions and
14192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * limitations under the License.
15192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */
16192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
17192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapackage android.bluetooth.client.map.utils;
18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.util.Log;
20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.text.ParseException;
22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.regex.Matcher;
23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.regex.Pattern;
24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapublic final class BmsgTokenizer {
26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private final String mStr;
28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private final Matcher mMatcher;
30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private int mPos = 0;
32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    private final int mOffset;
34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    static public class Property {
36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        public final String name;
37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        public final String value;
38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        public Property(String name, String value) {
40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            if (name == null || value == null) {
41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                throw new IllegalArgumentException();
42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            }
43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            this.name = name;
45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            this.value = value;
46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            Log.v("BMSG >> ", toString());
48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        @Override
51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        public String toString() {
52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            return name + ":" + value;
53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        @Override
56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        public boolean equals(Object o) {
57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            return ((o instanceof Property) && ((Property) o).name.equals(name) && ((Property) o).value
58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                    .equals(value));
59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        }
60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    };
61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public BmsgTokenizer(String str) {
63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        this(str, 0);
64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public BmsgTokenizer(String str, int offset) {
67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mStr = str;
68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mOffset = offset;
69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mMatcher = Pattern.compile("(([^:]*):(.*))?\r\n").matcher(str);
70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        mPos = mMatcher.regionStart();
71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public Property next(boolean alwaysReturn) throws ParseException {
74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        boolean found = false;
75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        do {
77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mMatcher.region(mPos, mMatcher.regionEnd());
78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            if (!mMatcher.lookingAt()) {
80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                if (alwaysReturn) {
81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                    return null;
82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                }
83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                throw new ParseException("Property or empty line expected", pos());
85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            }
86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            mPos = mMatcher.end();
88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            if (mMatcher.group(1) != null) {
90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta                found = true;
91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta            }
92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        } while (!found);
93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return new Property(mMatcher.group(2), mMatcher.group(3));
95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public Property next() throws ParseException {
98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return next(false);
99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public String remaining() {
102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return mStr.substring(mPos);
103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta
105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    public int pos() {
106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta        return mPos + mOffset;
107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta    }
108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta}
109