1From 31ad5ec50ec0c9cc7a92f009925c5f58aecdcce1 Mon Sep 17 00:00:00 2001
2From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
3Date: Thu, 30 Dec 2021 14:58:11 +0100
4Subject: [PATCH] Support glibmm 2.68
5
6Support glibmm 2.68 which has been released one year ago and is the
7first stable release in the glibmm-2.68 ABI series:
8https://gitlab.gnome.org/GNOME/glibmm/-/blob/2.68.2/NEWS
9
10As TimeVal is not available with glibmm 2.68, use DateTime which is
11available since version 2.26
12
13Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
14[Upstream status:
15https://sourceforge.net/p/sigrok/mailman/message/37410614]
16---
17 README                                             |  2 +-
18 bindings/cxx/classes.cpp                           | 13 ++++++-------
19 bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp |  4 ++--
20 bindings/cxx/libsigrokcxx.pc.in                    |  2 +-
21 configure.ac                                       |  7 ++++++-
22 5 files changed, 16 insertions(+), 12 deletions(-)
23
24diff --git a/README b/README
25index 768c8ca2..2515f059 100644
26--- a/README
27+++ b/README
28@@ -63,7 +63,7 @@ Requirements for the C++ bindings:
29  - doxygen (required for building the bindings, not only for C++ API docs!)
30  - graphviz (optional, only needed for the C++ API docs)
31  - Python (2 or 3) executable (development files are not needed)
32- - glibmm-2.4 (>= 2.32.0)
33+ - glibmm-2.4 (>= 2.32.0) or glibmm-2.68 (>= 2.68.0)
34
35 Requirements for the Python bindings:
36
37diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp
38index f9f79273..de600d03 100644
39--- a/bindings/cxx/classes.cpp
40+++ b/bindings/cxx/classes.cpp
41@@ -287,12 +287,12 @@ shared_ptr<UserDevice> Context::create_user_device(
42 		default_delete<UserDevice>{}};
43 }
44
45-shared_ptr<Packet> Context::create_header_packet(Glib::TimeVal start_time)
46+shared_ptr<Packet> Context::create_header_packet(Glib::DateTime start_time)
47 {
48 	auto header = g_new(struct sr_datafeed_header, 1);
49 	header->feed_version = 1;
50-	header->starttime.tv_sec = start_time.tv_sec;
51-	header->starttime.tv_usec = start_time.tv_usec;
52+	header->starttime.tv_sec = start_time.to_unix();
53+	header->starttime.tv_usec = start_time.get_microsecond();
54 	auto packet = g_new(struct sr_datafeed_packet, 1);
55 	packet->type = SR_DF_HEADER;
56 	packet->payload = header;
57@@ -1154,11 +1154,10 @@ int Header::feed_version() const
58 	return _structure->feed_version;
59 }
60
61-Glib::TimeVal Header::start_time() const
62+Glib::DateTime Header::start_time() const
63 {
64-	return Glib::TimeVal(
65-		_structure->starttime.tv_sec,
66-		_structure->starttime.tv_usec);
67+	Glib::DateTime time = Glib::DateTime::create_now_utc(_structure->starttime.tv_sec);
68+	return time.add_seconds(_structure->starttime.tv_usec / 1.0e6);
69 }
70
71 Meta::Meta(const struct sr_datafeed_meta *structure) :
72diff --git a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp
73index 97e54e17..d090c379 100644
74--- a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp
75+++ b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp
76@@ -274,7 +274,7 @@ public:
77 	std::shared_ptr<UserDevice> create_user_device(
78 		std::string vendor, std::string model, std::string version);
79 	/** Create a header packet. */
80-	std::shared_ptr<Packet> create_header_packet(Glib::TimeVal start_time);
81+	std::shared_ptr<Packet> create_header_packet(Glib::DateTime start_time);
82 	/** Create a meta packet. */
83 	std::shared_ptr<Packet> create_meta_packet(
84 		std::map<const ConfigKey *, Glib::VariantBase> config);
85@@ -711,7 +711,7 @@ public:
86 	/* Feed version number. */
87 	int feed_version() const;
88 	/* Start time of this session. */
89-	Glib::TimeVal start_time() const;
90+	Glib::DateTime start_time() const;
91 private:
92 	explicit Header(const struct sr_datafeed_header *structure);
93 	~Header();
94diff --git a/bindings/cxx/libsigrokcxx.pc.in b/bindings/cxx/libsigrokcxx.pc.in
95index 10a92f2d..7d2723fc 100644
96--- a/bindings/cxx/libsigrokcxx.pc.in
97+++ b/bindings/cxx/libsigrokcxx.pc.in
98@@ -6,7 +6,7 @@ includedir=@includedir@
99 Name: libsigrokcxx
100 Description: C++ bindings for libsigrok
101 URL: http://www.sigrok.org
102-Requires: libsigrok glibmm-2.4
103+Requires: libsigrok @SR_GLIBMM_REQUIRES@
104 Version: @SR_PACKAGE_VERSION@
105 Libs: -L${libdir} -lsigrokcxx
106 Libs.private: -lm
107diff --git a/configure.ac b/configure.ac
108index 424b0002..d70575b7 100644
109--- a/configure.ac
110+++ b/configure.ac
111@@ -407,9 +407,14 @@ AS_IF([test "x$HAVE_CXX11" != x1],
112 	[SR_APPEND([sr_cxx_missing], [', '], ['C++11'])])
113
114 # The C++ bindings need glibmm.
115-SR_PKG_CHECK([glibmm], [SR_PKGLIBS_CXX], [glibmm-2.4 >= 2.32.0])
116+SR_GLIBMM_REQUIRES=glibmm-2.4
117+SR_PKG_CHECK([glibmm], [SR_PKGLIBS_CXX], [$SR_GLIBMM_REQUIRES >= 2.32.0])
118+AS_IF([test "x$sr_have_glibmm" != xyes],
119+	[SR_GLIBMM_REQUIRES=glibmm-2.68
120+	SR_PKG_CHECK([glibmm], [SR_PKGLIBS_CXX], [$SR_GLIBMM_REQUIRES >= 2.68.0])])
121 AS_IF([test "x$sr_have_glibmm" != xyes],
122 	[SR_APPEND([sr_cxx_missing], [', '], [glibmm])])
123+AC_SUBST(SR_GLIBMM_REQUIRES)
124
125 # The C++ bindings use Doxygen to parse libsigrok symbols.
126 AC_CHECK_PROG([HAVE_DOXYGEN], [doxygen], [yes], [no])
127--
1282.34.1
129
130