PreVerify/mqtt/paho.mqtt.cpp/client.cpp
2024-09-09 19:18:28 +08:00

187 lines
5.6 KiB
C++

// client.cpp
// Implementation of the client class for the mqtt C++ client library.
/*******************************************************************************
* Copyright (c) 2013-2017 Frank Pagliughi <fpagliughi@mindspring.com>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v20.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Frank Pagliughi - initial implementation and documentation
*******************************************************************************/
#include "mqtt/client.h"
#include <memory>
#include <iostream>
namespace mqtt {
/////////////////////////////////////////////////////////////////////////////
PAHO_MQTTPP_EXPORT const std::chrono::seconds client::DFLT_TIMEOUT
= std::chrono::seconds(30);
PAHO_MQTTPP_EXPORT const int client::DFLT_QOS = 1;
// --------------------------------------------------------------------------
client::client(const string& serverURI, const string& clientId,
iclient_persistence* persistence /*=nullptr*/)
: cli_(serverURI, clientId, persistence),
timeout_(DFLT_TIMEOUT), userCallback_(nullptr)
{
}
client::client(const string& serverURI, const string& clientId,
const string& persistDir)
: cli_(serverURI, clientId, persistDir),
timeout_(DFLT_TIMEOUT), userCallback_(nullptr)
{
}
client::client(const string& serverURI, const string& clientId,
int maxBufferedMessages,
iclient_persistence* persistence /*=nullptr*/)
: cli_(serverURI, clientId, maxBufferedMessages, persistence),
timeout_(DFLT_TIMEOUT), userCallback_(nullptr)
{
}
client::client(const string& serverURI, const string& clientId,
int maxBufferedMessages, const string& persistDir)
: cli_(serverURI, clientId, maxBufferedMessages, persistDir),
timeout_(DFLT_TIMEOUT), userCallback_(nullptr)
{
}
client::client(const string& serverURI, const string& clientId,
const create_options& opts,
iclient_persistence* persistence /*=nullptr*/)
: cli_(serverURI, clientId, opts, persistence),
timeout_(DFLT_TIMEOUT), userCallback_(nullptr)
{
}
// --------------------------------------------------------------------------
void client::set_callback(callback& cb)
{
userCallback_ = &cb;
cli_.set_callback(*this);
}
connect_response client::connect()
{
cli_.start_consuming();
auto tok = cli_.connect();
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_connect_response();
}
connect_response client::connect(connect_options opts)
{
cli_.start_consuming();
auto tok = cli_.connect(std::move(opts));
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_connect_response();
}
connect_response client::reconnect()
{
auto tok = cli_.reconnect();
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_connect_response();
}
subscribe_response client::subscribe(const string& topicFilter,
const subscribe_options& opts /*=subscribe_options()*/,
const properties& props /*=properties()*/)
{
auto tok = cli_.subscribe(topicFilter, DFLT_QOS, opts, props);
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_subscribe_response();
}
subscribe_response client::subscribe(const string& topicFilter, int qos,
const subscribe_options& opts /*=subscribe_options()*/,
const properties& props /*=properties()*/)
{
auto tok = cli_.subscribe(topicFilter, qos, opts, props);
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_subscribe_response();
}
subscribe_response client::subscribe(const string_collection& topicFilters,
const std::vector<subscribe_options>& opts /*=std::vector<subscribe_options>()*/,
const properties& props /*=properties()*/)
{
qos_collection qos;
for (size_t i=0; i<topicFilters.size(); ++i)
qos.push_back(DFLT_QOS);
auto tok = cli_.subscribe(ptr(topicFilters), qos, opts, props);
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_subscribe_response();
}
subscribe_response client::subscribe(const string_collection& topicFilters,
const qos_collection& qos,
const std::vector<subscribe_options>& opts /*=std::vector<subscribe_options>()*/,
const properties& props /*=properties()*/)
{
auto tok = cli_.subscribe(ptr(topicFilters), qos, opts, props);
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_subscribe_response();
}
unsubscribe_response client::unsubscribe(const string& topicFilter,
const properties& props /*=properties()*/)
{
auto tok = cli_.unsubscribe(topicFilter, props);
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_unsubscribe_response();
}
unsubscribe_response client::unsubscribe(const string_collection& topicFilters,
const properties& props /*=properties()*/)
{
auto tok = cli_.unsubscribe(ptr(topicFilters), props);
if (!tok->wait_for(timeout_))
throw timeout_error();
return tok->get_unsubscribe_response();
}
void client::disconnect()
{
cli_.stop_consuming();
if (!cli_.disconnect()->wait_for(timeout_))
throw timeout_error();
}
void client::disconnect(int timeoutMS)
{
cli_.stop_consuming();
if (!cli_.disconnect(timeoutMS)->wait_for(timeout_))
throw timeout_error();
}
/////////////////////////////////////////////////////////////////////////////
// end namespace mqtt
}