예제 #1
0
파일: Client.cs 프로젝트: elnomade/hathi
 public bool ProcessHello(bool response,byte[] packet)
 {
     #if VERBOSE
     CKernel.LogClient.AddLog("ProcessHello, Response:"+response.ToString(),m_ID);
     #endif
     CReceiveHello helloPacket=new CReceiveHello(response,new MemoryStream(packet));
     packet=null;
     m_UserHash=helloPacket.Hash;
     if (m_Software==(byte)Protocol.Client.Unknown)
     {
     m_Software=helloPacket.software;
     m_VersionMinor=helloPacket.Version;
     }
     if (helloPacket.software==(byte)Protocol.Client.eMule)
     m_EmuleProtocol=true;
     #if VERBOSE
     if ((m_ID!=0)&&(m_ID!=helloPacket.UserID))
     CKernel.LogClient.AddLog("Older ID:"+Convert.ToString(m_ID)+",new:"+Convert.ToString(helloPacket.UserID),m_ID);
     #endif
     if ((helloPacket.UserID==0)||(helloPacket.UserID>Protocol.LowIDLimit))
     {
     // probablemente no está conectado a un servidor y no sabe su ip pública
     // o es un idalto su id será la de su conexión
     if (connection!=null)
         m_ID=connection.IP;
     else
         m_ID=helloPacket.UserID;
     }
     else
     {
     //is a low id
     m_ID=helloPacket.UserID;
     }
     if ((m_ID!=0)&&(m_ID!=helloPacket.UserID))
     Debug.WriteLine("OldUserID:"+Convert.ToString(m_ID)+",new:"+Convert.ToString(helloPacket.UserID));
     m_Port=helloPacket.UserPort;
     m_UserName=helloPacket.UserName;
     if (helloPacket.ExtendedInfoComplete)
     {
     //all the extended info is here we dont need a emule info packet emule v0.42+
     m_Software=helloPacket.IDClientCompatible;
     m_UDPPort=helloPacket.PortUDP;
     m_SourceExchangeVersion=helloPacket.VersionSourceExchange;
     m_VersionMinor=(uint)helloPacket.VersioneMuleMinor;
     m_VersionMajor=(uint)helloPacket.VersioneMuleMajor;
     m_VersionRevision=(uint)helloPacket.VersioneMuleRevision;
     m_EmuleProtocol=true;
     m_VersionUDP=helloPacket.VersionUDP;
     m_VersionComments=helloPacket.VersionComments;
     m_VersionCompression=helloPacket.VersionCompression;
     m_VersionExtendedRequest=helloPacket.VersionExtendedRequests;
     m_AllowViewSharedFiles=helloPacket.AllowViewSharedFiles;
     m_PartnerAllowed=helloPacket.PartnerAllowed;
     m_SupportsPartner=helloPacket.SupportsPartner;
     }
     #if VERBOSE
     CKernel.LogClient.AddLog("User:"******"UpdateServerListFromClient"))) CKernel.ServersList.Add(m_ServerIP,m_ServerPort);
     #if DEBUG
     if (m_DownloadState==Protocol.DownloadState.WaitCallBack)
     {
     #if VERBOSE
     CKernel.LogClient.AddLog("ProcessHello-Responsed callback",m_ID);
     #endif
     m_UserName="******"+m_UserName;
     }
     #endif
     if (response)
     {
     m_OnConnetionReady();
     }
     return helloPacket.ExtendedInfoComplete;
 }
예제 #2
0
 /// <summary>
 /// Process incomming eDonkey packet.
 /// </summary>
 /// <param name="packet">Packet which need to be processed.</param>
 protected virtual void ProcessDonkeyPacket(ref byte[] packet)
 {
     try
     {
     switch ((Protocol.ClientCommand)m_DonkeyHeader.Command)
     {
     case Protocol.ClientCommand.Hello:
         if (m_Client==null)
         {
             CReceiveHello HelloPacket=new CReceiveHello(false,new MemoryStream(packet));
             m_Client=CKernel.ClientsList.GetClient(HelloPacket.UserID,HelloPacket.UserPort,HelloPacket.ServerIP,HelloPacket.Hash);
             if (m_Client==null)
             {
                 m_Client=new CClient(this);
                 CKernel.ClientsList.AddClient(m_Client);
             }
             else
             {
                 if ((m_Client.connection!=null)&&(m_Client.connection.Connected)&&(m_Client.connection!=this))
                 {
                     m_Client.connection.CloseConnection();
                     Debug.WriteLine("Client conexion!=null");
                 }
                 m_Client.connection=this;
             }
         }
         CClient cant=m_Client;
         CConnection conant=m_Client.connection;
         bool NeedExtendRequest=!m_Client.ProcessHello(false,packet);
         if ((NeedExtendRequest)&&(m_Client.EmuleProtocol)&&(CKernel.Preferences.GetBool("UseEmuleProtocol"))) m_Client.SendEmuleHello(false);
         m_Client.ResponseHello();
         break;
     case Protocol.ClientCommand.FileRequest:
         m_Client.ProcessFileRequest(packet);
         break;
     case Protocol.ClientCommand.HelloAnswer:
         m_Client.ProcessHello(true,packet);
         break;
     case Protocol.ClientCommand.SetRequestFileID:
         m_Client.ProcessRequestFileID(packet);
         break;
     case Protocol.ClientCommand.FileRequestAnswer:
         m_Client.ProcessFileInfo(packet);
         break;
     case Protocol.ClientCommand.FileState:
         m_Client.ProcessChunksStatus(packet,false/*tcp*/);
         break;
     case Protocol.ClientCommand.HashSetAnswer:
         m_Client.ProcessHashSet(packet);
         break;
     case Protocol.ClientCommand.HashSetRequest:
         m_Client.SendHashSet();
         break;
     case Protocol.ClientCommand.AcceptUploadRequest:
         if (m_Client.DownloadState==Protocol.DownloadState.OnQueue)
         {
             m_Client.RequestBlocks();
         }
         else
         {
             if (m_Client.DownFileHash!=null)
             {
     //                              CLog.Log(Constants.Log.Verbose,"Trying to resume download {2}: {0},hashdescarga=null? {1}",m_Client.DownloadState,(m_Client.DownFileHash==null),m_Client.UserName);
                 m_Client.RequestBlocks();
             }
             else
             {
                 if (m_Client.UpFileHash!=null)
                 {
     #if DEBUG
                     CLog.Log(Constants.Log.Verbose,"Recovering source to download "+m_Client.UserName);
     #endif
                     m_Client.DownFileHash=m_Client.UpFileHash;
                     m_Client.RequestBlocks();
                 }
                 else
                 {
                     CSourceOld sourceRecovered=CKernel.SourcesOld.GetSourceOld(m_Client.UserHash);
                     if (sourceRecovered!=null)
                     {
                         m_Client.DownFileHash=sourceRecovered.FileHash;
                         m_Client.DownFileChunks=sourceRecovered.FileChunks;
                         m_Client.RequestBlocks();
     #if DEBUG
                         CLog.Log(Constants.Log.Verbose,"RECOVERED SOURCE from sources cache "+m_Client.UserName);
     #endif
                     }
     #if DEBUG
                     else
                         CLog.Log(Constants.Log.Verbose,"download lost: {0}",m_Client.UserName);
     #endif
                 }
             }
         }
         break;
     case Protocol.ClientCommand.OutOfPartRequest:
         m_Client.ProcessOutOfParts();
         break;
     case Protocol.ClientCommand.StartUploadRequest:
         m_Client.ProcessStartUploadRequest(packet);
         break;
     case Protocol.ClientCommand.RequestParts:
         m_Client.ProcessRequestParts(packet);
         break;
     case Protocol.ClientCommand.EndOfDownload:
     case Protocol.ClientCommand.CancelTransfer:
         m_Client.CancelUploadTransfer(false);
         break;
     case Protocol.ClientCommand.SendingPart:
         m_Client.ReceiveBlock(packet);
         break;
     case Protocol.ClientCommand.QueueRank:
         m_Client.ProcessQR(packet);
         break;
     case Protocol.ClientCommand.FileRequestAnswerNoFile:
         m_Client.FileNotFound(packet);
         break;
     case Protocol.ClientCommand.ChangeClientID:
         m_Client.ProcessIDChange(packet);
         break;
     case Protocol.ClientCommand.ChangeSlot:
         break;
     case Protocol.ClientCommand.AskSharedFiles:
         Constants.AllowViewShared allow=(Constants.AllowViewShared)CKernel.Preferences.GetEnum("AllowViewShared",Constants.AllowViewShared.Nobody);
         if (allow==Constants.AllowViewShared.All)
         {
             m_Client.ProcessSharedListRequest();
         }
         break;
     case Protocol.ClientCommand.AskSharedFilesAnswer:
         m_Client.ProcessSharedListResponse(packet);
         break;
     case Protocol.ClientCommand.Message:
         m_Client.ProcessChatMessage(packet);
         break;
     default:
         CLog.Log(Constants.Log.Verbose,"CLI_UNK_DONK_TCP_PACKET",m_DonkeyHeader.Command);
         break;
     }
     }
     catch (Exception e)
     {
     Debug.WriteLine(e.ToString());
     #if DEBUG
     if (m_DonkeyHeader!=null) CLog.Log(Constants.Log.Verbose,"CLI_PAQ_DONK_ERROR",m_DonkeyHeader.Command);
     #endif
     }
     packet=null;
     return;
 }