Branch data Line data Source code
1 : : // $Id: EventHandler.cc 5911 2008-07-03 22:59:01Z vern $
2 : :
3 : : #include "Event.h"
4 : : #include "EventHandler.h"
5 : : #include "Func.h"
6 : : #include "Scope.h"
7 : : #include "RemoteSerializer.h"
8 : :
9 : 1066 : EventHandler::EventHandler(const char* arg_name)
10 : : {
11 : 1066 : name = copy_string(arg_name);
12 : 1066 : used = false;
13 : 1066 : local = 0;
14 : 1066 : type = 0;
15 : 1066 : group = 0;
16 : 1066 : enabled = true;
17 : 1066 : }
18 : :
19 : 0 : EventHandler::~EventHandler()
20 : : {
21 : 0 : Unref(local);
22 [ # # # # ]: 0 : delete [] name;
23 [ # # ][ # # ]: 0 : delete [] group;
24 : 0 : }
25 : :
26 : 125 : FuncType* EventHandler::FType()
27 : : {
28 [ + + ]: 125 : if ( type )
29 : 40 : return type;
30 : :
31 : 85 : ID* id = lookup_ID(name, current_module.c_str());
32 : :
33 [ - + ]: 85 : if ( ! id )
34 : 0 : return 0;
35 : :
36 [ - + ]: 85 : if ( id->Type()->Tag() != TYPE_FUNC )
37 : 0 : return 0;
38 : :
39 : 125 : return type = id->Type()->AsFuncType();
40 : : }
41 : :
42 : 399 : void EventHandler::SetLocalHandler(Func* f)
43 : : {
44 [ - + ]: 399 : if ( local )
45 : 0 : Unref(local);
46 : :
47 : 399 : Ref(f);
48 : 399 : local = f;
49 : 399 : }
50 : :
51 : 23244 : void EventHandler::Call(val_list* vl, bool no_remote)
52 : : {
53 : : #ifdef PROFILE_BRO_FUNCTIONS
54 : : DEBUG_MSG("Event: %s\n", Name());
55 : : #endif
56 : :
57 [ + + ]: 23244 : if ( ! no_remote )
58 : : {
59 [ - + ]: 23238 : loop_over_list(receivers, i)
60 : : {
61 : 0 : SerialInfo info(remote_serializer);
62 : 0 : remote_serializer->SendCall(&info, receivers[i], name, vl);
63 : : }
64 : : }
65 : :
66 [ + - ]: 23244 : if ( local )
67 : 23244 : Unref(local->Call(vl));
68 : : else
69 : : {
70 [ # # ]: 0 : loop_over_list(*vl, i)
71 : 0 : Unref((*vl)[i]);
72 : : }
73 : 23244 : }
74 : :
75 : 0 : void EventHandler::AddRemoteHandler(SourceID peer)
76 : : {
77 : 0 : receivers.append(peer);
78 : 0 : }
79 : :
80 : 0 : void EventHandler::RemoveRemoteHandler(SourceID peer)
81 : : {
82 : 0 : receivers.remove(peer);
83 : 0 : }
84 : :
85 : 0 : bool EventHandler::Serialize(SerialInfo* info) const
86 : : {
87 : 0 : return SERIALIZE(name);
88 : : }
89 : :
90 : 0 : EventHandler* EventHandler::Unserialize(UnserialInfo* info)
91 : : {
92 : : char* name;
93 [ # # ]: 0 : if ( ! UNSERIALIZE_STR(&name, 0) )
94 : 0 : return false;
95 : :
96 : 0 : EventHandler* h = event_registry->Lookup(name);
97 [ # # ]: 0 : if ( ! h )
98 : : {
99 : 0 : h = new EventHandler(name);
100 : 0 : event_registry->Register(h);
101 : : }
102 : :
103 : 0 : return h;
104 [ + - ][ + - ]: 6 : }
|