Skip to content

Commit 3212db9

Browse files
Use std::vector for 'send' and 'on' to make it clear there can be multiple arguments/parameters (#65)
1 parent b6320ce commit 3212db9

File tree

9 files changed

+70
-147
lines changed

9 files changed

+70
-147
lines changed

README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ Output will be in `build.release/bin/`
7777
std::promise<void> start_task;
7878
signalr::hub_connection connection = signalr::hub_connection_builder::create("http://localhost:5000/hub").build();
7979

80-
connection.on("Echo", [](const signalr::value& m)
80+
connection.on("Echo", [](const std::vector<signalr::value>& m)
8181
{
82-
std::cout << m.as_array()[0].as_string() << std::endl;
82+
std::cout << m[0].as_string() << std::endl;
8383
});
8484

8585
connection.start([&start_task](std::exception_ptr exception) {
@@ -89,9 +89,8 @@ connection.start([&start_task](std::exception_ptr exception) {
8989
start_task.get_future().get();
9090

9191
std::promise<void> send_task;
92-
std::vector<signalr::value> arr { "Hello world" };
93-
signalr::value arg(arr);
94-
connection.invoke("Echo", arg, [&send_task](const signalr::value& value, std::exception_ptr exception) {
92+
std::vector<signalr::value> args { "Hello world" };
93+
connection.invoke("Echo", args, [&send_task](const signalr::value& value, std::exception_ptr exception) {
9594
send_task.set_value();
9695
});
9796

include/signalrclient/hub_connection.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace signalr
2424
class hub_connection
2525
{
2626
public:
27-
typedef std::function<void __cdecl (const signalr::value&)> method_invoked_handler;
27+
typedef std::function<void __cdecl (const std::vector<signalr::value>&)> method_invoked_handler;
2828

2929
SIGNALRCLIENT_API ~hub_connection();
3030

@@ -48,9 +48,9 @@ namespace signalr
4848

4949
SIGNALRCLIENT_API void __cdecl on(const std::string& event_name, const method_invoked_handler& handler);
5050

51-
SIGNALRCLIENT_API void invoke(const std::string& method_name, const signalr::value& arguments = signalr::value(), std::function<void(const signalr::value&, std::exception_ptr)> callback = [](const signalr::value&, std::exception_ptr) {}) noexcept;
51+
SIGNALRCLIENT_API void invoke(const std::string& method_name, const std::vector<signalr::value>& arguments = std::vector<signalr::value>(), std::function<void(const signalr::value&, std::exception_ptr)> callback = [](const signalr::value&, std::exception_ptr) {}) noexcept;
5252

53-
SIGNALRCLIENT_API void send(const std::string& method_name, const signalr::value& arguments = signalr::value(), std::function<void(std::exception_ptr)> callback = [](std::exception_ptr) {}) noexcept;
53+
SIGNALRCLIENT_API void send(const std::string& method_name, const std::vector<signalr::value>& arguments = std::vector<signalr::value>(), std::function<void(std::exception_ptr)> callback = [](std::exception_ptr) {}) noexcept;
5454

5555
private:
5656
friend class hub_connection_builder;

samples/HubConnectionSample/HubConnectionSample.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ class logger : public signalr::log_writer
2020

2121
void send_message(signalr::hub_connection& connection, const std::string& message)
2222
{
23-
std::vector<signalr::value> arr { std::string("c++"), message };
24-
signalr::value args(arr);
23+
std::vector<signalr::value> args { std::string("c++"), message };
2524

2625
// if you get an internal compiler error uncomment the lambda below or install VS Update 4
2726
connection.invoke("Send", args, [](const signalr::value& value, std::exception_ptr exception)
@@ -55,9 +54,9 @@ void chat()
5554
.with_logging(std::make_shared <logger>(), signalr::trace_level::verbose)
5655
.build();
5756

58-
connection.on("Send", [](const signalr::value & m)
57+
connection.on("Send", [](const std::vector<signalr::value>& m)
5958
{
60-
std::cout << std::endl << m.as_array()[0].as_string() << std::endl << "Enter your message: ";
59+
std::cout << std::endl << m[0].as_string() << std::endl << "Enter your message: ";
6160
});
6261

6362
std::promise<void> task;

src/signalrclient/hub_connection.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace signalr
6363
return m_pImpl->on(event_name, handler);
6464
}
6565

66-
void hub_connection::invoke(const std::string& method_name, const signalr::value& arguments, std::function<void(const signalr::value&, std::exception_ptr)> callback) noexcept
66+
void hub_connection::invoke(const std::string& method_name, const std::vector<signalr::value>& arguments, std::function<void(const signalr::value&, std::exception_ptr)> callback) noexcept
6767
{
6868
if (!m_pImpl)
6969
{
@@ -74,7 +74,7 @@ namespace signalr
7474
return m_pImpl->invoke(method_name, arguments, callback);
7575
}
7676

77-
void hub_connection::send(const std::string& method_name, const signalr::value& arguments, std::function<void(std::exception_ptr)> callback) noexcept
77+
void hub_connection::send(const std::string& method_name, const std::vector<signalr::value>& arguments, std::function<void(std::exception_ptr)> callback) noexcept
7878
{
7979
if (!m_pImpl)
8080
{

src/signalrclient/hub_connection_impl.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ namespace signalr
8585
});
8686
}
8787

88-
void hub_connection_impl::on(const std::string& event_name, const std::function<void(const signalr::value &)>& handler)
88+
void hub_connection_impl::on(const std::string& event_name, const std::function<void(const std::vector<signalr::value>&)>& handler)
8989
{
9090
if (event_name.length() == 0)
9191
{
@@ -441,14 +441,8 @@ namespace signalr
441441
return true;
442442
}
443443

444-
void hub_connection_impl::invoke(const std::string& method_name, const signalr::value& arguments, std::function<void(const signalr::value&, std::exception_ptr)> callback) noexcept
444+
void hub_connection_impl::invoke(const std::string& method_name, const std::vector<signalr::value>& arguments, std::function<void(const signalr::value&, std::exception_ptr)> callback) noexcept
445445
{
446-
if (!arguments.is_array())
447-
{
448-
callback(signalr::value(), std::make_exception_ptr(signalr_exception("arguments should be an array")));
449-
return;
450-
}
451-
452446
const auto& callback_id = m_callback_manager.register_callback(
453447
create_hub_invocation_callback(m_logger, [callback](const signalr::value& result) { callback(result, nullptr); },
454448
[callback](const std::exception_ptr e) { callback(signalr::value(), e); }));
@@ -457,20 +451,14 @@ namespace signalr
457451
[callback](const std::exception_ptr e){ callback(signalr::value(), e); });
458452
}
459453

460-
void hub_connection_impl::send(const std::string& method_name, const signalr::value& arguments, std::function<void(std::exception_ptr)> callback) noexcept
454+
void hub_connection_impl::send(const std::string& method_name, const std::vector<signalr::value>& arguments, std::function<void(std::exception_ptr)> callback) noexcept
461455
{
462-
if (!arguments.is_array())
463-
{
464-
callback(std::make_exception_ptr(signalr_exception("arguments should be an array")));
465-
return;
466-
}
467-
468456
invoke_hub_method(method_name, arguments, "",
469457
[callback]() { callback(nullptr); },
470458
[callback](const std::exception_ptr e){ callback(e); });
471459
}
472460

473-
void hub_connection_impl::invoke_hub_method(const std::string& method_name, const signalr::value& arguments,
461+
void hub_connection_impl::invoke_hub_method(const std::string& method_name, const std::vector<signalr::value>& arguments,
474462
const std::string& callback_id, std::function<void()> set_completion, std::function<void(const std::exception_ptr)> set_exception) noexcept
475463
{
476464
try

src/signalrclient/hub_connection_impl.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ namespace signalr
3131
hub_connection_impl(const hub_connection_impl&) = delete;
3232
hub_connection_impl& operator=(const hub_connection_impl&) = delete;
3333

34-
void on(const std::string& event_name, const std::function<void(const signalr::value &)>& handler);
34+
void on(const std::string& event_name, const std::function<void(const std::vector<signalr::value>&)>& handler);
3535

36-
void invoke(const std::string& method_name, const signalr::value& arguments, std::function<void(const signalr::value&, std::exception_ptr)> callback) noexcept;
37-
void send(const std::string& method_name, const signalr::value& arguments, std::function<void(std::exception_ptr)> callback) noexcept;
36+
void invoke(const std::string& method_name, const std::vector<signalr::value>& arguments, std::function<void(const signalr::value&, std::exception_ptr)> callback) noexcept;
37+
void send(const std::string& method_name, const std::vector<signalr::value>& arguments, std::function<void(std::exception_ptr)> callback) noexcept;
3838

3939
void start(std::function<void(std::exception_ptr)> callback) noexcept;
4040
void stop(std::function<void(std::exception_ptr)> callback) noexcept;
@@ -54,7 +54,7 @@ namespace signalr
5454
std::shared_ptr<connection_impl> m_connection;
5555
logger m_logger;
5656
callback_manager m_callback_manager;
57-
std::unordered_map<std::string, std::function<void(const signalr::value&)>, case_insensitive_hash, case_insensitive_equals> m_subscriptions;
57+
std::unordered_map<std::string, std::function<void(const std::vector<signalr::value>&)>, case_insensitive_hash, case_insensitive_equals> m_subscriptions;
5858
bool m_handshakeReceived;
5959
std::shared_ptr<completion_event> m_handshakeTask;
6060
std::function<void(std::exception_ptr)> m_disconnected;
@@ -69,7 +69,7 @@ namespace signalr
6969

7070
void process_message(std::string&& message);
7171

72-
void invoke_hub_method(const std::string& method_name, const signalr::value& arguments, const std::string& callback_id,
72+
void invoke_hub_method(const std::string& method_name, const std::vector<signalr::value>& arguments, const std::string& callback_id,
7373
std::function<void()> set_completion, std::function<void(const std::exception_ptr)> set_exception) noexcept;
7474
bool invoke_callback(completion_message* completion);
7575
};

src/signalrclient/hub_protocol.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@ namespace signalr
3232
struct invocation_message : hub_invocation_message
3333
{
3434
invocation_message(const std::string& invocation_id, const std::string& target,
35-
const signalr::value& args, const std::vector<std::string>& stream_ids = std::vector<std::string>())
35+
const std::vector<signalr::value>& args, const std::vector<std::string>& stream_ids = std::vector<std::string>())
3636
: hub_invocation_message(invocation_id, signalr::message_type::invocation), target(target), arguments(args), stream_ids(stream_ids)
3737
{ }
3838

3939
invocation_message(std::string&& invocation_id, std::string&& target,
40-
signalr::value&& args, std::vector<std::string>&& stream_ids = std::vector<std::string>())
40+
std::vector<signalr::value>&& args, std::vector<std::string>&& stream_ids = std::vector<std::string>())
4141
: hub_invocation_message(invocation_id, signalr::message_type::invocation), target(target), arguments(args), stream_ids(stream_ids)
4242
{ }
4343

4444
std::string target;
45-
signalr::value arguments;
45+
std::vector<signalr::value> arguments;
4646
std::vector<std::string> stream_ids;
4747
};
4848

src/signalrclient/messagepack_hub_protocol.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ namespace signalr
210210
packer.pack_str((uint32_t)invocation->target.length());
211211
packer.pack_str_body(invocation->target.data(), (uint32_t)invocation->target.length());
212212

213-
packer.pack_array((uint32_t)invocation->arguments.as_array().size());
214-
for (auto& val : invocation->arguments.as_array())
213+
packer.pack_array((uint32_t)invocation->arguments.size());
214+
for (auto& val : invocation->arguments)
215215
{
216216
pack_messagepack(val, packer);
217217
}
@@ -357,8 +357,17 @@ namespace signalr
357357
throw signalr_exception("reading 'arguments' as array failed");
358358
}
359359

360+
std::vector<signalr::value> args;
361+
auto size = msgpack_obj_index->via.array.size;
362+
auto arg_array_index = msgpack_obj_index->via.array.ptr;
363+
for (uint32_t i = 0; i < size; ++i)
364+
{
365+
args.emplace_back(createValue(*arg_array_index));
366+
++arg_array_index;
367+
}
368+
360369
vec.emplace_back(std::unique_ptr<hub_message>(
361-
new invocation_message(std::move(invocation_id), std::move(target), createValue(*msgpack_obj_index))));
370+
new invocation_message(std::move(invocation_id), std::move(target), std::move(args))));
362371

363372
if (num_elements_of_message > 5)
364373
{

0 commit comments

Comments
 (0)