ServiceDeclaration.java revision a08fff0ae81757bdab00ae8865a906c711d5572f
1/*
2 * Copyright (C) 2013 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 */
16package com.android.bluetooth.gatt;
17
18import android.util.Log;
19import java.util.ArrayList;
20import java.util.Iterator;
21import java.util.List;
22import java.util.UUID;
23
24class ServiceDeclaration {
25    private static final boolean DBG = GattServiceConfig.DBG;
26    private static final String TAG = GattServiceConfig.TAG_PREFIX + "ServiceDeclaration";
27
28    public static final byte TYPE_UNDEFINED = 0;
29    public static final byte TYPE_SERVICE = 1;
30    public static final byte TYPE_CHARACTERISTIC = 2;
31    public static final byte TYPE_DESCRIPTOR = 3;
32    public static final byte TYPE_INCLUDED_SERVICE = 4;
33
34    class Entry {
35        byte type = TYPE_UNDEFINED;
36        UUID uuid = null;
37        int instance = 0;
38        int permissions = 0;
39        int properties = 0;
40        int serviceType = 0;
41        int serviceHandle = 0;
42        boolean advertisePreferred = false;
43
44        Entry(UUID uuid, int serviceType, int instance) {
45            this.type = TYPE_SERVICE;
46            this.uuid = uuid;
47            this.instance = instance;
48            this.serviceType = serviceType;
49        }
50
51        Entry(UUID uuid, int serviceType, int instance, boolean advertisePreferred) {
52          this.type = TYPE_SERVICE;
53          this.uuid = uuid;
54          this.instance = instance;
55          this.serviceType = serviceType;
56          this.advertisePreferred = advertisePreferred;
57        }
58
59        Entry(UUID uuid, int properties, int permissions, int instance) {
60            this.type = TYPE_CHARACTERISTIC;
61            this.uuid = uuid;
62            this.instance = instance;
63            this.permissions = permissions;
64            this.properties = properties;
65        }
66
67        Entry(UUID uuid, int permissions) {
68            this.type = TYPE_DESCRIPTOR;
69            this.uuid = uuid;
70            this.permissions = permissions;
71        }
72    }
73
74    List<Entry> mEntries = null;
75    int mNumHandles = 0;
76
77    ServiceDeclaration() {
78        mEntries = new ArrayList<Entry>();
79    }
80
81    void addService(UUID uuid, int serviceType, int instance, int minHandles,
82        boolean advertisePreferred) {
83        mEntries.add(new Entry(uuid, serviceType, instance, advertisePreferred));
84        if (minHandles == 0) {
85            ++mNumHandles;
86        } else {
87            mNumHandles = minHandles;
88        }
89    }
90
91    void addIncludedService(UUID uuid, int serviceType, int instance) {
92        Entry entry = new Entry(uuid, serviceType, instance);
93        entry.type = TYPE_INCLUDED_SERVICE;
94        mEntries.add(entry);
95        ++mNumHandles;
96    }
97
98    void addCharacteristic(UUID uuid, int properties, int permissions) {
99        mEntries.add(new Entry(uuid, properties, permissions, 0 /*instance*/));
100        mNumHandles += 2;
101    }
102
103    void addDescriptor(UUID uuid, int permissions) {
104        mEntries.add(new Entry(uuid, permissions));
105        ++mNumHandles;
106    }
107
108    Entry getNext() {
109        if (mEntries.isEmpty()) return null;
110        Entry entry = mEntries.get(0);
111        mEntries.remove(0);
112        return entry;
113    }
114
115    boolean isServiceAdvertisePreferred(UUID uuid) {
116      for (Entry entry : mEntries) {
117          if (entry.uuid.equals(uuid)) {
118              return entry.advertisePreferred;
119          }
120      }
121      return false;
122    }
123
124    int getNumHandles() {
125        return mNumHandles;
126    }
127}
128