version 0.3.20
[fms.git] / src / freenet / messagelistrequester.cpp
index ee2dfaf..41f7d85 100644 (file)
@@ -19,6 +19,60 @@ MessageListRequester::MessageListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp
        Initialize();\r
 }\r
 \r
+const bool MessageListRequester::CheckDateNotFuture(const std::string &datestr) const\r
+{\r
+       std::vector<std::string> dateparts;\r
+       int year=0;\r
+       int month=0;\r
+       int day=0;\r
+       Poco::DateTime today;\r
+\r
+       StringFunctions::Split(datestr,"-",dateparts);\r
+       if(dateparts.size()==3)\r
+       {\r
+               StringFunctions::Convert(dateparts[0],year);\r
+               StringFunctions::Convert(dateparts[1],month);\r
+               StringFunctions::Convert(dateparts[2],day);\r
+               if(today.year()>year || (today.year()==year && today.month()>month) || (today.year()==year && today.month()==month && today.day()>=day))\r
+               {\r
+                       return true;\r
+               }\r
+               else\r
+               {\r
+                       return false;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+\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 +83,13 @@ 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
+       std::string datestr="";\r
+       std::vector<std::string> dateparts;\r
+\r
+       GetBoardList(boards);\r
 \r
        StringFunctions::Split(message["Identifier"],"|",idparts);\r
        StringFunctions::Convert(message["DataLength"],datalength);\r
@@ -49,10 +110,13 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
 \r
        // receive the file\r
        data.resize(datalength);\r
-       m_fcp->ReceiveRaw(&data[0],datalength);\r
+       if(data.size()>0)\r
+       {\r
+               m_fcp->ReceiveRaw(&data[0],datalength);\r
+       }\r
 \r
        // parse file into xml and update the database\r
-       if(xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
+       if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
        {\r
 \r
                SQLite3DB::Statement st=m_db->Prepare("SELECT IdentityID FROM tblMessageRequests WHERE IdentityID=? AND Day=? AND RequestIndex=?;");\r
@@ -60,19 +124,58 @@ 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(CheckDateNotFuture(xml.GetDate(i))==false)\r
+                       {\r
+                               addmessage=false;\r
+                               m_log->error("MessageListRequester::HandleAllData date for message is in future! "+xml.GetDate(i));\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 +183,57 @@ 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(CheckDateNotFuture(xml.GetExternalDate(i))==false)\r
+                               {\r
+                                       addmessage=false;\r
+                                       m_log->error("MessageListRequester::HandleAllData date for external message is in future! "+xml.GetExternalDate(i));\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
@@ -165,9 +306,10 @@ const bool MessageListRequester::HandleGetFailed(FCPMessage &message)
 void MessageListRequester::Initialize()\r
 {\r
        m_fcpuniquename="MessageListRequester";\r
-       std::string tempval;\r
-       Option::Instance()->Get("MaxMessageListRequests",tempval);\r
-       StringFunctions::Convert(tempval,m_maxrequests);\r
+       std::string tempval="";\r
+\r
+       m_maxrequests=0;\r
+       Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
        if(m_maxrequests<1)\r
        {\r
                m_maxrequests=1;\r
@@ -178,6 +320,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 +331,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