11754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/*
21754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Copyright (C) 2016 The Android Open Source Project
31754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
41754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * you may not use this file except in compliance with the License.
61754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * You may obtain a copy of the License at
71754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
81754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Unless required by applicable law or agreed to in writing, software
111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * See the License for the specific language governing permissions and
141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * limitations under the License.
151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#ifndef GENERIC_MESSAGE_H
181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#define GENERIC_MESSAGE_H
191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <map>
211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <string>
221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace std;
241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/**
261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Class to represent a protobuf Message, where we don't actually
271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * know what any of the fields are, just their type codes. In other
281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * words, this loslessly stores a parsed protobuf object without
291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * having the .proto file that generated it.
301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoclass GenericMessage
321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratopublic:
341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    GenericMessage();
351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ~GenericMessage();
361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    enum {
381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        TYPE_VALUE32,
391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        TYPE_VALUE64,
401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        TYPE_MESSAGE,
411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        TYPE_STRING,
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        TYPE_DATA
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    };
441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    struct Node {
461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        uint32_t type;
471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        union {
481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            uint32_t value32;
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            uint64_t value64;
501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            GenericMessage* message;
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            string* str;
521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            string* data;
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        };
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    };
551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    void addInt32(int32_t fieldId, uint32_t value);
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    void addInt64(int32_t fieldId, uint64_t value);
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    GenericMessage* addMessage(int32_t fieldId);
591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    void addString(int32_t fieldId, const string& value);
601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    typedef multimap<int32_t,Node>::const_iterator const_iterator;
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    typedef pair<const_iterator,const_iterator> const_iterator_pair;
631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    const_iterator_pair find(int fieldId) const;
651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoprivate:
671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    multimap<int,Node> mNodes;
681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#endif // GENERIC_MESSAGE_H
711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
72