diff options
Diffstat (limited to 'modules/CIAO/DAnCE/tools/Convert_Plan/Convert_Plan_Impl.cpp')
-rw-r--r-- | modules/CIAO/DAnCE/tools/Convert_Plan/Convert_Plan_Impl.cpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/modules/CIAO/DAnCE/tools/Convert_Plan/Convert_Plan_Impl.cpp b/modules/CIAO/DAnCE/tools/Convert_Plan/Convert_Plan_Impl.cpp new file mode 100644 index 00000000000..9fb61a5dc29 --- /dev/null +++ b/modules/CIAO/DAnCE/tools/Convert_Plan/Convert_Plan_Impl.cpp @@ -0,0 +1,198 @@ +// $Id$ + +#include "Convert_Plan_Impl.h" +#include "ace/OS_NS_stdio.h" +#include "tao/CDR.h" +#include "Config_Handlers/XML_File_Intf.h" +#include "Logger/Log_Macros.h" + +namespace DAnCE +{ + Deployment::DeploymentPlan * + Convert_Plan::read_xml_plan (const char *filename) + { + if (!filename) + { + DANCE_ERROR (2, (LM_WARNING, DLINFO ACE_TEXT ("Convert_Plan::read_xml_plan - ") + ACE_TEXT ("Passed a null pointer, returning.\n"))); + } + + CIAO::Config_Handlers::XML_File_Intf xml_intf (filename); + xml_intf.add_search_path ("ACE_ROOT", "/docs/schema/"); + xml_intf.add_search_path ("TAO_ROOT", "/docs/schema/"); + xml_intf.add_search_path ("CIAO_ROOT", "/docs/schema/"); + xml_intf.add_search_path ("DANCE_ROOT", "/docs/schema/"); + + return xml_intf.release_plan (); + } + + Deployment::DeploymentPlan * + Convert_Plan::read_cdr_plan (const char *filename) + { + if (!filename) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("Convert_Plan::read_cdr_plan - ") + ACE_TEXT ("Passed a null pointer, returning.\n"))); + return 0; + } + + FILE *file = ACE_OS::fopen (filename, "r"); + + if (!file) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("Convert_Plan::read_cdr_plan - ") + ACE_TEXT ("Error: Unable to open file for reasding %C\n"), + filename)); + return 0; + } + + char byte_order; + size_t n = ACE_OS::fread (&byte_order, sizeof (byte_order), 1, file); + + if (n == 0) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("Convert_Plan::read_cdr_plan - ") + ACE_TEXT ("Byte order not written to file\n"))); + ACE_OS::fclose (file); + return 0; + } + + ACE_UINT32 bufsize (0); + n = ACE_OS::fread (&bufsize, sizeof (bufsize), 1, file); + + if (n == 0) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("Convert_Plan::read_cdr_plan - ") + ACE_TEXT ("Plan size not written to file\n"))); + ACE_OS::fclose (file); + return 0; + } + + if (byte_order != ACE_CDR_BYTE_ORDER) + { + DANCE_DEBUG (6, (LM_DEBUG, DLINFO ACE_TEXT ("Convert_Plan::read_cdr_plan - ") + ACE_TEXT ("Plan appears encoded in a different endian.\n"))); + ACE_CDR::swap_4 (reinterpret_cast<char *> (&bufsize), + reinterpret_cast<char *> (&bufsize)); + } + + + char *buffer = 0; + ACE_NEW_RETURN (buffer, + char[bufsize], + 0); + +#if defined (ACE_INITIALIZE_MEMORY_BEFORE_USE) + ACE_OS::memset(buffer, 0, sizeof (buffer)); +#endif /* ACE_INITIALIZE_MEMORY_BEFORE_USE */ + + // Make sure <buffer> is released automagically. + ACE_Auto_Basic_Array_Ptr<char> b (buffer); + + n = ACE_OS::fread (buffer, 1, bufsize, file); + ACE_OS::fclose (file); + + if (n != bufsize) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO "Convert_Plan_Impl::read_cdr_plan - read %u bytes " + "instead of %u bytes\n", n, bufsize)); + return 0; + } + + ACE_Message_Block mb (ACE_CDR::MAX_ALIGNMENT + bufsize); + ACE_CDR::mb_align (&mb); + mb.copy (buffer, bufsize); + + TAO_InputCDR input_cdr (&mb); + input_cdr.reset_byte_order ((int) byte_order); + + DANCE_DEBUG (9, (LM_TRACE, DLINFO "Convert_Plan_Impl::read_cdr_plan - " + "Reading file %C in %s endian format with size %u\n", + filename, + ACE_CDR_BYTE_ORDER ? ACE_TEXT("little") : ACE_TEXT("big"), + bufsize)); + + + Deployment::DeploymentPlan *retval; + + ACE_NEW_RETURN (retval, Deployment::DeploymentPlan (), 0); + + if (!(input_cdr >> *retval)) + { + DANCE_ERROR (1, (LM_ERROR, ACE_TEXT ("Convert_Plan_Impl::read_cdr_plan - ") + ACE_TEXT ("Failed to demarshal plan\n"))); + delete retval; + return 0; + } + + + return retval; + } + + bool + Convert_Plan::write_cdr_plan (const char *output_filename, Deployment::DeploymentPlan &plan) + { + if (!output_filename) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO "Convert_Plan_Impl::write_cdr_plan - passed nil file name\n")); + return false; + } + + TAO_OutputCDR output_cdr; + + if (output_cdr << plan) + { + FILE *file = ACE_OS::fopen (output_filename, "w"); + + if (file == 0) + { + DANCE_ERROR (1, (LM_ERROR, DLINFO "Convert_Plan_Impl::write_cdr_plan - failed to open file %C\n", + output_filename)); + return false; + } + + // First write the byte order + char byte_order = ACE_CDR_BYTE_ORDER; + size_t n = ACE_OS::fwrite (&byte_order, sizeof(byte_order), 1, file); + + // Next write the length + ACE_UINT32 cdr_length (output_cdr.total_length ()); + n += ACE_OS::fwrite (&cdr_length, sizeof (cdr_length), 1, file); + + DANCE_DEBUG (9, (LM_TRACE, DLINFO "Convert_Plan_Impl::write_cdr_plan - " + ACE_TEXT ("Writing plan to file %s in %s endian format and length %u\n"), + output_filename, + ACE_CDR_BYTE_ORDER ? ACE_TEXT("little") : ACE_TEXT("big"), + cdr_length)); + + // Now write the IDL structure. + for (const ACE_Message_Block *output_mb = output_cdr.begin (); + output_mb != 0; + output_mb = output_mb->cont ()) + { + n += ACE_OS::fwrite (output_mb->rd_ptr (), + 1, + output_mb->length (), + file); + } + + ACE_OS::fclose (file); + + size_t total_size = sizeof (byte_order) + sizeof (cdr_length) + cdr_length; + if (n != total_size) + { + DANCE_ERROR (1, (LM_ERROR, ACE_TEXT ("Convert_Plan::write_cdr_plan - ") + ACE_TEXT ("Error: Unexpected number of bytes written: %u instead of %u\n"), + n, total_size)); + } + } + else + { + DANCE_ERROR (1, (LM_ERROR, ACE_TEXT ("Convert_Plan::write_cdr_plan - ") + ACE_TEXT ("Failed to mashal deployment plan\n"))); + return false; + } + + return true; + } +} |