1 /* 2 * Copyright (C) 2011 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 */ 16 #ifndef __API_GEN_H_ 17 #define __API_GEN_H_ 18 19 #include <vector> 20 #include <string.h> 21 #include "EntryPoint.h" 22 23 24 class ApiGen : public std::vector<EntryPoint> { 25 26 public: 27 typedef std::vector<std::string> StringVec; 28 typedef enum { CLIENT_SIDE, SERVER_SIDE, WRAPPER_SIDE } SideType; 29 30 ApiGen(const std::string & basename) : 31 m_basename(basename), 32 m_maxEntryPointsParams(0), 33 m_baseOpcode(0) 34 { } 35 virtual ~ApiGen() {} 36 int readSpec(const std::string & filename); 37 int readAttributes(const std::string & attribFilename); 38 size_t maxEntryPointsParams() { return m_maxEntryPointsParams; } 39 void updateMaxEntryPointsParams(size_t val) { 40 if (m_maxEntryPointsParams == 0 || val > m_maxEntryPointsParams) m_maxEntryPointsParams = val; 41 } 42 int baseOpcode() { return m_baseOpcode; } 43 void setBaseOpcode(int base) { m_baseOpcode = base; } 44 45 const char *sideString(SideType side) { 46 const char *retval; 47 switch(side) { 48 case CLIENT_SIDE: 49 retval = "client"; 50 break; 51 case SERVER_SIDE: 52 retval = "server"; 53 break; 54 case WRAPPER_SIDE: 55 retval = "wrapper"; 56 break; 57 } 58 return retval; 59 } 60 61 StringVec & clientContextHeaders() { return m_clientContextHeaders; } 62 StringVec & encoderHeaders() { return m_encoderHeaders; } 63 StringVec & serverContextHeaders() { return m_serverContextHeaders; } 64 StringVec & decoderHeaders() { return m_decoderHeaders; } 65 66 EntryPoint * findEntryByName(const std::string & name); 67 int genOpcodes(const std::string &filename); 68 int genAttributesTemplate(const std::string &filename); 69 int genProcTypes(const std::string &filename, SideType side); 70 int genFuncTable(const std::string &filename, SideType side); 71 72 int genContext(const std::string &filename, SideType side); 73 int genContextImpl(const std::string &filename, SideType side); 74 75 int genEntryPoints(const std::string &filename, SideType side); 76 77 int genEncoderHeader(const std::string &filename); 78 int genEncoderImpl(const std::string &filename); 79 80 int genDecoderHeader(const std::string &filename); 81 int genDecoderImpl(const std::string &filename); 82 83 protected: 84 virtual void printHeader(FILE *fp) const; 85 std::string m_basename; 86 StringVec m_clientContextHeaders; 87 StringVec m_encoderHeaders; 88 StringVec m_serverContextHeaders; 89 StringVec m_decoderHeaders; 90 size_t m_maxEntryPointsParams; // record the maximum number of parameters in the entry points; 91 int m_baseOpcode; 92 int setGlobalAttribute(const std::string & line, size_t lc); 93 }; 94 95 #endif 96