version 1.9, 2006/11/07 21:30:36
|
version 1.15, 2008/11/12 17:22:32
|
|
|
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// | // |
//============================================================================== |
//============================================================================= |
// | // |
//%///////////////////////////////////////////////////////////////////////////// |
//%//////////////////////////////////////////////////////////////////////////// |
| |
|
#if defined(PEGASUS_ENABLE_INTERNAL_BINARY_PROTOCOL) |
|
# include <Pegasus/Common/CIMBinMsgSerializer.h> |
|
# include <Pegasus/Common/CIMBinMsgDeserializer.h> |
|
#else |
#include <Pegasus/Common/CIMMessageSerializer.h> | #include <Pegasus/Common/CIMMessageSerializer.h> |
#include <Pegasus/Common/CIMMessageDeserializer.h> | #include <Pegasus/Common/CIMMessageDeserializer.h> |
|
#endif |
|
|
#include <Pegasus/Common/MessageLoader.h> | #include <Pegasus/Common/MessageLoader.h> |
#include <Pegasus/Common/Exception.h> | #include <Pegasus/Common/Exception.h> |
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
|
|
# error "Unsupported platform" | # error "Unsupported platform" |
#endif | #endif |
| |
|
|
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
AnonymousPipe::Status AnonymousPipe::writeMessage (CIMMessage * message) | AnonymousPipe::Status AnonymousPipe::writeMessage (CIMMessage * message) |
|
|
// | // |
// Serialize the request | // Serialize the request |
// | // |
|
#if defined(PEGASUS_ENABLE_INTERNAL_BINARY_PROTOCOL) |
|
CIMBuffer messageBuffer(4096); |
|
#else |
Buffer messageBuffer; | Buffer messageBuffer; |
messageBuffer.reserveCapacity (4096); | messageBuffer.reserveCapacity (4096); |
|
#endif |
|
|
try | try |
{ | { |
|
#if defined(PEGASUS_ENABLE_INTERNAL_BINARY_PROTOCOL) |
|
CIMBinMsgSerializer::serialize(messageBuffer, message); |
|
#else |
CIMMessageSerializer::serialize (messageBuffer, message); | CIMMessageSerializer::serialize (messageBuffer, message); |
|
#endif |
} | } |
catch (Exception & e) | catch (Exception & e) |
{ | { |
PEG_TRACE_STRING (TRC_OS_ABSTRACTION, Tracer::LEVEL2, |
PEG_TRACE((TRC_OS_ABSTRACTION, Tracer::LEVEL2, |
"Failed to serialize message: " + e.getMessage ()); |
"Failed to serialize message: %s", |
|
(const char*)e.getMessage().getCString())); |
PEG_METHOD_EXIT (); | PEG_METHOD_EXIT (); |
throw; | throw; |
} | } |
|
|
// | // |
// Write the serialized message to the pipe | // Write the serialized message to the pipe |
// | // |
Status writeStatus; |
|
try |
|
{ |
|
Uint32 messageLength = messageBuffer.size (); | Uint32 messageLength = messageBuffer.size (); |
const char * messageData = messageBuffer.getData (); | const char * messageData = messageBuffer.getData (); |
| |
writeStatus = writeBuffer ((const char *) &messageLength, |
Status writeStatus = |
sizeof (Uint32)); |
writeBuffer((const char*) &messageLength, sizeof(Uint32)); |
| |
if (writeStatus == STATUS_SUCCESS) | if (writeStatus == STATUS_SUCCESS) |
{ | { |
writeStatus = writeBuffer (messageBuffer.getData (), |
writeStatus = writeBuffer(messageData, messageLength); |
messageLength); |
|
} |
|
} |
|
catch (...) |
|
{ |
|
PEG_METHOD_EXIT (); |
|
throw; |
|
} | } |
| |
PEG_METHOD_EXIT (); | PEG_METHOD_EXIT (); |
|
|
// | // |
// Read the message data | // Read the message data |
// | // |
|
#if defined(PEGASUS_ENABLE_INTERNAL_BINARY_PROTOCOL) |
|
// CIMBuffer uses realloc() and free() so the buffer must be allocated |
|
// with malloc(). |
|
AutoPtr<char, FreeCharPtr> messageBuffer((char*)malloc(messageLength + 1)); |
|
#else |
AutoArrayPtr <char> messageBuffer (new char [messageLength + 1]); | AutoArrayPtr <char> messageBuffer (new char [messageLength + 1]); |
|
#endif |
| |
// | // |
// We know a message is coming | // We know a message is coming |
|
|
// | // |
// De-serialize the message | // De-serialize the message |
// | // |
|
#if defined(PEGASUS_ENABLE_INTERNAL_BINARY_PROTOCOL) |
|
// CIMBuffer frees messageBuffer upon destruction. |
|
CIMBuffer buf(messageBuffer.release(), messageLength); |
|
message = CIMBinMsgDeserializer::deserialize(buf, messageLength); |
|
|
|
if (!message) |
|
{ |
|
throw CIMException(CIM_ERR_FAILED, "deserialize() failed"); |
|
} |
|
#else |
message = CIMMessageDeserializer::deserialize (messageBuffer.get ()); | message = CIMMessageDeserializer::deserialize (messageBuffer.get ()); |
|
#endif |
} | } |
catch (Exception & e) | catch (Exception & e) |
{ | { |
// | // |
// De-serialization failed | // De-serialization failed |
// | // |
PEG_TRACE_STRING (TRC_OS_ABSTRACTION, Tracer::LEVEL2, |
PEG_TRACE ((TRC_OS_ABSTRACTION, Tracer::LEVEL2, |
"Failed to de-serialize message: " + e.getMessage ()); |
"Failed to de-serialize message: %s", |
|
(const char*)e.getMessage().getCString())); |
PEG_METHOD_EXIT (); | PEG_METHOD_EXIT (); |
throw; | throw; |
} | } |