version 0.1.7
[fms.git] / src / global.cpp
1 #include "../include/global.h"\r
2 #include "../include/datetime.h"\r
3 #include "../include/logfile.h"\r
4 #include "../include/option.h"\r
5 #include "../include/stringfunctions.h"\r
6 #include "../include/db/sqlite3db.h"\r
7 #include "../include/freenet/freenetmasterthread.h"\r
8 #include "../include/nntp/nntplistener.h"\r
9 #include "../include/http/httpthread.h"\r
10 \r
11 #ifdef _WIN32\r
12         #include <winsock2.h>\r
13 #endif\r
14 \r
15 #ifdef XMEM\r
16         #include <xmem.h>\r
17 #endif\r
18 \r
19 void SetupDB()\r
20 {\r
21 \r
22         DateTime date;\r
23         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
24 \r
25         db->Open("fms.db3");\r
26         db->SetBusyTimeout(10000);              // set timeout to 10 seconds\r
27         db->Execute("VACUUM;");\r
28 \r
29         db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
30                                 Option                          TEXT UNIQUE,\\r
31                                 OptionValue                     TEXT NOT NULL,\\r
32                                 OptionDescription       TEXT\\r
33                                 );");\r
34 \r
35         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
36                                 LocalIdentityID                 INTEGER PRIMARY KEY,\\r
37                                 Name                                    TEXT,\\r
38                                 PublicKey                               TEXT,\\r
39                                 PrivateKey                              TEXT,\\r
40                                 SingleUse                               BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
41                                 PublishTrustList                BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
42                                 PublishBoardList                BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
43                                 InsertingIdentity               BOOL CHECK(InsertingIdentity IN('true','false')) DEFAULT 'false',\\r
44                                 LastInsertedIdentity    DATETIME,\\r
45                                 InsertingPuzzle                 BOOL CHECK(InsertingPuzzle IN('true','false')) DEFAULT 'false',\\r
46                                 LastInsertedPuzzle              DATETIME,\\r
47                                 InsertingTrustList              BOOL CHECK(InsertingTrustList IN('true','false')) DEFAULT 'false',\\r
48                                 LastInsertedTrustList   DATETIME,\\r
49                                 InsertingBoardList              BOOL CHECK(InsertingBoardList IN('true','false')) DEFAULT 'false',\\r
50                                 LastInsertedBoardList   DATETIME,\\r
51                                 InsertingMessageList    BOOL CHECK(InsertingMessageList IN('true','false')) DEFAULT 'false',\\r
52                                 LastInsertedMessageList DATETIME\\r
53                                 );");\r
54 \r
55         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentityInserts(\\r
56                                 LocalIdentityID         INTEGER,\\r
57                                 Day                                     DATE,\\r
58                                 InsertIndex                     INTEGER\\r
59                                 );");\r
60 \r
61         db->Execute("CREATE TABLE IF NOT EXISTS tblTrustListInserts(\\r
62                                 LocalIdentityID         INTEGER,\\r
63                                 Day                                     DATE,\\r
64                                 InsertIndex                     INTEGER\\r
65                                 );");\r
66 \r
67         db->Execute("CREATE TABLE IF NOT EXISTS tblTrustListRequests(\\r
68                                 IdentityID                      INTEGER,\\r
69                                 Day                                     DATE,\\r
70                                 RequestIndex            INTEGER,\\r
71                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
72                                 );");\r
73 \r
74         db->Execute("CREATE TABLE IF NOT EXISTS tblIntroductionPuzzleInserts(\\r
75                                 UUID                            TEXT UNIQUE,\\r
76                                 LocalIdentityID         INTEGER,\\r
77                                 Day                                     DATE,\\r
78                                 InsertIndex                     INTEGER,\\r
79                                 Type                            TEXT,\\r
80                                 MimeType                        TEXT,\\r
81                                 PuzzleData                      TEXT,\\r
82                                 PuzzleSolution          TEXT,\\r
83                                 FoundSolution           BOOL CHECK(FoundSolution IN('true','false')) DEFAULT 'false'\\r
84                                 );");\r
85 \r
86         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
87                                 IdentityID                      INTEGER PRIMARY KEY,\\r
88                                 PublicKey                       TEXT UNIQUE,\\r
89                                 Name                            TEXT,\\r
90                                 SingleUse                       BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
91                                 PublishTrustList        BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
92                                 PublishBoardList        BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
93                                 DateAdded                       DATETIME,\\r
94                                 LastSeen                        DATETIME,\\r
95                                 LocalMessageTrust       INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
96                                 PeerMessageTrust        INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
97                                 LocalTrustListTrust     INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
98                                 PeerTrustListTrust      INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT 50\\r
99                                 );");\r
100 \r
101         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityRequests(\\r
102                                 IdentityID                      INTEGER,\\r
103                                 Day                                     DATE,\\r
104                                 RequestIndex            INTEGER,\\r
105                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
106                                 );");\r
107 \r
108         db->Execute("CREATE TABLE IF NOT EXISTS tblIntroductionPuzzleRequests(\\r
109                                 IdentityID                      INTEGER,\\r
110                                 Day                                     DATE,\\r
111                                 RequestIndex            INTEGER,\\r
112                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false',\\r
113                                 UUID                            TEXT UNIQUE,\\r
114                                 Type                            TEXT,\\r
115                                 MimeType                        TEXT,\\r
116                                 PuzzleData                      TEXT\\r
117                                 );");\r
118 \r
119         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityIntroductionInserts(\\r
120                                 LocalIdentityID         INTEGER,\\r
121                                 Day                                     DATE,\\r
122                                 UUID                            TEXT UNIQUE,\\r
123                                 Solution                        TEXT,\\r
124                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
125                                 );");\r
126 \r
127         db->Execute("CREATE TABLE IF NOT EXISTS tblPeerTrust(\\r
128                                 IdentityID                      INTEGER,\\r
129                                 TargetIdentityID        INTEGER,\\r
130                                 MessageTrust            INTEGER CHECK(MessageTrust BETWEEN 0 AND 100),\\r
131                                 TrustListTrust          INTEGER CHECK(TrustListTrust BETWEEN 0 AND 100)\\r
132                                 );");\r
133 \r
134         db->Execute("CREATE TABLE IF NOT EXISTS tblBoard(\\r
135                                 BoardID                         INTEGER PRIMARY KEY,\\r
136                                 BoardName                       TEXT UNIQUE,\\r
137                                 BoardDescription        TEXT,\\r
138                                 DateAdded                       DATETIME\\r
139                                 );");\r
140 \r
141         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('fms','Freenet Message System','2007-12-01');");\r
142         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('freenet','Discussion about Freenet','2007-12-01');");\r
143         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('public','Public discussion','2007-12-01');");\r
144         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('test','Test board','2007-12-01');");\r
145 \r
146         db->Execute("CREATE TABLE IF NOT EXISTS tblMessage(\\r
147                                 MessageID                       INTEGER PRIMARY KEY,\\r
148                                 IdentityID                      INTEGER,\\r
149                                 FromName                        TEXT,\\r
150                                 MessageDate                     DATE,\\r
151                                 MessageTime                     TIME,\\r
152                                 Subject                         TEXT,\\r
153                                 MessageUUID                     TEXT UNIQUE,\\r
154                                 ReplyBoardID            INTEGER,\\r
155                                 Body                            TEXT\\r
156                                 );");\r
157 \r
158         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageReplyTo(\\r
159                                 MessageID                       INTEGER,\\r
160                                 ReplyToMessageUUID      TEXT,\\r
161                                 ReplyOrder                      INTEGER\\r
162                                 );");\r
163 \r
164         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageBoard(\\r
165                                 MessageID                       INTEGER,\\r
166                                 BoardID                         INTEGER\\r
167                                 );");\r
168 \r
169         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageListRequests(\\r
170                                 IdentityID                      INTEGER,\\r
171                                 Day                                     DATE,\\r
172                                 RequestIndex            INTEGER,\\r
173                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
174                                 );");\r
175 \r
176         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageRequests(\\r
177                                 IdentityID                      INTEGER,\\r
178                                 Day                                     DATE,\\r
179                                 RequestIndex            INTEGER,\\r
180                                 FromMessageList         BOOL CHECK(FromMessageList IN('true','false')) DEFAULT 'false',\\r
181                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
182                                 );");\r
183 \r
184         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageInserts(\\r
185                                 LocalIdentityID         INTEGER,\\r
186                                 Day                                     DATE,\\r
187                                 InsertIndex                     INTEGER,\\r
188                                 MessageUUID                     TEXT UNIQUE,\\r
189                                 MessageXML                      TEXT,\\r
190                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
191                                 );");\r
192 \r
193         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageListInserts(\\r
194                                 LocalIdentityID         INTEGER,\\r
195                                 Day                                     DATE,\\r
196                                 InsertIndex                     INTEGER,\\r
197                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
198                                 );");\r
199 \r
200         // MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed\r
201         db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\\r
202                                 LocalIdentityID         INTEGER,\\r
203                                 Date                            DATETIME\\r
204                                 );");\r
205 \r
206         // low / high / message count for each board\r
207         db->Execute("CREATE VIEW IF NOT EXISTS vwBoardStats AS \\r
208                                 SELECT tblBoard.BoardID AS 'BoardID', IFNULL(MIN(MessageID),0) AS 'LowMessageID', IFNULL(MAX(MessageID),0) AS 'HighMessageID', COUNT(MessageID) AS 'MessageCount' \\r
209                                 FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID \\r
210                                 WHERE MessageID>=0 OR MessageID IS NULL \\r
211                                 GROUP BY tblBoard.BoardID;");\r
212 \r
213         // calculates peer trust\r
214         db->Execute("CREATE VIEW IF NOT EXISTS vwCalculatedPeerTrust AS \\r
215                                 SELECT TargetIdentityID, \\r
216                                 ROUND(SUM(MessageTrust*(LocalMessageTrust/100.0))/SUM(LocalMessageTrust/100.0),0) AS 'PeerMessageTrust', \\r
217                                 ROUND(SUM(TrustListTrust*(LocalTrustListTrust/100.0))/SUM(LocalTrustListTrust/100.0),0) AS 'PeerTrustListTrust' \\r
218                                 FROM tblPeerTrust INNER JOIN tblIdentity ON tblPeerTrust.IdentityID=tblIdentity.IdentityID \\r
219                                 WHERE LocalTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalTrustListTrust') \\r
220                                 AND ( PeerTrustListTrust IS NULL OR PeerTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerTrustListTrust') ) \\r
221                                 GROUP BY TargetIdentityID;");\r
222 \r
223         // update PeerTrustLevel when deleting a record from tblPeerTrust\r
224         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteOntblPeerTrust AFTER DELETE ON tblPeerTrust \\r
225                                 FOR EACH ROW \\r
226                                 BEGIN \\r
227                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID) WHERE IdentityID=old.TargetIdentityID;\\r
228                                 END;");\r
229 \r
230         // update PeerTrustLevel when inserting a record into tblPeerTrust\r
231         db->Execute("CREATE TRIGGER IF NOT EXISTS trgInsertOntblPeerTrust AFTER INSERT ON tblPeerTrust \\r
232                                 FOR EACH ROW \\r
233                                 BEGIN \\r
234                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID) WHERE IdentityID=new.TargetIdentityID;\\r
235                                 END;");\r
236 \r
237         // update PeerTrustLevel when updating a record in tblPeerTrust\r
238         db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateOntblPeerTrust AFTER UPDATE ON tblPeerTrust \\r
239                                 FOR EACH ROW \\r
240                                 BEGIN \\r
241                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID) WHERE IdentityID=old.TargetIdentityID;\\r
242                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID) WHERE IdentityID=new.TargetIdentityID;\\r
243                                 END;");\r
244 \r
245         // recalculate all Peer TrustLevels when updating Local TrustLevels on tblIdentity - doesn't really need to be all, but rather all identities the updated identity has a trust level for.  It's easier to update everyone for now.\r
246         db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateLocalTrustLevels AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentity \\r
247                                 FOR EACH ROW \\r
248                                 BEGIN \\r
249                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID);\\r
250                                 END;");\r
251 \r
252         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteMessage AFTER DELETE ON tblMessage \\r
253                                 FOR EACH ROW \\r
254                                 BEGIN \\r
255                                         DELETE FROM tblMessageBoard WHERE tblMessageBoard.MessageID=old.MessageID;\\r
256                                         DELETE FROM tblMessageReplyTo WHERE tblMessageReplyTo.MessageID=old.MessageID;\\r
257                                 END;");\r
258 \r
259         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteIdentity AFTER DELETE ON tblIdentity \\r
260                                 FOR EACH ROW \\r
261                                 BEGIN \\r
262                                         DELETE FROM tblIdentityRequests WHERE IdentityID=old.IdentityID;\\r
263                                         DELETE FROM tblIntroductionPuzzleRequests WHERE IdentityID=old.IdentityID;\\r
264                                         DELETE FROM tblMessageListRequests WHERE IdentityID=old.IdentityID;\\r
265                                         DELETE FROM tblMessageRequests WHERE IdentityID=old.IdentityID;\\r
266                                         DELETE FROM tblPeerTrust WHERE IdentityID=old.IdentityID;\\r
267                                         DELETE FROM tblTrustListRequests WHERE IdentityID=old.IdentityID;\\r
268                                 END;");\r
269 \r
270         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteLocalIdentity AFTER DELETE ON tblLocalIdentity \\r
271                                 FOR EACH ROW \\r
272                                 BEGIN \\r
273                                         DELETE FROM tblIdentityIntroductionInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
274                                         DELETE FROM tblIntroductionPuzzleInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
275                                         DELETE FROM tblLocalIdentityInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
276                                         DELETE FROM tblMessageInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
277                                         DELETE FROM tblMessageListInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
278                                         DELETE FROM tblTrustListInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
279                                 END;");\r
280 \r
281         // delete introduction puzzles that were half-way inserted\r
282         db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day IS NULL AND InsertIndex IS NULL;");\r
283 \r
284         // delete stale introduction puzzles (2 or more days old)\r
285         date.SetToGMTime();\r
286         date.Add(0,0,0,-2);\r
287         db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day<='"+date.Format("%Y-%m-%d")+"';");\r
288         db->Execute("DELETE FROM tblIntroductionPuzzleRequests WHERE Day<='"+date.Format("%Y-%m-%d")+"';");\r
289 \r
290         // insert SomeDude's public key\r
291         date.SetToGMTime();\r
292         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded) VALUES('SSK@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw,iXez4j3qCpd596TxXiJgZyTq9o-CElEuJxm~jNNZAuA,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"');");\r
293 \r
294 }\r
295 \r
296 void SetupDefaultOptions()\r
297 {\r
298         // OptionValue should always be inserted as a string, even if the option really isn't a string - just to keep the field data type consistent\r
299 \r
300         std::ostringstream tempstr;     // must set tempstr to "" between db inserts\r
301         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
302         SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue,OptionDescription) VALUES(?,?,?);");\r
303 \r
304         // LogLevel\r
305         tempstr.str("");\r
306         tempstr << LogFile::LOGLEVEL_DEBUG;\r
307         st.Bind(0,"LogLevel");\r
308         st.Bind(1,tempstr.str());\r
309         st.Bind(2,"The maximum logging level that will be written to file.  0=Fatal Errors, 1=Errors, 2=Warnings, 3=Informational Messages, 4=Debug Messages.  Higher levels will include all messages from the previous levels.");\r
310         st.Step();\r
311         st.Reset();\r
312 \r
313         // NNTPListenPort\r
314         st.Bind(0,"NNTPListenPort");\r
315         st.Bind(1,"1119");\r
316         st.Bind(2,"The port that the NNTP service will listen for incoming connections.");\r
317         st.Step();\r
318         st.Reset();\r
319 \r
320         // NNTPBindAddresses\r
321         st.Bind(0,"NNTPBindAddresses");\r
322         st.Bind(1,"localhost");\r
323         st.Bind(2,"A comma separated list of valid IPv4 or IPv6 addresses/hostnames that the NNTP service will try to bind to.");\r
324         st.Step();\r
325         st.Reset();\r
326 \r
327         st.Bind(0,"NNTPAllowPost");\r
328         st.Bind(1,"true");\r
329         st.Bind(2,"Allow posting messages from NNTP.  Setting to false will make the newsgroups read only.");\r
330         st.Step();\r
331         st.Reset();\r
332 \r
333         // StartNNTP\r
334         st.Bind(0,"StartNNTP");\r
335         st.Bind(1,"true");\r
336         st.Bind(2,"Start NNTP server.");\r
337         st.Step();\r
338         st.Reset();\r
339 \r
340         st.Bind(0,"StartHTTP");\r
341         st.Bind(1,"true");\r
342         st.Bind(2,"Start HTTP server.");\r
343         st.Step();\r
344         st.Reset();\r
345 \r
346         st.Bind(0,"HTTPListenPort");\r
347         st.Bind(1,"8080");\r
348         st.Bind(2,"Port HTTP server will listen on.");\r
349         st.Step();\r
350         st.Reset();\r
351 \r
352         // StartFreenetUpdater\r
353         st.Bind(0,"StartFreenetUpdater");\r
354         st.Bind(1,"true");\r
355         st.Bind(2,"Start Freenet Updater thread.");\r
356         st.Step();\r
357         st.Reset();\r
358 \r
359         // FCPHost\r
360         st.Bind(0,"FCPHost");\r
361         st.Bind(1,"127.0.0.1");\r
362         st.Bind(2,"Host name or address of Freenet node.");\r
363         st.Step();\r
364         st.Reset();\r
365 \r
366         // FCPPort\r
367         st.Bind(0,"FCPPort");\r
368         st.Bind(1,"9481");\r
369         st.Bind(2,"The port that Freenet is listening for FCP connections on.");\r
370         st.Step();\r
371         st.Reset();\r
372 \r
373         st.Bind(0,"MessageBase");\r
374         st.Bind(1,"fms");\r
375         st.Bind(2,"A unique string shared by all clients who want to communicate with each other.  This should not be changed unless you want to create your own separate communications network.");\r
376         st.Step();\r
377         st.Reset();\r
378 \r
379         st.Bind(0,"MaxIdentityRequests");\r
380         st.Bind(1,"5");\r
381         st.Bind(2,"Maximum number of concurrent requests for new Identity xml files");\r
382         st.Step();\r
383         st.Reset();\r
384 \r
385         st.Bind(0,"MaxIdentityIntroductionRequests");\r
386         st.Bind(1,"5");\r
387         st.Bind(2,"Maximum number of concurrent identities requesting IdentityIntroduction xml files.  Each identity may have multiple requests pending.");\r
388         st.Step();\r
389         st.Reset();\r
390 \r
391         st.Bind(0,"MaxIntroductionPuzzleRequests");\r
392         st.Bind(1,"5");\r
393         st.Bind(2,"Maximum number of concurrent requests for new IntroductionPuzzle xml files");\r
394         st.Step();\r
395         st.Reset();\r
396 \r
397         st.Bind(0,"MaxTrustListRequests");\r
398         st.Bind(1,"5");\r
399         st.Bind(2,"Maximum number of concurrent requests for new Trust Lists");\r
400         st.Step();\r
401         st.Reset();\r
402 \r
403         st.Bind(0,"MaxMessageListRequests");\r
404         st.Bind(1,"5");\r
405         st.Bind(2,"Maximum number of concurrent requests for new Message Lists");\r
406         st.Step();\r
407         st.Reset();\r
408 \r
409         st.Bind(0,"MaxMessageRequests");\r
410         st.Bind(1,"20");\r
411         st.Bind(2,"Maximum number of concurrent requests for new Messages");\r
412         st.Step();\r
413         st.Reset();\r
414 \r
415         st.Bind(0,"MinLocalMessageTrust");\r
416         st.Bind(1,"50");\r
417         st.Bind(2,"Specifies a local message trust level that a peer must have before its messages will be downloaded.");\r
418         st.Step();\r
419         st.Reset();\r
420 \r
421         st.Bind(0,"MinPeerMessageTrust");\r
422         st.Bind(1,"30");\r
423         st.Bind(2,"Specifies a peer message trust level that a peer must have before its messages will be downloaded.");\r
424         st.Step();\r
425         st.Reset();\r
426 \r
427         st.Bind(0,"MinLocalTrustListTrust");\r
428         st.Bind(1,"50");\r
429         st.Bind(2,"Specifies a local trust list trust level that a peer must have before its trust list will be included in the weighted average.  Any peers below this number will be excluded from the results.");\r
430         st.Step();\r
431         st.Reset();\r
432 \r
433         st.Bind(0,"MinPeerTrustListTrust");\r
434         st.Bind(1,"30");\r
435         st.Bind(2,"Specifies a peer trust list trust level that a peer must have before its trust list will be included in the weighted average.  Any peers below this number will be excluded from the results.");\r
436         st.Step();\r
437         st.Reset();\r
438 \r
439         st.Bind(0,"MessageDownloadMaxDaysBackward");\r
440         st.Bind(1,"5");\r
441         st.Bind(2,"The maximum number of days backward that messages will be downloaded from each identity");\r
442         st.Step();\r
443         st.Reset();\r
444 \r
445         st.Bind(0,"MessageListDaysBackward");\r
446         st.Bind(1,"5");\r
447         st.Bind(2,"The number of days backward that messages you have inserted will appear in your MessageLists");\r
448         st.Step();\r
449         st.Reset();\r
450 \r
451 }\r
452 \r
453 void SetupLogFile()\r
454 {\r
455         DateTime date;\r
456         std::string configval;\r
457         int loglevel;\r
458 \r
459         date.SetToGMTime();\r
460 \r
461         LogFile::Instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log");\r
462         LogFile::Instance()->OpenFile();\r
463         LogFile::Instance()->SetWriteNewLine(true);\r
464         LogFile::Instance()->SetWriteDate(true);\r
465         LogFile::Instance()->SetWriteLogLevel(true);\r
466 \r
467         if(Option::Instance()->Get("LogLevel",configval)==false)\r
468         {\r
469                 configval="4";\r
470                 Option::Instance()->Set("LogLevel",configval);\r
471         }\r
472         if(StringFunctions::Convert(configval,loglevel)==false)\r
473         {\r
474                 loglevel=LogFile::LOGLEVEL_DEBUG;\r
475                 Option::Instance()->Set("LogLevel",loglevel);\r
476         }\r
477         LogFile::Instance()->SetLogLevel((LogFile::LogLevel)loglevel);\r
478 }\r
479 \r
480 void SetupNetwork()\r
481 {\r
482 #ifdef _WIN32\r
483         WSAData wsadata;\r
484         WSAStartup(MAKEWORD(2,2),&wsadata);\r
485 #endif\r
486 }\r
487 \r
488 void ShutdownNetwork()\r
489 {\r
490 #ifdef _WIN32\r
491         WSACleanup();\r
492 #endif\r
493 }\r
494 \r
495 void ShutdownThreads(std::vector<PThread::Thread *> &threads)\r
496 {\r
497         std::vector<PThread::Thread *>::iterator i;\r
498         for(i=threads.begin(); i!=threads.end(); i++)\r
499         {\r
500 /*              if((*i)->wait(1)==false)\r
501                 {\r
502                         try\r
503                         {\r
504                                 (*i)->interrupt();\r
505                         }\r
506                         catch(...)\r
507                         {\r
508                         }\r
509                 }\r
510                 */\r
511                 (*i)->Cancel();\r
512         }\r
513 \r
514         for(i=threads.begin(); i!=threads.end(); i++)\r
515         {\r
516                 LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ShutdownThreads waiting for thread to exit.");\r
517                 //(*i)->wait();\r
518                 (*i)->Join();\r
519                 delete (*i);\r
520         }\r
521 \r
522         threads.clear();\r
523 \r
524 }\r
525 \r
526 void StartThreads(std::vector<PThread::Thread *> &threads)\r
527 {\r
528         std::string startfreenet;\r
529         std::string startnntp;\r
530         std::string starthttp;\r
531 \r
532         if(Option::Instance()->Get("StartFreenetUpdater",startfreenet)==false)\r
533         {\r
534                 startfreenet="true";\r
535                 Option::Instance()->Set("StartFreenetUpdater","true");\r
536         }\r
537 \r
538         if(Option::Instance()->Get("StartNNTP",startnntp)==false)\r
539         {\r
540                 startnntp="true";\r
541                 Option::Instance()->Set("StartNNTP","true");\r
542         }\r
543 \r
544         if(Option::Instance()->Get("StartHTTP",starthttp)==false)\r
545         {\r
546                 starthttp="true";\r
547                 Option::Instance()->Set("StartHTTP","true");\r
548         }\r
549 \r
550         if(startfreenet=="true")\r
551         {\r
552                 PThread::Thread *t=new PThread::Thread(new FreenetMasterThread());\r
553                 threads.push_back(t);\r
554         }\r
555 \r
556         if(startnntp=="true")\r
557         {\r
558                 PThread::Thread *t=new PThread::Thread(new NNTPListener());\r
559                 threads.push_back(t);\r
560         }\r
561 \r
562         if(starthttp=="true")\r
563         {\r
564                 PThread::Thread *t=new PThread::Thread(new HTTPThread());\r
565                 threads.push_back(t);\r
566         }\r
567 \r
568 }\r