Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
9674dd51
Commit
9674dd51
authored
Jun 24, 2021
by
Pavel Vainerman
Committed by
Pavel Vainerman
Jun 30, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
make style
parent
1d66bfef
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2215 additions
and
2215 deletions
+2215
-2215
MessageType.cc
src/Core/MessageType.cc
+254
-254
UInterface.cc
src/Core/UInterface.cc
+0
-0
UniSetActivator.cc
src/Core/UniSetActivator.cc
+383
-383
UniSetManager.cc
src/Core/UniSetManager.cc
+499
-499
UniSetObject.cc
src/Core/UniSetObject.cc
+1079
-1079
No files found.
src/Core/MessageType.cc
View file @
9674dd51
...
@@ -30,259 +30,259 @@
...
@@ -30,259 +30,259 @@
namespace
uniset
namespace
uniset
{
{
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
std
::
string
strTypeOfMessage
(
int
type
)
std
::
string
strTypeOfMessage
(
int
type
)
{
{
if
(
type
==
Message
::
SensorInfo
)
if
(
type
==
Message
::
SensorInfo
)
return
"SensorInfo"
;
return
"SensorInfo"
;
if
(
type
==
Message
::
SysCommand
)
if
(
type
==
Message
::
SysCommand
)
return
"SysCommand"
;
return
"SysCommand"
;
if
(
type
==
Message
::
Confirm
)
if
(
type
==
Message
::
Confirm
)
return
"Confirm"
;
return
"Confirm"
;
if
(
type
==
Message
::
Timer
)
if
(
type
==
Message
::
Timer
)
return
"Timer"
;
return
"Timer"
;
if
(
type
==
Message
::
TextMessage
)
if
(
type
==
Message
::
TextMessage
)
return
"TextMessage"
;
return
"TextMessage"
;
if
(
type
==
Message
::
Unused
)
if
(
type
==
Message
::
Unused
)
return
"Unused"
;
return
"Unused"
;
return
"Unkown"
;
return
"Unkown"
;
}
}
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
Message
::
TypeOfMessage
&
t
)
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
Message
::
TypeOfMessage
&
t
)
{
{
return
os
<<
strTypeOfMessage
(
t
);
return
os
<<
strTypeOfMessage
(
t
);
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
Message
::
Message
()
noexcept
:
Message
::
Message
()
noexcept
:
type
(
Unused
),
priority
(
Medium
),
type
(
Unused
),
priority
(
Medium
),
node
(
uniset
::
uniset_conf
()
?
uniset
::
uniset_conf
()
->
getLocalNode
()
:
DefaultObjectId
),
node
(
uniset
::
uniset_conf
()
?
uniset
::
uniset_conf
()
->
getLocalNode
()
:
DefaultObjectId
),
supplier
(
DefaultObjectId
),
supplier
(
DefaultObjectId
),
consumer
(
DefaultObjectId
)
consumer
(
DefaultObjectId
)
{
{
tm
=
uniset
::
now_to_timespec
();
tm
=
uniset
::
now_to_timespec
();
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
VoidMessage
::
VoidMessage
(
const
TransportMessage
&
tm
)
noexcept
:
VoidMessage
::
VoidMessage
(
const
TransportMessage
&
tm
)
noexcept
:
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{
{
assert
(
sizeof
(
VoidMessage
)
>=
sizeof
(
uniset
::
RawDataOfTransportMessage
));
assert
(
sizeof
(
VoidMessage
)
>=
sizeof
(
uniset
::
RawDataOfTransportMessage
));
memcpy
(
this
,
&
tm
.
data
,
sizeof
(
tm
.
data
));
memcpy
(
this
,
&
tm
.
data
,
sizeof
(
tm
.
data
));
consumer
=
tm
.
consumer
;
consumer
=
tm
.
consumer
;
}
}
VoidMessage
::
VoidMessage
()
noexcept
VoidMessage
::
VoidMessage
()
noexcept
{
{
assert
(
sizeof
(
VoidMessage
)
>=
sizeof
(
uniset
::
RawDataOfTransportMessage
));
assert
(
sizeof
(
VoidMessage
)
>=
sizeof
(
uniset
::
RawDataOfTransportMessage
));
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
SensorMessage
::
SensorMessage
()
noexcept
:
SensorMessage
::
SensorMessage
()
noexcept
:
id
(
DefaultObjectId
),
id
(
DefaultObjectId
),
value
(
0
),
value
(
0
),
undefined
(
false
),
undefined
(
false
),
sensor_type
(
UniversalIO
::
DI
),
sensor_type
(
UniversalIO
::
DI
),
threshold
(
false
),
threshold
(
false
),
tid
(
uniset
::
DefaultThresholdId
)
tid
(
uniset
::
DefaultThresholdId
)
{
{
type
=
Message
::
SensorInfo
;
type
=
Message
::
SensorInfo
;
sm_tv
=
tm
;
// или инициализировать нулём ?
sm_tv
=
tm
;
// или инициализировать нулём ?
ci
.
minRaw
=
0
;
ci
.
minRaw
=
0
;
ci
.
maxRaw
=
0
;
ci
.
maxRaw
=
0
;
ci
.
minCal
=
0
;
ci
.
minCal
=
0
;
ci
.
maxCal
=
0
;
ci
.
maxCal
=
0
;
ci
.
precision
=
0
;
ci
.
precision
=
0
;
}
}
SensorMessage
::
SensorMessage
(
ObjectId
id
,
long
value
,
const
IOController_i
::
CalibrateInfo
&
ci
,
SensorMessage
::
SensorMessage
(
ObjectId
id
,
long
value
,
const
IOController_i
::
CalibrateInfo
&
ci
,
Priority
priority
,
Priority
priority
,
UniversalIO
::
IOType
st
,
ObjectId
consumer
)
noexcept
:
UniversalIO
::
IOType
st
,
ObjectId
consumer
)
noexcept
:
id
(
id
),
id
(
id
),
value
(
value
),
value
(
value
),
undefined
(
false
),
undefined
(
false
),
sensor_type
(
st
),
sensor_type
(
st
),
ci
(
ci
),
ci
(
ci
),
threshold
(
false
),
threshold
(
false
),
tid
(
uniset
::
DefaultThresholdId
)
tid
(
uniset
::
DefaultThresholdId
)
{
{
type
=
Message
::
SensorInfo
;
type
=
Message
::
SensorInfo
;
this
->
priority
=
priority
;
this
->
priority
=
priority
;
this
->
consumer
=
consumer
;
this
->
consumer
=
consumer
;
sm_tv
=
tm
;
sm_tv
=
tm
;
}
}
SensorMessage
::
SensorMessage
(
int
dummy
)
noexcept
:
SensorMessage
::
SensorMessage
(
int
dummy
)
noexcept
:
Message
(
1
),
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
Message
(
1
),
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
ci
(
IOController_i
::
CalibrateInfo
())
ci
(
IOController_i
::
CalibrateInfo
())
{
{
type
=
Message
::
SensorInfo
;
type
=
Message
::
SensorInfo
;
}
}
SensorMessage
::
SensorMessage
(
const
VoidMessage
*
msg
)
noexcept
:
SensorMessage
::
SensorMessage
(
const
VoidMessage
*
msg
)
noexcept
:
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{
{
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
assert
(
this
->
type
==
Message
::
SensorInfo
);
assert
(
this
->
type
==
Message
::
SensorInfo
);
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
SystemMessage
::
SystemMessage
()
noexcept
:
SystemMessage
::
SystemMessage
()
noexcept
:
command
(
SystemMessage
::
Unknown
)
command
(
SystemMessage
::
Unknown
)
{
{
memset
(
data
,
0
,
sizeof
(
data
));
memset
(
data
,
0
,
sizeof
(
data
));
type
=
Message
::
SysCommand
;
type
=
Message
::
SysCommand
;
}
}
SystemMessage
::
SystemMessage
(
Command
command
,
Priority
priority
,
ObjectId
consumer
)
noexcept
:
SystemMessage
::
SystemMessage
(
Command
command
,
Priority
priority
,
ObjectId
consumer
)
noexcept
:
command
(
command
)
command
(
command
)
{
{
type
=
Message
::
SysCommand
;
type
=
Message
::
SysCommand
;
this
->
priority
=
priority
;
this
->
priority
=
priority
;
this
->
consumer
=
consumer
;
this
->
consumer
=
consumer
;
memset
(
data
,
0
,
sizeof
(
data
));
memset
(
data
,
0
,
sizeof
(
data
));
}
}
SystemMessage
::
SystemMessage
(
const
VoidMessage
*
msg
)
noexcept
:
SystemMessage
::
SystemMessage
(
const
VoidMessage
*
msg
)
noexcept
:
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{
{
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
assert
(
this
->
type
==
Message
::
SysCommand
);
assert
(
this
->
type
==
Message
::
SysCommand
);
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
SystemMessage
::
Command
&
c
)
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
SystemMessage
::
Command
&
c
)
{
{
if
(
c
==
SystemMessage
::
Unknown
)
if
(
c
==
SystemMessage
::
Unknown
)
return
os
<<
"Unknown"
;
return
os
<<
"Unknown"
;
if
(
c
==
SystemMessage
::
StartUp
)
if
(
c
==
SystemMessage
::
StartUp
)
return
os
<<
"StartUp"
;
return
os
<<
"StartUp"
;
if
(
c
==
SystemMessage
::
FoldUp
)
if
(
c
==
SystemMessage
::
FoldUp
)
return
os
<<
"FoldUp"
;
return
os
<<
"FoldUp"
;
if
(
c
==
SystemMessage
::
Finish
)
if
(
c
==
SystemMessage
::
Finish
)
return
os
<<
"Finish"
;
return
os
<<
"Finish"
;
if
(
c
==
SystemMessage
::
WatchDog
)
if
(
c
==
SystemMessage
::
WatchDog
)
return
os
<<
"WatchDog"
;
return
os
<<
"WatchDog"
;
if
(
c
==
SystemMessage
::
ReConfiguration
)
if
(
c
==
SystemMessage
::
ReConfiguration
)
return
os
<<
"ReConfiguration"
;
return
os
<<
"ReConfiguration"
;
if
(
c
==
SystemMessage
::
NetworkInfo
)
if
(
c
==
SystemMessage
::
NetworkInfo
)
return
os
<<
"NetworkInfo"
;
return
os
<<
"NetworkInfo"
;
if
(
c
==
SystemMessage
::
LogRotate
)
if
(
c
==
SystemMessage
::
LogRotate
)
return
os
<<
"LogRotate"
;
return
os
<<
"LogRotate"
;
return
os
;
return
os
;
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
TimerMessage
::
TimerMessage
()
:
TimerMessage
::
TimerMessage
()
:
id
(
uniset
::
DefaultTimerId
)
id
(
uniset
::
DefaultTimerId
)
{
{
type
=
Message
::
Timer
;
type
=
Message
::
Timer
;
}
}
TimerMessage
::
TimerMessage
(
uniset
::
TimerId
id
,
Priority
prior
,
ObjectId
cons
)
:
TimerMessage
::
TimerMessage
(
uniset
::
TimerId
id
,
Priority
prior
,
ObjectId
cons
)
:
id
(
id
)
id
(
id
)
{
{
type
=
Message
::
Timer
;
type
=
Message
::
Timer
;
this
->
consumer
=
cons
;
this
->
consumer
=
cons
;
}
}
TimerMessage
::
TimerMessage
(
const
VoidMessage
*
msg
)
noexcept
:
TimerMessage
::
TimerMessage
(
const
VoidMessage
*
msg
)
noexcept
:
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{
{
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
assert
(
this
->
type
==
Message
::
Timer
);
assert
(
this
->
type
==
Message
::
Timer
);
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
ConfirmMessage
::
ConfirmMessage
(
const
VoidMessage
*
msg
)
noexcept
:
ConfirmMessage
::
ConfirmMessage
(
const
VoidMessage
*
msg
)
noexcept
:
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
Message
(
1
)
// вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{
{
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
memcpy
(
this
,
msg
,
sizeof
(
*
this
));
assert
(
this
->
type
==
Message
::
Confirm
);
assert
(
this
->
type
==
Message
::
Confirm
);
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
ConfirmMessage
::
ConfirmMessage
(
uniset
::
ObjectId
in_sensor_id
,
ConfirmMessage
::
ConfirmMessage
(
uniset
::
ObjectId
in_sensor_id
,
const
double
&
in_sensor_value
,
const
double
&
in_sensor_value
,
const
timespec
&
in_sensor_time
,
const
timespec
&
in_sensor_time
,
const
timespec
&
in_confirm_time
,
const
timespec
&
in_confirm_time
,
Priority
in_priority
)
noexcept
:
Priority
in_priority
)
noexcept
:
sensor_id
(
in_sensor_id
),
sensor_id
(
in_sensor_id
),
sensor_value
(
in_sensor_value
),
sensor_value
(
in_sensor_value
),
sensor_time
(
in_sensor_time
),
sensor_time
(
in_sensor_time
),
confirm_time
(
in_confirm_time
),
confirm_time
(
in_confirm_time
),
broadcast
(
false
),
broadcast
(
false
),
forward
(
false
)
forward
(
false
)
{
{
type
=
Message
::
Confirm
;
type
=
Message
::
Confirm
;
priority
=
in_priority
;
priority
=
in_priority
;
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
TextMessage
::
TextMessage
(
const
VoidMessage
*
vmsg
)
noexcept
TextMessage
::
TextMessage
(
const
VoidMessage
*
vmsg
)
noexcept
:
VoidMessage
(
1
)
// dummy constructor
:
VoidMessage
(
1
)
// dummy constructor
{
{
assert
(
vmsg
->
type
==
Message
::
TextMessage
);
assert
(
vmsg
->
type
==
Message
::
TextMessage
);
auto
m
=
static_cast
<
const
TextMessage
*>
(
vmsg
);
auto
m
=
static_cast
<
const
TextMessage
*>
(
vmsg
);
if
(
m
)
if
(
m
)
{
{
type
=
m
->
type
;
type
=
m
->
type
;
priority
=
m
->
priority
;
priority
=
m
->
priority
;
node
=
m
->
node
;
node
=
m
->
node
;
tm
=
m
->
tm
;
tm
=
m
->
tm
;
consumer
=
m
->
consumer
;
consumer
=
m
->
consumer
;
supplier
=
m
->
supplier
;
supplier
=
m
->
supplier
;
mtype
=
m
->
mtype
;
mtype
=
m
->
mtype
;
txt
=
m
->
txt
;
txt
=
m
->
txt
;
}
}
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
TextMessage
::
TextMessage
()
noexcept
TextMessage
::
TextMessage
()
noexcept
{
{
type
=
Message
::
TextMessage
;
type
=
Message
::
TextMessage
;
}
}
TextMessage
::
TextMessage
(
const
char
*
msg
,
TextMessage
::
TextMessage
(
const
char
*
msg
,
int
_mtype
,
int
_mtype
,
const
uniset
::
Timespec
&
tm
,
const
uniset
::
Timespec
&
tm
,
const
::
uniset
::
ProducerInfo
&
pi
,
const
::
uniset
::
ProducerInfo
&
pi
,
Priority
prior
,
Priority
prior
,
ObjectId
cons
)
noexcept
ObjectId
cons
)
noexcept
{
{
type
=
Message
::
TextMessage
;
type
=
Message
::
TextMessage
;
this
->
node
=
pi
.
node
;
this
->
node
=
pi
.
node
;
this
->
supplier
=
pi
.
id
;
this
->
supplier
=
pi
.
id
;
this
->
priority
=
prior
;
this
->
priority
=
prior
;
this
->
consumer
=
cons
;
this
->
consumer
=
cons
;
this
->
tm
.
tv_sec
=
tm
.
sec
;
this
->
tm
.
tv_sec
=
tm
.
sec
;
this
->
tm
.
tv_nsec
=
tm
.
nsec
;
this
->
tm
.
tv_nsec
=
tm
.
nsec
;
this
->
txt
=
std
::
string
(
msg
);
this
->
txt
=
std
::
string
(
msg
);
this
->
mtype
=
_mtype
;
this
->
mtype
=
_mtype
;
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
std
::
shared_ptr
<
VoidMessage
>
TextMessage
::
toLocalVoidMessage
()
const
std
::
shared_ptr
<
VoidMessage
>
TextMessage
::
toLocalVoidMessage
()
const
{
{
uniset
::
ProducerInfo
pi
;
uniset
::
ProducerInfo
pi
;
pi
.
id
=
supplier
;
pi
.
id
=
supplier
;
pi
.
node
=
node
;
pi
.
node
=
node
;
uniset
::
Timespec
ts
;
uniset
::
Timespec
ts
;
ts
.
sec
=
tm
.
tv_sec
;
ts
.
sec
=
tm
.
tv_sec
;
ts
.
nsec
=
tm
.
tv_nsec
;
ts
.
nsec
=
tm
.
tv_nsec
;
auto
tmsg
=
std
::
make_shared
<
TextMessage
>
(
txt
.
c_str
(),
mtype
,
ts
,
pi
,
priority
,
consumer
);
auto
tmsg
=
std
::
make_shared
<
TextMessage
>
(
txt
.
c_str
(),
mtype
,
ts
,
pi
,
priority
,
consumer
);
return
std
::
static_pointer_cast
<
VoidMessage
>
(
tmsg
);
return
std
::
static_pointer_cast
<
VoidMessage
>
(
tmsg
);
}
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
}
// end of namespace uniset
}
// end of namespace uniset
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
src/Core/UInterface.cc
View file @
9674dd51
This source diff could not be displayed because it is too large. You can
view the blob
instead.
src/Core/UniSetActivator.cc
View file @
9674dd51
...
@@ -56,416 +56,416 @@ static const int TERMINATE_TIMEOUT_SEC = 15; // время, отведённо
...
@@ -56,416 +56,416 @@ static const int TERMINATE_TIMEOUT_SEC = 15; // время, отведённо
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
struct
ORBThreadDeleter
struct
ORBThreadDeleter
{
{
void
operator
()(
OmniThreadCreator
<
UniSetActivator
>*
p
)
const
void
operator
()(
OmniThreadCreator
<
UniSetActivator
>*
p
)
const
{
{
// не удаляем..
// не удаляем..
}
}
};
};
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
namespace
uniset
namespace
uniset
{
{
UniSetActivatorPtr
UniSetActivator
::
inst
;
UniSetActivatorPtr
UniSetActivator
::
inst
;
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
UniSetActivatorPtr
UniSetActivator
::
Instance
()
UniSetActivatorPtr
UniSetActivator
::
Instance
()
{
{
if
(
inst
==
nullptr
)
if
(
inst
==
nullptr
)
inst
=
shared_ptr
<
UniSetActivator
>
(
new
UniSetActivator
()
);
inst
=
shared_ptr
<
UniSetActivator
>
(
new
UniSetActivator
()
);
return
inst
;
return
inst
;
}
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
UniSetActivator
::
UniSetActivator
()
:
UniSetActivator
::
UniSetActivator
()
:
UniSetManager
(
uniset
::
DefaultObjectId
)
UniSetManager
(
uniset
::
DefaultObjectId
)
{
{
UniSetActivator
::
init
();
UniSetActivator
::
init
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
init
()
void
UniSetActivator
::
init
()
{
{
if
(
getId
()
==
DefaultObjectId
)
if
(
getId
()
==
DefaultObjectId
)
myname
=
"UniSetActivator"
;
myname
=
"UniSetActivator"
;
auto
conf
=
uniset_conf
();
auto
conf
=
uniset_conf
();
#ifndef DISABLE_REST_API
#ifndef DISABLE_REST_API
if
(
findArgParam
(
"--activator-run-httpserver"
,
conf
->
getArgc
(),
conf
->
getArgv
())
!=
-
1
)
if
(
findArgParam
(
"--activator-run-httpserver"
,
conf
->
getArgc
(),
conf
->
getArgv
())
!=
-
1
)
{
{
httpHost
=
conf
->
getArgParam
(
"--activator-httpserver-host"
,
"localhost"
);
httpHost
=
conf
->
getArgParam
(
"--activator-httpserver-host"
,
"localhost"
);
ostringstream
s
;
ostringstream
s
;
s
<<
(
getId
()
==
DefaultObjectId
?
8080
:
getId
()
);
s
<<
(
getId
()
==
DefaultObjectId
?
8080
:
getId
()
);
httpPort
=
conf
->
getArgInt
(
"--activator-httpserver-port"
,
s
.
str
());
httpPort
=
conf
->
getArgInt
(
"--activator-httpserver-port"
,
s
.
str
());
ulog1
<<
myname
<<
"(init): http server parameters "
<<
httpHost
<<
":"
<<
httpPort
<<
endl
;
ulog1
<<
myname
<<
"(init): http server parameters "
<<
httpHost
<<
":"
<<
httpPort
<<
endl
;
httpCORS_allow
=
conf
->
getArgParam
(
"--activator-httpserver-cors-allow"
,
"*"
);
httpCORS_allow
=
conf
->
getArgParam
(
"--activator-httpserver-cors-allow"
,
"*"
);
}
}
#endif
#endif
orb
=
conf
->
getORB
();
orb
=
conf
->
getORB
();
CORBA
::
Object_var
obj
=
orb
->
resolve_initial_references
(
"RootPOA"
);
CORBA
::
Object_var
obj
=
orb
->
resolve_initial_references
(
"RootPOA"
);
PortableServer
::
POA_var
root_poa
=
PortableServer
::
POA
::
_narrow
(
obj
);
PortableServer
::
POA_var
root_poa
=
PortableServer
::
POA
::
_narrow
(
obj
);
pman
=
root_poa
->
the_POAManager
();
pman
=
root_poa
->
the_POAManager
();
const
CORBA
::
PolicyList
pl
=
conf
->
getPolicy
();
const
CORBA
::
PolicyList
pl
=
conf
->
getPolicy
();
poa
=
root_poa
->
create_POA
(
"my poa"
,
pman
,
pl
);
poa
=
root_poa
->
create_POA
(
"my poa"
,
pman
,
pl
);
if
(
CORBA
::
is_nil
(
poa
)
)
if
(
CORBA
::
is_nil
(
poa
)
)
{
{
ucrit
<<
myname
<<
"(init): init poa failed!!!"
<<
endl
;
ucrit
<<
myname
<<
"(init): init poa failed!!!"
<<
endl
;
std
::
terminate
();
std
::
terminate
();
}
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetActivator
::~
UniSetActivator
()
UniSetActivator
::~
UniSetActivator
()
{
{
if
(
active
)
if
(
active
)
{
{
try
try
{
{
shutdown
();
shutdown
();
}
}
catch
(...)
catch
(...)
{
{
std
::
exception_ptr
p
=
std
::
current_exception
();
std
::
exception_ptr
p
=
std
::
current_exception
();
cerr
<<
(
p
?
p
.
__cxa_exception_type
()
->
name
()
:
"null"
)
<<
std
::
endl
;
cerr
<<
(
p
?
p
.
__cxa_exception_type
()
->
name
()
:
"null"
)
<<
std
::
endl
;
}
}
}
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
run
(
bool
thread
,
bool
terminate_control
)
void
UniSetActivator
::
run
(
bool
thread
,
bool
terminate_control
)
{
{
ulogsys
<<
myname
<<
"(run): создаю менеджер "
<<
endl
;
ulogsys
<<
myname
<<
"(run): создаю менеджер "
<<
endl
;
termControl
=
terminate_control
;
termControl
=
terminate_control
;
auto
aptr
=
std
::
static_pointer_cast
<
UniSetActivator
>
(
get_ptr
());
auto
aptr
=
std
::
static_pointer_cast
<
UniSetActivator
>
(
get_ptr
());
UniSetManager
::
initPOA
(
aptr
);
UniSetManager
::
initPOA
(
aptr
);
if
(
getId
()
==
uniset
::
DefaultObjectId
)
if
(
getId
()
==
uniset
::
DefaultObjectId
)
offThread
();
// отключение потока обработки сообщений, раз не задан ObjectId
offThread
();
// отключение потока обработки сообщений, раз не задан ObjectId
UniSetManager
::
activate
();
// а там вызывается активация всех подчиненных объектов и менеджеров
UniSetManager
::
activate
();
// а там вызывается активация всех подчиненных объектов и менеджеров
active
=
true
;
active
=
true
;
ulogsys
<<
myname
<<
"(run): активизируем менеджер"
<<
endl
;
ulogsys
<<
myname
<<
"(run): активизируем менеджер"
<<
endl
;
pman
->
activate
();
pman
->
activate
();
msleep
(
50
);
msleep
(
50
);
if
(
termControl
)
if
(
termControl
)
set_signals
(
true
);
set_signals
(
true
);
#ifndef DISABLE_REST_API
#ifndef DISABLE_REST_API
if
(
!
httpHost
.
empty
()
)
if
(
!
httpHost
.
empty
()
)
{
{
try
try
{
{
auto
reg
=
dynamic_pointer_cast
<
UHttp
::
IHttpRequestRegistry
>
(
shared_from_this
());
auto
reg
=
dynamic_pointer_cast
<
UHttp
::
IHttpRequestRegistry
>
(
shared_from_this
());
httpserv
=
make_shared
<
UHttp
::
UHttpServer
>
(
reg
,
httpHost
,
httpPort
);
httpserv
=
make_shared
<
UHttp
::
UHttpServer
>
(
reg
,
httpHost
,
httpPort
);
httpserv
->
setCORS_allow
(
httpCORS_allow
);
httpserv
->
setCORS_allow
(
httpCORS_allow
);
httpserv
->
start
();
httpserv
->
start
();
}
}
catch
(
std
::
exception
&
ex
)
catch
(
std
::
exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(run): init http server error: "
<<
ex
.
what
()
<<
endl
;
uwarn
<<
myname
<<
"(run): init http server error: "
<<
ex
.
what
()
<<
endl
;
}
}
}
}
#endif
#endif
if
(
thread
)
if
(
thread
)
{
{
uinfo
<<
myname
<<
"(run): запускаемся с созданием отдельного потока... "
<<
endl
;
uinfo
<<
myname
<<
"(run): запускаемся с созданием отдельного потока... "
<<
endl
;
orbthr
=
std
::
shared_ptr
<
OmniThreadCreator
<
UniSetActivator
>>
(
new
OmniThreadCreator
<
UniSetActivator
>
(
aptr
,
&
UniSetActivator
::
mainWork
),
ORBThreadDeleter
());
orbthr
=
std
::
shared_ptr
<
OmniThreadCreator
<
UniSetActivator
>>
(
new
OmniThreadCreator
<
UniSetActivator
>
(
aptr
,
&
UniSetActivator
::
mainWork
),
ORBThreadDeleter
());
orbthr
->
start
();
orbthr
->
start
();
}
}
else
else
{
{
uinfo
<<
myname
<<
"(run): запускаемся без создания отдельного потока... "
<<
endl
;
uinfo
<<
myname
<<
"(run): запускаемся без создания отдельного потока... "
<<
endl
;
mainWork
();
mainWork
();
shutdown
();
shutdown
();
}
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
/*!
/*!
* Функция останавливает работу orb и завершает поток, а также удаляет ссылку из репозитория.
* Функция останавливает работу orb и завершает поток, а также удаляет ссылку из репозитория.
* \note Объект становится недоступен другим процессам
* \note Объект становится недоступен другим процессам
*/
*/
void
UniSetActivator
::
shutdown
()
void
UniSetActivator
::
shutdown
()
{
{
if
(
!
active
)
if
(
!
active
)
return
;
return
;
active
=
false
;
active
=
false
;
if
(
termControl
)
if
(
termControl
)
{
{
set_signals
(
false
);
set_signals
(
false
);
{
{
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
g_done
=
false
;
g_done
=
false
;
g_finish_guard_thread
=
make_shared
<
std
::
thread
>
(
on_finish_timeout
);
g_finish_guard_thread
=
make_shared
<
std
::
thread
>
(
on_finish_timeout
);
}
}
}
}
ulogsys
<<
myname
<<
"(shutdown): deactivate... "
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): deactivate... "
<<
endl
;
deactivate
();
deactivate
();
ulogsys
<<
myname
<<
"(shutdown): deactivate ok. "
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): deactivate ok. "
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): discard request..."
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): discard request..."
<<
endl
;
pman
->
discard_requests
(
true
);
pman
->
discard_requests
(
true
);
ulogsys
<<
myname
<<
"(shutdown): discard request ok."
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): discard request ok."
<<
endl
;
#ifndef DISABLE_REST_API
#ifndef DISABLE_REST_API
if
(
httpserv
)
if
(
httpserv
)
httpserv
->
stop
();
httpserv
->
stop
();
#endif
#endif
ulogsys
<<
myname
<<
"(shutdown): pman deactivate... "
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): pman deactivate... "
<<
endl
;
pman
->
deactivate
(
false
,
true
);
pman
->
deactivate
(
false
,
true
);
ulogsys
<<
myname
<<
"(shutdown): pman deactivate ok. "
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): pman deactivate ok. "
<<
endl
;
try
try
{
{
ulogsys
<<
myname
<<
"(shutdown): shutdown orb... "
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): shutdown orb... "
<<
endl
;
if
(
orb
)
if
(
orb
)
orb
->
shutdown
(
true
);
orb
->
shutdown
(
true
);
ulogsys
<<
myname
<<
"(shutdown): shutdown ok."
<<
endl
;
ulogsys
<<
myname
<<
"(shutdown): shutdown ok."
<<
endl
;
}
}
catch
(
const
omniORB
::
fatalException
&
fe
)
catch
(
const
omniORB
::
fatalException
&
fe
)
{
{
ucrit
<<
myname
<<
"(shutdown): : поймали omniORB::fatalException:"
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): : поймали omniORB::fatalException:"
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): file: "
<<
fe
.
file
()
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): file: "
<<
fe
.
file
()
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): line: "
<<
fe
.
line
()
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): line: "
<<
fe
.
line
()
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): mesg: "
<<
fe
.
errmsg
()
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): mesg: "
<<
fe
.
errmsg
()
<<
endl
;
}
}
catch
(
const
std
::
exception
&
ex
)
catch
(
const
std
::
exception
&
ex
)
{
{
ucrit
<<
myname
<<
"(shutdown): "
<<
ex
.
what
()
<<
endl
;
ucrit
<<
myname
<<
"(shutdown): "
<<
ex
.
what
()
<<
endl
;
}
}
{
{
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
g_done
=
true
;
g_done
=
true
;
}
}
g_doneevent
.
notify_all
();
g_doneevent
.
notify_all
();
if
(
g_finish_guard_thread
)
if
(
g_finish_guard_thread
)
g_finish_guard_thread
->
join
();
g_finish_guard_thread
->
join
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
join
()
void
UniSetActivator
::
join
()
{
{
if
(
g_done
)
if
(
g_done
)
return
;
return
;
ulogsys
<<
myname
<<
"(join): ..."
<<
endl
;
ulogsys
<<
myname
<<
"(join): ..."
<<
endl
;
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
g_doneevent
.
wait
(
lk
,
[]()
g_doneevent
.
wait
(
lk
,
[]()
{
{
return
(
g_done
==
true
);
return
(
g_done
==
true
);
}
);
}
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
terminate
()
void
UniSetActivator
::
terminate
()
{
{
ulogsys
<<
myname
<<
"(terminate): ..."
<<
endl
;
ulogsys
<<
myname
<<
"(terminate): ..."
<<
endl
;
kill
(
getpid
(),
SIGTERM
);
kill
(
getpid
(),
SIGTERM
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
static
void
activator_terminate
(
int
signo
)
static
void
activator_terminate
(
int
signo
)
{
{
auto
act
=
UniSetActivator
::
Instance
();
auto
act
=
UniSetActivator
::
Instance
();
act
->
shutdown
();
act
->
shutdown
();
ulogsys
<<
"******** activator_terminate finished **** "
<<
endl
;
ulogsys
<<
"******** activator_terminate finished **** "
<<
endl
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
on_finish_timeout
()
void
UniSetActivator
::
on_finish_timeout
()
{
{
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
std
::
unique_lock
<
std
::
mutex
>
lk
(
g_donemutex
);
if
(
g_done
)
if
(
g_done
)
return
;
return
;
ulogsys
<<
"(FINISH GUARD THREAD): wait "
<<
TERMINATE_TIMEOUT_SEC
<<
" sec.."
<<
endl
<<
flush
;
ulogsys
<<
"(FINISH GUARD THREAD): wait "
<<
TERMINATE_TIMEOUT_SEC
<<
" sec.."
<<
endl
<<
flush
;
g_doneevent
.
wait_for
(
lk
,
std
::
chrono
::
milliseconds
(
TERMINATE_TIMEOUT_SEC
*
1000
),
[]()
g_doneevent
.
wait_for
(
lk
,
std
::
chrono
::
milliseconds
(
TERMINATE_TIMEOUT_SEC
*
1000
),
[]()
{
{
return
(
g_done
==
true
);
return
(
g_done
==
true
);
}
);
}
);
if
(
!
g_done
)
if
(
!
g_done
)
{
{
ulogsys
<<
"(FINISH GUARD THREAD): WAIT TIMEOUT "
ulogsys
<<
"(FINISH GUARD THREAD): WAIT TIMEOUT "
<<
TERMINATE_TIMEOUT_SEC
<<
" sec..KILL *******"
<<
endl
<<
flush
;
<<
TERMINATE_TIMEOUT_SEC
<<
" sec..KILL *******"
<<
endl
<<
flush
;
set_signals
(
false
);
set_signals
(
false
);
std
::
abort
();
std
::
abort
();
return
;
return
;
}
}
ulogsys
<<
"(FINISH GUARD THREAD): [OK]..bye.."
<<
endl
;
ulogsys
<<
"(FINISH GUARD THREAD): [OK]..bye.."
<<
endl
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
set_signals
(
bool
ask
)
void
UniSetActivator
::
set_signals
(
bool
ask
)
{
{
struct
sigaction
act
;
// = { { 0 } };
struct
sigaction
act
;
// = { { 0 } };
struct
sigaction
oact
;
// = { { 0 } };
struct
sigaction
oact
;
// = { { 0 } };
memset
(
&
act
,
0
,
sizeof
(
act
));
memset
(
&
act
,
0
,
sizeof
(
act
));
memset
(
&
act
,
0
,
sizeof
(
oact
));
memset
(
&
act
,
0
,
sizeof
(
oact
));
sigemptyset
(
&
act
.
sa_mask
);
sigemptyset
(
&
act
.
sa_mask
);
sigemptyset
(
&
oact
.
sa_mask
);
sigemptyset
(
&
oact
.
sa_mask
);
// добавляем сигналы, которые будут игнорироваться
// добавляем сигналы, которые будут игнорироваться
// при обработке сигнала
// при обработке сигнала
sigaddset
(
&
act
.
sa_mask
,
SIGINT
);
sigaddset
(
&
act
.
sa_mask
,
SIGINT
);
sigaddset
(
&
act
.
sa_mask
,
SIGTERM
);
sigaddset
(
&
act
.
sa_mask
,
SIGTERM
);
sigaddset
(
&
act
.
sa_mask
,
SIGABRT
);
sigaddset
(
&
act
.
sa_mask
,
SIGABRT
);
sigaddset
(
&
act
.
sa_mask
,
SIGQUIT
);
sigaddset
(
&
act
.
sa_mask
,
SIGQUIT
);
if
(
ask
)
if
(
ask
)
act
.
sa_handler
=
activator_terminate
;
act
.
sa_handler
=
activator_terminate
;
else
else
act
.
sa_handler
=
SIG_DFL
;
act
.
sa_handler
=
SIG_DFL
;
sigaction
(
SIGINT
,
&
act
,
&
oact
);
sigaction
(
SIGINT
,
&
act
,
&
oact
);
sigaction
(
SIGTERM
,
&
act
,
&
oact
);
sigaction
(
SIGTERM
,
&
act
,
&
oact
);
sigaction
(
SIGABRT
,
&
act
,
&
oact
);
sigaction
(
SIGABRT
,
&
act
,
&
oact
);
sigaction
(
SIGQUIT
,
&
act
,
&
oact
);
sigaction
(
SIGQUIT
,
&
act
,
&
oact
);
// SIGSEGV отдельно
// SIGSEGV отдельно
sigemptyset
(
&
act
.
sa_mask
);
sigemptyset
(
&
act
.
sa_mask
);
sigaddset
(
&
act
.
sa_mask
,
SIGSEGV
);
sigaddset
(
&
act
.
sa_mask
,
SIGSEGV
);
act
.
sa_flags
=
0
;
act
.
sa_flags
=
0
;
//
act.sa_flags |= SA_RESTART;
//
act.sa_flags |= SA_RESTART;
act
.
sa_flags
|=
SA_RESETHAND
;
act
.
sa_flags
|=
SA_RESETHAND
;
#if 0
#if 0
g_sigseg_stack.ss_sp = g_stack_body;
g_sigseg_stack.ss_sp = g_stack_body;
g_sigseg_stack.ss_flags = SS_ONSTACK;
g_sigseg_stack.ss_flags = SS_ONSTACK;
g_sigseg_stack.ss_size = sizeof(g_stack_body);
g_sigseg_stack.ss_size = sizeof(g_stack_body);
assert(!sigaltstack(&g_sigseg_stack, nullptr));
assert(!sigaltstack(&g_sigseg_stack, nullptr));
act.sa_flags |= SA_ONSTACK;
act.sa_flags |= SA_ONSTACK;
#endif
#endif
//
if(ask)
//
if(ask)
//
act.sa_handler = activator_terminate_with_calltrace;
//
act.sa_handler = activator_terminate_with_calltrace;
//
else
//
else
//
act.sa_handler = SIG_DFL;
//
act.sa_handler = SIG_DFL;
//
sigaction(SIGSEGV, &act, &oact);
//
sigaction(SIGSEGV, &act, &oact);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetActivator
::
mainWork
()
void
UniSetActivator
::
mainWork
()
{
{
ulogsys
<<
myname
<<
"(work): запускаем orb на обработку запросов..."
<<
endl
;
ulogsys
<<
myname
<<
"(work): запускаем orb на обработку запросов..."
<<
endl
;
try
try
{
{
omniORB
::
setMainThread
();
omniORB
::
setMainThread
();
orb
->
run
();
orb
->
run
();
}
}
catch
(
const
CORBA
::
SystemException
&
ex
)
catch
(
const
CORBA
::
SystemException
&
ex
)
{
{
ucrit
<<
myname
<<
"(work): поймали CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
ucrit
<<
myname
<<
"(work): поймали CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
ucrit
<<
myname
<<
"(work): поймали CORBA::Exception."
<<
endl
;
ucrit
<<
myname
<<
"(work): поймали CORBA::Exception."
<<
endl
;
}
}
catch
(
const
omniORB
::
fatalException
&
fe
)
catch
(
const
omniORB
::
fatalException
&
fe
)
{
{
ucrit
<<
myname
<<
"(work): : поймали omniORB::fatalException:"
<<
endl
;
ucrit
<<
myname
<<
"(work): : поймали omniORB::fatalException:"
<<
endl
;
ucrit
<<
myname
<<
"(work): file: "
<<
fe
.
file
()
<<
endl
;
ucrit
<<
myname
<<
"(work): file: "
<<
fe
.
file
()
<<
endl
;
ucrit
<<
myname
<<
"(work): line: "
<<
fe
.
line
()
<<
endl
;
ucrit
<<
myname
<<
"(work): line: "
<<
fe
.
line
()
<<
endl
;
ucrit
<<
myname
<<
"(work): mesg: "
<<
fe
.
errmsg
()
<<
endl
;
ucrit
<<
myname
<<
"(work): mesg: "
<<
fe
.
errmsg
()
<<
endl
;
}
}
catch
(
std
::
exception
&
ex
)
catch
(
std
::
exception
&
ex
)
{
{
ucrit
<<
myname
<<
"(work): catch: "
<<
ex
.
what
()
<<
endl
;
ucrit
<<
myname
<<
"(work): catch: "
<<
ex
.
what
()
<<
endl
;
}
}
ulogsys
<<
myname
<<
"(work): orb thread stopped!"
<<
endl
<<
flush
;
ulogsys
<<
myname
<<
"(work): orb thread stopped!"
<<
endl
<<
flush
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#ifndef DISABLE_REST_API
#ifndef DISABLE_REST_API
Poco
::
JSON
::
Object
::
Ptr
UniSetActivator
::
httpGetByName
(
const
string
&
name
,
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetActivator
::
httpGetByName
(
const
string
&
name
,
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
if
(
name
==
myname
)
if
(
name
==
myname
)
return
httpGet
(
p
);
return
httpGet
(
p
);
auto
obj
=
deepFindObject
(
name
);
auto
obj
=
deepFindObject
(
name
);
if
(
obj
)
if
(
obj
)
return
obj
->
httpGet
(
p
);
return
obj
->
httpGet
(
p
);
ostringstream
err
;
ostringstream
err
;
err
<<
"Object '"
<<
name
<<
"' not found"
;
err
<<
"Object '"
<<
name
<<
"' not found"
;
throw
uniset
::
NameNotFound
(
err
.
str
());
throw
uniset
::
NameNotFound
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
Poco
::
JSON
::
Array
::
Ptr
UniSetActivator
::
httpGetObjectsList
(
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Array
::
Ptr
UniSetActivator
::
httpGetObjectsList
(
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
Poco
::
JSON
::
Array
::
Ptr
jdata
=
new
Poco
::
JSON
::
Array
();
Poco
::
JSON
::
Array
::
Ptr
jdata
=
new
Poco
::
JSON
::
Array
();
std
::
vector
<
std
::
shared_ptr
<
UniSetObject
>>
vec
;
std
::
vector
<
std
::
shared_ptr
<
UniSetObject
>>
vec
;
vec
.
reserve
(
objectsCount
());
vec
.
reserve
(
objectsCount
());
//! \todo Доделать обработку параметров beg,lim на случай большого количества объектов (и частичных запросов)
//! \todo Доделать обработку параметров beg,lim на случай большого количества объектов (и частичных запросов)
size_t
lim
=
1000
;
size_t
lim
=
1000
;
getAllObjectsList
(
vec
,
lim
);
getAllObjectsList
(
vec
,
lim
);
for
(
const
auto
&
o
:
vec
)
for
(
const
auto
&
o
:
vec
)
jdata
->
add
(
o
->
getName
());
jdata
->
add
(
o
->
getName
());
return
jdata
;
return
jdata
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
UniSetActivator
::
httpHelpByName
(
const
string
&
name
,
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetActivator
::
httpHelpByName
(
const
string
&
name
,
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
if
(
name
==
myname
)
if
(
name
==
myname
)
return
httpHelp
(
p
);
return
httpHelp
(
p
);
auto
obj
=
deepFindObject
(
name
);
auto
obj
=
deepFindObject
(
name
);
if
(
obj
)
if
(
obj
)
return
obj
->
httpHelp
(
p
);
return
obj
->
httpHelp
(
p
);
ostringstream
err
;
ostringstream
err
;
err
<<
"Object '"
<<
name
<<
"' not found"
;
err
<<
"Object '"
<<
name
<<
"' not found"
;
throw
uniset
::
NameNotFound
(
err
.
str
());
throw
uniset
::
NameNotFound
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
UniSetActivator
::
httpRequestByName
(
const
string
&
name
,
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetActivator
::
httpRequestByName
(
const
string
&
name
,
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
if
(
name
==
myname
)
if
(
name
==
myname
)
return
httpRequest
(
req
,
p
);
return
httpRequest
(
req
,
p
);
// а вдруг встретится объект с именем "conf" а мы перекрываем имя?!
// а вдруг встретится объект с именем "conf" а мы перекрываем имя?!
// (пока считаем что такого не будет)
// (пока считаем что такого не будет)
if
(
name
==
"configure"
)
if
(
name
==
"configure"
)
return
request_configure
(
req
,
p
);
return
request_configure
(
req
,
p
);
auto
obj
=
deepFindObject
(
name
);
auto
obj
=
deepFindObject
(
name
);
if
(
obj
)
if
(
obj
)
return
obj
->
httpRequest
(
req
,
p
);
return
obj
->
httpRequest
(
req
,
p
);
ostringstream
err
;
ostringstream
err
;
err
<<
"Object '"
<<
name
<<
"' not found"
;
err
<<
"Object '"
<<
name
<<
"' not found"
;
throw
uniset
::
NameNotFound
(
err
.
str
());
throw
uniset
::
NameNotFound
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#endif // #ifndef DISABLE_REST_API
#endif // #ifndef DISABLE_REST_API
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
}
// end of namespace uniset
}
// end of namespace uniset
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
src/Core/UniSetManager.cc
View file @
9674dd51
...
@@ -39,202 +39,202 @@ using namespace std;
...
@@ -39,202 +39,202 @@ using namespace std;
// объект-функция для посылки сообщения менеджеру
// объект-функция для посылки сообщения менеджеру
class
MPush
:
public
unary_function
<
const
std
::
shared_ptr
<
uniset
::
UniSetManager
>&
,
bool
>
class
MPush
:
public
unary_function
<
const
std
::
shared_ptr
<
uniset
::
UniSetManager
>&
,
bool
>
{
{
public
:
public
:
explicit
MPush
(
const
uniset
::
TransportMessage
&
msg
)
:
msg
(
msg
)
{}
explicit
MPush
(
const
uniset
::
TransportMessage
&
msg
)
:
msg
(
msg
)
{}
bool
operator
()(
const
std
::
shared_ptr
<
uniset
::
UniSetManager
>&
m
)
const
bool
operator
()(
const
std
::
shared_ptr
<
uniset
::
UniSetManager
>&
m
)
const
{
{
try
try
{
{
if
(
m
)
if
(
m
)
{
{
m
->
push
(
msg
);
m
->
push
(
msg
);
m
->
broadcast
(
msg
);
m
->
broadcast
(
msg
);
}
}
return
true
;
return
true
;
}
}
catch
(...)
{}
catch
(...)
{}
return
false
;
return
false
;
}
}
private
:
private
:
const
uniset
::
TransportMessage
&
msg
;
const
uniset
::
TransportMessage
&
msg
;
};
};
// объект-функция для посылки сообщения объекту
// объект-функция для посылки сообщения объекту
class
OPush
:
public
unary_function
<
const
std
::
shared_ptr
<
uniset
::
UniSetObject
>&
,
bool
>
class
OPush
:
public
unary_function
<
const
std
::
shared_ptr
<
uniset
::
UniSetObject
>&
,
bool
>
{
{
public
:
public
:
explicit
OPush
(
const
uniset
::
TransportMessage
&
msg
)
:
msg
(
msg
)
{}
explicit
OPush
(
const
uniset
::
TransportMessage
&
msg
)
:
msg
(
msg
)
{}
bool
operator
()(
const
std
::
shared_ptr
<
uniset
::
UniSetObject
>&
o
)
const
bool
operator
()(
const
std
::
shared_ptr
<
uniset
::
UniSetObject
>&
o
)
const
{
{
try
try
{
{
if
(
o
)
if
(
o
)
{
{
o
->
push
(
msg
);
o
->
push
(
msg
);
return
true
;
return
true
;
}
}
}
}
catch
(...)
{}
catch
(...)
{}
return
false
;
return
false
;
}
}
private
:
private
:
const
uniset
::
TransportMessage
&
msg
;
const
uniset
::
TransportMessage
&
msg
;
};
};
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetManager
::
UniSetManager
()
:
UniSetManager
::
UniSetManager
()
:
UniSetObject
(
uniset
::
DefaultObjectId
),
UniSetObject
(
uniset
::
DefaultObjectId
),
olistMutex
(
"UniSetManager_olistMutex"
),
olistMutex
(
"UniSetManager_olistMutex"
),
mlistMutex
(
"UniSetManager_mlistMutex"
)
mlistMutex
(
"UniSetManager_mlistMutex"
)
{
{
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetManager
::
UniSetManager
(
ObjectId
id
)
:
UniSetManager
::
UniSetManager
(
ObjectId
id
)
:
UniSetObject
(
id
)
UniSetObject
(
id
)
{
{
olistMutex
.
setName
(
myname
+
"_olistMutex"
);
olistMutex
.
setName
(
myname
+
"_olistMutex"
);
mlistMutex
.
setName
(
myname
+
"_mlistMutex"
);
mlistMutex
.
setName
(
myname
+
"_mlistMutex"
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetManager
::
UniSetManager
(
const
string
&
name
,
const
string
&
section
)
:
UniSetManager
::
UniSetManager
(
const
string
&
name
,
const
string
&
section
)
:
UniSetObject
(
name
,
section
)
UniSetObject
(
name
,
section
)
{
{
olistMutex
.
setName
(
myname
+
"_olistMutex"
);
olistMutex
.
setName
(
myname
+
"_olistMutex"
);
mlistMutex
.
setName
(
myname
+
"_mlistMutex"
);
mlistMutex
.
setName
(
myname
+
"_mlistMutex"
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetManager
::~
UniSetManager
()
UniSetManager
::~
UniSetManager
()
{
{
olist
.
clear
();
olist
.
clear
();
mlist
.
clear
();
mlist
.
clear
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
std
::
shared_ptr
<
UniSetManager
>
UniSetManager
::
get_mptr
()
std
::
shared_ptr
<
UniSetManager
>
UniSetManager
::
get_mptr
()
{
{
return
std
::
dynamic_pointer_cast
<
UniSetManager
>
(
get_ptr
());
return
std
::
dynamic_pointer_cast
<
UniSetManager
>
(
get_ptr
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetManager
::
initPOA
(
const
std
::
weak_ptr
<
UniSetManager
>&
rmngr
)
void
UniSetManager
::
initPOA
(
const
std
::
weak_ptr
<
UniSetManager
>&
rmngr
)
{
{
auto
m
=
rmngr
.
lock
();
auto
m
=
rmngr
.
lock
();
if
(
!
m
)
if
(
!
m
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(initPOA): failed weak_ptr !!"
;
err
<<
myname
<<
"(initPOA): failed weak_ptr !!"
;
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
if
(
CORBA
::
is_nil
(
pman
)
)
if
(
CORBA
::
is_nil
(
pman
)
)
this
->
pman
=
m
->
getPOAManager
();
this
->
pman
=
m
->
getPOAManager
();
PortableServer
::
POA_var
rpoa
=
m
->
getPOA
();
PortableServer
::
POA_var
rpoa
=
m
->
getPOA
();
if
(
rpoa
!=
poa
)
if
(
rpoa
!=
poa
)
poa
=
m
->
getPOA
();
poa
=
m
->
getPOA
();
if
(
CORBA
::
is_nil
(
poa
)
)
if
(
CORBA
::
is_nil
(
poa
)
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(initPOA): failed init poa "
;
err
<<
myname
<<
"(initPOA): failed init poa "
;
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
// Инициализация самого менеджера и его подобъектов
// Инициализация самого менеджера и его подобъектов
UniSetObject
::
init
(
rmngr
);
UniSetObject
::
init
(
rmngr
);
objects
(
initial
);
objects
(
initial
);
managers
(
initial
);
managers
(
initial
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetManager
::
add
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
bool
UniSetManager
::
add
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
{
{
auto
m
=
std
::
dynamic_pointer_cast
<
UniSetManager
>
(
obj
);
auto
m
=
std
::
dynamic_pointer_cast
<
UniSetManager
>
(
obj
);
if
(
m
)
if
(
m
)
return
addManager
(
m
);
return
addManager
(
m
);
return
addObject
(
obj
);
return
addObject
(
obj
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetManager
::
remove
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
bool
UniSetManager
::
remove
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
{
{
auto
m
=
std
::
dynamic_pointer_cast
<
UniSetManager
>
(
obj
);
auto
m
=
std
::
dynamic_pointer_cast
<
UniSetManager
>
(
obj
);
if
(
m
)
if
(
m
)
return
removeManager
(
m
);
return
removeManager
(
m
);
return
removeObject
(
obj
);
return
removeObject
(
obj
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetManager
::
addObject
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
bool
UniSetManager
::
addObject
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
{
{
{
{
//lock
//lock
uniset_rwmutex_wrlock
lock
(
olistMutex
);
uniset_rwmutex_wrlock
lock
(
olistMutex
);
auto
li
=
find
(
olist
.
begin
(),
olist
.
end
(),
obj
);
auto
li
=
find
(
olist
.
begin
(),
olist
.
end
(),
obj
);
if
(
li
==
olist
.
end
()
)
if
(
li
==
olist
.
end
()
)
{
{
uinfo
<<
myname
<<
"(activator): добавляем объект "
<<
obj
->
getName
()
<<
endl
;
uinfo
<<
myname
<<
"(activator): добавляем объект "
<<
obj
->
getName
()
<<
endl
;
olist
.
push_back
(
obj
);
olist
.
push_back
(
obj
);
}
}
}
// unlock
}
// unlock
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetManager
::
removeObject
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
bool
UniSetManager
::
removeObject
(
const
std
::
shared_ptr
<
UniSetObject
>&
obj
)
{
{
{
{
//lock
//lock
uniset_rwmutex_wrlock
lock
(
olistMutex
);
uniset_rwmutex_wrlock
lock
(
olistMutex
);
auto
li
=
find
(
olist
.
begin
(),
olist
.
end
(),
obj
);
auto
li
=
find
(
olist
.
begin
(),
olist
.
end
(),
obj
);
if
(
li
!=
olist
.
end
()
)
if
(
li
!=
olist
.
end
()
)
{
{
uinfo
<<
myname
<<
"(activator): удаляем объект "
<<
obj
->
getName
()
<<
endl
;
uinfo
<<
myname
<<
"(activator): удаляем объект "
<<
obj
->
getName
()
<<
endl
;
try
try
{
{
if
(
obj
)
if
(
obj
)
obj
->
deactivate
();
obj
->
deactivate
();
}
}
catch
(
const
CORBA
::
SystemException
&
ex
)
catch
(
const
CORBA
::
SystemException
&
ex
)
{
{
uwarn
<<
myname
<<
"(removeObject): поймали CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
uwarn
<<
myname
<<
"(removeObject): поймали CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(removeObject): CORBA::Exception"
<<
endl
;
uwarn
<<
myname
<<
"(removeObject): CORBA::Exception"
<<
endl
;
}
}
catch
(
const
omniORB
::
fatalException
&
fe
)
catch
(
const
omniORB
::
fatalException
&
fe
)
{
{
ucrit
<<
myname
<<
"(managers): Caught omniORB::fatalException:"
<<
endl
;
ucrit
<<
myname
<<
"(managers): Caught omniORB::fatalException:"
<<
endl
;
ucrit
<<
myname
<<
"(managers): file: "
<<
fe
.
file
()
ucrit
<<
myname
<<
"(managers): file: "
<<
fe
.
file
()
<<
" line: "
<<
fe
.
line
()
<<
" line: "
<<
fe
.
line
()
<<
" mesg: "
<<
fe
.
errmsg
()
<<
endl
;
<<
" mesg: "
<<
fe
.
errmsg
()
<<
endl
;
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(removeObject): "
<<
ex
<<
endl
;
uwarn
<<
myname
<<
"(removeObject): "
<<
ex
<<
endl
;
}
}
catch
(...)
{}
catch
(...)
{}
olist
.
erase
(
li
);
olist
.
erase
(
li
);
}
}
}
// unlock
}
// unlock
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
...
@@ -243,97 +243,97 @@ bool UniSetManager::removeObject( const std::shared_ptr<UniSetObject>& obj )
...
@@ -243,97 +243,97 @@ bool UniSetManager::removeObject( const std::shared_ptr<UniSetObject>& obj )
*/
*/
void
UniSetManager
::
managers
(
OManagerCommand
cmd
)
void
UniSetManager
::
managers
(
OManagerCommand
cmd
)
{
{
uinfo
<<
myname
<<
"(managers): mlist.size="
<<
mlist
.
size
()
<<
" cmd="
<<
cmd
<<
endl
;
uinfo
<<
myname
<<
"(managers): mlist.size="
<<
mlist
.
size
()
<<
" cmd="
<<
cmd
<<
endl
;
{
{
//lock
//lock
uniset_rwmutex_rlock
lock
(
mlistMutex
);
uniset_rwmutex_rlock
lock
(
mlistMutex
);
for
(
const
auto
&
li
:
mlist
)
for
(
const
auto
&
li
:
mlist
)
{
{
if
(
!
li
)
if
(
!
li
)
continue
;
continue
;
try
try
{
{
switch
(
cmd
)
switch
(
cmd
)
{
{
case
initial
:
case
initial
:
li
->
initPOA
(
get_mptr
()
);
li
->
initPOA
(
get_mptr
()
);
break
;
break
;
case
activ
:
case
activ
:
li
->
activate
();
li
->
activate
();
break
;
break
;
case
deactiv
:
case
deactiv
:
li
->
deactivate
();
li
->
deactivate
();
break
;
break
;
default
:
default
:
break
;
break
;
}
}
}
}
catch
(
const
CORBA
::
SystemException
&
ex
)
catch
(
const
CORBA
::
SystemException
&
ex
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(managers): поймали CORBA::SystemException:"
<<
ex
.
NP_minorString
();
err
<<
myname
<<
"(managers): поймали CORBA::SystemException:"
<<
ex
.
NP_minorString
();
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(managers): Caught CORBA::Exception. "
err
<<
myname
<<
"(managers): Caught CORBA::Exception. "
<<
ex
.
_name
()
<<
ex
.
_name
()
<<
" ("
<<
li
->
getName
()
<<
")"
;
<<
" ("
<<
li
->
getName
()
<<
")"
;
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
catch
(
const
omniORB
::
fatalException
&
fe
)
catch
(
const
omniORB
::
fatalException
&
fe
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(managers): Caught omniORB::fatalException:"
<<
endl
err
<<
myname
<<
"(managers): Caught omniORB::fatalException:"
<<
endl
<<
myname
<<
"(managers): file: "
<<
fe
.
file
()
<<
myname
<<
"(managers): file: "
<<
fe
.
file
()
<<
" line: "
<<
fe
.
line
()
<<
" line: "
<<
fe
.
line
()
<<
" mesg: "
<<
fe
.
errmsg
();
<<
" mesg: "
<<
fe
.
errmsg
();
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(managers): "
<<
ex
<<
endl
err
<<
myname
<<
"(managers): "
<<
ex
<<
endl
<<
" Не смог зарегистрировать (разрегистрировать) объект -->"
<<
" Не смог зарегистрировать (разрегистрировать) объект -->"
<<
li
->
getName
();
<<
li
->
getName
();
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
}
}
}
// unlock
}
// unlock
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
/*!
/*!
...
@@ -341,97 +341,97 @@ void UniSetManager::managers( OManagerCommand cmd )
...
@@ -341,97 +341,97 @@ void UniSetManager::managers( OManagerCommand cmd )
*/
*/
void
UniSetManager
::
objects
(
OManagerCommand
cmd
)
void
UniSetManager
::
objects
(
OManagerCommand
cmd
)
{
{
uinfo
<<
myname
<<
"(objects): olist.size="
uinfo
<<
myname
<<
"(objects): olist.size="
<<
olist
.
size
()
<<
" cmd="
<<
cmd
<<
endl
;
<<
olist
.
size
()
<<
" cmd="
<<
cmd
<<
endl
;
{
{
//lock
//lock
uniset_rwmutex_rlock
lock
(
olistMutex
);
uniset_rwmutex_rlock
lock
(
olistMutex
);
for
(
const
auto
&
li
:
olist
)
for
(
const
auto
&
li
:
olist
)
{
{
if
(
!
li
)
if
(
!
li
)
continue
;
continue
;
try
try
{
{
switch
(
cmd
)
switch
(
cmd
)
{
{
case
initial
:
case
initial
:
li
->
init
(
get_mptr
());
li
->
init
(
get_mptr
());
break
;
break
;
case
activ
:
case
activ
:
li
->
activate
();
li
->
activate
();
break
;
break
;
case
deactiv
:
case
deactiv
:
li
->
deactivate
();
li
->
deactivate
();
break
;
break
;
default
:
default
:
break
;
break
;
}
}
}
}
catch
(
const
CORBA
::
SystemException
&
ex
)
catch
(
const
CORBA
::
SystemException
&
ex
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(objects): поймали CORBA::SystemException:"
<<
ex
.
NP_minorString
();
err
<<
myname
<<
"(objects): поймали CORBA::SystemException:"
<<
ex
.
NP_minorString
();
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(objects): Caught CORBA::Exception. "
err
<<
myname
<<
"(objects): Caught CORBA::Exception. "
<<
ex
.
_name
()
<<
ex
.
_name
()
<<
" ("
<<
li
->
getName
()
<<
")"
;
<<
" ("
<<
li
->
getName
()
<<
")"
;
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
catch
(
const
omniORB
::
fatalException
&
fe
)
catch
(
const
omniORB
::
fatalException
&
fe
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(objects): Caught omniORB::fatalException:"
<<
endl
;
err
<<
myname
<<
"(objects): Caught omniORB::fatalException:"
<<
endl
;
err
<<
myname
<<
"(objects): file: "
<<
fe
.
file
()
err
<<
myname
<<
"(objects): file: "
<<
fe
.
file
()
<<
" line: "
<<
fe
.
line
()
<<
" line: "
<<
fe
.
line
()
<<
" mesg: "
<<
fe
.
errmsg
()
<<
endl
;
<<
" mesg: "
<<
fe
.
errmsg
()
<<
endl
;
ucrit
<<
err
.
str
();
ucrit
<<
err
.
str
();
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(objects): "
<<
ex
<<
endl
;
err
<<
myname
<<
"(objects): "
<<
ex
<<
endl
;
err
<<
myname
<<
"(objects): не смог зарегистрировать (разрегистрировать) объект -->"
<<
li
->
getName
()
<<
endl
;
err
<<
myname
<<
"(objects): не смог зарегистрировать (разрегистрировать) объект -->"
<<
li
->
getName
()
<<
endl
;
ucrit
<<
err
.
str
();
ucrit
<<
err
.
str
();
if
(
cmd
==
activ
)
if
(
cmd
==
activ
)
{
{
cerr
<<
err
.
str
();
cerr
<<
err
.
str
();
std
::
terminate
();
std
::
terminate
();
}
}
}
}
}
}
}
// unlock
}
// unlock
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
/*!
/*!
...
@@ -440,11 +440,11 @@ void UniSetManager::objects(OManagerCommand cmd)
...
@@ -440,11 +440,11 @@ void UniSetManager::objects(OManagerCommand cmd)
*/
*/
bool
UniSetManager
::
activateObject
()
bool
UniSetManager
::
activateObject
()
{
{
uinfo
<<
myname
<<
"(activateObjects): активизирую объекты"
<<
endl
;
uinfo
<<
myname
<<
"(activateObjects): активизирую объекты"
<<
endl
;
UniSetObject
::
activateObject
();
UniSetObject
::
activateObject
();
managers
(
activ
);
managers
(
activ
);
objects
(
activ
);
objects
(
activ
);
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
/*!
/*!
...
@@ -453,261 +453,261 @@ bool UniSetManager::activateObject()
...
@@ -453,261 +453,261 @@ bool UniSetManager::activateObject()
*/
*/
bool
UniSetManager
::
deactivateObject
()
bool
UniSetManager
::
deactivateObject
()
{
{
uinfo
<<
myname
<<
"(deactivateObjects): деактивизирую объекты"
<<
endl
;
uinfo
<<
myname
<<
"(deactivateObjects): деактивизирую объекты"
<<
endl
;
// именно в такой последовательности!
// именно в такой последовательности!
objects
(
deactiv
);
objects
(
deactiv
);
managers
(
deactiv
);
managers
(
deactiv
);
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
const
std
::
shared_ptr
<
UniSetObject
>
UniSetManager
::
findObject
(
const
string
&
name
)
const
const
std
::
shared_ptr
<
UniSetObject
>
UniSetManager
::
findObject
(
const
string
&
name
)
const
{
{
uniset_rwmutex_rlock
lock
(
olistMutex
);
uniset_rwmutex_rlock
lock
(
olistMutex
);
for
(
auto
&&
o
:
olist
)
for
(
auto
&&
o
:
olist
)
{
{
if
(
o
->
getName
()
==
name
)
if
(
o
->
getName
()
==
name
)
return
o
;
return
o
;
}
}
return
nullptr
;
return
nullptr
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
const
std
::
shared_ptr
<
UniSetManager
>
UniSetManager
::
findManager
(
const
string
&
name
)
const
const
std
::
shared_ptr
<
UniSetManager
>
UniSetManager
::
findManager
(
const
string
&
name
)
const
{
{
uniset_rwmutex_rlock
lock
(
mlistMutex
);
uniset_rwmutex_rlock
lock
(
mlistMutex
);
for
(
auto
&&
m
:
mlist
)
for
(
auto
&&
m
:
mlist
)
{
{
if
(
m
->
getName
()
==
name
)
if
(
m
->
getName
()
==
name
)
return
m
;
return
m
;
}
}
return
nullptr
;
return
nullptr
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
const
std
::
shared_ptr
<
UniSetObject
>
UniSetManager
::
deepFindObject
(
const
string
&
name
)
const
const
std
::
shared_ptr
<
UniSetObject
>
UniSetManager
::
deepFindObject
(
const
string
&
name
)
const
{
{
{
{
auto
obj
=
findObject
(
name
);
auto
obj
=
findObject
(
name
);
if
(
obj
)
if
(
obj
)
return
obj
;
return
obj
;
}
}
auto
man
=
findManager
(
name
);
auto
man
=
findManager
(
name
);
if
(
man
)
if
(
man
)
{
{
auto
obj
=
dynamic_pointer_cast
<
UniSetObject
>
(
man
);
auto
obj
=
dynamic_pointer_cast
<
UniSetObject
>
(
man
);
return
obj
;
return
obj
;
}
}
// ищем в глубину у каждого менеджера
// ищем в глубину у каждого менеджера
for
(
const
auto
&
m
:
mlist
)
for
(
const
auto
&
m
:
mlist
)
{
{
auto
obj
=
m
->
deepFindObject
(
name
);
auto
obj
=
m
->
deepFindObject
(
name
);
if
(
obj
)
if
(
obj
)
return
obj
;
return
obj
;
}
}
return
nullptr
;
return
nullptr
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetManager
::
getAllObjectsList
(
std
::
vector
<
std
::
shared_ptr
<
UniSetObject
>
>&
vec
,
size_t
lim
)
void
UniSetManager
::
getAllObjectsList
(
std
::
vector
<
std
::
shared_ptr
<
UniSetObject
>
>&
vec
,
size_t
lim
)
{
{
// добавить себя
// добавить себя
vec
.
push_back
(
get_ptr
());
vec
.
push_back
(
get_ptr
());
// добавить подчинённые объекты
// добавить подчинённые объекты
for
(
const
auto
&
o
:
olist
)
for
(
const
auto
&
o
:
olist
)
{
{
vec
.
push_back
(
o
);
vec
.
push_back
(
o
);
if
(
lim
>
0
&&
vec
.
size
()
>=
lim
)
if
(
lim
>
0
&&
vec
.
size
()
>=
lim
)
return
;
return
;
}
}
// добавить рекурсивно по менеджерам
// добавить рекурсивно по менеджерам
for
(
const
auto
&
m
:
mlist
)
for
(
const
auto
&
m
:
mlist
)
{
{
// вызываем рекурсивно
// вызываем рекурсивно
m
->
getAllObjectsList
(
vec
,
lim
);
m
->
getAllObjectsList
(
vec
,
lim
);
}
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetManager
::
broadcast
(
const
TransportMessage
&
msg
)
void
UniSetManager
::
broadcast
(
const
TransportMessage
&
msg
)
{
{
// себя не забыть...
// себя не забыть...
// push(msg);
// push(msg);
// Всем объектам...
// Всем объектам...
{
{
//lock
//lock
uniset_rwmutex_rlock
lock
(
olistMutex
);
uniset_rwmutex_rlock
lock
(
olistMutex
);
for_each
(
olist
.
begin
(),
olist
.
end
(),
OPush
(
msg
));
// STL метод
for_each
(
olist
.
begin
(),
olist
.
end
(),
OPush
(
msg
));
// STL метод
}
// unlock
}
// unlock
// Всем менеджерам....
// Всем менеджерам....
{
{
//lock
//lock
uniset_rwmutex_rlock
lock
(
mlistMutex
);
uniset_rwmutex_rlock
lock
(
mlistMutex
);
for_each
(
mlist
.
begin
(),
mlist
.
end
(),
MPush
(
msg
));
// STL метод
for_each
(
mlist
.
begin
(),
mlist
.
end
(),
MPush
(
msg
));
// STL метод
}
// unlock
}
// unlock
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetManager
::
addManager
(
const
std
::
shared_ptr
<
UniSetManager
>&
child
)
bool
UniSetManager
::
addManager
(
const
std
::
shared_ptr
<
UniSetManager
>&
child
)
{
{
{
{
//lock
//lock
uniset_rwmutex_wrlock
lock
(
mlistMutex
);
uniset_rwmutex_wrlock
lock
(
mlistMutex
);
// Проверка на совпадение
// Проверка на совпадение
auto
it
=
find
(
mlist
.
begin
(),
mlist
.
end
(),
child
);
auto
it
=
find
(
mlist
.
begin
(),
mlist
.
end
(),
child
);
if
(
it
==
mlist
.
end
()
)
if
(
it
==
mlist
.
end
()
)
{
{
mlist
.
push_back
(
child
);
mlist
.
push_back
(
child
);
uinfo
<<
myname
<<
": добавляем менеджер "
<<
child
->
getName
()
<<
endl
;
uinfo
<<
myname
<<
": добавляем менеджер "
<<
child
->
getName
()
<<
endl
;
}
}
else
else
uwarn
<<
myname
<<
": попытка повторного добавления объекта "
<<
child
->
getName
()
<<
endl
;
uwarn
<<
myname
<<
": попытка повторного добавления объекта "
<<
child
->
getName
()
<<
endl
;
}
// unlock
}
// unlock
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetManager
::
removeManager
(
const
std
::
shared_ptr
<
UniSetManager
>&
child
)
bool
UniSetManager
::
removeManager
(
const
std
::
shared_ptr
<
UniSetManager
>&
child
)
{
{
{
{
//lock
//lock
uniset_rwmutex_wrlock
lock
(
mlistMutex
);
uniset_rwmutex_wrlock
lock
(
mlistMutex
);
mlist
.
remove
(
child
);
mlist
.
remove
(
child
);
}
// unlock
}
// unlock
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
int
UniSetManager
::
getObjectsInfo
(
const
std
::
shared_ptr
<
UniSetManager
>&
mngr
,
SimpleInfoSeq
*
seq
,
int
UniSetManager
::
getObjectsInfo
(
const
std
::
shared_ptr
<
UniSetManager
>&
mngr
,
SimpleInfoSeq
*
seq
,
int
begin
,
const
long
uplimit
,
const
char
*
userparam
)
int
begin
,
const
long
uplimit
,
const
char
*
userparam
)
{
{
auto
ind
=
begin
;
auto
ind
=
begin
;
// получаем у самого менеджера
// получаем у самого менеджера
SimpleInfo_var
msi
=
mngr
->
getInfo
(
userparam
);
SimpleInfo_var
msi
=
mngr
->
getInfo
(
userparam
);
(
*
seq
)[
ind
]
=
msi
;
(
*
seq
)[
ind
]
=
msi
;
ind
++
;
ind
++
;
if
(
ind
>
uplimit
)
if
(
ind
>
uplimit
)
return
ind
;
return
ind
;
for
(
const
auto
&
o
:
olist
)
for
(
const
auto
&
o
:
olist
)
{
{
try
try
{
{
SimpleInfo_var
si
=
o
->
getInfo
(
userparam
);
SimpleInfo_var
si
=
o
->
getInfo
(
userparam
);
(
*
seq
)[
ind
]
=
si
;
(
*
seq
)[
ind
]
=
si
;
ind
++
;
ind
++
;
if
(
ind
>
uplimit
)
if
(
ind
>
uplimit
)
break
;
break
;
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(getObjectsInfo): CORBA::Exception"
<<
endl
;
uwarn
<<
myname
<<
"(getObjectsInfo): CORBA::Exception"
<<
endl
;
}
}
catch
(...)
catch
(...)
{
{
uwarn
<<
myname
<<
"(getObjectsInfo): не смог получить у объекта "
uwarn
<<
myname
<<
"(getObjectsInfo): не смог получить у объекта "
<<
uniset_conf
()
->
oind
->
getNameById
(
o
->
getId
()
)
<<
" информацию"
<<
endl
;
<<
uniset_conf
()
->
oind
->
getNameById
(
o
->
getId
()
)
<<
" информацию"
<<
endl
;
}
}
}
}
if
(
ind
>
uplimit
)
if
(
ind
>
uplimit
)
return
ind
;
return
ind
;
// а далее у его менеджеров (рекурсивно)
// а далее у его менеджеров (рекурсивно)
for
(
const
auto
&
m
:
mlist
)
for
(
const
auto
&
m
:
mlist
)
{
{
ind
=
getObjectsInfo
(
m
,
seq
,
ind
,
uplimit
,
userparam
);
ind
=
getObjectsInfo
(
m
,
seq
,
ind
,
uplimit
,
userparam
);
if
(
ind
>
uplimit
)
if
(
ind
>
uplimit
)
break
;
break
;
}
}
return
ind
;
return
ind
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
SimpleInfoSeq
*
UniSetManager
::
getObjectsInfo
(
CORBA
::
Long
maxlength
,
const
char
*
userparam
)
SimpleInfoSeq
*
UniSetManager
::
getObjectsInfo
(
CORBA
::
Long
maxlength
,
const
char
*
userparam
)
{
{
SimpleInfoSeq
*
res
=
new
SimpleInfoSeq
();
// ЗА ОСВОБОЖДЕНИЕ ПАМЯТИ ОТВЕЧАЕТ КЛИЕНТ!!!!!!
SimpleInfoSeq
*
res
=
new
SimpleInfoSeq
();
// ЗА ОСВОБОЖДЕНИЕ ПАМЯТИ ОТВЕЧАЕТ КЛИЕНТ!!!!!!
// поэтому ему лучше пользоваться при получении _var-классом
// поэтому ему лучше пользоваться при получении _var-классом
int
length
=
objectsCount
()
+
1
;
int
length
=
objectsCount
()
+
1
;
if
(
length
>=
maxlength
)
if
(
length
>=
maxlength
)
length
=
maxlength
;
length
=
maxlength
;
res
->
length
(
length
);
res
->
length
(
length
);
// используем рекурсивную функцию
// используем рекурсивную функцию
int
ind
=
0
;
int
ind
=
0
;
const
int
limit
=
length
;
const
int
limit
=
length
;
(
void
)
getObjectsInfo
(
get_mptr
(),
res
,
ind
,
limit
,
userparam
);
(
void
)
getObjectsInfo
(
get_mptr
(),
res
,
ind
,
limit
,
userparam
);
return
res
;
return
res
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetManager
::
apply_for_objects
(
OFunction
f
)
void
UniSetManager
::
apply_for_objects
(
OFunction
f
)
{
{
for
(
const
auto
&
o
:
olist
)
for
(
const
auto
&
o
:
olist
)
f
(
o
);
f
(
o
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetManager
::
apply_for_managers
(
UniSetManager
::
MFunction
f
)
void
UniSetManager
::
apply_for_managers
(
UniSetManager
::
MFunction
f
)
{
{
for
(
const
auto
&
m
:
mlist
)
for
(
const
auto
&
m
:
mlist
)
f
(
m
);
f
(
m
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
size_t
UniSetManager
::
objectsCount
()
const
size_t
UniSetManager
::
objectsCount
()
const
{
{
size_t
res
=
olist
.
size
()
+
mlist
.
size
();
size_t
res
=
olist
.
size
()
+
mlist
.
size
();
for
(
const
auto
&
i
:
mlist
)
for
(
const
auto
&
i
:
mlist
)
res
+=
i
->
objectsCount
();
res
+=
i
->
objectsCount
();
return
res
;
return
res
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
PortableServer
::
POA_ptr
UniSetManager
::
getPOA
()
PortableServer
::
POA_ptr
UniSetManager
::
getPOA
()
{
{
return
PortableServer
::
POA
::
_duplicate
(
poa
);
return
PortableServer
::
POA
::
_duplicate
(
poa
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
PortableServer
::
POAManager_ptr
UniSetManager
::
getPOAManager
()
PortableServer
::
POAManager_ptr
UniSetManager
::
getPOAManager
()
{
{
return
PortableServer
::
POAManager
::
_duplicate
(
pman
);
return
PortableServer
::
POAManager
::
_duplicate
(
pman
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
std
::
ostream
&
uniset
::
operator
<<
(
std
::
ostream
&
os
,
uniset
::
UniSetManager
::
OManagerCommand
&
cmd
)
std
::
ostream
&
uniset
::
operator
<<
(
std
::
ostream
&
os
,
uniset
::
UniSetManager
::
OManagerCommand
&
cmd
)
{
{
// { deactiv, activ, initial, term };
// { deactiv, activ, initial, term };
if
(
cmd
==
uniset
::
UniSetManager
::
deactiv
)
if
(
cmd
==
uniset
::
UniSetManager
::
deactiv
)
return
os
<<
"deactivate"
;
return
os
<<
"deactivate"
;
if
(
cmd
==
uniset
::
UniSetManager
::
activ
)
if
(
cmd
==
uniset
::
UniSetManager
::
activ
)
return
os
<<
"activate"
;
return
os
<<
"activate"
;
if
(
cmd
==
uniset
::
UniSetManager
::
initial
)
if
(
cmd
==
uniset
::
UniSetManager
::
initial
)
return
os
<<
"init"
;
return
os
<<
"init"
;
return
os
<<
"unkwnown"
;
return
os
<<
"unkwnown"
;
}
}
src/Core/UniSetObject.cc
View file @
9674dd51
...
@@ -45,1090 +45,1090 @@ namespace uniset
...
@@ -45,1090 +45,1090 @@ namespace uniset
{
{
#define CREATE_TIMER unisetstd::make_unique<PassiveCondTimer>();
#define CREATE_TIMER unisetstd::make_unique<PassiveCondTimer>();
// new PassiveSysTimer();
// new PassiveSysTimer();
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetObject
::
UniSetObject
()
:
UniSetObject
::
UniSetObject
()
:
msgpid
(
0
),
msgpid
(
0
),
regOK
(
false
),
regOK
(
false
),
active
(
0
),
active
(
0
),
threadcreate
(
false
),
threadcreate
(
false
),
myid
(
uniset
::
DefaultObjectId
),
myid
(
uniset
::
DefaultObjectId
),
oref
(
0
)
oref
(
0
)
{
{
ui
=
make_shared
<
UInterface
>
(
uniset
::
DefaultObjectId
);
ui
=
make_shared
<
UInterface
>
(
uniset
::
DefaultObjectId
);
tmr
=
CREATE_TIMER
;
tmr
=
CREATE_TIMER
;
myname
=
"noname"
;
myname
=
"noname"
;
initObject
();
initObject
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetObject
::
UniSetObject
(
ObjectId
id
)
:
UniSetObject
::
UniSetObject
(
ObjectId
id
)
:
msgpid
(
0
),
msgpid
(
0
),
regOK
(
false
),
regOK
(
false
),
active
(
0
),
active
(
0
),
threadcreate
(
true
),
threadcreate
(
true
),
myid
(
id
),
myid
(
id
),
oref
(
0
)
oref
(
0
)
{
{
ui
=
make_shared
<
UInterface
>
(
id
);
ui
=
make_shared
<
UInterface
>
(
id
);
tmr
=
CREATE_TIMER
;
tmr
=
CREATE_TIMER
;
if
(
myid
!=
DefaultObjectId
)
if
(
myid
!=
DefaultObjectId
)
setID
(
id
);
setID
(
id
);
else
else
{
{
threadcreate
=
false
;
threadcreate
=
false
;
myname
=
"UnknownUniSetObject"
;
myname
=
"UnknownUniSetObject"
;
}
}
initObject
();
initObject
();
}
}
UniSetObject
::
UniSetObject
(
const
string
&
name
,
const
string
&
section
)
:
UniSetObject
::
UniSetObject
(
const
string
&
name
,
const
string
&
section
)
:
msgpid
(
0
),
msgpid
(
0
),
regOK
(
false
),
regOK
(
false
),
active
(
0
),
active
(
0
),
threadcreate
(
true
),
threadcreate
(
true
),
myid
(
uniset
::
DefaultObjectId
),
myid
(
uniset
::
DefaultObjectId
),
oref
(
0
)
oref
(
0
)
{
{
ui
=
make_shared
<
UInterface
>
(
uniset
::
DefaultObjectId
);
ui
=
make_shared
<
UInterface
>
(
uniset
::
DefaultObjectId
);
/*! \warning UniversalInterface не инициализируется идентификатором объекта */
/*! \warning UniversalInterface не инициализируется идентификатором объекта */
tmr
=
CREATE_TIMER
;
tmr
=
CREATE_TIMER
;
myname
=
section
+
"/"
+
name
;
myname
=
section
+
"/"
+
name
;
myid
=
ui
->
getIdByName
(
myname
);
myid
=
ui
->
getIdByName
(
myname
);
setID
(
myid
);
setID
(
myid
);
initObject
();
initObject
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
UniSetObject
::~
UniSetObject
()
UniSetObject
::~
UniSetObject
()
{
{
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
std
::
shared_ptr
<
UniSetObject
>
UniSetObject
::
get_ptr
()
std
::
shared_ptr
<
UniSetObject
>
UniSetObject
::
get_ptr
()
{
{
return
shared_from_this
();
return
shared_from_this
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
initObject
()
void
UniSetObject
::
initObject
()
{
{
//
a_working = ATOMIC_VAR_INIT(0);
//
a_working = ATOMIC_VAR_INIT(0);
active
=
ATOMIC_VAR_INIT
(
0
);
active
=
ATOMIC_VAR_INIT
(
0
);
refmutex
.
setName
(
myname
+
"_refmutex"
);
refmutex
.
setName
(
myname
+
"_refmutex"
);
auto
conf
=
uniset_conf
();
auto
conf
=
uniset_conf
();
if
(
!
conf
)
if
(
!
conf
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(initObject): Unknown configuration!!"
;
err
<<
myname
<<
"(initObject): Unknown configuration!!"
;
throw
SystemError
(
err
.
str
());
throw
SystemError
(
err
.
str
());
}
}
int
sz
=
conf
->
getArgPInt
(
"--uniset-object-size-message-queue"
,
conf
->
getField
(
"SizeOfMessageQueue"
),
1000
);
int
sz
=
conf
->
getArgPInt
(
"--uniset-object-size-message-queue"
,
conf
->
getField
(
"SizeOfMessageQueue"
),
1000
);
if
(
sz
>
0
)
if
(
sz
>
0
)
setMaxSizeOfMessageQueue
(
sz
);
setMaxSizeOfMessageQueue
(
sz
);
uinfo
<<
myname
<<
"(init): SizeOfMessageQueue="
<<
getMaxSizeOfMessageQueue
()
<<
endl
;
uinfo
<<
myname
<<
"(init): SizeOfMessageQueue="
<<
getMaxSizeOfMessageQueue
()
<<
endl
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
/*!
/*!
* \param om - указатель на менеджер, управляющий объектом
* \param om - указатель на менеджер, управляющий объектом
* \return Возвращает \a true если инициализация прошла успешно, и \a false если нет
* \return Возвращает \a true если инициализация прошла успешно, и \a false если нет
*/
*/
bool
UniSetObject
::
init
(
const
std
::
weak_ptr
<
UniSetManager
>&
om
)
bool
UniSetObject
::
init
(
const
std
::
weak_ptr
<
UniSetManager
>&
om
)
{
{
uinfo
<<
myname
<<
": init..."
<<
endl
;
uinfo
<<
myname
<<
": init..."
<<
endl
;
this
->
mymngr
=
om
;
this
->
mymngr
=
om
;
uinfo
<<
myname
<<
": init ok..."
<<
endl
;
uinfo
<<
myname
<<
": init ok..."
<<
endl
;
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
setID
(
uniset
::
ObjectId
id
)
void
UniSetObject
::
setID
(
uniset
::
ObjectId
id
)
{
{
if
(
isActive
()
)
if
(
isActive
()
)
throw
ObjectNameAlready
(
"Set ID error: ObjectId is active.."
);
throw
ObjectNameAlready
(
"Set ID error: ObjectId is active.."
);
string
myfullname
=
ui
->
getNameById
(
id
);
string
myfullname
=
ui
->
getNameById
(
id
);
myname
=
ORepHelpers
::
getShortName
(
myfullname
);
myname
=
ORepHelpers
::
getShortName
(
myfullname
);
myid
=
id
;
myid
=
id
;
ui
->
initBackId
(
myid
);
ui
->
initBackId
(
myid
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
setMaxSizeOfMessageQueue
(
size_t
s
)
void
UniSetObject
::
setMaxSizeOfMessageQueue
(
size_t
s
)
{
{
mqueueMedium
.
setMaxSizeOfMessageQueue
(
s
);
mqueueMedium
.
setMaxSizeOfMessageQueue
(
s
);
mqueueLow
.
setMaxSizeOfMessageQueue
(
s
);
mqueueLow
.
setMaxSizeOfMessageQueue
(
s
);
mqueueHi
.
setMaxSizeOfMessageQueue
(
s
);
mqueueHi
.
setMaxSizeOfMessageQueue
(
s
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
size_t
UniSetObject
::
getMaxSizeOfMessageQueue
()
const
size_t
UniSetObject
::
getMaxSizeOfMessageQueue
()
const
{
{
return
mqueueMedium
.
getMaxSizeOfMessageQueue
();
return
mqueueMedium
.
getMaxSizeOfMessageQueue
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetObject
::
isActive
()
const
bool
UniSetObject
::
isActive
()
const
{
{
return
active
;
return
active
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
setActive
(
bool
set
)
void
UniSetObject
::
setActive
(
bool
set
)
{
{
active
=
set
;
active
=
set
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
/*!
/*!
* \param vm - указатель на структуру, которая заполняется, если есть сообщение
* \param vm - указатель на структуру, которая заполняется, если есть сообщение
* \return Возвращает указатель VoidMessagePtr если сообщение есть, и shared_ptr(nullptr) если нет
* \return Возвращает указатель VoidMessagePtr если сообщение есть, и shared_ptr(nullptr) если нет
*/
*/
VoidMessagePtr
UniSetObject
::
receiveMessage
()
VoidMessagePtr
UniSetObject
::
receiveMessage
()
{
{
if
(
!
mqueueHi
.
empty
()
)
if
(
!
mqueueHi
.
empty
()
)
return
mqueueHi
.
top
();
return
mqueueHi
.
top
();
if
(
!
mqueueMedium
.
empty
()
)
if
(
!
mqueueMedium
.
empty
()
)
return
mqueueMedium
.
top
();
return
mqueueMedium
.
top
();
return
mqueueLow
.
top
();
return
mqueueLow
.
top
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
VoidMessagePtr
UniSetObject
::
waitMessage
(
timeout_t
timeMS
)
VoidMessagePtr
UniSetObject
::
waitMessage
(
timeout_t
timeMS
)
{
{
auto
m
=
receiveMessage
();
auto
m
=
receiveMessage
();
if
(
m
)
if
(
m
)
return
m
;
return
m
;
tmr
->
wait
(
timeMS
);
tmr
->
wait
(
timeMS
);
return
receiveMessage
();
return
receiveMessage
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
registration
()
void
UniSetObject
::
registration
()
{
{
ulogrep
<<
myname
<<
": registration..."
<<
endl
;
ulogrep
<<
myname
<<
": registration..."
<<
endl
;
if
(
myid
==
uniset
::
DefaultObjectId
)
if
(
myid
==
uniset
::
DefaultObjectId
)
{
{
ulogrep
<<
myname
<<
"(registration): Don`t registration. myid=DefaultObjectId
\n
"
;
ulogrep
<<
myname
<<
"(registration): Don`t registration. myid=DefaultObjectId
\n
"
;
return
;
return
;
}
}
auto
m
=
mymngr
.
lock
();
auto
m
=
mymngr
.
lock
();
if
(
!
m
)
if
(
!
m
)
{
{
uwarn
<<
myname
<<
"(registration): unknown my manager"
<<
endl
;
uwarn
<<
myname
<<
"(registration): unknown my manager"
<<
endl
;
string
err
(
myname
+
": unknown my manager"
);
string
err
(
myname
+
": unknown my manager"
);
throw
ORepFailed
(
err
);
throw
ORepFailed
(
err
);
}
}
{
{
uniset
::
uniset_rwmutex_rlock
lock
(
refmutex
);
uniset
::
uniset_rwmutex_rlock
lock
(
refmutex
);
if
(
!
oref
)
if
(
!
oref
)
{
{
uwarn
<<
myname
<<
"(registration): oref is NULL!..."
<<
endl
;
uwarn
<<
myname
<<
"(registration): oref is NULL!..."
<<
endl
;
return
;
return
;
}
}
}
}
auto
conf
=
uniset_conf
();
auto
conf
=
uniset_conf
();
regOK
=
false
;
regOK
=
false
;
for
(
size_t
i
=
0
;
i
<
conf
->
getRepeatCount
();
i
++
)
for
(
size_t
i
=
0
;
i
<
conf
->
getRepeatCount
();
i
++
)
{
{
try
try
{
{
ui
->
registered
(
myid
,
getRef
(),
true
);
ui
->
registered
(
myid
,
getRef
(),
true
);
regOK
=
true
;
regOK
=
true
;
break
;
break
;
}
}
catch
(
ObjectNameAlready
&
al
)
catch
(
ObjectNameAlready
&
al
)
{
{
/*!
/*!
\warning По умолчанию объекты должны быть уникальны! Поэтому если идёт попытка повторной регистрации.
\warning По умолчанию объекты должны быть уникальны! Поэтому если идёт попытка повторной регистрации.
Мы чистим существующую ссылку и заменяем её на новую.
Мы чистим существующую ссылку и заменяем её на новую.
Это сделано для более надёжной работы, иначе может получится, что если объект перед завершением
Это сделано для более надёжной работы, иначе может получится, что если объект перед завершением
не очистил за собой ссылку (не разрегистрировался), то больше он никогда не сможет вновь зарегистрироваться.
не очистил за собой ссылку (не разрегистрировался), то больше он никогда не сможет вновь зарегистрироваться.
Т.к. \b надёжной функции проверки "жив" ли объект пока нет...
Т.к. \b надёжной функции проверки "жив" ли объект пока нет...
(так бы можно было проверить и если "не жив", то смело заменять ссылку на новую). Но существует обратная сторона:
(так бы можно было проверить и если "не жив", то смело заменять ссылку на новую). Но существует обратная сторона:
если заменяемый объект "жив" и завершит свою работу, то он может почистить за собой ссылку и это тогда наш (новый)
если заменяемый объект "жив" и завершит свою работу, то он может почистить за собой ссылку и это тогда наш (новый)
объект станет недоступен другим, а знать об этом не будет!!!
объект станет недоступен другим, а знать об этом не будет!!!
*/
*/
uwarn
<<
myname
<<
"(registration): replace object (ObjectNameAlready)"
<<
endl
;
uwarn
<<
myname
<<
"(registration): replace object (ObjectNameAlready)"
<<
endl
;
unregistration
();
unregistration
();
}
}
catch
(
const
uniset
::
ORepFailed
&
ex
)
catch
(
const
uniset
::
ORepFailed
&
ex
)
{
{
uwarn
<<
myname
<<
"(registration): don`t registration in object reposotory "
<<
endl
;
uwarn
<<
myname
<<
"(registration): don`t registration in object reposotory "
<<
endl
;
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(registration): "
<<
ex
<<
endl
;
uwarn
<<
myname
<<
"(registration): "
<<
ex
<<
endl
;
}
}
msleep
(
conf
->
getRepeatTimeout
());
msleep
(
conf
->
getRepeatTimeout
());
}
}
if
(
!
regOK
)
if
(
!
regOK
)
{
{
string
err
(
myname
+
"(registration): don`t registration in object reposotory"
);
string
err
(
myname
+
"(registration): don`t registration in object reposotory"
);
ucrit
<<
err
<<
endl
;
ucrit
<<
err
<<
endl
;
throw
ORepFailed
(
err
);
throw
ORepFailed
(
err
);
}
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
unregistration
()
void
UniSetObject
::
unregistration
()
{
{
if
(
myid
<
0
)
// || !reg )
if
(
myid
<
0
)
// || !reg )
{
{
regOK
=
false
;
regOK
=
false
;
return
;
return
;
}
}
if
(
myid
==
uniset
::
DefaultObjectId
)
// -V547
if
(
myid
==
uniset
::
DefaultObjectId
)
// -V547
{
{
uinfo
<<
myname
<<
"(unregister): myid=DefaultObjectId
\n
"
;
uinfo
<<
myname
<<
"(unregister): myid=DefaultObjectId
\n
"
;
regOK
=
false
;
regOK
=
false
;
return
;
return
;
}
}
{
{
uniset
::
uniset_rwmutex_rlock
lock
(
refmutex
);
uniset
::
uniset_rwmutex_rlock
lock
(
refmutex
);
if
(
!
oref
)
if
(
!
oref
)
{
{
uwarn
<<
myname
<<
"(unregister): oref NULL!"
<<
endl
;
uwarn
<<
myname
<<
"(unregister): oref NULL!"
<<
endl
;
regOK
=
false
;
regOK
=
false
;
return
;
return
;
}
}
}
}
try
try
{
{
uinfo
<<
myname
<<
": unregister "
<<
endl
;
uinfo
<<
myname
<<
": unregister "
<<
endl
;
ui
->
unregister
(
myid
);
ui
->
unregister
(
myid
);
uinfo
<<
myname
<<
": unregister ok. "
<<
endl
;
uinfo
<<
myname
<<
": unregister ok. "
<<
endl
;
}
}
catch
(...)
catch
(...)
{
{
std
::
exception_ptr
p
=
std
::
current_exception
();
std
::
exception_ptr
p
=
std
::
current_exception
();
uwarn
<<
myname
<<
": don`t registration in object repository"
uwarn
<<
myname
<<
": don`t registration in object repository"
<<
" err: "
<<
(
p
?
p
.
__cxa_exception_type
()
->
name
()
:
"unknown"
)
<<
" err: "
<<
(
p
?
p
.
__cxa_exception_type
()
->
name
()
:
"unknown"
)
<<
endl
;
<<
endl
;
}
}
regOK
=
false
;
regOK
=
false
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
waitFinish
()
void
UniSetObject
::
waitFinish
()
{
{
// поток завершаем в конце, после пользовательских deactivateObject()
// поток завершаем в конце, после пользовательских deactivateObject()
if
(
!
thr
)
if
(
!
thr
)
return
;
return
;
std
::
unique_lock
<
std
::
mutex
>
lk
(
m_working
);
std
::
unique_lock
<
std
::
mutex
>
lk
(
m_working
);
// cv_working.wait_for(lk, std::chrono::milliseconds(workingTerminateTimeout), [&](){ return (a_working == false); } );
// cv_working.wait_for(lk, std::chrono::milliseconds(workingTerminateTimeout), [&](){ return (a_working == false); } );
cv_working
.
wait
(
lk
,
[
=
]()
cv_working
.
wait
(
lk
,
[
=
]()
{
{
return
a_working
==
false
;
return
a_working
==
false
;
});
});
if
(
thr
->
isRunning
()
)
if
(
thr
->
isRunning
()
)
thr
->
join
();
thr
->
join
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
CORBA
::
Boolean
UniSetObject
::
exist
()
CORBA
::
Boolean
UniSetObject
::
exist
()
{
{
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
ObjectId
UniSetObject
::
getId
()
ObjectId
UniSetObject
::
getId
()
{
{
return
myid
;
return
myid
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
const
ObjectId
UniSetObject
::
getId
()
const
const
ObjectId
UniSetObject
::
getId
()
const
{
{
return
myid
;
return
myid
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
string
UniSetObject
::
getName
()
const
string
UniSetObject
::
getName
()
const
{
{
return
myname
;
return
myname
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
const
string
UniSetObject
::
getStrType
()
const
string
UniSetObject
::
getStrType
()
{
{
return
CORBA
::
string_dup
(
getType
());
return
CORBA
::
string_dup
(
getType
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
termWaiting
()
void
UniSetObject
::
termWaiting
()
{
{
if
(
tmr
)
if
(
tmr
)
tmr
->
terminate
();
tmr
->
terminate
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
setThreadPriority
(
Poco
::
Thread
::
Priority
p
)
void
UniSetObject
::
setThreadPriority
(
Poco
::
Thread
::
Priority
p
)
{
{
if
(
thr
)
if
(
thr
)
thr
->
setPriority
(
p
);
thr
->
setPriority
(
p
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
push
(
const
TransportMessage
&
tm
)
void
UniSetObject
::
push
(
const
TransportMessage
&
tm
)
{
{
auto
vm
=
make_shared
<
VoidMessage
>
(
tm
);
auto
vm
=
make_shared
<
VoidMessage
>
(
tm
);
if
(
vm
->
priority
==
Message
::
Medium
)
if
(
vm
->
priority
==
Message
::
Medium
)
mqueueMedium
.
push
(
vm
);
mqueueMedium
.
push
(
vm
);
else
if
(
vm
->
priority
==
Message
::
High
)
else
if
(
vm
->
priority
==
Message
::
High
)
mqueueHi
.
push
(
vm
);
mqueueHi
.
push
(
vm
);
else
if
(
vm
->
priority
==
Message
::
Low
)
else
if
(
vm
->
priority
==
Message
::
Low
)
mqueueLow
.
push
(
vm
);
mqueueLow
.
push
(
vm
);
else
// на всякий по умолчанию medium
else
// на всякий по умолчанию medium
mqueueMedium
.
push
(
vm
);
mqueueMedium
.
push
(
vm
);
termWaiting
();
termWaiting
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
pushMessage
(
const
char
*
msg
,
void
UniSetObject
::
pushMessage
(
const
char
*
msg
,
::
CORBA
::
Long
mtype
,
::
CORBA
::
Long
mtype
,
const
::
uniset
::
Timespec
&
tm
,
const
::
uniset
::
Timespec
&
tm
,
const
::
uniset
::
ProducerInfo
&
pi
,
const
::
uniset
::
ProducerInfo
&
pi
,
::
CORBA
::
Long
priority
,
::
CORBA
::
Long
priority
,
::
CORBA
::
Long
consumer
)
::
CORBA
::
Long
consumer
)
{
{
uniset
::
TextMessage
tmsg
(
msg
,
mtype
,
tm
,
pi
,
(
uniset
::
Message
::
Priority
)
priority
,
consumer
);
uniset
::
TextMessage
tmsg
(
msg
,
mtype
,
tm
,
pi
,
(
uniset
::
Message
::
Priority
)
priority
,
consumer
);
auto
vm
=
tmsg
.
toLocalVoidMessage
();
auto
vm
=
tmsg
.
toLocalVoidMessage
();
if
(
vm
->
priority
==
Message
::
Medium
)
if
(
vm
->
priority
==
Message
::
Medium
)
mqueueMedium
.
push
(
vm
);
mqueueMedium
.
push
(
vm
);
else
if
(
vm
->
priority
==
Message
::
High
)
else
if
(
vm
->
priority
==
Message
::
High
)
mqueueHi
.
push
(
vm
);
mqueueHi
.
push
(
vm
);
else
if
(
vm
->
priority
==
Message
::
Low
)
else
if
(
vm
->
priority
==
Message
::
Low
)
mqueueLow
.
push
(
vm
);
mqueueLow
.
push
(
vm
);
else
// на всякий по умолчанию medium
else
// на всякий по умолчанию medium
mqueueMedium
.
push
(
vm
);
mqueueMedium
.
push
(
vm
);
termWaiting
();
termWaiting
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#ifndef DISABLE_REST_API
#ifndef DISABLE_REST_API
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
httpGet
(
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
httpGet
(
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
Poco
::
JSON
::
Object
::
Ptr
jret
=
new
Poco
::
JSON
::
Object
();
Poco
::
JSON
::
Object
::
Ptr
jret
=
new
Poco
::
JSON
::
Object
();
httpGetMyInfo
(
jret
);
httpGetMyInfo
(
jret
);
return
jret
;
return
jret
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
httpHelp
(
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
httpHelp
(
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
uniset
::
json
::
help
::
object
myhelp
(
myname
);
uniset
::
json
::
help
::
object
myhelp
(
myname
);
{
{
uniset
::
json
::
help
::
item
cmd
(
"params/get"
,
"get value for parameter"
);
uniset
::
json
::
help
::
item
cmd
(
"params/get"
,
"get value for parameter"
);
cmd
.
param
(
"param1,param2,..."
,
"paremeter names. Default: all"
);
cmd
.
param
(
"param1,param2,..."
,
"paremeter names. Default: all"
);
myhelp
.
add
(
cmd
);
myhelp
.
add
(
cmd
);
}
}
{
{
uniset
::
json
::
help
::
item
cmd
(
"params/set"
,
"set value for parameter"
);
uniset
::
json
::
help
::
item
cmd
(
"params/set"
,
"set value for parameter"
);
cmd
.
param
(
"param1=val1,param2=val2,..."
,
"paremeters"
);
cmd
.
param
(
"param1=val1,param2=val2,..."
,
"paremeters"
);
myhelp
.
add
(
cmd
);
myhelp
.
add
(
cmd
);
}
}
return
myhelp
;
return
myhelp
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
httpGetMyInfo
(
Poco
::
JSON
::
Object
::
Ptr
root
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
httpGetMyInfo
(
Poco
::
JSON
::
Object
::
Ptr
root
)
{
{
Poco
::
JSON
::
Object
::
Ptr
my
=
uniset
::
json
::
make_child
(
root
,
"object"
);
Poco
::
JSON
::
Object
::
Ptr
my
=
uniset
::
json
::
make_child
(
root
,
"object"
);
my
->
set
(
"name"
,
myname
);
my
->
set
(
"name"
,
myname
);
my
->
set
(
"id"
,
getId
());
my
->
set
(
"id"
,
getId
());
my
->
set
(
"msgCount"
,
countMessages
());
my
->
set
(
"msgCount"
,
countMessages
());
my
->
set
(
"lostMessages"
,
getCountOfLostMessages
());
my
->
set
(
"lostMessages"
,
getCountOfLostMessages
());
my
->
set
(
"maxSizeOfMessageQueue"
,
getMaxSizeOfMessageQueue
());
my
->
set
(
"maxSizeOfMessageQueue"
,
getMaxSizeOfMessageQueue
());
my
->
set
(
"isActive"
,
isActive
());
my
->
set
(
"isActive"
,
isActive
());
my
->
set
(
"objectType"
,
getStrType
());
my
->
set
(
"objectType"
,
getStrType
());
return
my
;
return
my
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /configure/xxxx
// обработка запроса вида: /configure/xxxx
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_configure
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_configure
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
{
{
if
(
req
==
"get"
)
if
(
req
==
"get"
)
return
request_configure_get
(
req
,
params
);
return
request_configure_get
(
req
,
params
);
ostringstream
err
;
ostringstream
err
;
err
<<
"(request_conf): BAD REQUEST: Unknown command.."
;
err
<<
"(request_conf): BAD REQUEST: Unknown command.."
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /params/xxxx
// обработка запроса вида: /params/xxxx
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_params
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_params
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
{
{
if
(
req
==
"get"
)
if
(
req
==
"get"
)
return
request_params_get
(
req
,
params
);
return
request_params_get
(
req
,
params
);
if
(
req
==
"set"
)
if
(
req
==
"set"
)
return
request_params_set
(
req
,
params
);
return
request_params_set
(
req
,
params
);
ostringstream
err
;
ostringstream
err
;
err
<<
"(request_conf): BAD REQUEST: Unknown command.."
;
err
<<
"(request_conf): BAD REQUEST: Unknown command.."
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /configure/get?[ID|NAME]&props=testname,name] from configure.xml
// обработка запроса вида: /configure/get?[ID|NAME]&props=testname,name] from configure.xml
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_configure_get
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_configure_get
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
{
{
Poco
::
JSON
::
Object
::
Ptr
json
=
new
Poco
::
JSON
::
Object
();
Poco
::
JSON
::
Object
::
Ptr
json
=
new
Poco
::
JSON
::
Object
();
Poco
::
JSON
::
Array
::
Ptr
jdata
=
uniset
::
json
::
make_child_array
(
json
,
"conf"
);
Poco
::
JSON
::
Array
::
Ptr
jdata
=
uniset
::
json
::
make_child_array
(
json
,
"conf"
);
auto
my
=
httpGetMyInfo
(
json
);
auto
my
=
httpGetMyInfo
(
json
);
if
(
params
.
empty
()
)
if
(
params
.
empty
()
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
"(request_conf): BAD REQUEST: Unknown id or name..."
;
err
<<
"(request_conf): BAD REQUEST: Unknown id or name..."
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
auto
idlist
=
uniset
::
explode_str
(
params
[
0
].
first
,
','
);
auto
idlist
=
uniset
::
explode_str
(
params
[
0
].
first
,
','
);
if
(
idlist
.
empty
()
)
if
(
idlist
.
empty
()
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
"(request_conf): BAD REQUEST: Unknown id or name in '"
<<
params
[
0
].
first
<<
"'"
;
err
<<
"(request_conf): BAD REQUEST: Unknown id or name in '"
<<
params
[
0
].
first
<<
"'"
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
string
props
=
{
""
};
string
props
=
{
""
};
for
(
const
auto
&
p
:
params
)
for
(
const
auto
&
p
:
params
)
{
{
if
(
p
.
first
==
"props"
)
if
(
p
.
first
==
"props"
)
{
{
props
=
p
.
second
;
props
=
p
.
second
;
break
;
break
;
}
}
}
}
for
(
const
auto
&
id
:
idlist
)
for
(
const
auto
&
id
:
idlist
)
{
{
Poco
::
JSON
::
Object
::
Ptr
j
=
request_configure_by_name
(
id
,
props
);
Poco
::
JSON
::
Object
::
Ptr
j
=
request_configure_by_name
(
id
,
props
);
if
(
j
)
if
(
j
)
jdata
->
add
(
j
);
jdata
->
add
(
j
);
}
}
return
json
;
return
json
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_configure_by_name
(
const
string
&
name
,
const
std
::
string
&
props
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_configure_by_name
(
const
string
&
name
,
const
std
::
string
&
props
)
{
{
Poco
::
JSON
::
Object
::
Ptr
jdata
=
new
Poco
::
JSON
::
Object
();
Poco
::
JSON
::
Object
::
Ptr
jdata
=
new
Poco
::
JSON
::
Object
();
auto
conf
=
uniset_conf
();
auto
conf
=
uniset_conf
();
ObjectId
id
=
conf
->
getAnyID
(
name
);
ObjectId
id
=
conf
->
getAnyID
(
name
);
if
(
id
==
DefaultObjectId
)
if
(
id
==
DefaultObjectId
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
name
<<
" not found.."
;
err
<<
name
<<
" not found.."
;
jdata
->
set
(
name
,
""
);
jdata
->
set
(
name
,
""
);
jdata
->
set
(
"error"
,
err
.
str
());
jdata
->
set
(
"error"
,
err
.
str
());
return
jdata
;
return
jdata
;
}
}
xmlNode
*
xmlnode
=
conf
->
getXMLObjectNode
(
id
);
xmlNode
*
xmlnode
=
conf
->
getXMLObjectNode
(
id
);
if
(
!
xmlnode
)
if
(
!
xmlnode
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
name
<<
" not found confnode.."
;
err
<<
name
<<
" not found confnode.."
;
jdata
->
set
(
name
,
""
);
jdata
->
set
(
name
,
""
);
jdata
->
set
(
"error"
,
err
.
str
());
jdata
->
set
(
"error"
,
err
.
str
());
return
jdata
;
return
jdata
;
}
}
UniXML
::
iterator
it
(
xmlnode
);
UniXML
::
iterator
it
(
xmlnode
);
jdata
->
set
(
"name"
,
it
.
getProp
(
"name"
));
jdata
->
set
(
"name"
,
it
.
getProp
(
"name"
));
jdata
->
set
(
"id"
,
it
.
getProp
(
"id"
));
jdata
->
set
(
"id"
,
it
.
getProp
(
"id"
));
if
(
!
props
.
empty
()
)
if
(
!
props
.
empty
()
)
{
{
auto
lst
=
uniset
::
explode_str
(
props
,
','
);
auto
lst
=
uniset
::
explode_str
(
props
,
','
);
for
(
const
auto
&
p
:
lst
)
for
(
const
auto
&
p
:
lst
)
jdata
->
set
(
p
,
it
.
getProp
(
p
));
jdata
->
set
(
p
,
it
.
getProp
(
p
));
}
}
else
else
{
{
auto
lst
=
it
.
getPropList
();
auto
lst
=
it
.
getPropList
();
for
(
const
auto
&
p
:
lst
)
for
(
const
auto
&
p
:
lst
)
jdata
->
set
(
p
.
first
,
p
.
second
);
jdata
->
set
(
p
.
first
,
p
.
second
);
}
}
return
jdata
;
return
jdata
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/set?prop1=val1&prop2=val2
// обработка запроса вида: /conf/set?prop1=val1&prop2=val2
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_params_set
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_params_set
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
"(request_params): 'set' not realized yet"
;
err
<<
"(request_params): 'set' not realized yet"
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/get?prop1&prop2&prop3
// обработка запроса вида: /conf/get?prop1&prop2&prop3
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_params_get
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
Poco
::
JSON
::
Object
::
Ptr
UniSetObject
::
request_params_get
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
"(request_params): 'get' not realized yet"
;
err
<<
"(request_params): 'get' not realized yet"
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#endif
#endif
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
ObjectPtr
UniSetObject
::
getRef
()
const
ObjectPtr
UniSetObject
::
getRef
()
const
{
{
uniset
::
uniset_rwmutex_rlock
lock
(
refmutex
);
uniset
::
uniset_rwmutex_rlock
lock
(
refmutex
);
return
(
uniset
::
ObjectPtr
)
CORBA
::
Object
::
_duplicate
(
oref
);
return
(
uniset
::
ObjectPtr
)
CORBA
::
Object
::
_duplicate
(
oref
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
size_t
UniSetObject
::
countMessages
()
size_t
UniSetObject
::
countMessages
()
{
{
return
(
mqueueMedium
.
size
()
+
mqueueLow
.
size
()
+
mqueueHi
.
size
());
return
(
mqueueMedium
.
size
()
+
mqueueLow
.
size
()
+
mqueueHi
.
size
());
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
size_t
UniSetObject
::
getCountOfLostMessages
()
const
size_t
UniSetObject
::
getCountOfLostMessages
()
const
{
{
return
(
mqueueMedium
.
getCountOfLostMessages
()
+
return
(
mqueueMedium
.
getCountOfLostMessages
()
+
mqueueLow
.
getCountOfLostMessages
()
+
mqueueLow
.
getCountOfLostMessages
()
+
mqueueHi
.
getCountOfLostMessages
()
);
mqueueHi
.
getCountOfLostMessages
()
);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetObject
::
activateObject
()
bool
UniSetObject
::
activateObject
()
{
{
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetObject
::
deactivateObject
()
bool
UniSetObject
::
deactivateObject
()
{
{
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
uterminate
()
void
UniSetObject
::
uterminate
()
{
{
//
setActive(false);
//
setActive(false);
auto
act
=
UniSetActivator
::
Instance
();
auto
act
=
UniSetActivator
::
Instance
();
act
->
terminate
();
act
->
terminate
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
thread
(
bool
create
)
void
UniSetObject
::
thread
(
bool
create
)
{
{
threadcreate
=
create
;
threadcreate
=
create
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
offThread
()
void
UniSetObject
::
offThread
()
{
{
threadcreate
=
false
;
threadcreate
=
false
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
onThread
()
void
UniSetObject
::
onThread
()
{
{
threadcreate
=
true
;
threadcreate
=
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetObject
::
deactivate
()
bool
UniSetObject
::
deactivate
()
{
{
if
(
!
isActive
()
)
if
(
!
isActive
()
)
{
{
try
try
{
{
deactivateObject
();
deactivateObject
();
}
}
catch
(
std
::
exception
&
ex
)
catch
(
std
::
exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
.
what
()
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
.
what
()
<<
endl
;
}
}
return
true
;
return
true
;
}
}
setActive
(
false
);
// завершаем поток обработки сообщений
setActive
(
false
);
// завершаем поток обработки сообщений
if
(
tmr
)
if
(
tmr
)
tmr
->
terminate
();
tmr
->
terminate
();
try
try
{
{
uinfo
<<
myname
<<
"(deactivate): ..."
<<
endl
;
uinfo
<<
myname
<<
"(deactivate): ..."
<<
endl
;
auto
m
=
mymngr
.
lock
();
auto
m
=
mymngr
.
lock
();
if
(
m
)
if
(
m
)
{
{
PortableServer
::
POA_var
poamngr
=
m
->
getPOA
();
PortableServer
::
POA_var
poamngr
=
m
->
getPOA
();
if
(
!
PortableServer
::
POA_Helper
::
is_nil
(
poamngr
)
)
if
(
!
PortableServer
::
POA_Helper
::
is_nil
(
poamngr
)
)
{
{
try
try
{
{
deactivateObject
();
deactivateObject
();
}
}
catch
(
std
::
exception
&
ex
)
catch
(
std
::
exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
.
what
()
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
.
what
()
<<
endl
;
}
}
unregistration
();
unregistration
();
PortableServer
::
ObjectId_var
oid
=
poamngr
->
servant_to_id
(
static_cast
<
PortableServer
::
ServantBase
*>
(
this
));
PortableServer
::
ObjectId_var
oid
=
poamngr
->
servant_to_id
(
static_cast
<
PortableServer
::
ServantBase
*>
(
this
));
poamngr
->
deactivate_object
(
oid
);
poamngr
->
deactivate_object
(
oid
);
uinfo
<<
myname
<<
"(deactivate): finished..."
<<
endl
;
uinfo
<<
myname
<<
"(deactivate): finished..."
<<
endl
;
waitFinish
();
waitFinish
();
return
true
;
return
true
;
}
}
}
}
uwarn
<<
myname
<<
"(deactivate): manager already destroyed.."
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): manager already destroyed.."
<<
endl
;
}
}
catch
(
const
CORBA
::
TRANSIENT
&
)
catch
(
const
CORBA
::
TRANSIENT
&
)
{
{
uwarn
<<
myname
<<
"(deactivate): isExist: нет связи..."
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): isExist: нет связи..."
<<
endl
;
}
}
catch
(
CORBA
::
SystemException
&
ex
)
catch
(
CORBA
::
SystemException
&
ex
)
{
{
uwarn
<<
myname
<<
"(deactivate): "
<<
"поймали CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): "
<<
"поймали CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(deactivate): "
<<
"поймали CORBA::Exception."
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): "
<<
"поймали CORBA::Exception."
<<
endl
;
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
<<
endl
;
}
}
catch
(
std
::
exception
&
ex
)
catch
(
std
::
exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
.
what
()
<<
endl
;
uwarn
<<
myname
<<
"(deactivate): "
<<
ex
.
what
()
<<
endl
;
}
}
return
false
;
return
false
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
bool
UniSetObject
::
activate
()
bool
UniSetObject
::
activate
()
{
{
uinfo
<<
myname
<<
": activate..."
<<
endl
;
uinfo
<<
myname
<<
": activate..."
<<
endl
;
auto
m
=
mymngr
.
lock
();
auto
m
=
mymngr
.
lock
();
if
(
!
m
)
if
(
!
m
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(activate): mymngr=NULL!!! activate failure..."
;
err
<<
myname
<<
"(activate): mymngr=NULL!!! activate failure..."
;
ucrit
<<
err
.
str
()
<<
endl
;
ucrit
<<
err
.
str
()
<<
endl
;
throw
SystemError
(
err
.
str
());
throw
SystemError
(
err
.
str
());
}
}
PortableServer
::
POA_var
poa
=
m
->
getPOA
();
PortableServer
::
POA_var
poa
=
m
->
getPOA
();
if
(
poa
==
NULL
||
CORBA
::
is_nil
(
poa
)
)
if
(
poa
==
NULL
||
CORBA
::
is_nil
(
poa
)
)
{
{
string
err
(
myname
+
": не задан менеджер"
);
string
err
(
myname
+
": не задан менеджер"
);
throw
ORepFailed
(
err
);
throw
ORepFailed
(
err
);
}
}
bool
actOK
=
false
;
bool
actOK
=
false
;
auto
conf
=
uniset_conf
();
auto
conf
=
uniset_conf
();
for
(
size_t
i
=
0
;
i
<
conf
->
getRepeatCount
();
i
++
)
for
(
size_t
i
=
0
;
i
<
conf
->
getRepeatCount
();
i
++
)
{
{
try
try
{
{
if
(
conf
->
isTransientIOR
()
)
if
(
conf
->
isTransientIOR
()
)
{
{
// activate witch generate id
// activate witch generate id
poa
->
activate_object
(
static_cast
<
PortableServer
::
ServantBase
*>
(
this
));
poa
->
activate_object
(
static_cast
<
PortableServer
::
ServantBase
*>
(
this
));
actOK
=
true
;
actOK
=
true
;
break
;
break
;
}
}
else
else
{
{
// А если myid==uniset::DefaultObjectId
// А если myid==uniset::DefaultObjectId
// то myname = noname. ВСЕГДА!
// то myname = noname. ВСЕГДА!
if
(
myid
==
uniset
::
DefaultObjectId
)
if
(
myid
==
uniset
::
DefaultObjectId
)
{
{
uwarn
<<
myname
<<
"(activate): Не задан ID!!! IGNORE ACTIVATE..."
<<
endl
;
uwarn
<<
myname
<<
"(activate): Не задан ID!!! IGNORE ACTIVATE..."
<<
endl
;
// вызываем на случай если она переопределена в дочерних классах
// вызываем на случай если она переопределена в дочерних классах
// Например в UniSetManager, если здесь не вызвать, то не будут инициализированы подчинённые объекты.
// Например в UniSetManager, если здесь не вызвать, то не будут инициализированы подчинённые объекты.
// (см. UniSetManager::activateObject)
// (см. UniSetManager::activateObject)
activateObject
();
activateObject
();
return
false
;
return
false
;
}
}
// Always use the same object id.
// Always use the same object id.
PortableServer
::
ObjectId_var
oid
=
PortableServer
::
string_to_ObjectId
(
myname
.
c_str
());
PortableServer
::
ObjectId_var
oid
=
PortableServer
::
string_to_ObjectId
(
myname
.
c_str
());
// Activate object...
// Activate object...
poa
->
activate_object_with_id
(
oid
,
this
);
poa
->
activate_object_with_id
(
oid
,
this
);
actOK
=
true
;
actOK
=
true
;
break
;
break
;
}
}
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
if
(
string
(
ex
.
_name
())
!=
"ObjectAlreadyActive"
)
if
(
string
(
ex
.
_name
())
!=
"ObjectAlreadyActive"
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(activate): ACTIVATE ERROR: "
<<
ex
.
_name
();
err
<<
myname
<<
"(activate): ACTIVATE ERROR: "
<<
ex
.
_name
();
ucrit
<<
myname
<<
"(activate): "
<<
err
.
str
()
<<
endl
;
ucrit
<<
myname
<<
"(activate): "
<<
err
.
str
()
<<
endl
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
uwarn
<<
myname
<<
"(activate): IGNORE.. catch "
<<
ex
.
_name
()
<<
endl
;
uwarn
<<
myname
<<
"(activate): IGNORE.. catch "
<<
ex
.
_name
()
<<
endl
;
}
}
msleep
(
conf
->
getRepeatTimeout
()
);
msleep
(
conf
->
getRepeatTimeout
()
);
}
}
if
(
!
actOK
)
if
(
!
actOK
)
{
{
ostringstream
err
;
ostringstream
err
;
err
<<
myname
<<
"(activate): DON`T ACTIVATE.."
;
err
<<
myname
<<
"(activate): DON`T ACTIVATE.."
;
ucrit
<<
myname
<<
"(activate): "
<<
err
.
str
()
<<
endl
;
ucrit
<<
myname
<<
"(activate): "
<<
err
.
str
()
<<
endl
;
throw
uniset
::
SystemError
(
err
.
str
());
throw
uniset
::
SystemError
(
err
.
str
());
}
}
{
{
uniset
::
uniset_rwmutex_wrlock
lock
(
refmutex
);
uniset
::
uniset_rwmutex_wrlock
lock
(
refmutex
);
oref
=
poa
->
servant_to_reference
(
static_cast
<
PortableServer
::
ServantBase
*>
(
this
)
);
oref
=
poa
->
servant_to_reference
(
static_cast
<
PortableServer
::
ServantBase
*>
(
this
)
);
}
}
registration
();
registration
();
// Запускаем поток обработки сообщений
// Запускаем поток обработки сообщений
setActive
(
true
);
setActive
(
true
);
if
(
myid
!=
uniset
::
DefaultObjectId
&&
threadcreate
)
if
(
myid
!=
uniset
::
DefaultObjectId
&&
threadcreate
)
{
{
thr
=
unisetstd
::
make_unique
<
ThreadCreator
<
UniSetObject
>
>
(
this
,
&
UniSetObject
::
work
);
thr
=
unisetstd
::
make_unique
<
ThreadCreator
<
UniSetObject
>
>
(
this
,
&
UniSetObject
::
work
);
//thr->setCancel(ost::Thread::cancelDeferred);
//thr->setCancel(ost::Thread::cancelDeferred);
std
::
unique_lock
<
std
::
mutex
>
locker
(
m_working
);
std
::
unique_lock
<
std
::
mutex
>
locker
(
m_working
);
a_working
=
true
;
a_working
=
true
;
thr
->
start
();
thr
->
start
();
}
}
else
else
{
{
// выдаём предупреждение только если поток не отключён, но при этом не задан ID
// выдаём предупреждение только если поток не отключён, но при этом не задан ID
if
(
threadcreate
)
if
(
threadcreate
)
{
{
uinfo
<<
myname
<<
": ?? не задан ObjectId...("
uinfo
<<
myname
<<
": ?? не задан ObjectId...("
<<
"myid="
<<
myid
<<
" threadcreate="
<<
threadcreate
<<
"myid="
<<
myid
<<
" threadcreate="
<<
threadcreate
<<
")"
<<
endl
;
<<
")"
<<
endl
;
}
}
thread
(
false
);
thread
(
false
);
}
}
activateObject
();
activateObject
();
uinfo
<<
myname
<<
": activate ok."
<<
endl
;
uinfo
<<
myname
<<
": activate ok."
<<
endl
;
return
true
;
return
true
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
work
()
void
UniSetObject
::
work
()
{
{
uinfo
<<
myname
<<
": thread processing messages running..."
<<
endl
;
uinfo
<<
myname
<<
": thread processing messages running..."
<<
endl
;
msgpid
=
thr
?
thr
->
getTID
()
:
Poco
::
Process
::
id
();
msgpid
=
thr
?
thr
->
getTID
()
:
Poco
::
Process
::
id
();
{
{
std
::
unique_lock
<
std
::
mutex
>
locker
(
m_working
);
std
::
unique_lock
<
std
::
mutex
>
locker
(
m_working
);
a_working
=
true
;
a_working
=
true
;
}
}
while
(
isActive
()
)
while
(
isActive
()
)
callback
();
callback
();
uinfo
<<
myname
<<
": thread processing messages stopped..."
<<
endl
;
uinfo
<<
myname
<<
": thread processing messages stopped..."
<<
endl
;
{
{
std
::
unique_lock
<
std
::
mutex
>
locker
(
m_working
);
std
::
unique_lock
<
std
::
mutex
>
locker
(
m_working
);
a_working
=
false
;
a_working
=
false
;
}
}
cv_working
.
notify_all
();
cv_working
.
notify_all
();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
callback
()
void
UniSetObject
::
callback
()
{
{
// При реализации с использованием waitMessage() каждый раз при вызове askTimer() необходимо
// При реализации с использованием waitMessage() каждый раз при вызове askTimer() необходимо
// проверять возвращаемое значение на UniSetTimers::WaitUpTime и вызывать termWaiting(),
// проверять возвращаемое значение на UniSetTimers::WaitUpTime и вызывать termWaiting(),
// чтобы избежать ситуации, когда процесс до заказа таймера 'спал'(в функции waitMessage()) и после
// чтобы избежать ситуации, когда процесс до заказа таймера 'спал'(в функции waitMessage()) и после
// заказа продолжит спать(т.е. обработчик вызван не будет)...
// заказа продолжит спать(т.е. обработчик вызван не будет)...
try
try
{
{
auto
m
=
waitMessage
(
sleepTime
);
auto
m
=
waitMessage
(
sleepTime
);
if
(
m
)
if
(
m
)
processingMessage
(
m
.
get
());
processingMessage
(
m
.
get
());
if
(
!
isActive
()
)
if
(
!
isActive
()
)
return
;
return
;
sleepTime
=
checkTimers
(
this
);
sleepTime
=
checkTimers
(
this
);
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
ucrit
<<
myname
<<
"(callback): "
<<
ex
<<
endl
;
ucrit
<<
myname
<<
"(callback): "
<<
ex
<<
endl
;
}
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
void
UniSetObject
::
processingMessage
(
const
uniset
::
VoidMessage
*
msg
)
void
UniSetObject
::
processingMessage
(
const
uniset
::
VoidMessage
*
msg
)
{
{
try
try
{
{
switch
(
msg
->
type
)
switch
(
msg
->
type
)
{
{
case
Message
:
:
SensorInfo
:
case
Message
:
:
SensorInfo
:
sensorInfo
(
reinterpret_cast
<
const
SensorMessage
*>
(
msg
)
);
sensorInfo
(
reinterpret_cast
<
const
SensorMessage
*>
(
msg
)
);
break
;
break
;
case
Message
:
:
Timer
:
case
Message
:
:
Timer
:
timerInfo
(
reinterpret_cast
<
const
TimerMessage
*>
(
msg
)
);
timerInfo
(
reinterpret_cast
<
const
TimerMessage
*>
(
msg
)
);
break
;
break
;
case
Message
:
:
SysCommand
:
case
Message
:
:
SysCommand
:
sysCommand
(
reinterpret_cast
<
const
SystemMessage
*>
(
msg
)
);
sysCommand
(
reinterpret_cast
<
const
SystemMessage
*>
(
msg
)
);
break
;
break
;
case
Message
:
:
TextMessage
:
case
Message
:
:
TextMessage
:
{
{
TextMessage
tm
(
msg
);
TextMessage
tm
(
msg
);
onTextMessage
(
&
tm
);
onTextMessage
(
&
tm
);
break
;
break
;
}
}
default
:
default
:
break
;
break
;
}
}
}
}
catch
(
const
CORBA
::
SystemException
&
ex
)
catch
(
const
CORBA
::
SystemException
&
ex
)
{
{
ucrit
<<
myname
<<
"(processingMessage): CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
ucrit
<<
myname
<<
"(processingMessage): CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
}
catch
(
const
CORBA
::
Exception
&
ex
)
catch
(
const
CORBA
::
Exception
&
ex
)
{
{
uwarn
<<
myname
<<
"(processingMessage): CORBA::Exception: "
<<
ex
.
_name
()
<<
endl
;
uwarn
<<
myname
<<
"(processingMessage): CORBA::Exception: "
<<
ex
.
_name
()
<<
endl
;
}
}
catch
(
omniORB
::
fatalException
&
fe
)
catch
(
omniORB
::
fatalException
&
fe
)
{
{
if
(
ulog
()
->
is_crit
()
)
if
(
ulog
()
->
is_crit
()
)
{
{
ulog
()
->
crit
()
<<
myname
<<
"(processingMessage): Caught omniORB::fatalException:"
<<
endl
;
ulog
()
->
crit
()
<<
myname
<<
"(processingMessage): Caught omniORB::fatalException:"
<<
endl
;
ulog
()
->
crit
()
<<
myname
<<
"(processingMessage): file: "
<<
fe
.
file
()
ulog
()
->
crit
()
<<
myname
<<
"(processingMessage): file: "
<<
fe
.
file
()
<<
" line: "
<<
fe
.
line
()
<<
" line: "
<<
fe
.
line
()
<<
" mesg: "
<<
fe
.
errmsg
()
<<
endl
;
<<
" mesg: "
<<
fe
.
errmsg
()
<<
endl
;
}
}
}
}
catch
(
const
uniset
::
Exception
&
ex
)
catch
(
const
uniset
::
Exception
&
ex
)
{
{
ucrit
<<
myname
<<
"(processingMessage): "
<<
ex
<<
endl
;
ucrit
<<
myname
<<
"(processingMessage): "
<<
ex
<<
endl
;
}
}
catch
(
const
std
::
exception
&
ex
)
catch
(
const
std
::
exception
&
ex
)
{
{
ucrit
<<
myname
<<
"(processingMessage): "
<<
ex
.
what
()
<<
endl
;
ucrit
<<
myname
<<
"(processingMessage): "
<<
ex
.
what
()
<<
endl
;
}
}
/*
/*
catch( ... )
catch( ... )
{
{
std::exception_ptr p = std::current_exception();
std::exception_ptr p = std::current_exception();
ucrit <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
ucrit <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
}
}
*/
*/
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
timeout_t
UniSetObject
::
askTimer
(
TimerId
timerid
,
timeout_t
timeMS
,
clock_t
ticks
,
Message
::
Priority
p
)
timeout_t
UniSetObject
::
askTimer
(
TimerId
timerid
,
timeout_t
timeMS
,
clock_t
ticks
,
Message
::
Priority
p
)
{
{
timeout_t
tsleep
=
LT_Object
::
askTimer
(
timerid
,
timeMS
,
ticks
,
p
);
timeout_t
tsleep
=
LT_Object
::
askTimer
(
timerid
,
timeMS
,
ticks
,
p
);
if
(
tsleep
!=
UniSetTimer
::
WaitUpTime
)
if
(
tsleep
!=
UniSetTimer
::
WaitUpTime
)
termWaiting
();
termWaiting
();
return
tsleep
;
return
tsleep
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
uniset
::
SimpleInfo
*
UniSetObject
::
getInfo
(
const
char
*
userparam
)
uniset
::
SimpleInfo
*
UniSetObject
::
getInfo
(
const
char
*
userparam
)
{
{
ostringstream
info
;
ostringstream
info
;
info
.
setf
(
ios
::
left
,
ios
::
adjustfield
);
info
.
setf
(
ios
::
left
,
ios
::
adjustfield
);
info
<<
"("
<<
myid
<<
")"
<<
setw
(
40
)
<<
myname
info
<<
"("
<<
myid
<<
")"
<<
setw
(
40
)
<<
myname
<<
" date: "
<<
uniset
::
dateToString
()
<<
" date: "
<<
uniset
::
dateToString
()
<<
" time: "
<<
uniset
::
timeToString
()
<<
" time: "
<<
uniset
::
timeToString
()
<<
"
\n
===============================================================================
\n
"
<<
"
\n
===============================================================================
\n
"
<<
"pid="
<<
setw
(
10
)
<<
Poco
::
Process
::
id
()
<<
"pid="
<<
setw
(
10
)
<<
Poco
::
Process
::
id
()
<<
" tid="
<<
setw
(
10
);
<<
" tid="
<<
setw
(
10
);
if
(
threadcreate
)
if
(
threadcreate
)
{
{
if
(
thr
)
if
(
thr
)
{
{
msgpid
=
thr
->
getTID
();
// заодно(на всякий) обновим и внутреннюю информацию
msgpid
=
thr
->
getTID
();
// заодно(на всякий) обновим и внутреннюю информацию
info
<<
msgpid
;
info
<<
msgpid
;
}
}
else
else
info
<<
"не запущен"
;
info
<<
"не запущен"
;
}
}
else
else
info
<<
"откл."
;
info
<<
"откл."
;
info
<<
"
\t
count="
<<
countMessages
()
info
<<
"
\t
count="
<<
countMessages
()
<<
"
\t
medium: "
<<
"
\t
medium: "
<<
" maxMsg="
<<
mqueueMedium
.
getMaxQueueMessages
()
<<
" maxMsg="
<<
mqueueMedium
.
getMaxQueueMessages
()
<<
" qFull("
<<
mqueueMedium
.
getMaxSizeOfMessageQueue
()
<<
")="
<<
mqueueMedium
.
getCountOfLostMessages
()
<<
" qFull("
<<
mqueueMedium
.
getMaxSizeOfMessageQueue
()
<<
")="
<<
mqueueMedium
.
getCountOfLostMessages
()
<<
"
\t
hi: "
<<
"
\t
hi: "
<<
" maxMsg="
<<
mqueueHi
.
getMaxQueueMessages
()
<<
" maxMsg="
<<
mqueueHi
.
getMaxQueueMessages
()
<<
" qFull("
<<
mqueueHi
.
getMaxSizeOfMessageQueue
()
<<
")="
<<
mqueueHi
.
getCountOfLostMessages
()
<<
" qFull("
<<
mqueueHi
.
getMaxSizeOfMessageQueue
()
<<
")="
<<
mqueueHi
.
getCountOfLostMessages
()
<<
"
\t
low: "
<<
"
\t
low: "
<<
" maxMsg="
<<
mqueueLow
.
getMaxQueueMessages
()
<<
" maxMsg="
<<
mqueueLow
.
getMaxQueueMessages
()
<<
" qFull("
<<
mqueueLow
.
getMaxSizeOfMessageQueue
()
<<
")="
<<
mqueueLow
.
getCountOfLostMessages
();
<<
" qFull("
<<
mqueueLow
.
getMaxSizeOfMessageQueue
()
<<
")="
<<
mqueueLow
.
getCountOfLostMessages
();
SimpleInfo
*
res
=
new
SimpleInfo
();
SimpleInfo
*
res
=
new
SimpleInfo
();
res
->
info
=
info
.
str
().
c_str
();
// CORBA::string_dup(info.str().c_str());
res
->
info
=
info
.
str
().
c_str
();
// CORBA::string_dup(info.str().c_str());
res
->
id
=
myid
;
res
->
id
=
myid
;
return
res
;
// ._retn();
return
res
;
// ._retn();
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
SimpleInfo
*
UniSetObject
::
apiRequest
(
const
char
*
request
)
SimpleInfo
*
UniSetObject
::
apiRequest
(
const
char
*
request
)
{
{
#ifdef DISABLE_REST_API
#ifdef DISABLE_REST_API
return
getInfo
(
request
);
return
getInfo
(
request
);
#else
#else
SimpleInfo
*
ret
=
new
SimpleInfo
();
SimpleInfo
*
ret
=
new
SimpleInfo
();
ret
->
id
=
getId
();
ret
->
id
=
getId
();
ostringstream
err
;
ostringstream
err
;
try
try
{
{
Poco
::
URI
uri
(
request
);
Poco
::
URI
uri
(
request
);
if
(
ulog
()
->
is_level9
()
)
if
(
ulog
()
->
is_level9
()
)
ulog
()
->
level9
()
<<
myname
<<
"(apiRequest): request: "
<<
request
<<
endl
;
ulog
()
->
level9
()
<<
myname
<<
"(apiRequest): request: "
<<
request
<<
endl
;
ostringstream
out
;
ostringstream
out
;
std
::
string
query
=
""
;
std
::
string
query
=
""
;
// Пока не будем требовать обязательно использовать формат /api/vesion/query..
// Пока не будем требовать обязательно использовать формат /api/vesion/query..
// но если указан, то проверяем..
// но если указан, то проверяем..
std
::
vector
<
std
::
string
>
seg
;
std
::
vector
<
std
::
string
>
seg
;
uri
.
getPathSegments
(
seg
);
uri
.
getPathSegments
(
seg
);
size_t
qind
=
0
;
size_t
qind
=
0
;
if
(
seg
.
size
()
>
0
&&
seg
[
0
]
==
"api"
)
if
(
seg
.
size
()
>
0
&&
seg
[
0
]
==
"api"
)
{
{
// проверка: /api/version/query[?params]..
// проверка: /api/version/query[?params]..
if
(
seg
.
size
()
<
2
||
seg
[
1
]
!=
UHttp
::
UHTTP_API_VERSION
)
if
(
seg
.
size
()
<
2
||
seg
[
1
]
!=
UHttp
::
UHTTP_API_VERSION
)
{
{
Poco
::
JSON
::
Object
jdata
;
Poco
::
JSON
::
Object
jdata
;
jdata
.
set
(
"error"
,
Poco
::
Net
::
HTTPServerResponse
::
getReasonForStatus
(
Poco
::
Net
::
HTTPResponse
::
HTTP_BAD_REQUEST
));
jdata
.
set
(
"error"
,
Poco
::
Net
::
HTTPServerResponse
::
getReasonForStatus
(
Poco
::
Net
::
HTTPResponse
::
HTTP_BAD_REQUEST
));
jdata
.
set
(
"ecode"
,
(
int
)
Poco
::
Net
::
HTTPResponse
::
HTTP_BAD_REQUEST
);
jdata
.
set
(
"ecode"
,
(
int
)
Poco
::
Net
::
HTTPResponse
::
HTTP_BAD_REQUEST
);
jdata
.
set
(
"message"
,
"BAD REQUEST STRUCTURE"
);
jdata
.
set
(
"message"
,
"BAD REQUEST STRUCTURE"
);
jdata
.
stringify
(
out
);
jdata
.
stringify
(
out
);
ret
->
info
=
out
.
str
().
c_str
();
// CORBA::string_dup(..)
ret
->
info
=
out
.
str
().
c_str
();
// CORBA::string_dup(..)
return
ret
;
return
ret
;
}
}
if
(
seg
.
size
()
>
2
)
if
(
seg
.
size
()
>
2
)
qind
=
2
;
qind
=
2
;
}
}
else
if
(
seg
.
size
()
==
1
)
else
if
(
seg
.
size
()
==
1
)
qind
=
0
;
qind
=
0
;
query
=
seg
.
empty
()
?
""
:
seg
[
qind
];
query
=
seg
.
empty
()
?
""
:
seg
[
qind
];
// обработка запроса..
// обработка запроса..
if
(
query
==
"help"
)
if
(
query
==
"help"
)
{
{
// запрос вида: /help?params
// запрос вида: /help?params
auto
reply
=
httpHelp
(
uri
.
getQueryParameters
());
auto
reply
=
httpHelp
(
uri
.
getQueryParameters
());
reply
->
stringify
(
out
);
reply
->
stringify
(
out
);
}
}
else
if
(
query
==
"configure"
)
else
if
(
query
==
"configure"
)
{
{
// запрос вида: /configure/query?params
// запрос вида: /configure/query?params
string
qconf
=
(
seg
.
size
()
>
(
qind
+
1
)
)
?
seg
[
qind
+
1
]
:
""
;
string
qconf
=
(
seg
.
size
()
>
(
qind
+
1
)
)
?
seg
[
qind
+
1
]
:
""
;
auto
reply
=
request_configure
(
qconf
,
uri
.
getQueryParameters
());
auto
reply
=
request_configure
(
qconf
,
uri
.
getQueryParameters
());
reply
->
stringify
(
out
);
reply
->
stringify
(
out
);
}
}
else
if
(
query
==
"params"
)
else
if
(
query
==
"params"
)
{
{
// запрос вида: /params/query?params
// запрос вида: /params/query?params
string
qconf
=
(
seg
.
size
()
>
(
qind
+
1
)
)
?
seg
[
qind
+
1
]
:
""
;
string
qconf
=
(
seg
.
size
()
>
(
qind
+
1
)
)
?
seg
[
qind
+
1
]
:
""
;
auto
reply
=
request_params
(
qconf
,
uri
.
getQueryParameters
());
auto
reply
=
request_params
(
qconf
,
uri
.
getQueryParameters
());
reply
->
stringify
(
out
);
reply
->
stringify
(
out
);
}
}
else
if
(
!
query
.
empty
()
)
else
if
(
!
query
.
empty
()
)
{
{
// запрос вида: /cmd?params
// запрос вида: /cmd?params
auto
reply
=
httpRequest
(
query
,
uri
.
getQueryParameters
());
auto
reply
=
httpRequest
(
query
,
uri
.
getQueryParameters
());
reply
->
stringify
(
out
);
reply
->
stringify
(
out
);
}
}
else
else
{
{
// запрос без команды /?params
// запрос без команды /?params
auto
reply
=
httpGet
(
uri
.
getQueryParameters
());
auto
reply
=
httpGet
(
uri
.
getQueryParameters
());
reply
->
stringify
(
out
);
reply
->
stringify
(
out
);
}
}
ret
->
info
=
out
.
str
().
c_str
();
// CORBA::string_dup(..)
ret
->
info
=
out
.
str
().
c_str
();
// CORBA::string_dup(..)
return
ret
;
return
ret
;
}
}
catch
(
Poco
::
SyntaxException
&
ex
)
catch
(
Poco
::
SyntaxException
&
ex
)
{
{
err
<<
ex
.
displayText
();
err
<<
ex
.
displayText
();
}
}
catch
(
uniset
::
SystemError
&
ex
)
catch
(
uniset
::
SystemError
&
ex
)
{
{
err
<<
ex
;
err
<<
ex
;
}
}
catch
(
std
::
exception
&
ex
)
catch
(
std
::
exception
&
ex
)
{
{
err
<<
ex
.
what
();
err
<<
ex
.
what
();
}
}
Poco
::
JSON
::
Object
jdata
;
Poco
::
JSON
::
Object
jdata
;
jdata
.
set
(
"error"
,
err
.
str
());
jdata
.
set
(
"error"
,
err
.
str
());
jdata
.
set
(
"ecode"
,
(
int
)
Poco
::
Net
::
HTTPResponse
::
HTTP_INTERNAL_SERVER_ERROR
);
jdata
.
set
(
"ecode"
,
(
int
)
Poco
::
Net
::
HTTPResponse
::
HTTP_INTERNAL_SERVER_ERROR
);
//
jdata.set("ename", Poco::Net::HTTPResponse::getReasonForStatus(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR));
//
jdata.set("ename", Poco::Net::HTTPResponse::getReasonForStatus(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR));
ostringstream
out
;
ostringstream
out
;
jdata
.
stringify
(
out
);
jdata
.
stringify
(
out
);
ret
->
info
=
out
.
str
().
c_str
();
// CORBA::string_dup(..)
ret
->
info
=
out
.
str
().
c_str
();
// CORBA::string_dup(..)
return
ret
;
return
ret
;
#endif
#endif
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
ostream
&
operator
<<
(
ostream
&
os
,
UniSetObject
&
obj
)
ostream
&
operator
<<
(
ostream
&
os
,
UniSetObject
&
obj
)
{
{
SimpleInfo_var
si
=
obj
.
getInfo
();
SimpleInfo_var
si
=
obj
.
getInfo
();
return
os
<<
si
->
info
;
return
os
<<
si
->
info
;
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#undef CREATE_TIMER
#undef CREATE_TIMER
}
// end of namespace uniset
}
// end of namespace uniset
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment