version 0.2.18
[fms.git] / src / freenet / messagelistrequester.cpp
index ba2d4ff..75f2e02 100644 (file)
@@ -76,19 +76,22 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
                // insert external message indexes\r
                for(long i=0; i<xml.ExternalMessageCount(); i++)\r
                {\r
-                       spk.Bind(0,xml.GetExternalIdentity(i));\r
-                       spk.Step();\r
-                       if(spk.RowReturned())\r
+                       if(xml.GetExternalType(i)=="Keyed")\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
+                               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
-                       spk.Reset();\r
                }\r
 \r
                st=m_db->Prepare("INSERT INTO tblMessageListRequests(IdentityID,Day,RequestIndex,Found) VALUES(?,?,?,'true');");\r
@@ -133,6 +136,13 @@ const bool MessageListRequester::HandleGetFailed(FCPMessage &message)
        StringFunctions::Convert(idparts[1],identityid);\r
        StringFunctions::Convert(idparts[2],index);     \r
 \r
+       // code 27 - permanent redirect\r
+       if(message["Code"]=="27")\r
+       {\r
+               StartRedirectRequest(message);\r
+               return true;\r
+       }\r
+\r
        // if this is a fatal error - insert index into database so we won't try to download this index again\r
        if(message["Fatal"]=="true")\r
        {\r
@@ -210,12 +220,50 @@ void MessageListRequester::PopulateIDList()
        }\r
 }\r
 \r
+void MessageListRequester::StartRedirectRequest(FCPMessage &message)\r
+{\r
+       std::vector<std::string> parts;\r
+       std::string indexstr="";\r
+       std::string identityidstr="";\r
+       std::string datestr="";\r
+       FCPMessage newmessage;\r
+\r
+       // get the new edition #\r
+       StringFunctions::Split(message["RedirectURI"],"/",parts);\r
+       //edition # is 2nd to last part\r
+       if(parts.size()>2)\r
+       {\r
+               indexstr=parts[parts.size()-2];\r
+       }\r
+\r
+       // get identityid\r
+       parts.clear();\r
+       StringFunctions::Split(message["Identifier"],"|",parts);\r
+       if(parts.size()>1)\r
+       {\r
+               identityidstr=parts[1];\r
+       }\r
+       if(parts.size()>4)\r
+       {\r
+               datestr=parts[4];\r
+       }\r
+\r
+       newmessage.SetName("ClientGet");\r
+       newmessage["URI"]=StringFunctions::UriDecode(message["RedirectURI"]);\r
+       newmessage["Identifier"]=m_fcpuniquename+"|"+identityidstr+"|"+indexstr+"|_|"+datestr+"|"+newmessage["URI"];\r
+       newmessage["ReturnType"]="direct";\r
+       newmessage["MaxSize"]="1000000";\r
+\r
+       m_fcp->SendMessage(newmessage);\r
+\r
+}\r
+\r
 void MessageListRequester::StartRequest(const long &id)\r
 {\r
        DateTime now;\r
        FCPMessage message;\r
        std::string publickey;\r
-       int index;\r
+       int index=0;\r
        std::string indexstr;\r
        std::string identityidstr;\r
 \r
@@ -249,10 +297,10 @@ void MessageListRequester::StartRequest(const long &id)
                StringFunctions::Convert(id,identityidstr);\r
 \r
                message.SetName("ClientGet");\r
-               message["URI"]=publickey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|MessageList|"+indexstr+".xml";\r
-               message["Identifier"]=m_fcpuniquename+"|"+identityidstr+"|"+indexstr+"|"+message["URI"];\r
+               message["URI"]="USK"+publickey.substr(3)+m_messagebase+"|"+now.Format("%Y.%m.%d")+"|MessageList/"+indexstr+"/MessageList.xml";\r
+               message["Identifier"]=m_fcpuniquename+"|"+identityidstr+"|"+indexstr+"|_|"+now.Format("%Y-%m-%d")+"|"+message["URI"];\r
                message["ReturnType"]="direct";\r
-               message["MaxSize"]="1000000";                   // 1 MB\r
+               message["MaxSize"]="1000000";\r
 \r
                m_fcp->SendMessage(message);\r
 \r