+#include "../../include/freenet/fileinserter.h"\r
+\r
+#ifdef XMEM\r
+ #include <xmem.h>\r
+#endif\r
+\r
+FileInserter::FileInserter()\r
+{\r
+ Initialize();\r
+}\r
+\r
+FileInserter::FileInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+{\r
+ Initialize();\r
+}\r
+\r
+void FileInserter::CheckForNeededInsert()\r
+{\r
+ // only do 1 insert at a time\r
+ if(m_inserting.size()==0)\r
+ {\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT FileInsertID FROM tblFileInserts WHERE Key IS NULL;");\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ int id=-1;\r
+ st.ResultInt(0,id);\r
+ StartInsert(id);\r
+ }\r
+ }\r
+}\r
+\r
+const bool FileInserter::HandlePutFailed(FCPMessage &message)\r
+{\r
+ std::vector<std::string> idparts;\r
+ long fileinsertid;\r
+\r
+ StringFunctions::Split(message["Identifier"],"|",idparts);\r
+ StringFunctions::Convert(idparts[1],fileinsertid);\r
+\r
+ RemoveFromInsertList(fileinsertid);\r
+\r
+ m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"FileInserter::HandlePutFailed failed to insert "+message["Identifier"]);\r
+\r
+ return true;\r
+\r
+}\r
+\r
+const bool FileInserter::HandlePutSuccessful(FCPMessage &message)\r
+{\r
+ std::vector<std::string> idparts;\r
+ long fileinsertid;\r
+\r
+ StringFunctions::Split(message["Identifier"],"|",idparts);\r
+ StringFunctions::Convert(idparts[1],fileinsertid);\r
+\r
+ SQLite3DB::Statement st=m_db->Prepare("UPDATE tblFileInserts SET Key=?, Data=NULL WHERE FileInsertID=?;");\r
+ st.Bind(0,message["URI"]);\r
+ st.Bind(1,fileinsertid);\r
+ st.Step();\r
+\r
+ RemoveFromInsertList(fileinsertid);\r
+\r
+ return true;\r
+}\r
+\r
+void FileInserter::Initialize()\r
+{\r
+ m_fcpuniquename="FileInserter";\r
+}\r
+\r
+void FileInserter::StartInsert(const long &fileinsertid)\r
+{\r
+ FCPMessage message;\r
+ std::string fileinsertidstr="";\r
+ std::string sizestr="";\r
+ std::string filename="";\r
+ int datalen=-1;\r
+ std::vector<char> data;\r
+\r
+ StringFunctions::Convert(fileinsertid,fileinsertidstr);\r
+\r
+\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT FileName,Size,Data FROM tblFileInserts WHERE FileInsertID=?;");\r
+ st.Bind(0,fileinsertid);\r
+ st.Step();\r
+\r
+ st.ResultText(0,filename);\r
+ st.ResultInt(1,datalen);\r
+ data.resize(datalen,0);\r
+ st.ResultBlob(2,&data[0],datalen);\r
+ data.resize(datalen);\r
+\r
+ StringFunctions::Convert(data.size(),sizestr);\r
+\r
+ message.SetName("ClientPut");\r
+ message["URI"]="CHK@";\r
+ message["TargetFilename"]=filename;\r
+ message["Identifier"]=m_fcpuniquename+"|"+fileinsertidstr;\r
+ message["UploadFrom"]="direct";\r
+ message["DataLength"]=sizestr;\r
+ m_fcp->SendMessage(message);\r
+ m_fcp->SendRaw(&data[0],data.size());\r
+\r
+ m_inserting.push_back(fileinsertid);\r
+}\r