version 0.3.6
[fms.git] / src / freenet / messagelistrequester.cpp
index ee2dfaf..62d5bb2 100644 (file)
@@ -19,6 +19,30 @@ MessageListRequester::MessageListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp
        Initialize();\r
 }\r
 \r
+void MessageListRequester::GetBoardList(std::map<std::string,bool> &boards)\r
+{\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, SaveReceivedMessages FROM tblBoard;");\r
+       st.Step();\r
+       while(st.RowReturned())\r
+       {\r
+               std::string boardname="";\r
+               std::string tempval="";\r
+               st.ResultText(0,boardname);\r
+               st.ResultText(1,tempval);\r
+\r
+               if(tempval=="true")\r
+               {\r
+                       boards[boardname]=true;\r
+               }\r
+               else\r
+               {\r
+                       boards[boardname]=false;\r
+               }\r
+\r
+               st.Step();\r
+       }\r
+}\r
+\r
 const bool MessageListRequester::HandleAllData(FCPMessage &message)\r
 {      \r
        SQLite3DB::Statement st;\r
@@ -29,6 +53,11 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
        MessageListXML xml;\r
        long identityid;\r
        long index;\r
+       std::map<std::string,bool> boards;      // list of boards and if we will save messages for that board or not\r
+       bool addmessage=false;\r
+       std::string boardsstr="";\r
+\r
+       GetBoardList(boards);\r
 \r
        StringFunctions::Split(message["Identifier"],"|",idparts);\r
        StringFunctions::Convert(message["DataLength"],datalength);\r
@@ -60,19 +89,52 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
                SQLite3DB::Statement mst=m_db->Prepare("INSERT INTO tblMessageRequests(IdentityID,Day,RequestIndex,FromMessageList) VALUES(?,?,?,'true');");\r
                for(long i=0; i<xml.MessageCount(); i++)\r
                {\r
-                       st.Bind(0,identityid);\r
-                       st.Bind(1,xml.GetDate(i));\r
-                       st.Bind(2,xml.GetIndex(i));\r
-                       st.Step();\r
-                       if(st.RowReturned()==false)\r
+\r
+                       // go through each board the message was posted to and see if we are saving messages to that board\r
+                       // if the board isn't found, see if we are saving messages to new boards\r
+                       boardsstr="";\r
+                       addmessage=false;\r
+                       std::vector<std::string> messageboards=xml.GetBoards(i);\r
+                       for(std::vector<std::string>::iterator j=messageboards.begin(); j!=messageboards.end(); j++)\r
                        {\r
-                               mst.Bind(0,identityid);\r
-                               mst.Bind(1,xml.GetDate(i));\r
-                               mst.Bind(2,xml.GetIndex(i));\r
-                               mst.Step();\r
-                               mst.Reset();\r
+                               if(boards.find((*j))!=boards.end())\r
+                               {\r
+                                       if(boards[(*j)]==true)\r
+                                       {\r
+                                               addmessage=true;\r
+                                       }\r
+                               }\r
+                               else if(m_savetonewboards==true)\r
+                               {\r
+                                       addmessage=true;\r
+                               }\r
+                               if(j!=messageboards.begin())\r
+                               {\r
+                                       boardsstr+=", ";\r
+                               }\r
+                               boardsstr+=(*j);\r
+                       }\r
+\r
+                       if(addmessage==true)\r
+                       {\r
+                               st.Bind(0,identityid);\r
+                               st.Bind(1,xml.GetDate(i));\r
+                               st.Bind(2,xml.GetIndex(i));\r
+                               st.Step();\r
+                               if(st.RowReturned()==false)\r
+                               {\r
+                                       mst.Bind(0,identityid);\r
+                                       mst.Bind(1,xml.GetDate(i));\r
+                                       mst.Bind(2,xml.GetIndex(i));\r
+                                       mst.Step();\r
+                                       mst.Reset();\r
+                               }\r
+                               st.Reset();\r
+                       }\r
+                       else\r
+                       {\r
+                               m_log->trace("MessageListRequester::HandleAllData will not download message posted to "+boardsstr);\r
                        }\r
-                       st.Reset();\r
                }\r
 \r
                // insert external message indexes\r
@@ -80,19 +142,51 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
                {\r
                        if(xml.GetExternalType(i)=="Keyed")\r
                        {\r
-                               spk.Bind(0,xml.GetExternalIdentity(i));\r
-                               spk.Step();\r
-                               if(spk.RowReturned())\r
+                               // go through each board the message was posted to and see if we are saving messages to that board\r
+                               // if the board isn't found, see if we are saving messages to new boards\r
+                               boardsstr="";\r
+                               addmessage=false;\r
+                               std::vector<std::string> messageboards=xml.GetExternalBoards(i);\r
+                               for(std::vector<std::string>::iterator j=messageboards.begin(); j!=messageboards.end(); j++)\r
                                {\r
-                                       int thisidentityid=0;\r
-                                       spk.ResultInt(0,thisidentityid);\r
-                                       mst.Bind(0,thisidentityid);\r
-                                       mst.Bind(1,xml.GetExternalDate(i));\r
-                                       mst.Bind(2,xml.GetExternalIndex(i));\r
-                                       mst.Step();\r
-                                       mst.Reset();\r
+                                       if(boards.find((*j))!=boards.end())\r
+                                       {\r
+                                               if(boards[(*j)]==true)\r
+                                               {\r
+                                                       addmessage=true;\r
+                                               }\r
+                                       }\r
+                                       else if(m_savetonewboards==true)\r
+                                       {\r
+                                               addmessage=true;\r
+                                       }\r
+                                       if(j!=messageboards.begin())\r
+                                       {\r
+                                               boardsstr+=", ";\r
+                                       }\r
+                                       boardsstr+=(*j);\r
+                               }\r
+\r
+                               if(addmessage==true)\r
+                               {\r
+                                       spk.Bind(0,xml.GetExternalIdentity(i));\r
+                                       spk.Step();\r
+                                       if(spk.RowReturned())\r
+                                       {\r
+                                               int thisidentityid=0;\r
+                                               spk.ResultInt(0,thisidentityid);\r
+                                               mst.Bind(0,thisidentityid);\r
+                                               mst.Bind(1,xml.GetExternalDate(i));\r
+                                               mst.Bind(2,xml.GetExternalIndex(i));\r
+                                               mst.Step();\r
+                                               mst.Reset();\r
+                                       }\r
+                                       spk.Reset();\r
+                               }\r
+                               else\r
+                               {\r
+                                       m_log->trace("MessageListRequester::HandleAllData will not download external message posted to "+boardsstr+" from " + xml.GetExternalIdentity(i));\r
                                }\r
-                               spk.Reset();\r
                        }\r
                }\r
 \r
@@ -178,6 +272,7 @@ void MessageListRequester::Initialize()
                m_log->warning("Option MaxMessageListRequests is currently set at "+tempval+".  This value might be incorrectly configured.");\r
        }\r
 \r
+       tempval="";\r
        Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
        if(tempval=="true")\r
        {\r
@@ -188,6 +283,17 @@ void MessageListRequester::Initialize()
                m_localtrustoverrides=false;\r
        }\r
 \r
+       tempval="";\r
+       Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+       if(tempval=="true")\r
+       {\r
+               m_savetonewboards=true;\r
+       }\r
+       else\r
+       {\r
+               m_savetonewboards=false;\r
+       }\r
+\r
 }\r
 \r
 void MessageListRequester::PopulateIDList()\r