summaryrefslogtreecommitdiff
path: root/idlc/gen/cpp_stub_header_gen.cc
blob: 0e5689e0938c46d7b5b53b964ee26143356ccf9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "idlc/gen/cpp_stub_header_gen.h"

namespace {
#include "idlc/gen/cpp_stub_header_gen_cb.h"
}

namespace tidl {

CppStubHeaderGen::CppStubHeaderGen(std::shared_ptr<Document> doc)
    : CppGeneratorBase(doc) {}

void CppStubHeaderGen::OnInitGen(std::ofstream& stream) {
  GenVersion(stream);
  stream << CB_HEADER;
  GenNamespace(stream);
}

void CppStubHeaderGen::OnFiniGen(std::ofstream& stream) {
}

void CppStubHeaderGen::GenNamespace(std::ofstream& stream) {
  stream << "namespace rpc_port ";
  GenBrace(stream, 0, [&]() {
    stream << "namespace " << GetFileNamespace() << " ";
    GenBrace(stream, 0, [&]() {
      stream <<  NLine(1);
      GenStructuresForHeader(stream);
      stream << "namespace stub ";
      GenBrace(stream, 0, [&]() {
        GenExceptions(stream);
        GenInterfaces(stream);
      }, false, false);
      stream << "  // namespace stub" + NLine(1);
    }, false, false);
    stream << "  // namespace " + GetFileNamespace() + NLine(1);
  }, false, false);
  stream << "  // namespace rpc_port" + NLine(1);
}

void CppStubHeaderGen::GenExceptions(std::ofstream& stream) {
  stream << CB_EXCEPTIONS;
}

void CppStubHeaderGen::GenInterfaces(std::ofstream& stream) {
  for (auto& i : GetDocument().GetBlocks()) {
    if (i->GetType() != Block::TYPE_INTERFACE)
      continue;
    Interface& iface = static_cast<Interface&>(*i);
    GenInterface(stream, iface);
  }
}

void CppStubHeaderGen::GenInterface(std::ofstream& stream,
                                    const Interface& iface) {
  stream << NLine(1) << "class " << iface.GetID() << " final ";
  GenBrace(stream, 0, [&]() {
    GenPublic(stream, iface);
    GenPrivate(stream, iface);
  }, false, false);
  stream << ";" << NLine(1);
}

void CppStubHeaderGen::GenPublic(std::ofstream& stream,
                                 const Interface& iface) {
  stream << " public:" << NLine(1);
  stream << "  class ServiceBase;" << NLine(1);
  GenHeaderCallbacks(stream, iface, false);
  GenServiceBase(stream, iface);
  GenPublicMethods(stream, iface);
}

void CppStubHeaderGen::GenPrivate(std::ofstream& stream,
                                 const Interface& iface) {
  stream << " private:" << NLine(1);
  GenMethodId(stream, iface);
  GenDelegateId(stream, iface);
  stream << CB_PRIVATE_MEMBERS;
}

void CppStubHeaderGen::GenServiceBase(std::ofstream& stream,
                                      const Interface& iface) {
  stream << CB_SERVICE_BASE_FRONT;
  auto& decls = iface.GetDeclarations();

  for (auto& i : decls.GetDecls()) {
    if (i->GetMethodType() == Declaration::MethodType::DELEGATE)
      continue;
    if (!i->GetComments().empty())
      stream << NLine(1) << AddIndent(TAB_SIZE * 2, i->GetComments());
    stream << Tab(2) << "virtual " << ConvertTypeToString(i->GetType())
           << " " << i->GetID() << "(";
    GenParameters(stream, i->GetParameters());
    stream << ") = 0;" << NLine(1);
  }

  stream << CB_SERVICE_BASE_BACK << NLine(2);
}

void CppStubHeaderGen::GenPublicMethods(std::ofstream& stream,
                                        const Interface& iface) {
  stream << ReplaceAll(CB_PUBLIC_METHODS, "##", iface.GetID());
}

}  // namespace tidl