1/*
2 *
3 * Copyright 2015 gRPC authors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18
19#ifndef GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H
20#define GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H
21
22#include <list>
23#include <vector>
24
25#include <grpc/compression.h>
26#include <grpc/grpc.h>
27#include <grpcpp/resource_quota.h>
28#include <grpcpp/support/config.h>
29
30namespace grpc {
31class SecureChannelCredentials;
32namespace testing {
33class ChannelArgumentsTest;
34} // namespace testing
35
36/// Options for channel creation. The user can use generic setters to pass
37/// key value pairs down to C channel creation code. For gRPC related options,
38/// concrete setters are provided.
39class ChannelArguments {
40 public:
41 ChannelArguments();
42 ~ChannelArguments();
43
44 ChannelArguments(const ChannelArguments& other);
45 ChannelArguments& operator=(ChannelArguments other) {
46 Swap(other);
47 return *this;
48 }
49
50 void Swap(ChannelArguments& other);
51
52 /// Dump arguments in this instance to \a channel_args. Does not take
53 /// ownership of \a channel_args.
54 ///
55 /// Note that the underlying arguments are shared. Changes made to either \a
56 /// channel_args or this instance would be reflected on both.
57 void SetChannelArgs(grpc_channel_args* channel_args) const;
58
59 // gRPC specific channel argument setters
60 /// Set target name override for SSL host name checking. This option should
61 /// be used with caution in production.
62 void SetSslTargetNameOverride(const std::string& name);
63 // TODO(yangg) add flow control options
64 /// Set the compression algorithm for the channel.
65 void SetCompressionAlgorithm(grpc_compression_algorithm algorithm);
66
67 /// Set the grpclb fallback timeout (in ms) for the channel. If this amount
68 /// of time has passed but we have not gotten any non-empty \a serverlist from
69 /// the balancer, we will fall back to use the backend address(es) returned by
70 /// the resolver.
71 void SetGrpclbFallbackTimeout(int fallback_timeout);
72
73 /// Set a mutator for the underlying socket.
74 void SetSocketMutator(grpc_socket_mutator* mutator);
75
76 /// Set the string to prepend to the user agent.
77 void SetUserAgentPrefix(const std::string& user_agent_prefix);
78
79 /// Set the buffer pool to be attached to the constructed channel.
80 void SetResourceQuota(const grpc::ResourceQuota& resource_quota);
81
82 /// Set the max receive and send message sizes.
83 void SetMaxReceiveMessageSize(int size);
84 void SetMaxSendMessageSize(int size);
85
86 /// Set LB policy name.
87 /// Note that if the name resolver returns only balancer addresses, the
88 /// grpclb LB policy will be used, regardless of what is specified here.
89 void SetLoadBalancingPolicyName(const std::string& lb_policy_name);
90
91 /// Set service config in JSON form.
92 /// Primarily meant for use in unit tests.
93 void SetServiceConfigJSON(const std::string& service_config_json);
94
95 // Generic channel argument setter. Only for advanced use cases.
96 /// Set an integer argument \a value under \a key.
97 void SetInt(const std::string& key, int value);
98
99 // Generic channel argument setter. Only for advanced use cases.
100 /// Set a pointer argument \a value under \a key. Ownership is not
101 /// transferred.
102 void SetPointer(const std::string& key, void* value);
103
104 /// Set a pointer argument \a value under \a key, transferring ownership of
105 /// \a value to the \a ChannelArguments object. The \a vtable::Delete function
106 /// is responsible for \a value cleanup/destruction when called.
107 void SetPointerWithVtable(const std::string& key, void* value,
108 const grpc_arg_pointer_vtable* vtable);
109
110 /// Set a textual argument \a value under \a key.
111 void SetString(const std::string& key, const std::string& value);
112
113 /// Return (by value) a C \a grpc_channel_args structure which points to
114 /// arguments owned by this \a ChannelArguments instance
115 grpc_channel_args c_channel_args() const {
116 grpc_channel_args out;
117 out.num_args = args_.size();
118 out.args = args_.empty() ? nullptr : const_cast<grpc_arg*>(&args_[0]);
119 return out;
120 }
121
122 private:
123 friend class grpc::SecureChannelCredentials;
124 friend class grpc::testing::ChannelArgumentsTest;
125
126 /// Default pointer argument operations.
127 struct PointerVtableMembers {
128 static void* Copy(void* in) { return in; }
129 static void Destroy(void* /*in*/) {}
130 static int Compare(void* a, void* b) {
131 if (a < b) return -1;
132 if (a > b) return 1;
133 return 0;
134 }
135 };
136
137 // Returns empty string when it is not set.
138 std::string GetSslTargetNameOverride() const;
139
140 std::vector<grpc_arg> args_;
141 std::list<std::string> strings_;
142};
143
144} // namespace grpc
145
146#endif // GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H
147

source code of include/grpcpp/support/channel_arguments.h