--- /dev/null
+#ifndef _iindexinserter_\r
+#define _iindexinserter_\r
+\r
+#include "../idatabase.h"\r
+#include "../ilogger.h"\r
+#include "../option.h"\r
+#include "../datetime.h"\r
+#include "../stringfunctions.h"\r
+#include "ifreenetregistrable.h"\r
+#include "ifcpconnected.h"\r
+#include "ifcpmessagehandler.h"\r
+#include "iperiodicprocessor.h"\r
+\r
+template <class IDTYPE>\r
+class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
+{\r
+public:\r
+ IIndexInserter();\r
+ IIndexInserter(FCPv2 *fcp);\r
+\r
+ virtual void FCPConnected();\r
+ virtual void FCPDisconnected();\r
+ virtual const bool HandleMessage(FCPMessage &message);\r
+\r
+ virtual void Process();\r
+\r
+ virtual void RegisterWithThread(FreenetMasterThread *thread);\r
+\r
+protected:\r
+ void InitializeIIndexInserter();\r
+ virtual void Initialize()=0; // initialize m_fcpuniquename\r
+ virtual const bool HandlePutSuccessful(FCPMessage &message)=0;\r
+ virtual const bool HandlePutFailed(FCPMessage &message)=0;\r
+ virtual void StartInsert(const IDTYPE &id)=0;\r
+ virtual void CheckForNeededInsert()=0;\r
+ virtual void RemoveFromInsertList(const IDTYPE id);\r
+\r
+ std::vector<IDTYPE> m_inserting; // list of ids we are inserting\r
+ std::string m_messagebase;\r
+ DateTime m_lastchecked;\r
+\r
+ // these MUST be populated by child class\r
+ std::string m_fcpuniquename;\r
+};\r
+\r
+template <class IDTYPE>\r
+IIndexInserter<IDTYPE>::IIndexInserter()\r
+{\r
+ InitializeIIndexInserter();\r
+}\r
+\r
+template <class IDTYPE>\r
+IIndexInserter<IDTYPE>::IIndexInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+{\r
+ InitializeIIndexInserter();\r
+}\r
+\r
+template <class IDTYPE>\r
+void IIndexInserter<IDTYPE>::FCPConnected()\r
+{\r
+ // make sure variables have been initialized by the derived class\r
+ if(m_fcpuniquename=="")\r
+ {\r
+ m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename not initialized correctly!");\r
+ }\r
+ if(m_fcpuniquename.find("|")!=std::string::npos)\r
+ {\r
+ m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename contains | character! This is not a valid character!");\r
+ }\r
+\r
+ m_inserting.clear();\r
+}\r
+\r
+template <class IDTYPE>\r
+void IIndexInserter<IDTYPE>::FCPDisconnected()\r
+{\r
+ \r
+}\r
+\r
+template <class IDTYPE>\r
+const bool IIndexInserter<IDTYPE>::HandleMessage(FCPMessage &message)\r
+{\r
+\r
+ if(message["Identifier"].find(m_fcpuniquename)==0)\r
+ {\r
+ if(message.GetName()=="URIGenerated")\r
+ {\r
+ return true;\r
+ }\r
+\r
+ if(message.GetName()=="PutSuccessful")\r
+ {\r
+ return HandlePutSuccessful(message);\r
+ }\r
+\r
+ if(message.GetName()=="PutFailed")\r
+ {\r
+ return HandlePutFailed(message);\r
+ }\r
+\r
+ if(message.GetName()=="IdentifierCollision")\r
+ {\r
+ // remove one of the ids from the requesting list\r
+ IDTYPE id;\r
+ std::vector<std::string> idparts;\r
+ StringFunctions::Split(message["Identifier"],"|",idparts);\r
+ StringFunctions::Convert(idparts[1],id);\r
+ RemoveFromInsertList(id);\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+template <class IDTYPE>\r
+void IIndexInserter<IDTYPE>::InitializeIIndexInserter()\r
+{\r
+ m_fcpuniquename="";\r
+ Option::instance()->Get("MessageBase",m_messagebase);\r
+ m_lastchecked.SetToGMTime();\r
+}\r
+\r
+template <class IDTYPE>\r
+void IIndexInserter<IDTYPE>::Process()\r
+{\r
+ DateTime now;\r
+ now.SetToGMTime();\r
+\r
+ if(m_lastchecked<(now-(1.0/1440.0)))\r
+ {\r
+ CheckForNeededInsert();\r
+ m_lastchecked=now;\r
+ }\r
+}\r
+\r
+template <class IDTYPE>\r
+void IIndexInserter<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)\r
+{\r
+ thread->RegisterFCPConnected(this);\r
+ thread->RegisterFCPMessageHandler(this);\r
+ thread->RegisterPeriodicProcessor(this);\r
+}\r
+\r
+template <class IDTYPE>\r
+void IIndexInserter<IDTYPE>::RemoveFromInsertList(const IDTYPE identityid)\r
+{\r
+ std::vector<IDTYPE>::iterator i=m_inserting.begin();\r
+ while(i!=m_inserting.end() && (*i)!=identityid)\r
+ {\r
+ i++;\r
+ }\r
+ if(i!=m_inserting.end())\r
+ {\r
+ m_inserting.erase(i);\r
+ }\r
+}\r
+\r
+#endif // _iindexrequester_\r