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