Blame lang/cpp/src/scdgetinfoassuantransaction.cpp

Packit d7e8d0
/*
Packit d7e8d0
  scdgetinfoassuantransaction.cpp - Assuan Transaction to get information from scdaemon
Packit d7e8d0
  Copyright (C) 2009 Klarälvdalens Datakonsult AB
Packit d7e8d0
  2016 Bundesamt für Sicherheit in der Informationstechnik
Packit d7e8d0
  Software engineering by Intevation GmbH
Packit d7e8d0
Packit d7e8d0
  This file is part of GPGME++.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is free software; you can redistribute it and/or
Packit d7e8d0
  modify it under the terms of the GNU Library General Public
Packit d7e8d0
  License as published by the Free Software Foundation; either
Packit d7e8d0
  version 2 of the License, or (at your option) any later version.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is distributed in the hope that it will be useful,
Packit d7e8d0
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit d7e8d0
  GNU Library General Public License for more details.
Packit d7e8d0
Packit d7e8d0
  You should have received a copy of the GNU Library General Public License
Packit d7e8d0
  along with GPGME++; see the file COPYING.LIB.  If not, write to the
Packit d7e8d0
  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit d7e8d0
  Boston, MA 02110-1301, USA.
Packit d7e8d0
*/
Packit d7e8d0
Packit d7e8d0
#ifdef HAVE_CONFIG_H
Packit d7e8d0
 #include "config.h"
Packit d7e8d0
#endif
Packit d7e8d0
Packit d7e8d0
#include "scdgetinfoassuantransaction.h"
Packit d7e8d0
#include "error.h"
Packit d7e8d0
#include "data.h"
Packit d7e8d0
#include "util.h"
Packit d7e8d0
Packit d7e8d0
#include <sstream>
Packit d7e8d0
#include <assert.h>
Packit d7e8d0
Packit d7e8d0
using namespace GpgME;
Packit d7e8d0
Packit d7e8d0
ScdGetInfoAssuanTransaction::ScdGetInfoAssuanTransaction(InfoItem item)
Packit d7e8d0
    : AssuanTransaction(),
Packit d7e8d0
      m_item(item),
Packit d7e8d0
      m_command(),
Packit d7e8d0
      m_data()
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
ScdGetInfoAssuanTransaction::~ScdGetInfoAssuanTransaction() {}
Packit d7e8d0
Packit d7e8d0
static std::vector<std::string> to_reader_list(const std::string &s)
Packit d7e8d0
{
Packit d7e8d0
    std::vector<std::string> result;
Packit d7e8d0
    std::stringstream ss(s);
Packit d7e8d0
    std::string tok;
Packit d7e8d0
    while (std::getline(ss, tok, '\n')) {
Packit d7e8d0
        result.push_back(tok);
Packit d7e8d0
    }
Packit d7e8d0
    return result;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
static std::vector<std::string> to_app_list(const std::string &s)
Packit d7e8d0
{
Packit d7e8d0
    return to_reader_list(s);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::string ScdGetInfoAssuanTransaction::version() const
Packit d7e8d0
{
Packit d7e8d0
    if (m_item == Version) {
Packit d7e8d0
        return m_data;
Packit d7e8d0
    } else {
Packit d7e8d0
        return std::string();
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
unsigned int ScdGetInfoAssuanTransaction::pid() const
Packit d7e8d0
{
Packit d7e8d0
    if (m_item == Pid) {
Packit d7e8d0
        return to_pid(m_data);
Packit d7e8d0
    } else {
Packit d7e8d0
        return 0U;
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::string ScdGetInfoAssuanTransaction::socketName() const
Packit d7e8d0
{
Packit d7e8d0
    if (m_item == SocketName) {
Packit d7e8d0
        return m_data;
Packit d7e8d0
    } else {
Packit d7e8d0
        return std::string();
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
char ScdGetInfoAssuanTransaction::status() const
Packit d7e8d0
{
Packit d7e8d0
    if (m_item == Status && !m_data.empty()) {
Packit d7e8d0
        return m_data[0];
Packit d7e8d0
    } else {
Packit d7e8d0
        return '\0';
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::vector<std::string> ScdGetInfoAssuanTransaction::readerList() const
Packit d7e8d0
{
Packit d7e8d0
    if (m_item == ReaderList) {
Packit d7e8d0
        return to_reader_list(m_data);
Packit d7e8d0
    } else {
Packit d7e8d0
        return std::vector<std::string>();
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::vector<std::string> ScdGetInfoAssuanTransaction::applicationList() const
Packit d7e8d0
{
Packit d7e8d0
    if (m_item == ApplicationList) {
Packit d7e8d0
        return to_app_list(m_data);
Packit d7e8d0
    } else {
Packit d7e8d0
        return std::vector<std::string>();
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
static const char *const scd_getinfo_tokens[] = {
Packit d7e8d0
    "version",
Packit d7e8d0
    "pid",
Packit d7e8d0
    "socket_name",
Packit d7e8d0
    "status",
Packit d7e8d0
    "reader_list",
Packit d7e8d0
    "deny_admin",
Packit d7e8d0
    "app_list",
Packit d7e8d0
};
Packit d7e8d0
static_assert((sizeof scd_getinfo_tokens / sizeof * scd_getinfo_tokens == ScdGetInfoAssuanTransaction::LastInfoItem),
Packit d7e8d0
              "getinfo_tokens size mismatch");
Packit d7e8d0
Packit d7e8d0
void ScdGetInfoAssuanTransaction::makeCommand() const
Packit d7e8d0
{
Packit d7e8d0
    assert(m_item >= 0);
Packit d7e8d0
    assert(m_item < LastInfoItem);
Packit d7e8d0
    m_command = "SCD GETINFO ";
Packit d7e8d0
    m_command += scd_getinfo_tokens[m_item];
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *ScdGetInfoAssuanTransaction::command() const
Packit d7e8d0
{
Packit d7e8d0
    makeCommand();
Packit d7e8d0
    return m_command.c_str();
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Error ScdGetInfoAssuanTransaction::data(const char *data, size_t len)
Packit d7e8d0
{
Packit d7e8d0
    m_data.append(data, len);
Packit d7e8d0
    return Error();
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Data ScdGetInfoAssuanTransaction::inquire(const char *name, const char *args, Error &err)
Packit d7e8d0
{
Packit d7e8d0
    (void)name; (void)args; (void)err;
Packit d7e8d0
    return Data::null;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Error ScdGetInfoAssuanTransaction::status(const char *status, const char *args)
Packit d7e8d0
{
Packit d7e8d0
    (void)status; (void)args;
Packit d7e8d0
    return Error();
Packit d7e8d0
}