25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment
这是Live555源码阅读的第三部分,包括了UsageEnvironment相关的三个类。
本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
简介
BasicUsageEnvironment0
实现了其基类UsageEnvironment
的部分纯虚接口
(只有部分,其还是一个抽象类),并添加了三个数据成员。其定义在live555sourcecontrol\BasicUsageEnvironment\include\BasicUsageEnvironment0.hh
文件中。
代码定义如下
// An abstract base class, useful for subclassing
// (e.g., to redefine the implementation of "operator<<")
class BasicUsageEnvironment0 : public UsageEnvironment {
public:
// redefined virtual functions:重定义虚函数
//返回fResultMsgBuffer
virtual MsgString getResultMsg() const;
// 调用reset将消息结果buffer截空,再将msg(msg1-3)拷贝到buffer
virtual void setResultMsg(MsgString msg);
virtual void setResultMsg(MsgString msg1,
MsgString msg2);
virtual void setResultMsg(MsgString msg1,
MsgString msg2,
MsgString msg3);
//将msg设置到fResultMsgBuffer,支持_WIN32_WCE的平台会将err代表的错误消息也加入
virtual void setResultErrMsg(MsgString msg, int err = 0);
//将msg拷贝到fResultMsgBuffer可用部分,剩余空间不够时,只拷贝部分
virtual void appendToResultMsg(MsgString msg);
////将fResultMsgBuffer中的内容写入到标准错误
virtual void reportBackgroundError();
protected:
BasicUsageEnvironment0(TaskScheduler& taskScheduler);
virtual ~BasicUsageEnvironment0();
private:
void reset(); //截空buffer字符串(首元素置'\0')
//消息处理结果缓冲
char fResultMsgBuffer[RESULT_MSG_BUFFER_MAX];
unsigned fCurBufferSize; //当前buffer已用大小
unsigned fBufferMaxSize; //最大buffer大小
};
BasicUsageEnvironment0构造析构与重置
把这三个放在一起,因为其内容很少。
构造的时候调用了基类UsageEnvironment
的构造,并把fBufferMaxSize
(buffer最大尺寸)的值设置为fResultMsgBuffer
数组的大小(见宏定义#define RESULT_MSG_BUFFER_MAX 1000
)并调用reset
重置buffer
。
reset方法用于重置buffer(这里说的buffer都代指
fResultMsgBuffer
字符串),其将fResultMsgBuffer的首元素置为’\0’,也就是将其截空。
BasicUsageEnvironment0::BasicUsageEnvironment0(TaskScheduler& taskScheduler)
: UsageEnvironment(taskScheduler),
fBufferMaxSize(RESULT_MSG_BUFFER_MAX) {
reset();
}
BasicUsageEnvironment0::~BasicUsageEnvironment0() {
}
void BasicUsageEnvironment0::reset() {
fCurBufferSize = 0;
fResultMsgBuffer[fCurBufferSize] = '\0';
}
ResultMsg系列方法
ResultMsg
系列方法是指一系列
对fResultMsgBuffer
进行操作的方法,包括get/set/append/report
等多个。这些方法都在基类UsageEnvironment中声明,这里对其进行了实现。注意,这些接口都是public权限
的,理应对参数进行判断。后面介绍的时候会提到一些方法中没有对参数的合法性进行判断。
getResultMsg() const方法(获取buffer)
getResultMsg方法是一个const
方法,不会对对象有写操作。其返回fResultMsgBuffer数组的首地址。fResultMsgBuffer数组这里再提一下,其是一个char类型的数组,从变量名上理解,是用于保存处理消息结果。
char const* BasicUsageEnvironment0::getResultMsg() const {
return fResultMsgBuffer;
}
appendToResultMsg方法(添加msg到buffer)
appendToResultMsg方法用与向buffer中添加内容
。参数msg
是标识一个char*
字符串。注意,这里没有判断msg是否为NULL
是一个bug
。因为strlen(NULL)
以及memmove(dest,NULL,len)
的后果是未定义的。
如果buffer中剩余的可用空间容不下msg
的全部内容,那么会拷贝msg中的部分内容,将buffer
填满。
void BasicUsageEnvironment0::appendToResultMsg(MsgString msg) {
char* curPtr = &fResultMsgBuffer[fCurBufferSize];
unsigned spaceAvailable = fBufferMaxSize - fCurBufferSize;
unsigned msgLength = strlen(msg);
// Copy only enough of "msg" as will fit:
// fResultMsgBuffer剩余空间不够放,拷贝一部分
if (msgLength > spaceAvailable-1) {
msgLength = spaceAvailable-1;
}
/* memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够
保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标
区域与源区域没有重叠则和memcpy函数功能相同。*/
memmove(curPtr, (char*)msg, msgLength);
fCurBufferSize += msgLength;
fResultMsgBuffer[fCurBufferSize] = '\0'; //这个必须有
}
setResultMsg方法(重置buffer内容为msg)
setResultMsg用于重置buffer
内容。它将其内容重新设置为参数msg(msg1-3)的内容。
setResultMsg有多个重载形式,区别在于参数个数不一致。这里提一下,C++的重载
就是以参数不同
为依据的。在这多个重载中都使用到了appendToResultMsg
方法,也就继承了没有判断参数合法性的bug。
// 调用reset将消息结果buffer截空,再将msg拷贝到buffer
void BasicUsageEnvironment0::setResultMsg(MsgString msg) {
reset();
appendToResultMsg(msg);
}
void BasicUsageEnvironment0::setResultMsg(MsgString msg1, MsgString msg2) {
setResultMsg(msg1);
appendToResultMsg(msg2);
}
void BasicUsageEnvironment0::setResultMsg(MsgString msg1, MsgString msg2,
MsgString msg3) {
setResultMsg(msg1, msg2);
appendToResultMsg(msg3);
}
setResultErrMsg方法(重置buffer内容为msg/err)
setResultErrMsg方法有两个参数,msg
参数用于重置buffer
内容。
err
参数在windows(WIN32/WINCE)
平台会使用到,如果err为0,那么会调用getError()
,这个方法在派生类BasicUsageEnvironment
中实现。在windows相关平台其return WSAGetLastError()
也就是该线程进行的上一次Windows Sockets API
函数调用时的错误代码。如果是其他平台,直接返回errno
。这里说了,在非windows平台是不会调用的。如果err不为0 ,会之间调用strerror(err)
获取错误描述字符串添加到buffer
。
void BasicUsageEnvironment0::setResultErrMsg(MsgString msg, int err) {
setResultMsg(msg);
#ifndef _WIN32_WCE
appendToResultMsg(strerror(err == 0 ? getErrno() : err));
#endif
}
reportBackgroundError方法(报告错误消息)
reportBackgroundError
将buffer
中的内容输出到标准错误。这里很简单,要提的一点是,stderr
是无缓冲
的的输出流,写入的数据直接送入到内核缓冲区。这是C语言的一点基础知识。
//将fResultMsgBuffer中的内容写入到标准错误
void BasicUsageEnvironment0::reportBackgroundError() {
fputs(getResultMsg(), stderr);
}
25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment的更多相关文章
-
24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类——Live555源码阅读 ...
-
26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment
26 BasicUsageEnvironment基本使用环境--Live555源码阅读(三)UsageEnvironment 26 BasicUsageEnvironment基本使用环境--Live5 ...
-
18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
-
12 哈希表相关类——Live555源码阅读(一)基本组件类
12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...
-
10 DelayQueue 延时队列类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 www.cnblogs.com/oloroso/ 本文由乌合 ...
-
13 HashTable抽象哈希表类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
-
11 AlarmHandler定时处理类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
-
9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
-
8 延时队列相关类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
随机推荐
-
移动端报表JS开发示例
最近对移动端的报表开发颇有研究,细磨精算了好久,虽然到现在还是“囊中羞涩”,但决定还是先抛砖引玉,拿点小干货出来和大家分享. 研究的工具是比较有代表性的FineReport. 1. 移动端哪些地方支 ...
-
我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)
我将所有我的电子书汇总在一起,方便大家下载!(持续更新) 文档保存在我的网站——软件知识原创基地上(www.umlonline.org),请放心下载. 1)软件设计是怎样炼成的?(2014-4-1 发 ...
-
MAPPING SEGMENTS TO PAGES
The segmentation and paging mechanisms provide in the support a wide variety of approaches to memory ...
-
uva 10271
DP 状态转移方程 dp[i][j] = min(dp[i-1][j], dp[i-2][j-1] + w)) dp[i][j] 指的是前i个筷子组成j组所花费的最小值 考虑第i个筷子是否参与第j组 ...
-
jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
-
TextureView+SurfaceTexture+OpenGL ES来播放视频(二)
引自:http://www.jianshu.com/p/b2d949ab1a1a 在使用OpenGL ES 绘制前,我先概括下接下来要做的工作:我先借用一个博主kiffa举的的一个栗子,我觉得说的恰到 ...
-
利用python脚本(re)抓取美空mm图片
很久没有写博客了,这段时间一直在搞风控的东西,过段时间我把风控的内容整理整理发出来大家一起研究研究. 这两天抽空写了两个python爬虫脚本,一个使用re,一个使用xpath. 直接上代码——基于re ...
-
(Alpha)Let&#39;s-版本测试报告
测试中发现的Bug 我们在测试之前发布了新的版本Version1.1,发布新版本的同时也带来一些问题: 修复了上传图片画质问题的Bug 修复了搜索功能的部分Bug 增加了下拉刷新的功能 修复了部分界面 ...
-
验证手机格式的js代码
function isMobil(s) { var patrn = /(^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$)/; ...
-
Educational Codeforces Round 17 C. Two strings 打表二分
C. Two strings time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...