forked from Kistler-Group/sdbus-cpp
codegen: Support chrono literal timeout by ProxyGenerator
Allow to use human readable chrono literals to specify method call timeout. The change is backward compatbile - if no unit is provided, the fallback is "us". Example: <annotation name="org.freedesktop.DBus.Method.Timeout" value="500ms"/>
This commit is contained in:
committed by
Stanislav Angelovič
parent
b01db13ff7
commit
442670ec18
@ -1156,6 +1156,27 @@ So in the specific example above, the stub generator will generate a `Concatenat
|
|||||||
|
|
||||||
For a real example of a client-side asynchronous D-Bus method, please look at sdbus-c++ [stress tests](/tests/stresstests).
|
For a real example of a client-side asynchronous D-Bus method, please look at sdbus-c++ [stress tests](/tests/stresstests).
|
||||||
|
|
||||||
|
## Method call timeout
|
||||||
|
|
||||||
|
Annotate the element with `org.freedesktop.DBus.Method.Timeout` in order to specify the timeout value for the method call. The value should be a number of microseconds or number with duration literal (`us`/`ms`/`s`/`min`). Optionally combine it with `org.freedesktop.DBus.Method.Async`.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<node>
|
||||||
|
<interface name="org.bluez.Device1">
|
||||||
|
<method name="Connect">
|
||||||
|
<annotation name="org.freedesktop.DBus.Method.Async" value="client"/>
|
||||||
|
<annotation name="org.freedesktop.DBus.Method.Timeout" value="3000ms"/>
|
||||||
|
</method>
|
||||||
|
<method name="Disconnect">
|
||||||
|
<annotation name="org.freedesktop.DBus.Method.Async" value="client"/>
|
||||||
|
<annotation name="org.freedesktop.DBus.Method.Timeout" value="2000000"/> <!-- 2000000us -->
|
||||||
|
</method>
|
||||||
|
</interface>
|
||||||
|
</node>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Using D-Bus properties
|
Using D-Bus properties
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
|
||||||
@ -130,6 +131,8 @@ std::string ProxyGenerator::processInterface(Node& interface) const
|
|||||||
|
|
||||||
std::tuple<std::string, std::string> ProxyGenerator::processMethods(const Nodes& methods) const
|
std::tuple<std::string, std::string> ProxyGenerator::processMethods(const Nodes& methods) const
|
||||||
{
|
{
|
||||||
|
const std::regex patternTimeout{R"(^(\d+)(min|s|ms|us)?$)"};
|
||||||
|
|
||||||
std::ostringstream definitionSS, asyncDeclarationSS;
|
std::ostringstream definitionSS, asyncDeclarationSS;
|
||||||
|
|
||||||
for (const auto& method : methods)
|
for (const auto& method : methods)
|
||||||
@ -143,6 +146,7 @@ std::tuple<std::string, std::string> ProxyGenerator::processMethods(const Nodes&
|
|||||||
bool dontExpectReply{false};
|
bool dontExpectReply{false};
|
||||||
bool async{false};
|
bool async{false};
|
||||||
std::string timeoutValue;
|
std::string timeoutValue;
|
||||||
|
std::smatch smTimeout;
|
||||||
|
|
||||||
Nodes annotations = (*method)["annotation"];
|
Nodes annotations = (*method)["annotation"];
|
||||||
for (const auto& annotation : annotations)
|
for (const auto& annotation : annotations)
|
||||||
@ -168,6 +172,13 @@ std::tuple<std::string, std::string> ProxyGenerator::processMethods(const Nodes&
|
|||||||
timeoutValue.clear();
|
timeoutValue.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!timeoutValue.empty() && !std::regex_match(timeoutValue, smTimeout, patternTimeout))
|
||||||
|
{
|
||||||
|
std::cerr << "Function: " << name << ": ";
|
||||||
|
std::cerr << "Option 'org.freedesktop.DBus.Method.Timeout' has unsupported timeout value! Option ignored..." << std::endl;
|
||||||
|
timeoutValue.clear();
|
||||||
|
}
|
||||||
|
|
||||||
auto retType = outArgsToType(outArgs);
|
auto retType = outArgsToType(outArgs);
|
||||||
std::string inArgStr, inArgTypeStr;
|
std::string inArgStr, inArgTypeStr;
|
||||||
std::tie(inArgStr, inArgTypeStr, std::ignore, std::ignore) = argsToNamesAndTypes(inArgs);
|
std::tie(inArgStr, inArgTypeStr, std::ignore, std::ignore) = argsToNamesAndTypes(inArgs);
|
||||||
@ -193,7 +204,9 @@ std::tuple<std::string, std::string> ProxyGenerator::processMethods(const Nodes&
|
|||||||
|
|
||||||
if (!timeoutValue.empty())
|
if (!timeoutValue.empty())
|
||||||
{
|
{
|
||||||
definitionSS << ".withTimeout(" << timeoutValue << "us)";
|
const auto val = smTimeout.str(1);
|
||||||
|
const auto unit = smTimeout.str(2);
|
||||||
|
definitionSS << ".withTimeout(" << val << (unit.empty() ? "us" : unit) << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inArgs.size() > 0)
|
if (inArgs.size() > 0)
|
||||||
|
Reference in New Issue
Block a user