blob: ae243939e9a6e5ed49ee0ab95524bb2601a584d0 [file] [log] [blame]
yangg59dfc902014-12-19 14:00:14 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
yangg59dfc902014-12-19 14:00:14 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
yang-g9e2f90c2015-08-21 15:35:03 -070034#ifndef GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H
35#define GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H
yangg59dfc902014-12-19 14:00:14 -080036
yangg59dfc902014-12-19 14:00:14 -080037#include <list>
Craig Tillerf40df232016-03-25 13:38:14 -070038#include <vector>
yangg59dfc902014-12-19 14:00:14 -080039
Craig Tillerf40df232016-03-25 13:38:14 -070040#include <grpc++/support/config.h>
David Garcia Quintascc6c43c2015-06-16 11:35:41 -070041#include <grpc/compression.h>
yangg59dfc902014-12-19 14:00:14 -080042#include <grpc/grpc.h>
43
44namespace grpc {
45namespace testing {
46class ChannelArgumentsTest;
47} // namespace testing
48
Craig Tillerd6599a32015-09-03 09:37:02 -070049/// Options for channel creation. The user can use generic setters to pass
50/// key value pairs down to c channel creation code. For grpc related options,
51/// concrete setters are provided.
yangg59dfc902014-12-19 14:00:14 -080052class ChannelArguments {
53 public:
yang-gd59ad7e2016-02-10 12:42:53 -080054 ChannelArguments();
yangg59dfc902014-12-19 14:00:14 -080055 ~ChannelArguments() {}
56
Craig Tiller0dc5e6c2015-07-10 10:07:53 -070057 ChannelArguments(const ChannelArguments& other);
58 ChannelArguments& operator=(ChannelArguments other) {
59 Swap(other);
60 return *this;
61 }
62
63 void Swap(ChannelArguments& other);
64
yang-gd59ad7e2016-02-10 12:42:53 -080065 /// Dump arguments in this instance to \a channel_args. Does not take
66 /// ownership of \a channel_args.
Craig Tillerd6599a32015-09-03 09:37:02 -070067 ///
68 /// Note that the underlying arguments are shared. Changes made to either \a
69 /// channel_args or this instance would be reflected on both.
70 void SetChannelArgs(grpc_channel_args* channel_args) const;
71
72 // gRPC specific channel argument setters
Julien Boeuf112f4a32015-11-11 18:34:28 -080073 /// Set target name override for SSL host name checking. This option is for
74 /// testing only and should never be used in production.
yangg59dfc902014-12-19 14:00:14 -080075 void SetSslTargetNameOverride(const grpc::string& name);
76 // TODO(yangg) add flow control options
Craig Tillerd6599a32015-09-03 09:37:02 -070077 /// Set the compression algorithm for the channel.
Craig Tillerbf6abee2015-07-19 22:31:04 -070078 void SetCompressionAlgorithm(grpc_compression_algorithm algorithm);
David Garcia Quintascc6c43c2015-06-16 11:35:41 -070079
yang-gd59ad7e2016-02-10 12:42:53 -080080 /// The given string will be sent at the front of the user agent string.
81 void SetUserAgentPrefix(const grpc::string& user_agent_prefix);
82
yangg59dfc902014-12-19 14:00:14 -080083 // Generic channel argument setters. Only for advanced use cases.
Craig Tillerd6599a32015-09-03 09:37:02 -070084 /// Set an integer argument \a value under \a key.
yangg59dfc902014-12-19 14:00:14 -080085 void SetInt(const grpc::string& key, int value);
yang-g52705592015-11-25 11:45:33 -080086
87 // Generic channel argument setter. Only for advanced use cases.
88 /// Set a pointer argument \a value under \a key. Owership is not transferred.
89 void SetPointer(const grpc::string& key, void* value);
90
Craig Tillerd6599a32015-09-03 09:37:02 -070091 /// Set a textual argument \a value under \a key.
yangg59dfc902014-12-19 14:00:14 -080092 void SetString(const grpc::string& key, const grpc::string& value);
93
94 private:
Julien Boeuf54a902e2015-10-12 13:26:21 -070095 friend class SecureChannelCredentials;
yangg59dfc902014-12-19 14:00:14 -080096 friend class testing::ChannelArgumentsTest;
97
David Garcia Quintas41055052016-02-17 18:01:18 -080098 /// Default pointer argument operations.
99 struct PointerVtableMembers {
100 static void* Copy(void* in) { return in; }
101 static void Destroy(void* in) {}
102 static int Compare(void* a, void* b) {
103 if (a < b) return -1;
104 if (a > b) return 1;
105 return 0;
106 }
107 };
108
yangg7cebec72014-12-22 12:47:45 -0800109 // Returns empty string when it is not set.
110 grpc::string GetSslTargetNameOverride() const;
111
yangg59dfc902014-12-19 14:00:14 -0800112 std::vector<grpc_arg> args_;
113 std::list<grpc::string> strings_;
114};
115
116} // namespace grpc
117
yang-g9e2f90c2015-08-21 15:35:03 -0700118#endif // GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H