#include "simplebluez/interfaces/Agent1.h"
using namespace SimpleBluez;
const SimpleDBus::AutoRegisterInterface<Agent1> Agent1::registry{
"org.bluez.Agent1",
[](std::shared_ptr<SimpleDBus::Connection> conn, std::shared_ptr<SimpleDBus::Proxy> proxy) -> std::shared_ptr<SimpleDBus::Interface> {
return std::static_pointer_cast<SimpleDBus::Interface>(std::make_shared<Agent1>(conn, proxy));
}
};
Agent1::Agent1(std::shared_ptr<SimpleDBus::Connection> conn, std::shared_ptr<SimpleDBus::Proxy> proxy)
: SimpleDBus::Interface(conn, proxy, "org.bluez.Agent1") {}
Agent1::~Agent1() = default;
void Agent1::message_handle(SimpleDBus::Message& msg) {
if (msg.get_type() == SimpleDBus::Message::Type::METHOD_CALL) {
SimpleDBus::Message reply = SimpleDBus::Message::create_method_return(msg);
if (msg.get_member() == "Release") {
if (OnRelease) {
OnRelease();
}
} else if (msg.get_member() == "RequestPinCode") {
SimpleDBus::Holder arg_device = msg.extract();
std::string pin_code = "abc123";
if (OnRequestPinCode) {
pin_code = OnRequestPinCode(arg_device.get<std::string>());
}
if (!pin_code.empty()) {
reply.append_argument(SimpleDBus::Holder::create<std::string>(pin_code), DBUS_TYPE_STRING_AS_STRING);
} else {
reply_error(msg, "org.bluez.Error.Rejected", "User rejected the request");
return;
}
} else if (msg.get_member() == "RequestPasskey") {
SimpleDBus::Holder arg_device = msg.extract();
int32_t passkey = 123456;
if (OnRequestPasskey) {
passkey = OnRequestPasskey(arg_device.get<std::string>());
}
if (passkey >= 0 && passkey <= 999999) {
reply.append_argument(SimpleDBus::Holder::create<uint32_t>(static_cast<uint32_t>(passkey)),
DBUS_TYPE_UINT32_AS_STRING);
} else {
reply_error(msg, "org.bluez.Error.Rejected", "User rejected the request");
return;
}
} else if (msg.get_member() == "DisplayPinCode") {
SimpleDBus::Holder arg_device = msg.extract();
msg.extract_next();
SimpleDBus::Holder arg_pin_code = msg.extract();
bool success = true;
if (OnDisplayPinCode) {
success = OnDisplayPinCode(arg_device.get<std::string>(), arg_pin_code.get<std::string>());
}
if (!success) {
reply_error(msg, "org.bluez.Error.Rejected", "User rejected the request");
return;
}
} else if (msg.get_member() == "DisplayPasskey") {
SimpleDBus::Holder arg_device = msg.extract();
msg.extract_next();
SimpleDBus::Holder arg_passkey = msg.extract();
msg.extract_next();
SimpleDBus::Holder arg_entered = msg.extract();
if (OnDisplayPasskey) {
OnDisplayPasskey(arg_device.get<std::string>(), arg_passkey.get<uint32_t>(),
arg_entered.get<uint16_t>());
}
} else if (msg.get_member() == "RequestConfirmation") {
SimpleDBus::Holder arg_device = msg.extract();
msg.extract_next();
SimpleDBus::Holder arg_passkey = msg.extract();
bool success = true;
if (OnRequestConfirmation) {
success = OnRequestConfirmation(arg_device.get<std::string>(), arg_passkey.get<uint32_t>());
}
if (!success) {
reply_error(msg, "org.bluez.Error.Rejected", "User rejected the request");
return;
}
} else if (msg.get_member() == "RequestAuthorization") {
SimpleDBus::Holder arg_device = msg.extract();
bool success = true;
if (OnRequestAuthorization) {
success = OnRequestAuthorization(arg_device.get<std::string>());
}
if (!success) {
reply_error(msg, "org.bluez.Error.Rejected", "User rejected the request");
return;
}
} else if (msg.get_member() == "AuthorizeService") {
SimpleDBus::Holder arg_device = msg.extract();
msg.extract_next();
SimpleDBus::Holder arg_uuid = msg.extract();
bool success = true;
if (OnAuthorizeService) {
success = OnAuthorizeService(arg_device.get<std::string>(), arg_uuid.get<std::string>());
}
if (!success) {
reply_error(msg, "org.bluez.Error.Rejected", "User rejected the request");
return;
}
} else if (msg.get_member() == "Cancel") {
if (OnCancel) {
OnCancel();
}
} else {
}
_conn->send(reply);
}
}
void Agent1::reply_error(SimpleDBus::Message& msg, const std::string& error_name, const std::string& error_message) {
SimpleDBus::Message reply = SimpleDBus::Message::create_error(msg, error_name, error_message);
_conn->send(reply);
}