package cn.dolit.DLBT;

import android.content.Context;

public class DolitBT extends DLL {
	     
    public DolitBT(Context applicationContext) {
    	m_applicationContext = applicationContext;
	}

    public int InitAPIKey(String key1, String key2)
    {	    
    	return Init(key1, key2, m_applicationContext);
    }
    
    // 以下为对外的接口
    /**
	  * 启动BT内核，初始化运行环境,返回值表示是否成功, 
	  * @return	 整型4个字节的返回值  ；1(TRUE)代表成功， 0代表失败
	  */
   public int DLBT_Startup(
		        DLBT_KERNEL_START_PARAM param, // 内核启动设置，参考KERNEL_START_PARAM，如果为NULL，则使用内部默认设置
			    String protectedProtocolIDs,  // 可以自定义私有协议，突破运营商限制。如果为NULL，则作为标准的BT客户端启动
			                                        // 点量BT的私有协议在3.4版本中进行了全新改进，可以穿透大部分运营商对协议的封锁
			    boolean seedServerMode,     // 是否上传模式，上传模式内部有些参数进行了优化，适合大并发上传，但不建议普通客户端启用，只建议上传服务器使用
			                                        // 专业上传服务器模式仅在商业版中有效，演示版暂不支持该功能。详见使用说明文档
			    String  productNum           // 商业版用户的数字ID，在购买后作者会提供一个产品密钥，激活商业版功能，试用版用户请使用NULL。 
			    )
   {	  
	   return Startup(param.ToParamString(), protectedProtocolIDs, seedServerMode ? 1 : 0, productNum);
   }
   
   
   // 获得内核监听的端口
   public short DLBT_GetListenPort ()
   {
	   return GetListenPort();
   }

	/**
	 * 关闭BT内核，释放所有内核资源
	 */
   public void DLBT_Shutdown ()
   {
	   Shutdown();
   }
   
// 由于关闭的速度可能会比较慢(需要通知Tracker Stop), 所以可以调用该函数提前通知,提高下线速度
// 然后最后在程序最后退出时调用Shutdown等待真正的结束
   public void DLBT_PreShutdown ()
   {
	   PreShutdown();
   }
   
   
 //=======================================================================================
// 内核的上传下载速度、最大连接用户数的设置
//=======================================================================================
//速度限制，单位是字节(BYTE)，如果需要限速1M，请输入 1024*1024
   public void DLBT_SetUploadSpeedLimit (int limit)
   {
	   SetUploadSpeedLimit(limit);
   }
   public void DLBT_SetDownloadSpeedLimit (int limit)
   {
	   SetDownloadSpeedLimit (limit);
   }

//最大连接数（真正完成连接的连接数）
   public void DLBT_SetMaxUploadConnection (int limit)
   {
	   SetMaxUploadConnection(limit);
   }
   public void DLBT_SetMaxTotalConnection (int limit)
   {
	   SetMaxTotalConnection(limit);
   }

//最多发起的连接数（很多连接可能是发起了，但还没连上）
   public void DLBT_SetMaxHalfOpenConnection (int limit)
   {
	   SetMaxHalfOpenConnection(limit);
   }

//用于设置是否对跟自己在同一个局域网的用户限速，limit如果为true，则使用后面参数中的限速数值进行限速，否则不限。默认不对同一个局域网下的用户应用限速。
   public void DLBT_SetLocalNetworkLimit (
   	int     limit,              // 是否启用局域网限速
	    int     downSpeedLimit,     // 如果启用局域网限速，下载限速的大小，单位字节/秒
	    int     uploadSpeedLimit    // 如果启用局域网限速，限制上传速度大小，单位字节/秒
	    )
   {
	   SetLocalNetworkLimit(limit, downSpeedLimit, uploadSpeedLimit);
   }

//设置文件扫描校验时的休息参数，circleCount代表循环多少次做一次休息。默认是0（也就是不休息）
//sleepMs代表休息多久，默认是1ms
   public void DLBT_SetFileScanDelay (int circleCount, int sleepMs)
   {
	   SetFileScanDelay(circleCount, sleepMs);
   }

//设置文件下载完成后，是否修改为原始修改时间（制作种子时每个文件的修改时间状态）。调用该函数后，制作的torrent中会包含有每个文件此时的修改时间信息
//用户在下载时，发现有这个信息，并且调用了该函数后，则会在每个文件完成时，自动将文件的修改时间设置为torrent种子中记录的时间
//如果只是下载的机器上启用了该函数，但制作种子的机器上没有使用该函数（种子中没有每个文件的时间信息），则也无法进行时间修改
   // protected native void UseServerModifyTime(Boolean bUseServerTime);  android版本暂时不支持该接口

//是否启用UDP穿透传输功能，默认是自动适应，如果对方支持，在tcp无法到达时，自动切换为udp通讯
   public void DLBT_EnableUDPTransfer(int bEnabled)
   {
	   EnableUDPTransfer(bEnabled);
   }

//是否启用伪装Http传输，某些地区（比如马来西亚、巴西的一些网络）对Http不限速，但对P2P限速在20K左右，这种网络环境下，可以启用Http传输
// 默认是允许伪装Http的传输进入（可以接受他们的通讯），但自己发起的连接不主动伪装。 如果客户群中有这类用户，可以考虑都设置：主动伪装。
//但这种伪装也有副作用，国内有些地区机房（一般是网通）设置了Http必须使用域名，而不能使用IP，而BT传输中，对方没有合法域名，反而会被这种限制截杀
//如果有这种限制，反而主动伪装后会没有速度。所以请根据实际使用选择。
   public void DLBT_SetP2PTransferAsHttp (int bHttpOut, int bAllowedIn)
   {
	   SetP2PTransferAsHttp (bHttpOut, bAllowedIn);
   }

   
   public KERNEL_INFO DLBT_GetKernelInfo ()
   {
	   String str = GetKernelInfo();
	   if (str == null)
		   return null;
	   String arry[] = str.split("|");  
	   if (arry.length != 12)
		   return null;
	   
	   KERNEL_INFO kInfo = new KERNEL_INFO();
	   kInfo.Init(arry);
	   return kInfo;
   }
   
   public int DLBT_Downloader_Initialize(
			String				torrentFile,
	        String              outPath,
	        String              statusFile,
	        DLBT_FILE_ALLOCATE_TYPE  fileAllocateType, /* = FILE_ALLOCATE_SPARSE*/
	        boolean             bPaused,
	        boolean             bQuickSeed,             // 是否快速供种（专业服务器模式下有效，仅商业版提供，演示版暂不提供）
	        String              password,               // 是否加密种子，如果为Null，则是普通种子，否则是种子的密码
	        String              rootPathName,
	        boolean             bPrivateProtocol,
	        boolean				bZipTransfer)
   {
	   int ret = DownloaderInitialize(
				torrentFile,   
		        outPath,
		        statusFile,
		        DLBT_FILE_ALLOCATE_TYPE.toInt(fileAllocateType), /* = FILE_ALLOCATE_SPARSE*/
		        bPaused ? 1 : 0,
		        bQuickSeed ? 1 : 0,             // 是否快速供种（专业服务器模式下有效，仅商业版提供，演示版暂不提供）
		        password,               // 是否加密种子，如果为Null，则是普通种子，否则是种子的密码
		        rootPathName,
		        bPrivateProtocol ? 1 : 0,
		        bZipTransfer ? 1 : 0
			   );
	   return ret;
   }

	public DOWNLOADER_INFO DLBT_GetDownloaderInfo(int hDownloader)
	{
		 String str = GetDownloaderInfo(hDownloader);
		 if (str == null)
			 return null;
		 String[] arry = str.split("\\|"); 
		 if (arry.length != 32)
			 return null;
		 
		 DOWNLOADER_INFO downInfo = new DOWNLOADER_INFO();
		 downInfo.Init(arry);
		 return downInfo;
	}
	
	public String DLBT_Downloader_GetLastError(int hDownloader)
	{
		return DownloaderGetLastError(hDownloader);
	}

	 // 关闭hDownloader所标记的下载任务,如果需要删除文件,可以将第2个参数置为True
	public int DLBT_Downloader_Release (int hDownloader, int bDeleteAllFiles)
	{
		return DownloaderRelease(hDownloader, bDeleteAllFiles);
	}
   
}
