zoukankan      html  css  js  c++  java
  • 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    这是Live555源码阅读的第三部分,包括了UsageEnvironment相关的三个类。

    本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
    本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

    简介

    UsageEnvironment是一个抽象基类,其定义在live555sourcecontrolUsageEnvironmentincludeUsageEnvironment.hh文件中。

    UsageEnvironment定义了三个数据成员, void*类型的指针liveMediaPrivgroupsockPriv(要注意这两者是public权限的,在使用环境相关类中都没有对它们进行初始化以外的操作),这两个在后面说GroupsockLiveMedia模块的时候就比较清楚了。还有一个很重要的是一个引用fScheduler,它告诉了我们,每一个使用环境必须绑定一个任务调度器。

    下面是其定义

    // An abstract base class, subclassed for each use of the library
    // 一个抽象类,子类为每个使用库
    class UsageEnvironment {
    public:
    
        //reclaim   vt.开拓,开垦; 感化; 取回; 沙化; n.改造,感化; 教化; 回收再利用; 收回,取回;
        //自我回收,如果liveMediaPriv或groupsockPriv这两个成员变量有一个为NULL,就delete this;
        void reclaim();
    
        // task scheduler:任务调度
        //直接返回对象内部的fScheduler成员
        TaskScheduler& taskScheduler() const { return fScheduler; }
    
        // result message handling:
        //消息处理结果,注意这里是一个类型定义
        typedef char const* MsgString;
        //纯虚接口,看意思应该是获取消息处理结果
        virtual MsgString getResultMsg() const = 0;
    
        virtual void setResultMsg(MsgString msg) = 0;
        virtual void setResultMsg(MsgString msg1, MsgString msg2) = 0;
        virtual void setResultMsg(MsgString msg1, MsgString msg2, MsgString msg3) = 0;
        virtual void setResultErrMsg(MsgString msg, int err = 0) = 0;
        // like setResultMsg(), except that an 'errno' message is appended.  (If "err == 0", the "getErrno()" code is used instead.)
        //类似setResultMsg(),除了“errno”的消息被追加。(如果“err== 0”,“getErrno()”代码是用于替代。)
    
        virtual void appendToResultMsg(MsgString msg) = 0;
    
        virtual void reportBackgroundError() = 0;
        // used to report a (previously set) error message within
        //用于报告错误消息(预先设定)内的
        // a background event事件的背景
    
        virtual void internalError(); // used to 'handle' a 'should not occur'-type error condition within the library.
    
        // 'errno'
        virtual int getErrno() const = 0;
    
        // 'console' output:
        virtual UsageEnvironment& operator<<(char const* str) = 0;
        virtual UsageEnvironment& operator<<(int i) = 0;
        virtual UsageEnvironment& operator<<(unsigned u) = 0;
        virtual UsageEnvironment& operator<<(double d) = 0;
        virtual UsageEnvironment& operator<<(void* p) = 0;
    
        // a pointer to additional, optional, client-specific state
        // 客户端特定的状态
        void* liveMediaPriv;
        void* groupsockPriv;
    
    protected:
        //初始化liveMediaPriv(NULL), groupsockPriv(NULL), fScheduler(scheduler)
        UsageEnvironment(TaskScheduler& scheduler); // abstract base class
        virtual ~UsageEnvironment(); // we are deleted only by reclaim()我们只有reclaim()删除
    
    private:
        TaskScheduler& fScheduler;
    };
    

    UsageEnvironment的构造与析构

    其构造的时候需要一个TaskScheduler对象来用于绑定,另外两个成员都被初始化为了NULL。稍带提一下,TaskScheduler是一个抽象基类,这里绑定的应该是BasicTaskScheduler对象,回忆一下BasicTaskScheduler的创建是通过静态方法createNew获得的。

    UsageEnvironment的构造和析构都受到protected权限的保护。

    UsageEnvironment::UsageEnvironment(TaskScheduler& scheduler)
      : liveMediaPriv(NULL), groupsockPriv(NULL), fScheduler(scheduler) {
    }
    
    UsageEnvironment::~UsageEnvironment() {
    }
    

    reclaim方法(自我回收)

    自我回收是一个public接口,可以在外部使用。但是其必须是在(liveMediaPriv NULL && groupsockPriv NULL)成立的条件下才会析构自身。

    void UsageEnvironment::reclaim() {
        // We delete ourselves only if we have no remainining state:
        //我们回收自己,仅当我们有一个删除遗留的状态:
        if (liveMediaPriv == NULL && groupsockPriv == NULL) delete this;
    }
    

    internalError方法(内部错误)

    这个就不用解释了,在TaskScheduler中有一个一样的。

    // By default, we handle 'should not occur'-type library errors by calling abort().  Subclasses can redefine this, if desired.
    void UsageEnvironment::internalError() {
        abort();
    }
    
  • 相关阅读:
    【转载wpf命令】
    【转载WPF资源】
    【转载MVVM模式的简介】
    【转载有关XmlAttribute的知识】
    【test7】stream、用于输入和输出的类、特性
    【补充作业】XML和LINQ
    CodeVS 1084 乒乓球
    android开发之屏幕旋转
    Android开发之新建项目报错的问题
    Android 开发获取用户权限
  • 原文地址:https://www.cnblogs.com/oloroso/p/4609389.html
Copyright © 2011-2022 走看看