// NeL - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdgeorges.h"
#include "nel/misc/thread.h"
#include "nel/misc/i_xml.h"
#include "nel/misc/common.h"
#include "nel/georges/header.h"
using namespace NLMISC;
namespace NLGEORGES
{
// ***************************************************************************
void warning (bool exception, const char *format, ... );
// ***************************************************************************
CFileHeader::CFileHeader ()
{
MajorVersion = 0;
MinorVersion = 0;
State = Modified;
Revision = "$R";
Revision += "evision$";
}
// ***************************************************************************
void CFileHeader::write (xmlNodePtr node, bool georges4CVS) const
{
// Version for CVS ?
if (georges4CVS)
{
// Georges version system
xmlSetProp (node, (const xmlChar*)"Revision", (const xmlChar*)Revision.c_str ());
}
else
{
// Georges version system
char tmp[512];
smprintf (tmp, 512, "%d.%d", MajorVersion, MinorVersion);
xmlSetProp (node, (const xmlChar*)"Version", (const xmlChar*)tmp);
}
// State
if (State == Modified)
xmlSetProp (node, (const xmlChar*)"State", (const xmlChar*)"modified");
else
xmlSetProp (node, (const xmlChar*)"State", (const xmlChar*)"checked");
// Comments of the form
if (!Comments.empty ())
{
// Create a new node
xmlNodePtr child = xmlNewChild ( node, NULL, (const xmlChar*)"COMMENTS", NULL);
xmlNodePtr textNode = xmlNewText ((const xmlChar *)Comments.c_str());
xmlAddChild (child, textNode);
}
// Logs
if (!Log.empty ())
{
// Create a new node
xmlNodePtr child = xmlNewChild ( node, NULL, (const xmlChar*)"LOG", NULL);
xmlNodePtr textNode = xmlNewText ((const xmlChar *)Log.c_str());
xmlAddChild (child, textNode);
}
}
// ***************************************************************************
void CFileHeader::addLog (const char *log)
{
time_t t;
time (&t);
if (!Log.empty())
Log += "\n";
Log += ctime(&t);
Log.resize (Log.size()-1);
Log += " (";
Log += IThread::getCurrentThread ()->getUserName ();
Log += ") ";
Log += log;
}
// ***************************************************************************
void CFileHeader::setComments (const char *comments)
{
Comments = comments;
}
// ***************************************************************************
void CFileHeader::read (xmlNodePtr root)
{
// Get the version
const char *value = (const char*)xmlGetProp (root, (xmlChar*)"Version");
if (value)
{
// Read the version
if (sscanf (value, "%d.%d", &MajorVersion, &MinorVersion) != 2)
{
// Delete the value
xmlFree ((void*)value);
// Throw exception
warning (true, "read", "XML Syntax error in TYPE block line %p, the Version argument is invalid.",
root->content);
}
// Delete the value
xmlFree ((void*)value);
}
else
{
// Set default
MajorVersion = 0;
MinorVersion = 0;
}
// Get the revision
value = (const char*)xmlGetProp (root, (xmlChar*)"Revision");
if (value)
{
// Set the value
Revision = value;
// Delete the value
xmlFree ((void*)value);
}
else
{
// Set default
Revision = "$R";
Revision += "evision$";
}
// Get the version
value = (const char*)xmlGetProp (root, (xmlChar*)"State");
if (value)
{
// Read the version
if (strcmp (value, "modified") == 0)
{
State = Modified;
}
else if (strcmp (value, "checked") == 0)
{
State = Checked;
}
else
{
// Delete the value
xmlFree ((void*)value);
// Throw exception
warning (true, "read", "XML Syntax error in TYPE block line %p, the State argument is invalid.",
root->content);
}
// Delete the value
xmlFree ((void*)value);
}
else
{
// Set default
State = Modified;
}
// Look for the comment node
Comments = "";
xmlNodePtr node = CIXml::getFirstChildNode (root, "COMMENTS");
if (node)
{
// Get a text node
node = CIXml::getFirstChildNode (node, XML_TEXT_NODE);
if (node)
{
// Get content
const char *comments = (const char*)xmlNodeGetContent (node);
if (comments)
{
Comments = comments;
// Delete the value
xmlFree ((void*)comments);
}
}
}
// Look for the log node
Log = "";
node = CIXml::getFirstChildNode (root, "LOG");
if (node)
{
// Get a text node
node = CIXml::getFirstChildNode (node, XML_TEXT_NODE);
if (node)
{
// Get content
const char *log = (const char*)xmlNodeGetContent (node);
if (log)
{
Log = log;
// Delete the value
xmlFree ((void*)log);
}
}
}
}
// ***************************************************************************
const char *CFileHeader::getStateString (TState state)
{
if (state == Modified)
return "Modified";
else
return "Checked";
}
// ***************************************************************************
void CFileHeader::warning (bool exception, const char *function, const char *format, ... ) const
{
// Make a buffer string
va_list args;
va_start( args, format );
char buffer[1024];
vsnprintf( buffer, 1024, format, args );
va_end( args );
// Set the warning
NLGEORGES::warning (exception, "(CFileHeader::%s) : %s", function, buffer);
}
// ***************************************************************************
} // NLGEORGES