libjingle之(程序的封装)

一:回调函数
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方法可以给消息处理函数发送消息!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值