version 0.1.3
[fms.git] / include / freenet / iindexinserter.h
1 #ifndef _iindexinserter_\r
2 #define _iindexinserter_\r
3 \r
4 #include "../idatabase.h"\r
5 #include "../ilogger.h"\r
6 #include "../option.h"\r
7 #include "../datetime.h"\r
8 #include "../stringfunctions.h"\r
9 #include "ifreenetregistrable.h"\r
10 #include "ifcpconnected.h"\r
11 #include "ifcpmessagehandler.h"\r
12 #include "iperiodicprocessor.h"\r
13 \r
14 template <class IDTYPE>\r
15 class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
16 {\r
17 public:\r
18         IIndexInserter();\r
19         IIndexInserter(FCPv2 *fcp);\r
20 \r
21         virtual void FCPConnected();\r
22         virtual void FCPDisconnected();\r
23         virtual const bool HandleMessage(FCPMessage &message);\r
24 \r
25         virtual void Process();\r
26 \r
27         virtual void RegisterWithThread(FreenetMasterThread *thread);\r
28 \r
29 protected:\r
30         void InitializeIIndexInserter();\r
31         virtual void Initialize()=0;            // initialize m_fcpuniquename\r
32         virtual const bool HandlePutSuccessful(FCPMessage &message)=0;\r
33         virtual const bool HandlePutFailed(FCPMessage &message)=0;\r
34         virtual void StartInsert(const IDTYPE &id)=0;\r
35         virtual void CheckForNeededInsert()=0;\r
36         virtual void RemoveFromInsertList(const IDTYPE id);\r
37 \r
38         std::vector<IDTYPE> m_inserting;                // list of ids we are inserting\r
39         std::string m_messagebase;\r
40         DateTime m_lastchecked;\r
41 \r
42         // these MUST be populated by child class\r
43         std::string m_fcpuniquename;\r
44 };\r
45 \r
46 template <class IDTYPE>\r
47 IIndexInserter<IDTYPE>::IIndexInserter()\r
48 {\r
49         InitializeIIndexInserter();\r
50 }\r
51 \r
52 template <class IDTYPE>\r
53 IIndexInserter<IDTYPE>::IIndexInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
54 {\r
55         InitializeIIndexInserter();\r
56 }\r
57 \r
58 template <class IDTYPE>\r
59 void IIndexInserter<IDTYPE>::FCPConnected()\r
60 {\r
61         // make sure variables have been initialized by the derived class\r
62         if(m_fcpuniquename=="")\r
63         {\r
64                 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename not initialized correctly!");\r
65         }\r
66         if(m_fcpuniquename.find("|")!=std::string::npos)\r
67         {\r
68                 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexInserter<IDTYPE>::FCPConnected fcpuniquename contains | character!  This is not a valid character!");\r
69         }\r
70 \r
71         m_inserting.clear();\r
72 }\r
73 \r
74 template <class IDTYPE>\r
75 void IIndexInserter<IDTYPE>::FCPDisconnected()\r
76 {\r
77         \r
78 }\r
79 \r
80 template <class IDTYPE>\r
81 const bool IIndexInserter<IDTYPE>::HandleMessage(FCPMessage &message)\r
82 {\r
83 \r
84         if(message["Identifier"].find(m_fcpuniquename)==0)\r
85         {\r
86                 if(message.GetName()=="URIGenerated")\r
87                 {\r
88                         return true;\r
89                 }\r
90 \r
91                 if(message.GetName()=="PutSuccessful")\r
92                 {\r
93                         return HandlePutSuccessful(message);\r
94                 }\r
95 \r
96                 if(message.GetName()=="PutFailed")\r
97                 {\r
98                         return HandlePutFailed(message);\r
99                 }\r
100 \r
101                 if(message.GetName()=="IdentifierCollision")\r
102                 {\r
103                         // remove one of the ids from the requesting list\r
104                         IDTYPE id;\r
105                         std::vector<std::string> idparts;\r
106                         StringFunctions::Split(message["Identifier"],"|",idparts);\r
107                         StringFunctions::Convert(idparts[1],id);\r
108                         RemoveFromInsertList(id);\r
109                         return true;\r
110                 }\r
111         }\r
112 \r
113         return false;\r
114 }\r
115 \r
116 template <class IDTYPE>\r
117 void IIndexInserter<IDTYPE>::InitializeIIndexInserter()\r
118 {\r
119         m_fcpuniquename="";\r
120         Option::Instance()->Get("MessageBase",m_messagebase);\r
121         m_lastchecked.SetToGMTime();\r
122 }\r
123 \r
124 template <class IDTYPE>\r
125 void IIndexInserter<IDTYPE>::Process()\r
126 {\r
127         DateTime now;\r
128         now.SetToGMTime();\r
129 \r
130         if(m_lastchecked<(now-(1.0/1440.0)))\r
131         {\r
132                 CheckForNeededInsert();\r
133                 m_lastchecked=now;\r
134         }\r
135 }\r
136 \r
137 template <class IDTYPE>\r
138 void IIndexInserter<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)\r
139 {\r
140         thread->RegisterFCPConnected(this);\r
141         thread->RegisterFCPMessageHandler(this);\r
142         thread->RegisterPeriodicProcessor(this);\r
143 }\r
144 \r
145 template <class IDTYPE>\r
146 void IIndexInserter<IDTYPE>::RemoveFromInsertList(const IDTYPE identityid)\r
147 {\r
148         typename std::vector<IDTYPE>::iterator i=m_inserting.begin();\r
149         while(i!=m_inserting.end() && (*i)!=identityid)\r
150         {\r
151                 i++;\r
152         }\r
153         if(i!=m_inserting.end())\r
154         {\r
155                 m_inserting.erase(i);\r
156         }\r
157 }\r
158 \r
159 #endif  // _iindexrequester_\r