1a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik/*
2a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Copyright (C) 2013 The Android Open Source Project
3a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
4a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * you may not use this file except in compliance with the License.
6a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * You may obtain a copy of the License at
7a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
8a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
10a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Unless required by applicable law or agreed to in writing, software
11a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * See the License for the specific language governing permissions and
14a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * limitations under the License.
15a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik */
16a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
17a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik#include "Registry.h"
18a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
19a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik#include "Stream.h"
20a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
21a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikstatic Registry* gHead = 0;
22a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikstatic int gHeaderBytesRequired = 0;
23a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
24a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris CraikRegistry::Registry(const RegistryEntry& entry) {
25a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    mImpl = entry;
26a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
27a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    mNext = gHead;
28a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    gHead = this;
29a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
30a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    if (gHeaderBytesRequired < entry.requiredHeaderBytes) {
31a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik        gHeaderBytesRequired = entry.requiredHeaderBytes;
32a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    }
33a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik}
34a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
35a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikconst RegistryEntry* Registry::Find(Stream* stream) {
36a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    Registry* registry = gHead;
376a61141137c7a46d747aa611c9caf62436bc119fChris Craik
386a61141137c7a46d747aa611c9caf62436bc119fChris Craik    if (stream->getRawBuffer() != NULL) {
396a61141137c7a46d747aa611c9caf62436bc119fChris Craik        while (registry) {
406a61141137c7a46d747aa611c9caf62436bc119fChris Craik            if (registry->mImpl.acceptsBuffer()) {
416a61141137c7a46d747aa611c9caf62436bc119fChris Craik                return &(registry->mImpl);
426a61141137c7a46d747aa611c9caf62436bc119fChris Craik            }
436a61141137c7a46d747aa611c9caf62436bc119fChris Craik            registry = registry->mNext;
446a61141137c7a46d747aa611c9caf62436bc119fChris Craik        }
456a61141137c7a46d747aa611c9caf62436bc119fChris Craik    } else {
466a61141137c7a46d747aa611c9caf62436bc119fChris Craik        int headerSize = gHeaderBytesRequired;
476a61141137c7a46d747aa611c9caf62436bc119fChris Craik        char header[headerSize];
486a61141137c7a46d747aa611c9caf62436bc119fChris Craik        headerSize = stream->peek(header, headerSize);
496a61141137c7a46d747aa611c9caf62436bc119fChris Craik        while (registry) {
506a61141137c7a46d747aa611c9caf62436bc119fChris Craik            if (headerSize >= registry->mImpl.requiredHeaderBytes
516a61141137c7a46d747aa611c9caf62436bc119fChris Craik                    && registry->mImpl.checkHeader(header, headerSize)) {
526a61141137c7a46d747aa611c9caf62436bc119fChris Craik                return &(registry->mImpl);
536a61141137c7a46d747aa611c9caf62436bc119fChris Craik            }
546a61141137c7a46d747aa611c9caf62436bc119fChris Craik            registry = registry->mNext;
55a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik        }
56a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    }
57a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    return 0;
58a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik}
596a61141137c7a46d747aa611c9caf62436bc119fChris Craik
60