summaryrefslogtreecommitdiff
path: root/cpp/src/IcePack/ServerAdapterI.cpp
blob: cd3ad2b7726cff7920d998a64ab8943b378d6d6f (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// **********************************************************************
//
// Copyright (c) 2001
// ZeroC, Inc.
// Huntsville, AL, USA
//
// All Rights Reserved
//
// **********************************************************************

#include <Ice/Ice.h>
#include <IcePack/ServerAdapterI.h>
#include <IcePack/ServerFactory.h>
#include <IcePack/TraceLevels.h>

using namespace std;
using namespace IcePack;

IcePack::ServerAdapterI::ServerAdapterI(const ServerFactoryPtr& factory, const TraceLevelsPtr& traceLevels, 
					Ice::Int waitTime) :
    _factory(factory),
    _traceLevels(traceLevels),
    _waitTime(waitTime)
{
}

IcePack::ServerAdapterI::~ServerAdapterI()
{
}

Ice::ObjectPrx
IcePack::ServerAdapterI::getDirectProxy(bool activate, const Ice::Current& current)
{
    ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this);

    if(!_proxy && activate)
    {
	//
	// Try to start the server and wait for the adapter proxy to
	// be changed.
	//

	if(_traceLevels->adapter > 2)
	{
	    Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
	    out << "waiting for activation of server adapter `" << name << "'";
	}
	
	try
	{
	    if(theServer->start(OnDemand))
	    {
		_notified = false;

		while(!_notified)
		{
		    bool notify = timedWait(IceUtil::Time::seconds(_waitTime));
		    if(!notify)
		    {
			if(_traceLevels->adapter > 1)
			{
			    Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
			    out << "server adapter `" << name << "' activation timed out";
			}
		    }
		}
	    }
	    else
	    {
		if(_traceLevels->adapter > 1)
		{
		    Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
		    out << "server adapter `" << name << "' activation failed, couldn't start the server";
		}
	    }
	}
	catch(const Ice::ObjectNotExistException&)
	{
	    //
	    // The server associated to this adapter doesn't exist
	    // anymore. Somehow the database is inconsistent if this
	    // happens. The best thing to do is to destroy the adapter
	    // and throw an ObjectNotExist exception.
	    //
	    destroy(current);
	    throw Ice::ObjectNotExistException(__FILE__, __LINE__);
	}
    }
    return _proxy;
}

void
IcePack::ServerAdapterI::setDirectProxy(const Ice::ObjectPrx& prx, const Ice::Current&)
{
    ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this);

    //
    // If the adapter proxy is not null the given proxy can only be
    // null. We don't allow to overide an existing proxy by another
    // non null proxy if the server is active.
    //
    if(prx && _proxy)
    {
	if(theServer->getState() == Active)
	{
	    throw AdapterActiveException();
	}
    }

    _proxy = prx;
    _notified = true;

    if(_traceLevels->adapter > 1)
    {
	Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
	out << "server adapter `" << name << "' " << (_proxy ? "activated" : "deactivated");
    }
    
    notifyAll();
}

void
IcePack::ServerAdapterI::destroy(const Ice::Current& current)
{
    _factory->destroy(this, current.id);
}