Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Cameo
cameo
Commits
cdc2a348
Commit
cdc2a348
authored
Nov 16, 2020
by
yannick legoc
Browse files
(split) Some minor changes for Visual Studio 19
parent
7188c0d4
Changes
3
Hide whitespace changes
Inline
Side-by-side
include/Services.h
View file @
cdc2a348
/*
* Copyright 2015 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef CAMEO_SERVICES_H_
#define CAMEO_SERVICES_H_
#include <string>
#include <vector>
#include "Strings.h"
#include "EventStreamSocket.h"
#include "OutputStreamSocket.h"
namespace
cameo
{
class
ServicesImpl
;
class
RequestSocketImpl
;
class
Services
{
public:
Services
();
~
Services
();
void
terminate
();
void
init
();
void
initRequestSocket
();
std
::
vector
<
std
::
string
>
split
(
const
std
::
string
&
info
);
void
setTimeout
(
int
timeout
);
int
getTimeout
()
const
;
const
Endpoint
&
getEndpoint
()
const
;
std
::
array
<
int
,
3
>
getVersion
()
const
;
Endpoint
getStatusEndpoint
()
const
;
bool
isAvailable
(
int
timeout
)
const
;
void
retrieveServerVersion
();
void
initStatus
();
std
::
unique_ptr
<
EventStreamSocket
>
openEventStream
();
int
getStreamPort
(
const
std
::
string
&
name
);
std
::
unique_ptr
<
OutputStreamSocket
>
createOutputStreamSocket
(
const
std
::
string
&
name
);
std
::
unique_ptr
<
RequestSocketImpl
>
createRequestSocket
(
const
std
::
string
&
endpoint
);
std
::
unique_ptr
<
RequestSocketImpl
>
createRequestSocket
(
const
std
::
string
&
endpoint
,
int
timeout
);
Endpoint
m_serverEndpoint
;
std
::
array
<
int
,
3
>
m_serverVersion
;
int
m_statusPort
;
std
::
unique_ptr
<
ServicesImpl
>
m_impl
;
std
::
unique_ptr
<
RequestSocketImpl
>
m_requestSocket
;
};
}
#endif
/*
* Copyright 2015 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef CAMEO_SERVICES_H_
#define CAMEO_SERVICES_H_
#include <string>
#include <vector>
#include <array>
#include "Strings.h"
#include "EventStreamSocket.h"
#include "OutputStreamSocket.h"
namespace
cameo
{
class
ServicesImpl
;
class
RequestSocketImpl
;
class
Services
{
public:
Services
();
~
Services
();
void
terminate
();
void
init
();
void
initRequestSocket
();
std
::
vector
<
std
::
string
>
split
(
const
std
::
string
&
info
);
void
setTimeout
(
int
timeout
);
int
getTimeout
()
const
;
const
Endpoint
&
getEndpoint
()
const
;
std
::
array
<
int
,
3
>
getVersion
()
const
;
Endpoint
getStatusEndpoint
()
const
;
bool
isAvailable
(
int
timeout
)
const
;
void
retrieveServerVersion
();
void
initStatus
();
std
::
unique_ptr
<
EventStreamSocket
>
openEventStream
();
int
getStreamPort
(
const
std
::
string
&
name
);
std
::
unique_ptr
<
OutputStreamSocket
>
createOutputStreamSocket
(
const
std
::
string
&
name
);
std
::
unique_ptr
<
RequestSocketImpl
>
createRequestSocket
(
const
std
::
string
&
endpoint
);
std
::
unique_ptr
<
RequestSocketImpl
>
createRequestSocket
(
const
std
::
string
&
endpoint
,
int
timeout
);
Endpoint
m_serverEndpoint
;
std
::
array
<
int
,
3
>
m_serverVersion
;
int
m_statusPort
;
std
::
unique_ptr
<
ServicesImpl
>
m_impl
;
std
::
unique_ptr
<
RequestSocketImpl
>
m_requestSocket
;
};
}
#endif
src/Strings.cpp
View file @
cdc2a348
/*
* Copyright 2015 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include "Strings.h"
#include "JSON.h"
#include "message/Message.h"
#include "BadFormatException.h"
#include <regex>
using
namespace
std
;
namespace
cameo
{
std
::
vector
<
std
::
string
>
split
(
const
std
::
string
&
str
,
char
c
)
{
vector
<
string
>
result
;
string
::
size_type
lastIndex
=
0
;
string
::
size_type
index
=
str
.
find
(
c
);
while
(
index
!=
string
::
npos
)
{
result
.
push_back
(
str
.
substr
(
lastIndex
,
index
-
lastIndex
));
lastIndex
=
index
+
1
;
index
=
str
.
find
(
c
,
lastIndex
);
}
result
.
push_back
(
str
.
substr
(
lastIndex
));
return
result
;
}
Endpoint
::
Endpoint
(
const
std
::
string
&
protocol
,
const
std
::
string
&
address
,
int
port
)
{
m_protocol
=
protocol
;
m_address
=
address
;
m_port
=
port
;
}
Endpoint
::
Endpoint
(
const
std
::
string
&
address
,
int
port
)
{
m_protocol
=
"tcp"
;
m_address
=
address
;
m_port
=
port
;
}
Endpoint
::
Endpoint
()
:
m_port
(
0
)
{
}
bool
Endpoint
::
operator
==
(
const
Endpoint
&
endpoint
)
const
{
return
m_protocol
==
endpoint
.
m_protocol
&&
m_address
==
endpoint
.
m_address
&&
m_port
==
endpoint
.
m_port
;
}
const
std
::
string
&
Endpoint
::
getProtocol
()
const
{
return
m_protocol
;
}
const
std
::
string
&
Endpoint
::
getAddress
()
const
{
return
m_address
;
}
int
Endpoint
::
getPort
()
const
{
return
m_port
;
}
Endpoint
Endpoint
::
parse
(
const
std
::
string
&
str
)
{
vector
<
string
>
tokens
=
split
(
str
,
':'
);
if
(
tokens
.
size
()
!=
3
)
{
throw
BadFormatException
(
"Bad format for endpoint "
+
str
);
}
string
protocol
=
tokens
[
0
];
string
substr
=
tokens
[
1
];
string
address
=
substr
.
substr
(
2
);
try
{
address
=
substr
.
substr
(
2
);
}
catch
(...)
{
throw
BadFormatException
(
"Bad format for endpoint "
+
str
);
}
int
port
=
0
;
try
{
port
=
stoi
(
tokens
[
2
]);
}
catch
(...)
{
throw
BadFormatException
(
"Bad format for endpoint "
+
str
);
}
return
Endpoint
(
protocol
,
address
,
port
);
}
Endpoint
Endpoint
::
withPort
(
int
port
)
const
{
return
Endpoint
(
m_protocol
,
m_address
,
port
);
}
std
::
string
Endpoint
::
toString
()
const
{
if
(
m_address
!=
""
)
{
return
m_protocol
+
"://"
+
m_address
+
":"
+
to_string
(
m_port
);
}
return
""
;
}
ApplicationIdentity
::
ApplicationIdentity
(
const
std
::
string
&
name
,
int
id
,
const
Endpoint
&
endpoint
)
:
m_name
(
name
),
m_id
(
id
),
m_endpoint
(
endpoint
)
{
}
ApplicationIdentity
::
ApplicationIdentity
(
const
std
::
string
&
name
,
const
Endpoint
&
endpoint
)
:
m_name
(
name
),
m_id
(
Null
),
m_endpoint
(
endpoint
)
{
}
ApplicationIdentity
::
ApplicationIdentity
()
:
m_id
(
Null
)
{
}
const
std
::
string
&
ApplicationIdentity
::
getName
()
const
{
return
m_name
;
}
int
ApplicationIdentity
::
getId
()
const
{
return
m_id
;
}
const
Endpoint
&
ApplicationIdentity
::
getEndpoint
()
const
{
return
m_endpoint
;
}
std
::
string
ApplicationIdentity
::
toJSONString
()
const
{
json
::
StringObject
jsonObject
;
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
NAME
);
jsonObject
.
pushString
(
m_name
);
if
(
m_id
!=
Null
)
{
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
ID
);
jsonObject
.
pushInt
(
m_id
);
}
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
SERVER
);
jsonObject
.
pushString
(
m_endpoint
.
toString
());
return
jsonObject
.
toString
();
}
ApplicationWithStarterIdentity
::
ApplicationWithStarterIdentity
(
const
ApplicationIdentity
&
application
,
const
ApplicationIdentity
&
starter
)
:
m_application
(
application
),
m_hasStarter
(
true
),
m_starter
(
starter
)
{
}
ApplicationWithStarterIdentity
::
ApplicationWithStarterIdentity
(
const
ApplicationIdentity
&
application
)
:
m_application
(
application
),
m_hasStarter
(
false
)
{
}
const
ApplicationIdentity
&
ApplicationWithStarterIdentity
::
getApplication
()
const
{
return
m_application
;
}
bool
ApplicationWithStarterIdentity
::
hasStarter
()
const
{
return
m_hasStarter
;
}
const
ApplicationIdentity
&
ApplicationWithStarterIdentity
::
getStarter
()
const
{
return
m_starter
;
}
std
::
string
ApplicationWithStarterIdentity
::
toJSONString
()
const
{
json
::
StringObject
jsonObject
;
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
NAME
);
jsonObject
.
pushString
(
m_application
.
getName
());
if
(
m_application
.
getId
()
!=
Null
)
{
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
ID
);
jsonObject
.
pushInt
(
m_application
.
getId
());
}
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
SERVER
);
jsonObject
.
pushString
(
m_application
.
getEndpoint
().
toString
());
if
(
m_hasStarter
)
{
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
STARTER
);
jsonObject
.
startObject
();
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
NAME
);
jsonObject
.
pushString
(
m_starter
.
getName
());
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
ID
);
jsonObject
.
pushInt
(
m_starter
.
getId
());
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
SERVER
);
jsonObject
.
pushString
(
m_starter
.
getEndpoint
().
toString
());
jsonObject
.
endObject
();
}
return
jsonObject
.
toString
();
}
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
cameo
::
Endpoint
&
endpoint
)
{
os
<<
endpoint
.
toString
();
return
os
;
}
}
/*
* Copyright 2015 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include "Strings.h"
#include "JSON.h"
#include "message/Message.h"
#include "BadFormatException.h"
#include <regex>
#include <ostream>
using
namespace
std
;
namespace
cameo
{
std
::
vector
<
std
::
string
>
split
(
const
std
::
string
&
str
,
char
c
)
{
vector
<
string
>
result
;
string
::
size_type
lastIndex
=
0
;
string
::
size_type
index
=
str
.
find
(
c
);
while
(
index
!=
string
::
npos
)
{
result
.
push_back
(
str
.
substr
(
lastIndex
,
index
-
lastIndex
));
lastIndex
=
index
+
1
;
index
=
str
.
find
(
c
,
lastIndex
);
}
result
.
push_back
(
str
.
substr
(
lastIndex
));
return
result
;
}
Endpoint
::
Endpoint
(
const
std
::
string
&
protocol
,
const
std
::
string
&
address
,
int
port
)
{
m_protocol
=
protocol
;
m_address
=
address
;
m_port
=
port
;
}
Endpoint
::
Endpoint
(
const
std
::
string
&
address
,
int
port
)
{
m_protocol
=
"tcp"
;
m_address
=
address
;
m_port
=
port
;
}
Endpoint
::
Endpoint
()
:
m_port
(
0
)
{
}
bool
Endpoint
::
operator
==
(
const
Endpoint
&
endpoint
)
const
{
return
m_protocol
==
endpoint
.
m_protocol
&&
m_address
==
endpoint
.
m_address
&&
m_port
==
endpoint
.
m_port
;
}
const
std
::
string
&
Endpoint
::
getProtocol
()
const
{
return
m_protocol
;
}
const
std
::
string
&
Endpoint
::
getAddress
()
const
{
return
m_address
;
}
int
Endpoint
::
getPort
()
const
{
return
m_port
;
}
Endpoint
Endpoint
::
parse
(
const
std
::
string
&
str
)
{
vector
<
string
>
tokens
=
split
(
str
,
':'
);
if
(
tokens
.
size
()
!=
3
)
{
throw
BadFormatException
(
"Bad format for endpoint "
+
str
);
}
string
protocol
=
tokens
[
0
];
string
substr
=
tokens
[
1
];
string
address
=
substr
.
substr
(
2
);
try
{
address
=
substr
.
substr
(
2
);
}
catch
(...)
{
throw
BadFormatException
(
"Bad format for endpoint "
+
str
);
}
int
port
=
0
;
try
{
port
=
stoi
(
tokens
[
2
]);
}
catch
(...)
{
throw
BadFormatException
(
"Bad format for endpoint "
+
str
);
}
return
Endpoint
(
protocol
,
address
,
port
);
}
Endpoint
Endpoint
::
withPort
(
int
port
)
const
{
return
Endpoint
(
m_protocol
,
m_address
,
port
);
}
std
::
string
Endpoint
::
toString
()
const
{
if
(
m_address
!=
""
)
{
return
m_protocol
+
"://"
+
m_address
+
":"
+
to_string
(
m_port
);
}
return
""
;
}
ApplicationIdentity
::
ApplicationIdentity
(
const
std
::
string
&
name
,
int
id
,
const
Endpoint
&
endpoint
)
:
m_name
(
name
),
m_id
(
id
),
m_endpoint
(
endpoint
)
{
}
ApplicationIdentity
::
ApplicationIdentity
(
const
std
::
string
&
name
,
const
Endpoint
&
endpoint
)
:
m_name
(
name
),
m_id
(
Null
),
m_endpoint
(
endpoint
)
{
}
ApplicationIdentity
::
ApplicationIdentity
()
:
m_id
(
Null
)
{
}
const
std
::
string
&
ApplicationIdentity
::
getName
()
const
{
return
m_name
;
}
int
ApplicationIdentity
::
getId
()
const
{
return
m_id
;
}
const
Endpoint
&
ApplicationIdentity
::
getEndpoint
()
const
{
return
m_endpoint
;
}
std
::
string
ApplicationIdentity
::
toJSONString
()
const
{
json
::
StringObject
jsonObject
;
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
NAME
);
jsonObject
.
pushString
(
m_name
);
if
(
m_id
!=
Null
)
{
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
ID
);
jsonObject
.
pushInt
(
m_id
);
}
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
SERVER
);
jsonObject
.
pushString
(
m_endpoint
.
toString
());
return
jsonObject
.
toString
();
}
ApplicationWithStarterIdentity
::
ApplicationWithStarterIdentity
(
const
ApplicationIdentity
&
application
,
const
ApplicationIdentity
&
starter
)
:
m_application
(
application
),
m_hasStarter
(
true
),
m_starter
(
starter
)
{
}
ApplicationWithStarterIdentity
::
ApplicationWithStarterIdentity
(
const
ApplicationIdentity
&
application
)
:
m_application
(
application
),
m_hasStarter
(
false
)
{
}
const
ApplicationIdentity
&
ApplicationWithStarterIdentity
::
getApplication
()
const
{
return
m_application
;
}
bool
ApplicationWithStarterIdentity
::
hasStarter
()
const
{
return
m_hasStarter
;
}
const
ApplicationIdentity
&
ApplicationWithStarterIdentity
::
getStarter
()
const
{
return
m_starter
;
}
std
::
string
ApplicationWithStarterIdentity
::
toJSONString
()
const
{
json
::
StringObject
jsonObject
;
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
NAME
);
jsonObject
.
pushString
(
m_application
.
getName
());
if
(
m_application
.
getId
()
!=
Null
)
{
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
ID
);
jsonObject
.
pushInt
(
m_application
.
getId
());
}
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
SERVER
);
jsonObject
.
pushString
(
m_application
.
getEndpoint
().
toString
());
if
(
m_hasStarter
)
{
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
STARTER
);
jsonObject
.
startObject
();
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
NAME
);
jsonObject
.
pushString
(
m_starter
.
getName
());
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
ID
);
jsonObject
.
pushInt
(
m_starter
.
getId
());
jsonObject
.
pushKey
(
message
::
ApplicationIdentity
::
SERVER
);
jsonObject
.
pushString
(
m_starter
.
getEndpoint
().
toString
());
jsonObject
.
endObject
();
}
return
jsonObject
.
toString
();
}
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
cameo
::
Endpoint
&
endpoint
)
{
os
<<
endpoint
.
toString
();
return
os
;
}
}
src/impl/ServicesImpl.cpp
View file @
cdc2a348
/*
* Copyright 2015 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include "ServicesImpl.h"
#include "SocketException.h"
#include "ConnectionTimeout.h"
#include "message/Message.h"
#include "RequestSocketImpl.h"
#include <iostream>
#include <sstream>
#include "JSON.h"
// Using Visual Studio preprocessor.
// It must be improved in case of other compilers.
#ifdef _WIN32
#define GET_PROCESS_PID() GetCurrentProcessId()
#else
#include <unistd.h>