summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.cpp
blob: a63c236d3130b042821bb41f784c6c6f0dffea6d (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
127
128
// -*- C++ -*-
// $Id$

#include "TAO_Time_Service_Clerk.h"
#include "TAO_TIO.h"
#include "TAO_UTO.h"

// Constructor.
TAO_Time_Service_Clerk::TAO_Time_Service_Clerk (int timer_value,
						const IORS& servers)
  : server_ (servers),
    helper_ (this)
{

  // Schedule the helper to be invoked by the reactor
  // periodically.

  if (TAO_ORB_Core_instance ()->reactor ()->schedule_timer
      (&helper_,
       0,
       ACE_Time_Value::zero,
       ACE_Time_Value (timer_value)) == -1)
    ACE_ERROR ((LM_ERROR,
		"%p\n",
		"schedule_timer ()"));
}

// Destructor.

TAO_Time_Service_Clerk::~TAO_Time_Service_Clerk (void)
{
}

// This method returns the global time and an estimate of inaccuracy
// in a UTO.

CosTime::UTO_ptr
TAO_Time_Service_Clerk::universal_time (CORBA::Environment &TAO_IN_ENV)
{
  TAO_UTO *uto = 0;

  ACE_NEW_THROW_RETURN (uto,
			TAO_UTO (this->get_time (),
				 0,
				 0),
			CORBA::NO_MEMORY (CORBA::COMPLETED_NO),
			CosTime::UTO::_nil ());
  // Return the global time as a UTO.

  return uto->_this ();
}

// This method returns the global time in a UTO only if the time can
// be guaranteed to have been obtained securely.  This method is not
// implemented currently.

CosTime::UTO_ptr
TAO_Time_Service_Clerk::secure_universal_time (CORBA::Environment &env)
{
  env.exception (new CORBA::NO_IMPLEMENT (CORBA::COMPLETED_NO));
  return 0;
}

// This creates a new UTO based on the given parameters.

CosTime::UTO_ptr
TAO_Time_Service_Clerk::new_universal_time (TimeBase::TimeT time,
					    TimeBase::InaccuracyT inaccuracy,
					    TimeBase::TdfT tdf,
					    CORBA::Environment &TAO_IN_ENV)
{
  TAO_UTO *uto = 0;

  ACE_NEW_THROW_RETURN (uto,
			TAO_UTO (time,
				 inaccuracy,
				 tdf),
			CORBA::NO_MEMORY (CORBA::COMPLETED_NO),
			CosTime::UTO::_nil ());
  return uto->_this ();
}

// This creates a new UTO given a time in the UtcT form.

CosTime::UTO_ptr
TAO_Time_Service_Clerk::uto_from_utc (const TimeBase::UtcT &utc,
				      CORBA::Environment &TAO_IN_ENV)
{
  TAO_UTO *uto = 0;

  ACE_NEW_THROW_RETURN (uto,
			TAO_UTO (utc.time,
				 utc.inacclo + utc.inacchi,
				 utc.tdf),
			CORBA::NO_MEMORY (CORBA::COMPLETED_NO),
			CosTime::UTO::_nil ());
  return uto->_this ();
}

// This creates a new TIO with the given parameters.

CosTime::TIO_ptr
TAO_Time_Service_Clerk::new_interval (TimeBase::TimeT lower,
				      TimeBase::TimeT upper,
				      CORBA::Environment &TAO_IN_ENV)
{
  TAO_TIO *tio = 0;

  ACE_NEW_THROW_RETURN (tio,
			TAO_TIO (lower,
				 upper),
			CORBA::NO_MEMORY (CORBA::COMPLETED_NO),
			CosTime::TIO::_nil ());
  return tio->_this ();
}

CORBA::ULongLong
TAO_Time_Service_Clerk::get_time (void)
{
  // Globally sync. time is the latest global time plus the time
  // elapsed since last updation was done.
  CORBA::ULongLong time;

  time = (CORBA::ULongLong) ACE_OS::gettimeofday ().sec ()
    - this->update_timestamp_ + this->time_;

  return time;
}