From ff23e24063feb9e1628858fd32df37be557072a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= Date: Fri, 16 Oct 2020 11:53:31 +0200 Subject: [PATCH] Add Assuan transaction that forwards status lines to another object * lang/cpp/src/Makefile.am: Add new files. * lang/cpp/src/interfaces/statusconsumer.h, lang/cpp/src/statusconsumerassuantransaction.cpp, lang/cpp/src/statusconsumerassuantransaction.h: New. * NEWS: Mention new API. -- This Assuan transaction is useful for long running Assuan commands. Classes implementing the StatusConsumer interface can process received status lines while the Assuan command is still running. GnuPG-bug-id: 5066 --- NEWS | 2 + lang/cpp/src/Makefile.am | 5 +- lang/cpp/src/interfaces/statusconsumer.h | 42 ++++++++++++ .../src/statusconsumerassuantransaction.cpp | 67 +++++++++++++++++++ .../cpp/src/statusconsumerassuantransaction.h | 51 ++++++++++++++ 5 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 lang/cpp/src/interfaces/statusconsumer.h create mode 100644 lang/cpp/src/statusconsumerassuantransaction.cpp create mode 100644 lang/cpp/src/statusconsumerassuantransaction.h diff --git a/NEWS b/NEWS index 830d206e..96520552 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,8 @@ Noteworthy changes in version 1.14.1 (unreleased) cpp: EngineInfo::Version::operator<= NEW. cpp: EngineInfo::Version::operator>= NEW. cpp: EngineInfo::Version::operator!= NEW. + cpp: StatusConsumer NEW. + cpp: StatusConsumerAssuanTransaction NEW. qt: operator<<(QDebug debug, const GpgME::Error &err) NEW. diff --git a/lang/cpp/src/Makefile.am b/lang/cpp/src/Makefile.am index 1b1de327..32e3045c 100644 --- a/lang/cpp/src/Makefile.am +++ b/lang/cpp/src/Makefile.am @@ -35,6 +35,7 @@ main_sources = \ gpgadduserideditinteractor.cpp gpggencardkeyinteractor.cpp \ defaultassuantransaction.cpp \ scdgetinfoassuantransaction.cpp gpgagentgetinfoassuantransaction.cpp \ + statusconsumerassuantransaction.cpp \ vfsmountresult.cpp configuration.cpp tofuinfo.cpp swdbresult.cpp gpgmepp_headers = \ @@ -47,6 +48,7 @@ gpgmepp_headers = \ gpggencardkeyinteractor.h \ importresult.h keygenerationresult.h key.h keylistresult.h \ notation.h result.h scdgetinfoassuantransaction.h signingresult.h \ + statusconsumerassuantransaction.h \ trustitem.h verificationresult.h vfsmountresult.h gpgmepp_export.h \ tofuinfo.h swdbresult.h @@ -55,7 +57,8 @@ private_gpgmepp_headers = \ interface_headers= \ interfaces/assuantransaction.h interfaces/dataprovider.h \ - interfaces/passphraseprovider.h interfaces/progressprovider.h + interfaces/passphraseprovider.h interfaces/progressprovider.h \ + interfaces/statusconsumer.h gpgmeppincludedir = $(includedir)/gpgme++ gpgmeppinclude_HEADERS = $(gpgmepp_headers) diff --git a/lang/cpp/src/interfaces/statusconsumer.h b/lang/cpp/src/interfaces/statusconsumer.h new file mode 100644 index 00000000..a819fccf --- /dev/null +++ b/lang/cpp/src/interfaces/statusconsumer.h @@ -0,0 +1,42 @@ +/* + statusconsumer.h - Interface for status callbacks + Copyright (c) 2020 g10 Code GmbH + Software engineering by Ingo Klöcker + + This file is part of GPGME++. + + GPGME++ is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + GPGME++ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with GPGME++; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef __GPGMEPP_INTERFACES_STATUSCONSUMER_H__ +#define __GPGMEPP_INTERFACES_STATUSCONSUMER_H__ + +#include "gpgmepp_export.h" + +namespace GpgME +{ + +class GPGMEPP_EXPORT StatusConsumer +{ +public: + virtual ~StatusConsumer() {} + + virtual void status(const char *status, const char *details) = 0; +}; + +} // namespace GpgME + +#endif // __GPGMEPP_INTERFACES_STATUSCONSUMER_H__ diff --git a/lang/cpp/src/statusconsumerassuantransaction.cpp b/lang/cpp/src/statusconsumerassuantransaction.cpp new file mode 100644 index 00000000..7adfac03 --- /dev/null +++ b/lang/cpp/src/statusconsumerassuantransaction.cpp @@ -0,0 +1,67 @@ +/* + statusconsumerassuantransaction.cpp + Copyright (c) 2020 g10 Code GmbH + Software engineering by Ingo Klöcker + + This file is part of GPGME++. + + GPGME++ is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + GPGME++ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with GPGME++; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "statusconsumerassuantransaction.h" + +#include "data.h" +#include "error.h" + +#include "interfaces/statusconsumer.h" + +using namespace GpgME; + +StatusConsumerAssuanTransaction::StatusConsumerAssuanTransaction(StatusConsumer *statusConsumer) + : AssuanTransaction() + , m_consumer(statusConsumer) +{ +} + +StatusConsumerAssuanTransaction::~StatusConsumerAssuanTransaction() +{ +} + +Error StatusConsumerAssuanTransaction::data(const char *data, size_t datalen) +{ + (void) data; + (void) datalen; + return Error(); +} + +Data StatusConsumerAssuanTransaction::inquire(const char *name, const char *args, Error &err) +{ + (void)name; + (void)args; + (void)err; + return Data::null; +} + +Error StatusConsumerAssuanTransaction::status(const char *status, const char *args) +{ + m_consumer->status(status, args); + + return Error(); +} diff --git a/lang/cpp/src/statusconsumerassuantransaction.h b/lang/cpp/src/statusconsumerassuantransaction.h new file mode 100644 index 00000000..9501b0ee --- /dev/null +++ b/lang/cpp/src/statusconsumerassuantransaction.h @@ -0,0 +1,51 @@ +/* + statusconsumerassuantransaction.h - Assuan transaction that forwards status lines to a consumer + Copyright (c) 2020 g10 Code GmbH + Software engineering by Ingo Klöcker + + This file is part of GPGME++. + + GPGME++ is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + GPGME++ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with GPGME++; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef __GPGMEPP_STATUSCONSUMERASSUANTRANSACTION_H__ +#define __GPGMEPP_STATUSCONSUMERASSUANTRANSACTION_H__ + +#include + +namespace GpgME +{ + +class StatusConsumer; + +class GPGMEPP_EXPORT StatusConsumerAssuanTransaction: public AssuanTransaction +{ +public: + explicit StatusConsumerAssuanTransaction(StatusConsumer *statusConsumer); + ~StatusConsumerAssuanTransaction(); + +private: + Error data(const char *data, size_t datalen) override; + Data inquire(const char *name, const char *args, Error &err) override; + Error status(const char *status, const char *args) override; + +private: + StatusConsumer *m_consumer; +}; + +} // namespace GpgME + +#endif // __GPGMEPP_STATUSCONSUMERASSUANTRANSACTION_H__