using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace OBJ_FileBus
{
///
/// 客户端高级版, 没有fileinfo概念,不用想更新问题。
/// 功能:
/// 1.读取文件内容
/// 2.写入文件内容
/// 3.删除文件
/// 4.打开文件夹,回调函数通知文件夹内容更新成功
/// 5.关闭文件夹
///
public class ClientAdv
{
#region 成员
public Client mClient;
public FileElement Root {
get { return mClient.Root; }
}
public string RootPath {
get { return mClient.RootPath; }
set { mClient.RootPath = value; }
}
private List onOpenDirectory = new List();
#endregion
public ClientAdv(string rootPath)
{
mClient = new Client(rootPath);
}
//打开文件夹,回调函数通知文件夹内容更新成功
public void OpenDirectory(string server_path, object sponsor, EventHandler onFresh)
{
//1.读取文件夹内容
mClient.Read(server_path, sponsor, new EventHandler(delegate(object sender, EventArgs e)
{
if (((OBJ_FileBus.Client.ReadEventArgs)e).mErrno == ERRNO.OK)//已经被写入到mClient.Root
{
onFresh(this, e);
//2.读完,注册文件夹推送
mClient.PushRegist(((OBJ_FileBus.Client.ReadEventArgs)e).mPath, ((OBJ_FileBus.Client.ReadEventArgs)e).sponsor, true, new EventHandler(delegate(object sender2, EventArgs e2)
{
if (e2 is OBJ_FileBus.Client.PushRegistEventArgs)
{
if (((OBJ_FileBus.Client.PushRegistEventArgs)e2).mErrno == ERRNO.OK) //注册成功
{
//if(!onOpenDirectory.Contains(server_path))
// onOpenDirectory.Add(server_path);
}
//onFresh(this, e2);
}
else//if (fbea is OBJ_FileBus.Client.PushEventArgs)
{
//3.被更新,检测时间
if (mClient.Root.SelectSingleNode(((OBJ_FileBus.Client.PushEventArgs)e2).mPath).Update == true)
{
mClient.Read(((OBJ_FileBus.Client.PushEventArgs)e2).mPath, ((OBJ_FileBus.Client.PushEventArgs)e2).sponsor, new EventHandler(delegate(object sender3, EventArgs e3)
{
//4.读取成功与否,都通知
onFresh(this, e3);
}));
}
}
}));
}
else
{
onFresh(this, e);
}
}));
}
public void OpenDirectoryWithoutPush(string server_path, object sponsor, EventHandler onFresh)
{
mClient.Read(server_path, sponsor, new EventHandler(delegate(object sender, EventArgs e)
{
onFresh(this, e);
}));
}
//关闭文件夹,停止回调
public void CloseDirectory(string server_path)
{
mClient.PushRegist(server_path, null, false, null);
//if (!onOpenDirectory.Contains(server_path))
// onOpenDirectory.Remove(server_path);
}
public void PushRegist(string path, object sponsor, bool isAdd, EventHandler handler)
{
mClient.PushRegist(path, sponsor, isAdd, handler );
}
public string GetAbsPath(string path)
{
return mClient.GetAbsPath(path);
}
public void FreeComm(object sponsor)
{
mClient.FreeComm(sponsor);
}
///
/// 读取文件内容 EventArgs is ReadInfoEventArgs or ReadEventArgs
///
///
///
public void ReadFile(string server_path, object sponsor, EventHandler onFresh)
{
//1.判断本地文件信息,判断是否需要更新
FileElement fe = mClient.Root.SelectSingleNode(server_path);
if (fe == null || //没有此信息
fe.Update == true || //必须更新
(!File.Exists(mClient.GetAbsPath(server_path))))//没有已经下载的文件
{
// 2.本地文件信息缺失,或需要更新,直接读取远端文件
mClient.Read(server_path, sponsor, new EventHandler(delegate(object sender, EventArgs e)
{
//文件读取成功
onFresh(this, e);//更新成功,通知
}));
}
else
{
//3. 检测远端文件信息,判断是否需要更新
mClient.ReadInfo(server_path, sponsor, new EventHandler(delegate(object sender, EventArgs e)
{
if ((e as OBJ_FileBus.Client.ReadInfoEventArgs).mErrno == ERRNO.OK)
{
fe = mClient.Root.SelectSingleNode((e as OBJ_FileBus.Client.ReadInfoEventArgs).mPath);
if (fe == null || //没有此信息
fe.Update == true || //必须更新
(!File.Exists(mClient.GetAbsPath((e as OBJ_FileBus.Client.ReadInfoEventArgs).mPath))))//没有已经下载的文件
{
// 2.本地文件信息缺失,或需要更新,直接读取远端文件
mClient.Read((e as OBJ_FileBus.Client.ReadInfoEventArgs).mPath, (e as OBJ_FileBus.Client.ReadInfoEventArgs).sponsor, new EventHandler(delegate(object sender2, EventArgs e2)
{
//文件读取成功
onFresh(this, e2);//更新成功,通知
}));
}
else
{
//文件已经是最新了
onFresh(this, e);//更新成功,通知
}
}
else
{
//文件不存在
onFresh(this, e);//更新成功,通知
}
}));
}
}
///
/// 写文件,本地文件 上传到服务器
/// onFresh 中
/// EventArgs的类型为OBJ_FileBus.Client.WriteEventArgs
///
///
///
public void WriteFile(string server_path, object sponsor, EventHandler onFresh)
{
mClient.Write(server_path, sponsor, new EventHandler(delegate(object sender, EventArgs e)
{
onFresh(this, e);
}));
}
public void Del(string server_path, object sponsor, EventHandler onFresh)
{
mClient.Del(server_path, sponsor, new EventHandler(delegate(object sender, EventArgs e)
{
onFresh(this, e);
}));
}
}
}