/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* config-parser-common.c  Common defines and routines for config file parsing
 *
 * Copyright (C) 2007 Red Hat, Inc.
 *
 * Licensed under the Academic Free License version 2.1
 *
 * This program 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 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
 
#include <config.h>
#include <dbus/dbus-internals.h>
#include <string.h>

#include "config-parser-common.h"
#include "utils.h"

ElementType
bus_config_parser_element_name_to_type (const char *name)
{
  if (strcmp (name, "none") == 0)
    {
      return ELEMENT_NONE;
    }
  else if (strcmp (name, "busconfig") == 0)
    {
      return ELEMENT_BUSCONFIG;
    }
  else if (strcmp (name, "user") == 0)
    {
      return ELEMENT_USER;
    }
  else if (strcmp (name, "auth") == 0)
    {
      return ELEMENT_AUTH;
    }
  else if (strcmp (name, "type") == 0)
    {
      return ELEMENT_CONFIGTYPE;
    }
  else if (strcmp (name, "fork") == 0)
    {
      return ELEMENT_FORK;
    }
  else if (strcmp (name, "pidfile") == 0)
    {
      return ELEMENT_PIDFILE;
    }
  else if (strcmp (name, "listen") == 0)
    {
      return ELEMENT_LISTEN;
    }
  else if (strcmp (name, "auth") == 0)
    {
      return ELEMENT_AUTH;
    }
  else if (strcmp (name, "allow") == 0)
    {
      return ELEMENT_ALLOW;
    }
  else if (strcmp (name, "deny") == 0)
    {
      return ELEMENT_DENY;
    }
  else if (strcmp (name, "servicehelper") == 0)
    {
      return ELEMENT_SERVICEHELPER;
    }
  else if (strcmp (name, "includedir") == 0)
    {
      return ELEMENT_INCLUDEDIR;
    }
  else if (strcmp (name, "standard_session_servicedirs") == 0)
    {
      return ELEMENT_STANDARD_SESSION_SERVICEDIRS;
    }
  else if (strcmp (name, "standard_system_servicedirs") == 0)
    {
      return ELEMENT_STANDARD_SYSTEM_SERVICEDIRS;
    }
  else if (strcmp (name, "servicedir") == 0)
    {
      return ELEMENT_SERVICEDIR;
    }
  else if (strcmp (name, "include") == 0)
    {
      return ELEMENT_INCLUDE;
    }
  else if (strcmp (name, "policy") == 0)
    {
      return ELEMENT_POLICY;
    }
  else if (strcmp (name, "limit") == 0)
    {
      return ELEMENT_LIMIT;
    }
  else if (strcmp (name, "selinux") == 0)
    {
      return ELEMENT_SELINUX;
    }
  else if (strcmp (name, "associate") == 0)
    {
      return ELEMENT_ASSOCIATE;
    }
  else if (strcmp (name, "syslog") == 0)
    {
      return ELEMENT_SYSLOG;
    }
  else if (strcmp (name, "keep_umask") == 0)
    {
      return ELEMENT_KEEP_UMASK;
    }
  else if (strcmp (name, "allow_anonymous") == 0)
    {
      return ELEMENT_ALLOW_ANONYMOUS;
    }
  return ELEMENT_NONE;
}

const char*
bus_config_parser_element_type_to_name (ElementType type)
{
  switch (type)
    {
    case ELEMENT_NONE:
      return NULL;
    case ELEMENT_BUSCONFIG:
      return "busconfig";
    case ELEMENT_INCLUDE:
      return "include";
    case ELEMENT_USER:
      return "user";
    case ELEMENT_LISTEN:
      return "listen";
    case ELEMENT_AUTH:
      return "auth";
    case ELEMENT_POLICY:
      return "policy";
    case ELEMENT_LIMIT:
      return "limit";
    case ELEMENT_ALLOW:
      return "allow";
    case ELEMENT_DENY:
      return "deny";
    case ELEMENT_FORK:
      return "fork";
    case ELEMENT_PIDFILE:
      return "pidfile";
    case ELEMENT_STANDARD_SESSION_SERVICEDIRS:
      return "standard_session_servicedirs";
    case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS:
      return "standard_system_servicedirs";
    case ELEMENT_SERVICEDIR:
      return "servicedir";
    case ELEMENT_SERVICEHELPER:
      return "servicehelper";
    case ELEMENT_INCLUDEDIR:
      return "includedir";
    case ELEMENT_CONFIGTYPE:
      return "type";
    case ELEMENT_SELINUX:
      return "selinux";
    case ELEMENT_ASSOCIATE:
      return "associate";
    case ELEMENT_SYSLOG:
      return "syslog";
    case ELEMENT_KEEP_UMASK:
      return "keep_umask";
    case ELEMENT_ALLOW_ANONYMOUS:
      return "allow_anonymous";
    }

  _dbus_assert_not_reached ("bad element type");

  return NULL;
}

