00001 #include "LCDElement.h" 00002 #include "LCDLock.h" 00003 #include <unistd.h> 00004 #include <pthread.h> 00005 #include <sstream> 00006 #include <iostream> 00007 00008 using namespace std; 00009 00010 set<std::string> LCDElement::_elementsList; 00011 LCDMutex LCDElement::_elementMutex; 00012 unsigned int LCDElement::_elementCounter = 0; 00013 00014 LCDElement::LCDElement(const string &id, const string &addCommand, const string &addParam, LCDElement *parent) 00015 { 00016 if (id.size() == 0) 00017 { 00018 LCDLock l(&LCDElement::_elementMutex); 00019 ostringstream idBuffer; 00020 idBuffer << "LCDAPI_" 00021 << getpid() 00022 << "_" 00023 << LCDElement::_elementCounter; 00024 00025 LCDElement::_elementCounter++; 00026 _id = idBuffer.str(); 00027 } 00028 else 00029 { 00030 _id = id; 00031 } 00032 _elementAddCmd = addCommand; 00033 _elementAddParam = addParam; 00034 _parent = parent; 00035 if (_parent) 00036 { 00037 _parent->addToList(this); 00038 } 00039 notifyCreated(); 00040 } 00041 00042 LCDElement::~LCDElement() 00043 { 00044 notifyDestroyed(); 00045 } 00046 00047 void LCDElement::notifyCreated() 00048 { 00049 LCDLock l(&LCDElement::_elementMutex); 00050 sendCommand(_elementAddCmd, _elementAddParam); 00051 _iAmDead = false; 00052 LCDElement::_elementsList.insert(_id); 00053 } 00054 00055 void LCDElement::notifyDestroyed() 00056 { 00057 LCDLock l(&LCDElement::_elementMutex); 00058 if (!_iAmDead) 00059 { 00060 LCDElement::_elementsList.erase(_id); 00061 ElementMap::iterator it; 00062 for (it = _childrenList.begin(); it != _childrenList.end(); it++) 00063 { 00064 it->second->notifyDestroyed(); 00065 } 00066 _childrenList.clear(); 00067 sendCommand(_elementDel); 00068 if (_parent) 00069 { 00070 _parent->removeFromList(this); 00071 } 00072 _iAmDead = true; 00073 } 00074 } 00075 00076 bool LCDElement::exists(string id) 00077 { 00078 LCDLock l(&LCDElement::_elementMutex); 00079 return ( (LCDElement::_elementsList.find(id)) != (LCDElement::_elementsList.end()) ); 00080 } 00081 00082 const string &LCDElement::getId() 00083 { 00084 return _id; 00085 } 00086 00087 void LCDElement::sendCommand(const std::string &cmd, const std::string ¶meters) 00088 { 00089 LCDLock l(&LCDElement::_elementMutex); 00090 if (cmd.size() > 0) 00091 { 00092 if (_parent) 00093 { 00094 string realParams = _id + " " + parameters; 00095 _parent->sendCommand(cmd, realParams); 00096 } 00097 else 00098 { 00099 _commandBuffer.push_back(Command(cmd, parameters)); 00100 } 00101 } 00102 } 00103 00104 void LCDElement::setParent(LCDElement *parent) 00105 { 00106 _parent = parent; 00107 notifyAdded(); 00108 } 00109 00110 void LCDElement::add(LCDElement *child) 00111 { 00112 child->setParent(this); 00113 addToList(child); 00114 } 00115 00116 void LCDElement::addToList(LCDElement *elt) 00117 { 00118 _childrenList[elt->getId()] = elt; 00119 } 00120 00121 void LCDElement::removeFromList(LCDElement *elt) 00122 { 00123 _childrenList.erase(elt->getId()); 00124 } 00125 00126 void LCDElement::notifyAdded() 00127 { 00128 CommandList::iterator it; 00129 00130 for (it = _commandBuffer.begin(); it != _commandBuffer.end(); it++) 00131 { 00132 sendCommand(it->_cmd, it->_params); 00133 } 00134 }