一:回调函数
ReportFileSpeed(file_name,user_id,speed,progress); //上报进度和速度--必须独立的线程或定时器
ReportFileStatus(file_name,user_id,file_state); //上报文件传输过程中的状态---由Libjingle状态回报
ReportFileReceive(file_name,user_id,size); //接收端收到文件信息之后,将文件信息上报给界面----???
ReportFileSending //发送端发送文件(文件夹)时,上报文件文件信息-----(not used)
ReportFileResumeBegin //当续传文件时的上报信息-----(not used)
二:DLL的API函数
在DLL中创建一个线程,用来控制输入和参数;这样在初始化的时候就可以将一些参数存储起来;
例如:userid和passwd,stun_ip/relay_server,callBack_fun
*初始化模块
*设置回调函数
*发送一个或多个文件(或目录)
*取消一个文件
*清理模块
三:程序的封装
2.发送manifest单独抽取出来(目前只考虑多文件,不考虑目录)
3.主线程的运行单独抽取出来
4.事件处理函数
OnStateChange 登陆服务器的状态回报;start初始化,opening正在认证,open成功,closeed-Session结束
OnSignon 在服务器回报open之后触发!
OnJingleInfo ◆
OnStatusUpdate ◆服务器反馈回来好友的状态信息;如何不定时的查看好友的状态呢?demo是在这里面查看好友在线就开始发送文件
OnFileShareSessionCreate◆
OnMessage 消息处理函数;因为是从MessageHandler中继承过来的
程序功能的抽取
将来的Demo界面:
对方JID、文件名称、大小、进度、速度、状态、注释
.......、Session信息、总体大小、进度(传输过来的/总大小)、速度(当前速度)、状态(总状态)、注释信息
、真正的文件名、...........................
、真正的文件名、...........................
、真正的文件名、...........................
、真正的文件名、...........................
、真正的文件名、...........................
1.JID登陆服务器;JID退出
A:登陆服务器(可舍去)
XmppPump类;封装了XmppClient并用它来登陆到服务器上,它主要的函数和消息通知:
pump.client()->SignalStateChange.connect(&object, &msg_function); //接收通知消息
STATE_START
STATE_OPENING
STATE_OPEN //登陆成功后;发送自身的状态
STATE_CLOSED
pump.DoLogin(xcs, new XmppSocket(true), NULL); //登陆服务器
pump.DoDisconnect(); //断开服务器
B:向服务器发送自身的状态(可舍去)
//1. 接收服务器发送过来的状态
buzz::PresencePushTask *presence_push_ = new buzz::PresencePushTask(xmpp_client_);
presence_push_->SignalStatusUpdate.connect(this, &FileShareClient::OnStatusUpdate);
presence_push_->Start();
//2. 设置自身的状态
buzz::Status my_status;
my_status.set_show(buzz::Status::SHOW_ONLINE);
//3 发送自身的状态
buzz::PresenceOutTask* presence_out_ = new buzz::PresenceOutTask(xmpp_client_);
presence_out_->Send(my_status);
presence_out_->Start();
//4-------------收到好友状态,从服务器传递过来的、(在当前程序中可不用)
void OnStatusUpdate(const buzz::Status& status)
{
if (status.available() && status.fileshare_capability()) //可以进行文件传输
if (status.available() && status.phone_capability()) //可以进行Call通信
}
C:建立文件传输的会话(能否单独抽取出来?就是个关键)
1. 创建三个对象
talk_base::NetworkManager network_manager_;
talk_base::scoped_ptr
port_allocator_;
talk_base::scoped_ptr
session_manager_;
port_allocator_.reset(new cricket::HttpPortAllocator(&network_manager_, "pcp"));
session_manager_.reset(new cricket::SessionManager(port_allocator_.get(), NULL)); //使用单线程!对我是否有影响?
or
worker_thread_ = new talk_base::Thread();
session_manager_ = new cricket::SessionManager(port_allocator_, worker_thread_);
session_manager_->SignalRequestSignaling.connect(this, &CallClient::OnRequestSignaling);
session_manager_->OnSignalingReady();
worker_thread_->Start()
2. 创建一个用来发送和接受Session请求;xmpp_client_(能否手工初始化,而不是从服务中获取?)
cricket::SessionManagerTask *session_manager_task = new cricket::SessionManagerTask(xmpp_client_, session_manager_);
session_manager_task->EnableOutgoingMessages();
session_manager_task->Start();
3.查询stun和relay server。这是异步调用
buzz::JingleInfoTask *jingle_info_task = new buzz::JingleInfoTask(xmpp_client_);
jingle_info_task->RefreshJingleInfoNow();
jingle_info_task->SignalJingleInfo.connect(this, &FileShareClient::OnJingleInfo);
jingle_info_task->Start();
4.文件传输Session开始;有点类似开始侦听
file_share_session_client_.reset(new cricket::FileShareSessionClient(session_manager_.get(), xmpp_client_->jid(), "pcp"));
file_share_session_client_->SignalFileShareSessionCreate.connect(this, &FileShareClient::OnFileShareSessionCreate);
session_manager_->AddClient(NS_GOOGLE_SHARE, file_share_session_client_.get());
【or】
phone_client_ = new cricket::PhoneSessionClient(xmpp_client_->jid(),session_manager_);
phone_client_->SignalCallCreate.connect(this, &CallClient::OnCallCreate);
2.连接某个用户、发送文件请求
3.收到文件请求后、显示出来
4.确定文件存储路径
5.文件发送完毕后;结束连接通道
四:libjingle使用方法:
1.线程处理:线程对象:
thread类(从MessageQueue中继承)
重写run函数做处理函数;调用start运行调用stop停止!
线程互斥锁CriticalSection;使用方法
CritScope cs(&CriticalSection);
2.范围指针
scoped_ptr
使用reset切换指针的地址;使用get获得原始的指针;很适合在类中使用
3.消息处理类
MessageHandler
该类必须重写OnMessage()函数;
通过thread的post方法可以给消息处理函数发送消息!