hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
#ifndef EASYMEDIA_MESSAGE_H_
#define EASYMEDIA_MESSAGE_H_
 
#include <stdint.h>
#include <string.h>
#include <sys/time.h>
 
#include <thread>
#include <vector>
 
#include "lock.h"
#include "message_type.h"
 
namespace easymedia
{
 
    class EventMessage;
    class Flow;
 
    class EventParam
    {
      public:
        EventParam() = delete;
        EventParam(int id, int param = 0) : id_(id), param_(param), params_(nullptr)
        {
        }
        ~EventParam()
        {
            if (params_) {
                free(params_);
                params_ = nullptr;
            }
        }
        int SetParams(void* params, int size)
        {
            if (params_) {
                free(params_);
            }
            params_ = params;
            params_size_ = size;
            return 0;
        }
        int GetId()
        {
            return id_;
        }
        int GetParam()
        {
            return param_;
        }
        void* GetParams()
        {
            return params_;
        }
        int GetParamsSize()
        {
            return params_size_;
        }
 
      private:
        int id_;
        int param_;
        void* params_;
        int params_size_;
    };
 
    typedef std::shared_ptr<EventParam> EventParamPtr;
 
    class EventMessage
    {
      public:
        EventMessage();
        EventMessage(void* sender, EventParamPtr param, int type = 0) : sender_(sender), param_(param), type_(type)
        {
        }
        ~EventMessage()
        {
        }
        void* GetSender()
        {
            return sender_;
        }
        EventParamPtr GetEventParam()
        {
            return param_;
        }
        int GetType()
        {
            return type_;
        }
 
      private:
        void* sender_;
        EventParamPtr param_;
        int type_;
    };
 
    typedef int (*EventHook)(std::shared_ptr<Flow> flow, bool& loop);
    typedef std::shared_ptr<EventMessage> MessagePtr;
    typedef std::vector<MessagePtr> MessagePtrQueue;
 
    class EventHandler
    {
      public:
        EventHandler()
        {
        }
        virtual ~EventHandler()
        {
        }
 
        void RegisterEventHook(std::shared_ptr<Flow> flow, EventHook proc);
        void UnRegisterEventHook();
        void EventHookWait();
        void SignalEventHook();
 
        void CleanRepeatMessage(MessagePtr msg);
        void InsertMessage(MessagePtr msg, bool front = false);
        MessagePtr GetEventMessage();
        void NotifyToEventHandler(MessagePtr msg);
 
      public:
      private:
        EventHook process_;
        bool event_thread_loop_;
        std::unique_ptr<std::thread> event_thread_;
        MessagePtrQueue event_msgs_;
        ConditionLockMutex event_cond_mtx_;
        ReadWriteLockMutex event_queue_mtx_;
    };
 
} // namespace easymedia
 
#endif // #ifndef EASYMEDIA_FLOW_H_