/* Chrysalide - Outil d'analyse de fichiers binaires
 * base64.c - équivalent Python du fichier "plugins/encodings/base64.c"
 *
 * Copyright (C) 2023 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Chrysalide 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */


#include "base64.h"


#include <pygobject.h>


#include <plugins/pychrysalide/access.h>
#include <plugins/pychrysalide/helpers.h>


#include "../base64.h"



/* Procède à l'encodage d'un contenu en base 64. */
static PyObject *py_encodings_base64_encode(PyObject *, PyObject *);



/******************************************************************************
*                                                                             *
*  Paramètres  : self = objet Python concerné par l'appel.                    *
*                args = paramètre à récupérer pour le traitement.             *
*                                                                             *
*  Description : Procède à l'encodage d'un contenu en base 64.                *
*                                                                             *
*  Retour      : None ou données sortantes constituées.                       *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

static PyObject *py_encodings_base64_encode(PyObject *self, PyObject *args)
{
    PyObject *result;                       /* Valeur à retourner          */
    sized_string_t alphabet;                /* Alphabet de traitement ?    */
    Py_ssize_t alen;                        /* Taille de cet alphabet      */
    sized_binary_t input;                   /* Données à traiter           */
    Py_ssize_t ilen;                        /* Quantité de ces données     */
    int ret;                                /* Bilan de lecture des args.  */
    sized_string_t output;                  /* Données encodées à exporter */
    bool status;                            /* Bilan de l'opération        */

#define ENCODINGS_BASE64_ENCODE_METHOD PYTHON_METHOD_DEF                \
(                                                                       \
    base64_encode, "input, /, alphabet=None",                           \
    METH_VARARGS, py_encodings,                                         \
    "Encode a given content using Base64.\n"                            \
    "\n"                                                                \
    "The *input* argument has to be provided as bytes. The optional"    \
    " *alphabet* is expected to be a 64-byte array if defined.\n"       \
    "\n"                                                                \
    "The returned value is bytes or *None* in case of error."           \
)

    result = NULL;

    alphabet.data = NULL;
    alen = 0;

    ret = PyArg_ParseTuple(args, "s#|s#", &input.static_data, &ilen, &alphabet.static_data, &alen);
    if (!ret) goto exit;

    alphabet.len = alen;
    input.len = ilen;

    if (alphabet.len > 0)
        status = _base64_encode(&input, &output, &alphabet);
    else
        status = base64_encode(&input, &output);

    if (status)
    {
        result = PyBytes_FromStringAndSize(output.data, output.len);
        exit_szstr(&output);
    }
    else
    {
        result = Py_None;
        Py_INCREF(result);
    }

 exit:

    return result;

}


/******************************************************************************
*                                                                             *
*  Paramètres  : super = module dont la définition est à compléter.           *
*                                                                             *
*  Description : Définit une extension du module 'encodings' à compléter.     *
*                                                                             *
*  Retour      : Bilan de l'opération.                                        *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

bool populate_encodings_module_with_base64(PyObject *super)
{
    bool result;                            /* Bilan à retourner           */

    static PyMethodDef py_base64_methods[] = {
        ENCODINGS_BASE64_ENCODE_METHOD,
        { NULL }
    };

    result = register_python_module_methods(super, py_base64_methods);

    return result;

}