www.pudn.com > lphant-v1.00-src.zip > KernelGateway.cs


#region Copyright (c)2003 Juanjo < http://lphant.sourceforge.net > 
/* 
* This file is part of eLePhant 
* Copyright (C)2003 Juanjo < j_u_a_n_j_o@users.sourceforge.net / http://lphant.sourceforge.net > 
*  
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License 
* as published by the Free Software Foundation; either 
* version 2 of the License, or (at your option) any later version. 
*  
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
* GNU General Public License for more details. 
*  
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
*/ 
#endregion 
 
using System; 
using System.Threading; 
using eLePhant.eDonkey; 
using eLePhant.Types; 
 
using System.Runtime.Remoting; 
using System.Runtime.Serialization; 
using System.Runtime.Remoting.Lifetime; 
using System.Diagnostics; 
using System.Collections; 
 
namespace eLePhant.Client 
{ 
	public delegate void RefreshEvent(CkernelGateway kernelGateway); 
 
	[Serializable] 
	public class CkernelGateway : MarshalByRefObject 
	{ 
		public event LogEvent OnLogMessage; 
		public event FileEvent OnNewFile; 
		public event FileEvent OnNewSharedFile; 
		public event FileEvent OnRemovedSharedFile; 
		public event ClientEvent OnNewUpload; 
		public event SourceEvent OnNewSource; 
		public event RefreshEvent OnRefreshDownloads; 
		public event ServerEvent OnNewServer; 
		public event RefreshEvent OnRefreshUploads; 
		public event RefreshEvent OnRefreshSources; 
		public event RefreshEvent OnRefreshFileNames; 
		public event RefreshEvent OnRefreshFileComments; 
		public event RefreshEvent OnRefreshStatus; 
		public event RefreshEvent OnRefreshServers; 
		public event RefreshEvent OnRefreshShared; 
		public event SearchEvent OnNewSearched; 
		public event SearchEvent OnModifiedSearched; 
		public event IPEvent OnDeleteServer; 
		public event EndSearchEvent OnEndSearch; 
		public event SearchTabEvent OnNewSearchTab; 
		public event SearchProgressEvent OnSearchProgress; 
		public event SourceEvent OnNewChatMessage; 
		 
		public event ClientEvent OnStartChatSession; 
		public event ClientEvent OnAddingFriend; 
		public event ClientEvent OnDeleteFriend; 
 
		private Thread RefreshThread; 
 
		private bool m_isLocal; 
		private bool m_NotRefresh; 
 
		private CKernel edonkeyNucleo; 
		private CInterfaceGateway krnGateway; 
 
		public Hashtable FilterSummary; 
		public string CurrentCategoryFilter; 
		public event EventHandler OnSummaryFilterChanged; 
		public event EventHandler OnCategoryListChanged; 
 
		public bool IsLocal 
		{ 
			get { return m_isLocal; } 
		} 
 
		public bool NotRefresh 
		{ 
			get { return m_NotRefresh; } 
			set { m_NotRefresh=value; } 
		} 
 
		public CkernelGateway() 
		{ 
			m_isLocal=true; 
			edonkeyNucleo=new CKernel(); 
			krnGateway=CKernel.InterfaceGateway[0]; 
			Initialize(); 
		} 
 
		public CkernelGateway(CInterfaceGateway in_krnGateway) 
		{ 
			m_isLocal=false; 
			krnGateway=in_krnGateway; 
			Initialize(); 
		} 
 
		private void ResetFiterSummary() 
		{ 
			FilterSummary.Clear(); 
 
			CFilterSummary FilerResumeItemAll=new CFilterSummary(); 
			FilerResumeItemAll.Items=0; 
			FilerResumeItemAll.TotalSize=0; 
			FilterSummary["All"]=FilerResumeItemAll; 
			 
			CFilterSummary FilerResumeItemStopped=new CFilterSummary(); 
			FilerResumeItemStopped.Items=0; 
			FilerResumeItemStopped.TotalSize=0;			 
			FilterSummary["Stopped"]=FilerResumeItemStopped; 
			 
			CFilterSummary FilerResumeItemStarted=new CFilterSummary(); 
			FilerResumeItemStarted.Items=0; 
			FilerResumeItemStarted.TotalSize=0; 
			FilterSummary["Started"]=FilerResumeItemStarted; 
		} 
 
		private void CalculateFilterSummary(InterfaceFile[] files) 
		{ 
			ResetFiterSummary(); 
			string category; 
			int i=0; 
			bool isCategoryFiltered; 
			InterfaceFile file; 
			while (i0) 
					{ 
						filterSummary=((CFilterSummary)FilterSummary[category]); 
						filterSummary.TotalSize+=file.Size/1024/1024; 
						filterSummary.Items++; 
					} 
 
					filterSummary=((CFilterSummary)FilterSummary["All"]); 
					filterSummary.TotalSize+=file.Size/1024/1024; 
					filterSummary.Items++; 
				} 
			} 
			if (OnSummaryFilterChanged!=null) OnSummaryFilterChanged(this,null); 
		} 
 
		private void Initialize() 
		{ 
			FilterSummary=new Hashtable(); 
			CurrentCategoryFilter=""; 
			ResetFiterSummary(); 
 
			krnGateway.OnLogMessage+=new LogEvent(m_OnLogMessage); 
			krnGateway.OnNewFile+=new FileEvent(m_OnNewFile); 
			krnGateway.OnNewSharedFile+=new FileEvent(m_OnNewSharedFile); 
			krnGateway.OnRemovedSharedFile+=new FileEvent(m_OnRemovedSharedFile); 
			krnGateway.OnNewUpload+=new ClientEvent(m_OnNewUpload); 
			krnGateway.OnNewSource+=new SourceEvent(m_OnNewSource); 
			krnGateway.OnNewServer+=new ServerEvent(m_OnNewServer); 
			krnGateway.OnDeleteServer+=new IPEvent(m_OnDeletedServer); 
			krnGateway.OnNewSearched+=new SearchEvent(m_OnNewSearched); 
			krnGateway.OnModifiedSearched+=new SearchEvent(m_OnModifiedSearched); 
			krnGateway.OnEndSearch+=new EndSearchEvent(m_OnEndSearch); 
			krnGateway.OnNewSearchTab+=new SearchTabEvent(m_OnNewSearchTab); 
			krnGateway.OnNewSearchProgress+=new SearchProgressEvent(m_OnSearchProgress); 
			krnGateway.OnNewChatMessage+=new SourceEvent(m_OnNewChatMessage); 
 
			RefreshThread=new Thread(new ThreadStart(RefreshProc)); 
			RefreshThread.Name="Interface refresher"; 
			m_NotRefresh=false; 
			RefreshThread.Start(); 
			 
			if (m_isLocal) 
				krnGateway.StartKernel(); 
		} 
 
		public void CloseKernel() 
		{ 
			krnGateway.OnLogMessage-=new LogEvent(m_OnLogMessage); 
			krnGateway.OnNewFile-=new FileEvent(m_OnNewFile); 
			krnGateway.OnNewSharedFile-=new FileEvent(m_OnNewSharedFile); 
			krnGateway.OnRemovedSharedFile-=new FileEvent(m_OnRemovedSharedFile); 
			krnGateway.OnNewUpload-=new ClientEvent(m_OnNewUpload); 
			krnGateway.OnNewSource-=new SourceEvent(m_OnNewSource); 
			krnGateway.OnNewServer-=new ServerEvent(m_OnNewServer);	 
			krnGateway.OnDeleteServer-=new IPEvent(m_OnDeletedServer); 
			krnGateway.OnNewSearched-=new SearchEvent(m_OnNewSearched); 
			krnGateway.OnModifiedSearched-=new SearchEvent(m_OnModifiedSearched); 
			krnGateway.OnEndSearch-=new EndSearchEvent(m_OnEndSearch); 
			krnGateway.OnNewSearchTab-=new SearchTabEvent(m_OnNewSearchTab); 
			krnGateway.OnNewSearchProgress-=new SearchProgressEvent(m_OnSearchProgress); 
			krnGateway.OnNewChatMessage-=new SourceEvent(m_OnNewChatMessage); 
			RefreshThread.Abort(); 
			if (m_isLocal) 
			{ 
				krnGateway.CloseKernel(); 
			} 
		} 
 
		public string Version 
		{ 
			get { return krnGateway.Version; } 
		} 
 
		//methods 
		public void StopRefresh() 
		{ 
			RefreshThread.Abort(); 
		} 
 
		public void StartRefresh() 
		{ 
			RefreshThread.Resume(); 
		} 
 
		public InterfaceFile GetDownloadFile(string hash) 
		{ 
			return krnGateway.GetDownloadFile(hash); 
		} 
 
		public void CalculateFilterSummary() 
		{ 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
		} 
 
		public InterfaceFile[] GetDownloadFileList() 
		{ 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
			return files; 
		} 
 
		public SFriend[] GetFriends() 
		{ 
			return krnGateway.GetFriends(); 
		} 
 
		public void ResumeFile(string strFileHash) 
		{ 
			krnGateway.ResumeFile(strFileHash); 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
		} 
 
		public void StopFile(string strFileHash) 
		{ 
			krnGateway.StopFile(strFileHash); 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
		} 
 
		public void CancelFile(string strFileHash) 
		{ 
			krnGateway.CancelFile(strFileHash); 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
		} 
 
		public InterfaceClient GetUploadClient(uint ID, ushort Puerto,uint IPServidor, byte[] HashCliente) 
		{ 
			return krnGateway.GetUploadClient(ID, Puerto, IPServidor, HashCliente); 
		} 
 
		public InterfaceClient GetDownloadClient(uint IP, ushort Puerto,uint IPServidor,byte[] HashCliente,string strHashFicheroDescarga) 
		{ 
			return krnGateway.GetDownloadClient(IP,Puerto,IPServidor,HashCliente,strHashFicheroDescarga); 
		} 
 
		public InterfaceClient[] GetFileSources(string strHashFichero) 
		{ 
			return krnGateway.GetFileSources(strHashFichero); 
		} 
 
		public InterfaceServer[] GetServerList() 
		{ 
			return krnGateway.GetServerList(); 
		} 
 
		public InterfaceClient[] GetQueuedSourcesList(byte[] fileHashFilter) 
		{ 
			return krnGateway.GetQueuedSourcesList(fileHashFilter); 
		} 
 
		public InterfaceFileNames[] GetFileNamesList(string strFileHash) 
		{ 
			return krnGateway.GetFileNamesList(strFileHash); 
		} 
 
		public InterfaceComment[] GetComments(string strFileHash) 
		{ 
			return krnGateway.GetComments(strFileHash); 
		} 
 
		public void SetFileComment(string strFileHash, string strComment, byte rating) 
		{ 
			krnGateway.SetFileComment(strFileHash, strComment, rating); 
		} 
 
		public void GetFileComment(string strFileHash, ref string strComment, ref byte rating) 
		{	 
			krnGateway.GetFileComment(strFileHash, ref strComment, ref rating); 
		} 
 
		public void SetFileName(string strFileHash,string newName) 
		{ 
			krnGateway.SetFileName(strFileHash,newName); 
		} 
 
		public FileStatistics GetFileStatistics(string strFileHash) 
		{ 
			return krnGateway.GetFileStatistics(strFileHash); 
		} 
 
		public sFileDetails GetFileDetails(string strFileHash) 
		{ 
			return krnGateway.GetFileDetails(strFileHash); 
		} 
 
		public void Search(int searchID, string condicion, bool matchAnyWords,string type,uint maxSize, uint minSize,uint avaibility, string exclude) 
		{ 
			krnGateway.Search(searchID, condicion, matchAnyWords, type, maxSize, minSize,avaibility, exclude); 
		} 
 
		public void CancelSearch(int SearchIndex) 
		{ 
			krnGateway.CancelSearch(SearchIndex); 
		} 
 
		public void DeleteSearch(int SearchIndex) 
		{ 
			krnGateway.DeleteSearch(SearchIndex); 
		} 
 
		public void ExtendSearch(int SearchIndex) 
		{ 
			krnGateway.ExtendSearch(SearchIndex); 
		} 
 
		public void DownloadFile(InterfaceSearchedFile fichero,int SearchIndex) 
		{ 
			krnGateway.DownloadFile(fichero,SearchIndex); 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
		} 
 
		public GlobalStatus GetGlobalStatus() 
		{ 
			return krnGateway.GetGlobalStatus(); 
		} 
 
		public void ConnectToaServer() 
		{ 
			krnGateway.ConnectToaServer(); 
		} 
 
		public void ConnectToServer(uint ip, ushort port) 
		{ 
			krnGateway.ConnectToServer(ip,port); 
		} 
 
		public void DeleteServer(uint ip, ushort port) 
		{ 
			krnGateway.DeleteServer(ip,port); 
		} 
 
		public void SetServerPriority(uint ip, ushort port,Constants.ServerPriority priority) 
		{ 
			krnGateway.SetServerPriority(ip,port,priority); 
		} 
 
		public InterfacePreferences GetConfig() 
		{ 
			return krnGateway.GetConfig(); 
		} 
 
		public void SetConfig(InterfacePreferences config) 
		{ 
			krnGateway.SetConfig(config); 
		} 
 
		public void DownloadElink(string elink, bool stopped) 
		{ 
			krnGateway.DownloadElink(elink,stopped); 
			InterfaceFile[] files=krnGateway.GetDownloadFileList(); 
			CalculateFilterSummary(files); 
		} 
 
		public void DownloadServerList(string uri) 
		{ 
			krnGateway.DownloadServerList(uri); 
		} 
 
		public void RefreshSharedList() 
		{ 
			krnGateway.RefreshSharedList(); 
		} 
 
		public InterfaceFile[] GetSharedFileList() 
		{ 
			return krnGateway.GetSharedFileList(); 
		} 
 
		public void SetFileUploadPrioriry(string strFileHash, Types.Constants.Priority priority) 
		{ 
			krnGateway.SetFileUploadPrioriry(strFileHash,priority); 
		} 
 
		public void SetFileDownloadPrioriry(string strFileHash, Types.Constants.Priority priority) 
		{ 
			krnGateway.SetFileDownloadPrioriry(strFileHash,priority); 
		} 
 
		public void RequestSharedList(uint ID, ushort Port,uint ServerIP, byte[] ClientHash) 
		{ 
			krnGateway.RequestSharedList(ID,Port,ServerIP,ClientHash); 
		} 
 
		public void SendChatMessage(uint ID, ushort Port,uint ServerIP, byte[] ClientHash, string message) 
		{ 
			krnGateway.SendChatMessage(ID, Port, ServerIP, ClientHash, message); 
		} 
 
		public void StartChatSession(InterfaceClient source) 
		{ 
			if (OnStartChatSession!=null) OnStartChatSession(source); 
		} 
 
		public void AddFriend(InterfaceClient source) 
		{ 
			krnGateway.AddFriend(source.ID, source.Port, source.ServerIP, source.UserHash, 0, "", source.Name, source.Software, source.Version,false); 
			OnAddingFriend(source); 
		} 
		 
		public void AddFriend(SFriend friend) 
		{ 
			krnGateway.AddFriend(friend.ID, friend.Port, friend.ServerIP, friend.UserHash, 0, friend.OurName, friend.Name, friend.Software, friend.Version, friend.FriendSlot); 
			InterfaceClient source = new InterfaceClient(); 
			source.Name=friend.OurName; 
			source.ID=friend.ID; 
			source.Port=friend.Port; 
			if (friend.UserHash!=null) source.UserHash=friend.UserHash; 
			OnAddingFriend(source); 
		} 
 
		public void ChangeFriendSlotAssigned(uint ID, byte[] ClientHash, ushort Port, bool assigned) 
		{ 
			krnGateway.ChangeFriendSlotAssigned(ID,ClientHash, Port, assigned); 
		} 
 
		public void DeleteFriend(byte[] ClientHash,uint ID, ushort Port) 
		{ 
			krnGateway.DeleteFriend(ClientHash, ID, Port); 
			InterfaceClient source = new InterfaceClient(); 
			source.ID=ID; 
			source.UserHash=ClientHash; 
			source.Port=Port; 
			OnDeleteFriend(source); 
		} 
 
		public ArrayList GetCategories() 
		{ 
			return krnGateway.GetCategories(); 
		} 
 
		public bool AddorUpdateCategory(uint ID, string name, string auto, uint color) 
		{ 
			bool res=krnGateway.AddorUpdateCategory(ID,name,auto,color); 
			if (OnCategoryListChanged!=null) OnCategoryListChanged(this,null); 
			return res; 
		} 
 
		public bool RemoveCategory(uint ID) 
		{ 
			bool res=krnGateway.RemoveCategory(ID); 
			if (OnCategoryListChanged!=null) OnCategoryListChanged(this,null); 
			return res; 
		} 
 
		public void SetFileCategory(string strFileHash,string category) 
		{ 
			krnGateway.SetFileCategory(strFileHash,category); 
		} 
 
		public CCategory GetCategoryByName(string name) 
		{ 
			return krnGateway.GetCategoryByName(name); 
		} 
 
		public void DeleteFile(string strFileHash) 
		{ 
			krnGateway.DeleteFile(strFileHash); 
		} 
 
		//Refresh thread 
		private void RefreshProc() 
		{ 
			int i=0; 
			int refreshMinimized=0; //refresh each 1200 seconds even minimized 
			while (RefreshThread.IsAlive) 
			{  
				Thread.Sleep(1000); 
				if (i>60) i=60; 
				else i++; 
				refreshMinimized++; 
				if (OnRefreshStatus!=null) OnRefreshStatus(this); 
				if ((m_NotRefresh)&&(refreshMinimized<1200)) continue; 
				refreshMinimized=0; 
				// monitor.Enter(s); 
				try 
				{ 
					if (OnRefreshDownloads!=null) OnRefreshDownloads(this); 
					if (OnRefreshUploads!=null) OnRefreshUploads(this); 
					if (OnRefreshSources!=null) OnRefreshSources(this); 
					if (i % 10==0) 
					{ 
						if (OnRefreshFileComments!=null) OnRefreshFileComments(this); 
						if (OnRefreshFileNames!=null) OnRefreshFileNames(this); 
					} 
					if (i % 30==0) 
					{ 
						if (OnRefreshShared!=null) OnRefreshShared(this); 
					} 
					if (i % 60==0) 
					{ 
						if (OnRefreshServers!=null) OnRefreshServers(this); 
						i=0; 
					} 
				} 
				catch(Exception e) 
				{ 
					Debug.WriteLine(e.ToString()); 
				} 
			} 
			Debug.WriteLine("Thread finalizado"); 
		} 
 
		//events 
		public void m_OnLogMessage(Constants.Log importance,string strMsg) 
		{ 
			if (OnLogMessage!=null) OnLogMessage(importance,strMsg); 
		} 
 
		public void m_OnNewFile(InterfaceFile file) 
		{ 
			if (OnNewFile!=null) OnNewFile(file); 
		} 
 
		public void m_OnNewSharedFile(InterfaceFile file) 
		{ 
			if (OnNewSharedFile!=null) OnNewSharedFile(file); 
		} 
 
		public void m_OnRemovedSharedFile(InterfaceFile file) 
		{ 
			if (OnRemovedSharedFile!=null) OnRemovedSharedFile(file); 
		} 
 
		public void m_OnNewUpload(InterfaceClient client) 
		{ 
			if (OnNewUpload!=null) OnNewUpload(client); 
		} 
 
		public void m_OnNewSource(InterfaceClient client,string strFileHash) 
		{ 
			if (OnNewSource!=null) OnNewSource(client,strFileHash); 
		} 
 
		public void m_OnNewServer(InterfaceServer server) 
		{ 
			if (OnNewServer!=null) OnNewServer(server); 
		} 
 
		public void m_OnDeletedServer(uint ip, ushort port) 
		{ 
			if (OnDeleteServer!=null) OnDeleteServer(ip,port); 
		} 
 
		public void m_OnNewSearched(InterfaceSearchedFile file, int searchID) 
		{ 
			if (OnNewSearched!=null) OnNewSearched(file,searchID); 
		} 
 
		public void m_OnModifiedSearched(InterfaceSearchedFile file, int searchID) 
		{ 
			if (OnModifiedSearched!=null) OnModifiedSearched(file,searchID); 
		} 
 
		public void m_OnEndSearch(int searchID) 
		{ 
			if (OnEndSearch!=null) OnEndSearch(searchID); 
		} 
 
		public void m_OnNewSearchTab(int searchID, string tabName) 
		{ 
			if (OnNewSearchTab!=null) OnNewSearchTab(searchID,tabName); 
		} 
 
		public void m_OnSearchProgress(int progress, int searchID) 
		{ 
			if (OnSearchProgress!=null) OnSearchProgress(progress,searchID); 
		} 
 
		public void m_OnNewChatMessage(InterfaceClient source, string message) 
		{ 
			if (OnNewChatMessage!=null) OnNewChatMessage(source, message); 
		} 
 
		public override Object InitializeLifetimeService() 
		{ 
			return null; 
		} 
 
		/*public override Object InitializeLifetimeService() 
		{ 
			ILease lease = (ILease)base.InitializeLifetimeService(); 
			if (lease.CurrentState == LeaseState.Initial) 
			{ 
				lease.InitialLeaseTime = TimeSpan.FromSeconds(1); 
				lease.SponsorshipTimeout = TimeSpan.FromSeconds(5); 
				lease.RenewOnCallTime = TimeSpan.FromSeconds(2); 
			} 
			return lease; 
		}*/ 
	} 
}