<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:import href="keyval-common.xsl" />

  <xsl:output method="text" indent="no"/>

  <xsl:preserve-space elements="*"/>

<xsl:template match="keyval">
  <xsl:text>/*----------------------------------------------------------------
 * AUTOMATICALLY GENERATED FROM XML - DO NOT EDIT!
 * 
 * (c) 2003 - Vaisala */
//----------------------------------------------------------------

#include &lt;nobj/Date.hh&gt;

#include "</xsl:text>
  <xsl:value-of select="(@class)" />
  <xsl:text>_config.hh"

/// 
using namespace </xsl:text><xsl:value-of select="(@namespace)"/>
  <xsl:text>;
using namespace nlib;

//----------------------------------------------------------------
// </xsl:text>
  <xsl:value-of select="(@class)"/>
  <xsl:text>::</xsl:text>
  <xsl:value-of select="(@class)"/>
  <xsl:text>() default constructor implementation.
//----------------------------------------------------------------

</xsl:text><xsl:value-of select="(@class)"/>
  <xsl:text>Config::</xsl:text>
  <xsl:value-of select="(@class)"/>
  <xsl:text>Config() :
</xsl:text>

  <!-- Initializer for each configurable value -->

  <xsl:for-each select="*">
    <xsl:if test="(@varname) and (@default != 'REQUIRED')">
      <xsl:text>  _</xsl:text>
      <xsl:value-of select="(@varname)"/>
      <xsl:text>(</xsl:text>
      <xsl:choose>

        <xsl:when test="@type = 'DATE'">
          <xsl:text>0</xsl:text>
        </xsl:when>

        <xsl:otherwise>
          <xsl:call-template name="format-cctype-value">
            <xsl:with-param name="cctype" select="@cctype" />
            <xsl:with-param name="value" select="@default" />
          </xsl:call-template>
        </xsl:otherwise>

      </xsl:choose>
      <xsl:text>),
</xsl:text>
    </xsl:if>
  </xsl:for-each>

  <xsl:text>  _Ok(false)
{
</xsl:text>


  <!-- Initializer for each special types (dates) -->

  <xsl:for-each select="*">
    <xsl:if test="(@varname) and (@default != 'REQUIRED') and (@type = 'DATE')">
      <xsl:text>
  {
    nanoval ntime = 0;
    if (nlib::Date::valueOf("</xsl:text>
      <xsl:value-of select="@default" />
      <xsl:text>", ntime) == true) {
      _</xsl:text>
      <xsl:value-of select="@varname" />
      <xsl:text> = ntime;
    }
  }
</xsl:text>
    </xsl:if>
  </xsl:for-each>

  <xsl:text>
}

//----------------------------------------------------------------
// </xsl:text>
   <xsl:value-of select="(@class)"/>
   <xsl:text>::parseString() implementation.
//----------------------------------------------------------------

int </xsl:text>
  <xsl:value-of select="(@class)"/>
  <xsl:text>Config::parseString(const std::string&amp; key, std::string&amp; val) const {
  const Lookup* lp = Lookup::toLookup(_Cfg);
  if (lp == 0) {		// Exit in failure now
    return false;
  }
  return lp->parseString(key,val);
}

//----------------------------------------------------------------
// </xsl:text>
   <xsl:value-of select="(@class)"/>
   <xsl:text>::loadConfig() implementation.
//----------------------------------------------------------------

bool </xsl:text>
  <xsl:value-of select="(@class)"/>
  <xsl:text>Config::loadConfig(const Handle&amp; h) {
  const Lookup* lp = Lookup::toLookup(h);

  if (lp == 0) {		// Exit in failure now
    _Ok = false;                // Indicate config object is not good
    return false;
  }

  _Cfg = h;
  bool ok = true;

  const Lookup&amp; props = *lp;

</xsl:text>

  <xsl:for-each select="*">
    <xsl:if test="(@varname)">
      <xsl:text>  {
    </xsl:text>
      <xsl:choose>
        <xsl:when test="@type = 'DATE'">
          <xsl:text>nanoval</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="(@cctype)"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:text> val</xsl:text>
      <xsl:if test="@default != 'REQUIRED'">
        <xsl:text>(</xsl:text>
        <xsl:call-template name="format-cctype-value">
          <xsl:with-param name="cctype" select="@cctype" />
          <xsl:with-param name="value" select="@default" />
        </xsl:call-template>
        <xsl:text>)</xsl:text>
      </xsl:if>
      <xsl:text>;
    int parseRc = props.parse</xsl:text>
      <xsl:value-of select="substring(@LookupGet,4)"/>
      <xsl:text>("</xsl:text>
      <xsl:value-of select="key"/>
      <xsl:text>", val);

</xsl:text>

      <xsl:if test="@default = 'REQUIRED'">
        <xsl:text>    // Since this value is required, force failure if value was missing
    if (parseRc == Lookup::MISSING) {
      parseRc == Lookup::INVALID;
    }
</xsl:text>
      </xsl:if>

      <xsl:choose>

        <xsl:when test="@min or @max">

          <xsl:text>    if (parseRc == Lookup::OK) {
</xsl:text>
          <xsl:if test="(@min)">
            <xsl:text>      if (val &lt; </xsl:text>
            <xsl:value-of select="(@min)"/>
            <xsl:text>) {
        parseRc = Lookup::INVALID;
      }
</xsl:text>
          </xsl:if>

          <xsl:if test="(@max)">
            <xsl:text>      if (val &gt; </xsl:text>
            <xsl:value-of select="(@max)"/>
            <xsl:text>) {
        parseRc = Lookup::INVALID;
      }
</xsl:text>
      </xsl:if>
      <xsl:text>    }
</xsl:text>  
    </xsl:when>

  </xsl:choose>


      <xsl:text>
    if (parseRc == Lookup::OK) {
      _</xsl:text>
      <xsl:value-of select="(@varname)"/>
      <xsl:text> = val;
    } else if (parseRc == Lookup::INVALID) {
      ok = false;
    }
  }

</xsl:text>

    </xsl:if>
  </xsl:for-each>

  <xsl:text>  _Ok = ok;
  return ok;
}
</xsl:text>

</xsl:template>

</xsl:stylesheet>
