📄 ifr_service_utils.cpp
字号:
ACE_TEXT ("multicast event handler\n")
),
-1
);
}
#endif /* ACE_HAS_IP_MULTICAST */
return 0;
}
TAO_IFR_Service_Utils::TAO_IFR_Service_Utils (void)
{
}
TAO_IFR_Service_Utils::~TAO_IFR_Service_Utils (void)
{
}
ACE_Configuration_Section_Key
TAO_IFR_Service_Utils::tmp_key_;
char *
TAO_IFR_Service_Utils::int_to_string (CORBA::ULong number)
{
static char hex_string[9];
ACE_OS::sprintf (hex_string,
"%8.8X",
number);
hex_string[8] = '\0';
return hex_string;
}
void
TAO_IFR_Service_Utils::valid_container (
CORBA::DefinitionKind container_kind,
CORBA::DefinitionKind contained_kind
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((CORBA::SystemException))
{
int error_flag = 0;
switch (container_kind)
{
case CORBA::dk_Repository:
case CORBA::dk_Module:
break;
case CORBA::dk_Exception:
case CORBA::dk_Struct:
case CORBA::dk_Union:
switch (contained_kind)
{
case CORBA::dk_Struct:
case CORBA::dk_Union:
case CORBA::dk_Enum:
break;
default:
error_flag = 1;
break;
}
break;
case CORBA::dk_Value:
case CORBA::dk_Interface:
case CORBA::dk_AbstractInterface:
case CORBA::dk_LocalInterface:
case CORBA::dk_Home:
switch (contained_kind)
{
case CORBA::dk_Module:
case CORBA::dk_Interface:
case CORBA::dk_Value:
error_flag = 1;
break;
default:
break;
}
break;
case CORBA::dk_Component:
switch (contained_kind)
{
case CORBA::dk_Provides:
case CORBA::dk_Uses:
case CORBA::dk_Emits:
case CORBA::dk_Publishes:
case CORBA::dk_Consumes:
case CORBA::dk_Attribute:
break;
default:
error_flag = 1;
break;
}
break;
default:
break;
}
if (error_flag == 1)
{
ACE_THROW (CORBA::BAD_PARAM (4,
CORBA::COMPLETED_NO));
}
}
void
TAO_IFR_Service_Utils::pre_exist (
const char *id,
TAO_IFR_Service_Utils::name_clash_checker checker,
ACE_Configuration_Section_Key &key,
TAO_Repository_i *repo,
CORBA::DefinitionKind kind
ACE_ENV_ARG_DECL
)
{
TAO_IFR_Service_Utils::id_exists (id,
repo
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_IFR_Service_Utils::name_exists (checker,
key,
repo,
kind
ACE_ENV_ARG_PARAMETER);
}
void
TAO_IFR_Service_Utils::id_exists (const char *id,
TAO_Repository_i *repo
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// The repo id must not already exist.
ACE_TString holder;
if (repo->config ()->get_string_value (repo->repo_ids_key (),
id,
holder)
== 0)
{
ACE_THROW (CORBA::BAD_PARAM (2,
CORBA::COMPLETED_NO));
}
}
void
TAO_IFR_Service_Utils::name_exists (
TAO_IFR_Service_Utils::name_clash_checker checker,
ACE_Configuration_Section_Key &key,
TAO_Repository_i *repo,
CORBA::DefinitionKind kind
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((CORBA::SystemException))
{
int index = 0;
int status = 0;
ACE_TString section_name;
// Check the members defined elsewhere, if any.
ACE_Configuration_Section_Key refs_key;
status =
repo->config ()->open_section (key,
"refs",
0,
refs_key);
if (status == 0)
{
while (repo->config ()->enumerate_sections (refs_key,
index++,
section_name)
== 0)
{
ACE_Configuration_Section_Key member_key;
repo->config ()->open_section (refs_key,
section_name.c_str (),
0,
member_key);
ACE_TString member_name;
repo->config ()->get_string_value (member_key,
"name",
member_name);
if ((*checker) (member_name.fast_rep ()) != 0)
{
ACE_THROW (CORBA::BAD_PARAM (3,
CORBA::COMPLETED_NO));
}
}
}
// Check the members defined in this scope, if any.
ACE_Configuration_Section_Key defns_key;
status =
repo->config ()->open_section (key,
"defns",
0,
defns_key);
if (status == 0)
{
index = 0;
while (repo->config ()->enumerate_sections (defns_key,
index++,
section_name)
== 0)
{
ACE_Configuration_Section_Key defn_key;
repo->config ()->open_section (defns_key,
section_name.c_str (),
0,
defn_key);
ACE_TString defn_name;
repo->config ()->get_string_value (defn_key,
"name",
defn_name);
if ((*checker) (defn_name.fast_rep ()) != 0)
{
ACE_THROW (CORBA::BAD_PARAM (3,
CORBA::COMPLETED_NO));
}
}
}
if (kind == CORBA::dk_Interface
|| kind == CORBA::dk_Component)
{
TAO_IFR_Service_Utils::check_subsection (checker,
"attrs",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
if (kind == CORBA::dk_Interface)
{
TAO_IFR_Service_Utils::check_subsection (checker,
"ops",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
if (kind == CORBA::dk_Component)
{
TAO_IFR_Service_Utils::check_subsection (checker,
"provides",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_IFR_Service_Utils::check_subsection (checker,
"uses",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_IFR_Service_Utils::check_subsection (checker,
"emits",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_IFR_Service_Utils::check_subsection (checker,
"publishes",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_IFR_Service_Utils::check_subsection (checker,
"consumes",
repo->config (),
key
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
void
TAO_IFR_Service_Utils::check_subsection (
TAO_IFR_Service_Utils::name_clash_checker checker,
const char *sub_section,
ACE_Configuration *config,
ACE_Configuration_Section_Key &key
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_Configuration_Section_Key sub_key;
int status =
config->open_section (key,
sub_section,
0,
sub_key);
if (status != 0)
{
return;
}
CORBA::ULong count = 0;
config->get_integer_value (sub_key,
"count",
count);
ACE_Configuration_Section_Key entry_key;
ACE_TString entry_name;
char *stringified = 0;
for (CORBA::ULong i = 0; i < count; ++i)
{
stringified = TAO_IFR_Service_Utils::int_to_string (i);
config->open_section (sub_key,
stringified,
0,
entry_key);
config->get_string_value (entry_key,
"name",
entry_name);
if ((*checker) (entry_name.fast_rep ()) != 0)
{
ACE_THROW (CORBA::BAD_PARAM (5,
CORBA::COMPLETED_NO));
return;
}
}
}
void
TAO_IFR_Service_Utils::valid_creation (
CORBA::DefinitionKind container_kind,
CORBA::DefinitionKind contained_kind,
const char *id,
TAO_IFR_Service_Utils::name_clash_checker checker,
ACE_Configuration_Section_Key &key,
TAO_Repository_i *repo
ACE_ENV_ARG_DECL
)
{
TAO_IFR_Service_Utils::valid_container (container_kind,
contained_kind
ACE_ENV_ARG_PARAMETER);
TAO_IFR_Service_Utils::pre_exist (id,
checker,
key,
repo,
container_kind
ACE_ENV_ARG_PARAMETER);
}
ACE_TString
TAO_IFR_Service_Utils::create_common (
CORBA::DefinitionKind container_kind,
CORBA::DefinitionKind contained_kind,
ACE_Configuration_Section_Key container_key,
ACE_Configuration_Section_Key &new_key,
TAO_Repository_i *repo,
const char *id,
const char *name,
TAO_IFR_Service_Utils::name_clash_checker checker,
const char *version,
const char *sub_section_name
ACE_ENV_ARG_DECL
)
{
ACE_TString path;
// No need for a return value, every error we check for will throw
// one of the BAD_PARAM versions if it is discovered.
TAO_IFR_Service_Utils::valid_creation (container_kind,
contained_kind,
id,
checker,
container_key,
repo
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (path);
ACE_Configuration *config = repo->config ();
// Create new section, or open if it already exists.
ACE_Configuration_Section_Key sub_key;
config->open_section (container_key,
sub_section_name,
1,
sub_key);
u_int defn_count = 0;
// If we have a count, it gets set, if not, it stays 0.
config->get_integer_value (sub_key,
"count",
defn_count);
char *section_name =
TAO_IFR_Service_Utils::int_to_string (defn_count);
config->open_section (sub_key,
section_name,
1,
new_key);
// Increment the count.
config->set_integer_value (sub_key,
"count",
defn_count + 1);
config->get_integer_value (sub_key,
"count",
defn_count);
// Set the name attribute.
config->set_string_value (new_key,
"name",
name);
// Set the id attribute.
config->set_string_value (new_key,
"id",
id);
// Set the version attribute.
config->set_string_value (new_key,
"version",
version);
// Set the definition kind.
config->set_integer_value (new_key,
"def_kind",
contained_kind);
// Get the container's absolute name, append the new name,
// and set it in the new section.
ACE_TString absolute_name;
config->get_string_value (container_key,
"absolute_name",
absolute_name);
absolute_name += "::";
absolute_name += name;
config->set_string_value (new_key,
"absolute_name",
absolute_name);
// Get the container's path.
ACE_TString container_id;
config->get_string_value (container_key,
"id",
container_id);
config->set_string_value (new_key,
"container_id",
container_id);
if (container_id == "") // This Container is the Repository.
{
path = "";
}
else
{
config->get_string_value (repo->repo_ids_key (),
container_id.c_str (),
path);
path += '\\';
}
path += sub_section_name;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -