FrameManager.cpp 6.6 KB
#include "FrameManager.h"

#include "../Common/Toolbox.h"

using namespace TREPS::Common;

namespace TREPS
{
	namespace FrameManager
	{
		FrameManagerClass::FrameManagerClass(void) : app(NULL), loader(NULL)
		{
			this->app = ApplicationClass::getInstance();
		}

		FrameManagerClass::~FrameManagerClass(void)
		{
			if (this->loader != NULL)
			{
				this->loader->close();
				delete this->loader;
				this->loader = NULL;
			}
		}

		bool FrameManagerClass::init(const char *file_path)
		{
			//create xml loader
			if (this->loader == NULL)
				this->loader = new XMLManagerClass();

			this->loader->close();

			if (!this->loader->isExist(file_path))
			{
				LOG4CXX_INFO(this->app->getLog()->getPtr(),"Cannot find frames file : " << file_path);
				return false;
			}

			//load file
			if (!this->loader->loadFile(file_path))
			{
				LOG4CXX_INFO(this->app->getLog()->getPtr(),"Cannot load frames file : " << file_path);
				return false;
			}

			//xsd validation
			if (!this->loader->isValid(TREPS_FRAMES_XSD))
			{
				LOG4CXX_INFO(this->app->getLog()->getPtr(),"Invalid frames file : " << file_path);
				return false;
			}

			return true;
		}

		bool FrameManagerClass::updateFrameList(t_StringList frameList, const char *newFramePath)
		{
			if (this->loader == NULL)
				return false;

			Node *framesNode = this->loader->getChildFromRoot("frames");

			if (framesNode == NULL)
				return false;

			NodeList frameNodes = this->loader->getChildrenFromNode("frame",framesNode);

			bool modif = false;
			for (t_StringList::iterator frame = frameList.begin(); frame != frameList.end(); ++frame)
			{
				bool found = false;
				for (NodeList::iterator frameNode = frameNodes.begin(); frameNode != frameNodes.end(); ++frameNode)
				{
					string crtFrame = this->loader->getAttributeFromNode("id",(*frameNode));
					if (crtFrame.compare((*frame)) == 0)
					{
						found = true;
						LOG4CXX_INFO(this->app->getLog()->getPtr(), "Frame " << (*frame) << " already exist");
						break;
					}
				}

				if (found)
					continue;

				//create new frame node
				Node *newNode = this->loader->addChildToNode("frame", framesNode);
				if (newNode == NULL)
					return false;
				//set id
				if (!this->loader->addAttributeToNode("id", (*frame).c_str(), newNode))
					return false;
				//add fullname node
				Node *nameNode = this->loader->addChildToNode("fullname",newNode);
				if (nameNode == NULL)
					return false;
				this->loader->setNodeContent("ToDo",nameNode);
				//add description node
				Node *descNode =  this->loader->addChildToNode("description",newNode);
				if (descNode == NULL)
					return false;
				modif = true;
				LOG4CXX_INFO(this->app->getLog()->getPtr(), "New frame added : " << (*frame));
			}

			//deleted frame
			for (NodeList::iterator frameNode = frameNodes.begin(); frameNode != frameNodes.end(); ++frameNode)
			{
				bool found = false;
				string crtFrame = this->loader->getAttributeFromNode("id",(*frameNode));
				for (t_StringList::iterator frame = frameList.begin(); frame != frameList.end(); ++frame)
				{
					if (crtFrame.compare(*frame) == 0)
					{
						found = true;
						break;
					}
				}
				if (!found)
				{
					LOG4CXX_INFO(this->app->getLog()->getPtr(), "Frame obsolete (no deleted) : " << crtFrame);
				}
			}

			if (modif)
			{
				if (!this->loader->save(newFramePath))
				{
					LOG4CXX_INFO(this->app->getLog()->getPtr(), "Cannot save new frame file");
					return false;
				}
				return true;
			}

			LOG4CXX_INFO(this->app->getLog()->getPtr(), "No modification detected");
			return true;
		}

		bool FrameManagerClass::isFrameExist(const char *frame_id)
		{
			if ((this->loader == NULL) || !this->loader->isInUse())
			{
				LOG4CXX_INFO(this->app->getLog()->getPtr(), "Frames loader not initialized");
				return false;
			}

			Node *framesNode = this->loader->getChildFromRoot("frames");

			if (framesNode == NULL)
			{
				LOG4CXX_INFO(this->app->getLog()->getPtr(), "Cannot find frames node");
				return false;
			}

			NodeList framesNodes = this->loader->getChildrenFromNode("frame", framesNode);

			for (NodeList::iterator frameNode = framesNodes.begin(); frameNode != framesNodes.end(); ++frameNode)
                        {
                                string crtId = this->loader->getAttributeFromNode("id",*frameNode);
                                if (crtId.compare(frame_id) == 0)
                                        return true;
                        }

			return false;
		}

		void FrameManagerClass::addDetectedFramesFromAttributesInList(const map<string,string> *attributes, t_StringList &framesList)
		{
			t_StringList frameTags = this->app->getConf()->getFramesTags();

			for (map<string,string>::const_iterator att = attributes->begin(); att != attributes->end(); ++att)
			{
				for (t_StringList::iterator tag = frameTags.begin(); tag != frameTags.end(); ++tag)
				{
					if ((att->first.compare(*tag) == 0) && this->isFrameExist(att->second.c_str()))
					{
						string frame = att->second;
						bool newFrame = true;
						for (t_StringList::iterator f = framesList.begin(); f != framesList.end(); ++f)
						{
							if (frame.compare((*f)) == 0)
							{
								newFrame = false;
								break;
							}
						}

						//add new detected frame in list
						if (newFrame)
							framesList.push_back(frame);
					}
				}
			}
		}

		void FrameManagerClass::addDetectedFramesFromStringInList(const char *str, t_StringList &framesList)
		{
			t_StringList frameTags = this->app->getConf()->getFramesTags();

			size_t p;
			string s = str;

			for (t_StringList::iterator tag = frameTags.begin(); tag != frameTags.end(); ++tag)
			{
				if ((*tag).compare("") == 0)
					continue;

				//search frame tag in str
				p = s.find(*tag);

				//test if line contains frame tag
				if (p == string::npos)
					continue;

				string ss = s.substr(p + (*tag).length(), s.length() - p - (*tag).length());
				ss = getTRIMStr(ss.c_str());

				//test if next char is :
				if ((ss.compare("") == 0) || (ss[0] != ':'))
					continue;

				//remove :
				ss = ss.substr(1,ss.length()-1);
				ss = getTRIMStr(ss.c_str());

				//search \n
				p = ss.find('\n');

				if (p != string::npos)
				{
					//remove \n
					ss = ss.substr(0, p);
					ss = getTRIMStr(ss.c_str());
				}

				string frame = ss;

				if (!this->isFrameExist(frame.c_str()))
					continue;

				//test if the frame already exist in list
				bool newFrame = true;
				for (t_StringList::iterator f = framesList.begin(); f != framesList.end(); ++f)
				{
					if (frame.compare((*f)) == 0)
					{
						newFrame = false;
						break;
					}
				}

				//add new detected frame in list
				if (newFrame)
					framesList.push_back(frame);
			}
		}
	}
}