blob: 9da45baf44ac0fb1a062e7229a57ce71b111527c (
plain)
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
|
// **********************************************************************
//
// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#include <Ice/Ice.h>
#include <Props.h>
using namespace std;
//
// The servant implements the Slice interface Demo::Props as well as the
// native callback class Ice::PropertiesAdminUpdateCallback.
//
class PropsI : public Demo::Props,
public Ice::PropertiesAdminUpdateCallback,
IceUtil::Monitor<IceUtil::Mutex>
{
public:
PropsI() : _called(false)
{
}
virtual Ice::PropertyDict getChanges(const Ice::Current&)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
//
// Make sure that we have received the property updates before we
// return the results.
//
while(!_called)
{
wait();
}
_called = false;
return _changes;
}
virtual void shutdown(const Ice::Current& current)
{
current.adapter->getCommunicator()->shutdown();
}
virtual void updated(const Ice::PropertyDict& changes)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
_changes = changes;
_called = true;
notify();
}
private:
Ice::PropertyDict _changes;
bool _called;
};
typedef IceUtil::Handle<PropsI> PropsIPtr;
class Server : public Ice::Application
{
public:
virtual int run(int, char*[]);
};
int
main(int argc, char* argv[])
{
Server app;
return app.main(argc, argv, "config.server");
}
int
Server::run(int argc, char*[])
{
if(argc > 1)
{
cerr << appName() << ": too many arguments" << endl;
return EXIT_FAILURE;
}
PropsIPtr props = new PropsI;
//
// Retrieve the PropertiesAdmin facet and register the servant as the update callback.
//
Ice::ObjectPtr obj = communicator()->findAdminFacet("Properties");
Ice::NativePropertiesAdminPtr admin = Ice::NativePropertiesAdminPtr::dynamicCast(obj);
admin->addUpdateCallback(props);
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Props");
adapter->add(props, communicator()->stringToIdentity("props"));
adapter->activate();
communicator()->waitForShutdown();
return EXIT_SUCCESS;
}
|