~ubuntu-branches/ubuntu/raring/sunpinyin/raring

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
#include <cassert>
#include <algorithm>
#include "imi_option_event.h"

COptionEvent::variant_::variant_(int v)
    : type(VAL_INTEGER)
{
    data.d_int = v;
}

COptionEvent::variant_::variant_(const std::string& v)
    : type(VAL_STRING)
{
    data.d_string = v;
}

COptionEvent::variant_::variant_(const std::vector<std::string>& v)
    : type(VAL_STRING_LIST)
{
    data.d_strings = v;
}

COptionEvent::variant_::variant_(const std::vector<string_pair>& v)
    : type(VAL_STRING_PAIR_LIST)
{
    data.d_string_pair_list = v;
}

COptionEvent::variant_::variant_(bool v)
    : type(VAL_BOOL)
{
    data.d_bool = v;
}

int
COptionEvent::get_int() const
{
    return value.data.d_int;
}

bool
COptionEvent::get_bool() const
{
    return value.data.d_bool;
}

std::string
COptionEvent::get_string() const
{
    return value.data.d_string;
}

std::vector<std::string>
COptionEvent::get_string_list() const
{
    return value.data.d_strings;
}

std::vector<string_pair>
COptionEvent::get_string_pair_list() const
{
    return value.data.d_string_pair_list;
}

IConfigurable::IConfigurable()
{
    AOptionEventBus::instance().registerAsListener(this);
}

IConfigurable::~IConfigurable()
{
    AOptionEventBus::instance().unregisterAsListener(this);
}

void
COptionEventBus::registerAsListener(IConfigurable* listener)
{
    Subscribers::iterator found = find(m_listeners.begin(),
                                       m_listeners.end(),
                                       listener);
    if (found == m_listeners.end())
        m_listeners.push_back(listener);
    else
        assert(false && "already subscribed");
}

void
COptionEventBus::unregisterAsListener(IConfigurable* listener)
{
    Subscribers::iterator found = find(m_listeners.begin(),
                                       m_listeners.end(),
                                       listener);
    if (found != m_listeners.end())
        m_listeners.erase(found);
    else
        assert(false && "not yet subscribed");
}

void
COptionEventBus::publishEvent(const COptionEvent& event)
{
    Subscribers::iterator end = m_listeners.end();
    for (Subscribers::iterator it = m_listeners.begin();
         it != end; ++it) {
        if ((*it)->onConfigChanged(event))
            break;
    }
}