Blame baselib/ohpi.cpp

Packit db01ca
/*      -*- linux-c -*-
Packit db01ca
 *
Packit db01ca
 * (C) Copyright IBM Corp. 2004-2008
Packit db01ca
 * (C) Copyright Pigeon Point Systems. 2010
Packit db01ca
 * (C) Copyright Nokia Siemens Networks 2010
Packit db01ca
 *
Packit db01ca
 * This program is distributed in the hope that it will be useful,
Packit db01ca
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit db01ca
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  This
Packit db01ca
 * file and program are licensed under a BSD style license.  See
Packit db01ca
 * the Copying file included with the OpenHPI distribution for
Packit db01ca
 * full licensing terms.
Packit db01ca
 *
Packit db01ca
 * Author(s):
Packit db01ca
 *      W. David Ashley <dashley@us.ibm.com>
Packit db01ca
 *      Renier Morales <renier@openhpi.org>
Packit db01ca
 *      Anton Pak <anton.pak@pigeonpoint.com>
Packit db01ca
 *      Ulrich Kleber <ulikleber@users.sourceforge.net>
Packit db01ca
 *
Packit db01ca
 */
Packit db01ca
Packit db01ca
#include <stddef.h>
Packit db01ca
#include <string.h>
Packit db01ca
Packit db01ca
#include <glib.h>
Packit db01ca
Packit db01ca
#include <SaHpi.h>
Packit db01ca
#include <oHpi.h>
Packit db01ca
#include <config.h>
Packit db01ca
#include <marshal_hpi.h>
Packit db01ca
#include <oh_rpc_params.h>
Packit db01ca
#include <oh_utils.h>
Packit db01ca
Packit db01ca
#include "conf.h"
Packit db01ca
#include "init.h"
Packit db01ca
#include "session.h"
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* Utility functions                                                          */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
static void __dehash_config(gpointer key, gpointer value, gpointer data)
Packit db01ca
{
Packit db01ca
    oHpiHandlerConfigT *hc = (oHpiHandlerConfigT *)data;
Packit db01ca
Packit db01ca
    strncpy((char *)hc->Params[hc->NumberOfParams].Name,
Packit db01ca
            (const char *)key,
Packit db01ca
            SAHPI_MAX_TEXT_BUFFER_LENGTH);
Packit db01ca
    strncpy((char *)hc->Params[hc->NumberOfParams].Value,
Packit db01ca
            (const char *)value,
Packit db01ca
            SAHPI_MAX_TEXT_BUFFER_LENGTH);
Packit db01ca
Packit db01ca
    ++hc->NumberOfParams;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiVersionGet                                                             */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaHpiUint64T SAHPI_API oHpiVersionGet(void)
Packit db01ca
{
Packit db01ca
    SaHpiUint64T v = 0;
Packit db01ca
Packit db01ca
    OHPI_VERSION_GET(v, VERSION);
Packit db01ca
Packit db01ca
    return v;
Packit db01ca
}
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiHandlerCreate                                                          */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaErrorT SAHPI_API oHpiHandlerCreate (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    GHashTable *config,
Packit db01ca
    SAHPI_OUT   oHpiHandlerIdT *id)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
    oHpiHandlerConfigT handler_config;
Packit db01ca
Packit db01ca
    if (!config || !id) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (g_hash_table_size(config) == 0) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    handler_config.Params = g_new0(oHpiHandlerConfigParamT, g_hash_table_size(config));
Packit db01ca
    handler_config.NumberOfParams = 0;
Packit db01ca
    // add each hash table entry to the marshable handler_config
Packit db01ca
    g_hash_table_foreach(config, __dehash_config, &handler_config);
Packit db01ca
Packit db01ca
    // now create the handler
Packit db01ca
    ClientRpcParams iparams(&handler_config);
Packit db01ca
    ClientRpcParams oparams(id);
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiHandlerCreate, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiHandlerDestroy                                                         */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaErrorT SAHPI_API oHpiHandlerDestroy (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    oHpiHandlerIdT id)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (id == 0) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(&id;;
Packit db01ca
    ClientRpcParams oparams;
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiHandlerDestroy, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiHandlerInfo                                                            */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaErrorT SAHPI_API oHpiHandlerInfo (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    oHpiHandlerIdT id,
Packit db01ca
    SAHPI_OUT   oHpiHandlerInfoT *info,
Packit db01ca
    SAHPI_INOUT GHashTable *conf_params)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
    oHpiHandlerConfigT config;
Packit db01ca
Packit db01ca
    if (id == 0 || !info || !conf_params) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (g_hash_table_size(conf_params) != 0) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(&id;;
Packit db01ca
    ClientRpcParams oparams(info, &config);
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiHandlerInfo, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    for (unsigned int n = 0; n < config.NumberOfParams; n++) {
Packit db01ca
        g_hash_table_insert(conf_params,
Packit db01ca
                            g_strdup((const gchar *)config.Params[n].Name),
Packit db01ca
                            g_strdup((const gchar *)config.Params[n].Value));
Packit db01ca
    }
Packit db01ca
    g_free(config.Params);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiHandlerGetNext                                                         */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaErrorT SAHPI_API oHpiHandlerGetNext (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    oHpiHandlerIdT id,
Packit db01ca
    SAHPI_OUT   oHpiHandlerIdT *next_id)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (!next_id) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(&id;;
Packit db01ca
    ClientRpcParams oparams(next_id);
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiHandlerGetNext, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiHandlerFind                                                            */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiHandlerFind (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    SaHpiResourceIdT rid,
Packit db01ca
    SAHPI_OUT   oHpiHandlerIdT *id)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (!id || !rid) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    *id = 0; //Initialize output var
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(&sid, &rid;;
Packit db01ca
    ClientRpcParams oparams(id);
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiHandlerFind, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiHandlerRetry                                                           */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiHandlerRetry (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    oHpiHandlerIdT id)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (id == 0) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(&id;;
Packit db01ca
    ClientRpcParams oparams;
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiHandlerRetry, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiGlobalParamGet                                                         */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaErrorT SAHPI_API oHpiGlobalParamGet (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_INOUT oHpiGlobalParamT *param)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (!param) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(param);
Packit db01ca
    ClientRpcParams oparams(param);
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiGlobalParamGet, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiGlobalParamSet                                                         */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
Packit db01ca
SaErrorT SAHPI_API oHpiGlobalParamSet (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    oHpiGlobalParamT *param)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (!param) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(param);
Packit db01ca
    ClientRpcParams oparams;
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiGlobalParamSet, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiInjectEvent                                                            */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiInjectEvent (
Packit db01ca
    SAHPI_IN    SaHpiSessionIdT sid,
Packit db01ca
    SAHPI_IN    oHpiHandlerIdT id,
Packit db01ca
    SAHPI_IN    SaHpiEventT    *event,
Packit db01ca
    SAHPI_IN    SaHpiRptEntryT *rpte,
Packit db01ca
    SAHPI_IN    SaHpiRdrT *rdr)
Packit db01ca
{
Packit db01ca
    SaErrorT rv;
Packit db01ca
Packit db01ca
    if (id == 0 || !event || !rpte || !rdr) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    ClientRpcParams iparams(&id, event, rpte, rdr);
Packit db01ca
    ClientRpcParams oparams;
Packit db01ca
    rv = ohc_sess_rpc(eFoHpiInjectEvent, sid, iparams, oparams);
Packit db01ca
Packit db01ca
    return rv;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiDomainAdd                                                              */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiDomainAdd (
Packit db01ca
    SAHPI_IN    const SaHpiTextBufferT *host,
Packit db01ca
    SAHPI_IN    SaHpiUint16T port,
Packit db01ca
    SAHPI_IN    const SaHpiEntityPathT *entity_root,
Packit db01ca
    SAHPI_OUT   SaHpiDomainIdT *domain_id)
Packit db01ca
{
Packit db01ca
    if (!host) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (!domain_id) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (!entity_root) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if ((host->DataType != SAHPI_TL_TYPE_BCDPLUS) &&
Packit db01ca
         (host->DataType != SAHPI_TL_TYPE_ASCII6) &&
Packit db01ca
         (host->DataType != SAHPI_TL_TYPE_TEXT))
Packit db01ca
    {
Packit db01ca
        return SA_ERR_HPI_INVALID_DATA;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    // Function may be called before first session was opened,
Packit db01ca
    // so we may need to initialize
Packit db01ca
    ohc_init();
Packit db01ca
Packit db01ca
    char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH+1];
Packit db01ca
    memcpy(&buf[0], &host->Data[0], host->DataLength);
Packit db01ca
    buf[host->DataLength] = '\0';
Packit db01ca
Packit db01ca
    return ohc_add_domain_conf(buf, port, entity_root, domain_id);
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiDomainAddById                                                          */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiDomainAddById (
Packit db01ca
    SAHPI_IN    SaHpiDomainIdT domain_id,
Packit db01ca
    SAHPI_IN    const SaHpiTextBufferT *host,
Packit db01ca
    SAHPI_IN    SaHpiUint16T port,
Packit db01ca
    SAHPI_IN    const SaHpiEntityPathT *entity_root)
Packit db01ca
{
Packit db01ca
    if (!host) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (!entity_root) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if ((host->DataType != SAHPI_TL_TYPE_BCDPLUS) &&
Packit db01ca
         (host->DataType != SAHPI_TL_TYPE_ASCII6) &&
Packit db01ca
         (host->DataType != SAHPI_TL_TYPE_TEXT))
Packit db01ca
    {
Packit db01ca
        return SA_ERR_HPI_INVALID_DATA;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    // Function may be called before first session was opened,
Packit db01ca
    // so we may need to initialize
Packit db01ca
    ohc_init();
Packit db01ca
Packit db01ca
    char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH+1];
Packit db01ca
    memcpy(&buf[0], &host->Data[0], host->DataLength);
Packit db01ca
    buf[host->DataLength] = '\0';
Packit db01ca
Packit db01ca
    return ohc_add_domain_conf_by_id(domain_id, buf, port, entity_root);
Packit db01ca
}
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiDomainEntryGet                                                         */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiDomainEntryGet (
Packit db01ca
    SAHPI_IN    SaHpiEntryIdT    EntryId,
Packit db01ca
    SAHPI_OUT   SaHpiEntryIdT    *NextEntryId,
Packit db01ca
    SAHPI_OUT   oHpiDomainEntryT *DomainEntry)
Packit db01ca
Packit db01ca
{
Packit db01ca
    if (!NextEntryId || !DomainEntry) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    // Function may be called before first session was opened,
Packit db01ca
    // so we may need to initialize
Packit db01ca
    ohc_init();
Packit db01ca
Packit db01ca
    const ohc_domain_conf *dc = ohc_get_next_domain_conf(EntryId, NextEntryId);
Packit db01ca
    if (dc == 0) { // no config for did found
Packit db01ca
        return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    DomainEntry->id = (SaHpiDomainIdT) EntryId;
Packit db01ca
    if (oh_init_textbuffer(&DomainEntry->host) != SA_OK) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (oh_append_textbuffer(&DomainEntry->host, dc->host)!= SA_OK) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    DomainEntry->port = dc->port;
Packit db01ca
    memcpy(&DomainEntry->entity_root, &dc->entity_root, sizeof(SaHpiEntityPathT));
Packit db01ca
Packit db01ca
    return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
/* oHpiDomainEntryGetByDomainId                                               */
Packit db01ca
/*----------------------------------------------------------------------------*/
Packit db01ca
SaErrorT SAHPI_API oHpiDomainEntryGetByDomainId (
Packit db01ca
    SAHPI_IN    SaHpiDomainIdT    DomainId,
Packit db01ca
    SAHPI_OUT   oHpiDomainEntryT *DomainEntry)
Packit db01ca
Packit db01ca
{
Packit db01ca
    if (!DomainEntry) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    // Function may be called before first session was opened,
Packit db01ca
    // so we may need to initialize
Packit db01ca
    ohc_init();
Packit db01ca
Packit db01ca
    const ohc_domain_conf *entry = ohc_get_domain_conf(DomainId);
Packit db01ca
    if (entry == 0) { // no config for did found
Packit db01ca
        return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
    }
Packit db01ca
Packit db01ca
    DomainEntry->id = DomainId;
Packit db01ca
    if (oh_init_textbuffer(&DomainEntry->host) != SA_OK) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    if (oh_append_textbuffer(&DomainEntry->host, entry->host)!= SA_OK) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    DomainEntry->port = entry->port;
Packit db01ca
    memcpy(&DomainEntry->entity_root, &entry->entity_root, sizeof(SaHpiEntityPathT));    
Packit db01ca
Packit db01ca
    return SA_OK;
Packit db01ca
}
Packit db01ca