public void ProcessFileRequest(byte[] packet) { #if VERBOSE CKernel.LogClient.AddLog("ProcessFileRequest",m_ID); #endif CFileRequest fileRequest=new CFileRequest(new MemoryStream(packet)); if (fileRequest.FileHash==null) return; m_UpFileHash=fileRequest.FileHash; byte[] tmp_UploadFileHash=fileRequest.FileHash; m_UploadElement=(CElement)CKernel.FilesList[m_UpFileHash]; CElement tmpUploadElement=m_UploadElement; if ((m_UploadElement==null)||(m_UploadElement.File.Empty)) { /* Dont need to send no file found,we have sent it already in ProcessRequestFileID * MemoryStream buffer=new MemoryStream(); * CNoFile noFile=new CNoFile(buffer,m_UpFileHash); * m_UpFileHash=null; * m_UploadElement=null; * if (connection!=null) connection.SendPacket(buffer); */ } else { #if VERBOSE CKernel.LogClient.AddLog("ProcessFileRequest-send file info",m_ID); #endif m_UploadElement.Statistics.IncSessionRequests(); if ((fileRequest.Partes!=null) &&(fileRequest.Partes.Length==m_UploadElement.File.NumChunks)) { m_UpFileChunks=fileRequest.Partes; } MemoryStream fileInfoPacket=new MemoryStream(); CFileInfo fileInfo=new CFileInfo(m_UpFileHash,m_UploadElement.File.FileName,fileInfoPacket); if (connection!=null) { connection.SendPacket(fileInfoPacket); } m_SendComment(); } // it can be a new source for downloads if ((tmpUploadElement!=null) &&(tmpUploadElement.SourcesList!=null) &&(!tmpUploadElement.File.Completed) &&(tmpUploadElement.File.FileStatus==Protocol.FileState.Ready)) { if (DownFileHash==null) { #if VERBOSE CKernel.LogClient.AddLog("ProcessFileRequest-add client to downloads",m_ID); #endif DownFileHash=new byte[16]; Buffer.BlockCopy(tmpUploadElement.File.FileHash,0,DownFileHash,0,16); m_DownloadElement=tmpUploadElement; m_DownloadState=Protocol.DownloadState.Connected; if (tmpUploadElement.SourcesList.AddSource(this)) { TryDownload(); } else { m_DownloadState=Protocol.DownloadState.None; } } else { if (!CKernel.SameHash(ref DownFileHash,ref tmpUploadElement.File.FileHash)) AddOtherDownloadFile(CKernel.HashToString(tmp_UploadFileHash)); } } }
public void ProcessFileInfo(byte[] packet) { #if VERBOSE CKernel.LogClient.AddLog("ProcessFileInfo",m_ID); #endif if (DownFileHash==null) return; CFileInfo fileInformation=new CFileInfo(new MemoryStream(packet)); if (!CKernel.SameHash(ref fileInformation.FileHash,ref DownFileHash)) { #if VERBOSE CKernel.LogClient.AddLog("ProcessFileInfo-no match hashes",m_ID); #endif // raise exception // m_DownloadElement.SourcesList.RemoveSource(this); Exception e=new Exception("File info hash!=DownFileHash"); throw(e); } m_ClientFileName=fileInformation.ClientFileName; }