(file) Return to AnonymousPipe.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 martin 1.17 //%LICENSE////////////////////////////////////////////////////////////////
  2 martin 1.18 //
  3 martin 1.17 // Licensed to The Open Group (TOG) under one or more contributor license
  4             // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
  5             // this work for additional information regarding copyright ownership.
  6             // Each contributor licenses this file to you under the OpenPegasus Open
  7             // Source License; you may not use this file except in compliance with the
  8             // License.
  9 martin 1.18 //
 10 martin 1.17 // Permission is hereby granted, free of charge, to any person obtaining a
 11             // copy of this software and associated documentation files (the "Software"),
 12             // to deal in the Software without restriction, including without limitation
 13             // the rights to use, copy, modify, merge, publish, distribute, sublicense,
 14             // and/or sell copies of the Software, and to permit persons to whom the
 15             // Software is furnished to do so, subject to the following conditions:
 16 martin 1.18 //
 17 martin 1.17 // The above copyright notice and this permission notice shall be included
 18             // in all copies or substantial portions of the Software.
 19 martin 1.18 //
 20 martin 1.17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 21 martin 1.18 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 22 martin 1.17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 23             // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 24             // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 25             // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 26             // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27 martin 1.18 //
 28 martin 1.17 //////////////////////////////////////////////////////////////////////////
 29 kumpf  1.1  //
 30 kamal.locahana 1.10 //%////////////////////////////////////////////////////////////////////////////
 31 kumpf          1.1  
 32 karl           1.19.8.1 #include <Pegasus/Common/CIMBinMsgSerializer.h>
 33                         #include <Pegasus/Common/CIMBinMsgDeserializer.h>
 34 kumpf          1.1      #include <Pegasus/Common/MessageLoader.h>
 35                         #include <Pegasus/Common/Exception.h>
 36                         #include <Pegasus/Common/Tracer.h>
 37                         
 38                         #include "AnonymousPipe.h"
 39                         
 40                         
 41                         #if defined (PEGASUS_OS_TYPE_WINDOWS)
 42                         # include "AnonymousPipeWindows.cpp"
 43                         #elif defined (PEGASUS_OS_TYPE_UNIX)
 44 mike           1.8      # include "AnonymousPipePOSIX.cpp"
 45 gs.keenan      1.5      #elif defined (PEGASUS_OS_VMS)
 46 mike           1.8      # include "AnonymousPipePOSIX.cpp"
 47 kumpf          1.1      #else
 48                         # error "Unsupported platform"
 49                         #endif
 50                         
 51 mike           1.15     
 52 kumpf          1.1      PEGASUS_NAMESPACE_BEGIN
 53                         
 54                         AnonymousPipe::Status AnonymousPipe::writeMessage (CIMMessage * message)
 55                         {
 56                             PEG_METHOD_ENTER (TRC_OS_ABSTRACTION, "AnonymousPipe::writeMessage");
 57                         
 58                             //
 59                             // Serialize the request
 60                             //
 61 mike           1.15         CIMBuffer messageBuffer(4096);
 62                         
 63 kumpf          1.1          try
 64                             {
 65 mike           1.15             CIMBinMsgSerializer::serialize(messageBuffer, message);
 66 kumpf          1.1          }
 67                             catch (Exception & e)
 68                             {
 69 thilo.boehm    1.14             PEG_TRACE((TRC_OS_ABSTRACTION, Tracer::LEVEL2,
 70 kumpf          1.19                 "Failed to serialize message: %s",
 71 thilo.boehm    1.14                 (const char*)e.getMessage().getCString()));
 72 kumpf          1.1              PEG_METHOD_EXIT ();
 73                                 throw;
 74                             }
 75                         
 76                             //
 77                             // Write the serialized message to the pipe
 78                             //
 79 kumpf          1.13         Uint32 messageLength = messageBuffer.size();
 80                             const char * messageData = messageBuffer.getData ();
 81 kumpf          1.1      
 82 kumpf          1.13         Status writeStatus =
 83                                 writeBuffer((const char*) &messageLength, sizeof(Uint32));
 84 kumpf          1.1      
 85 kumpf          1.13         if (writeStatus == STATUS_SUCCESS)
 86 kumpf          1.1          {
 87 kumpf          1.13             writeStatus = writeBuffer(messageData, messageLength);
 88 kumpf          1.1          }
 89                         
 90                             PEG_METHOD_EXIT ();
 91                             return writeStatus;
 92                         }
 93                         
 94                         AnonymousPipe::Status AnonymousPipe::readMessage (CIMMessage * & message)
 95 kumpf          1.19     {
 96 kumpf          1.1          PEG_METHOD_ENTER (TRC_OS_ABSTRACTION, "AnonymousPipe::readMessage");
 97                         
 98                             message = 0;
 99                         
100                             //
101                             //  Read the message length
102                             //
103                             Uint32 messageLength;
104                             Status readStatus = readBuffer ((char *) &messageLength, sizeof (Uint32));
105                         
106                             if (readStatus != STATUS_SUCCESS)
107                             {
108                                 PEG_METHOD_EXIT ();
109                                 return readStatus;
110                             }
111                         
112                             if (messageLength == 0)
113                             {
114                                 //
115                                 //  Null message
116                                 //
117 kumpf          1.1              PEG_METHOD_EXIT ();
118                                 return STATUS_SUCCESS;
119                             }
120                         
121                             //
122                             //  Read the message data
123                             //
124 mike           1.15         // CIMBuffer uses realloc() and free() so the buffer must be allocated
125                             // with malloc().
126                             AutoPtr<char, FreeCharPtr> messageBuffer((char*)malloc(messageLength + 1));
127 kumpf          1.1      
128                             //
129                             //  We know a message is coming
130                             //  Keep reading even if interrupted
131                             //
132                             do
133                             {
134                                 readStatus = readBuffer (messageBuffer.get (), messageLength);
135                             } while (readStatus == STATUS_INTERRUPT);
136                         
137                             if (readStatus != STATUS_SUCCESS)
138                             {
139                                 PEG_METHOD_EXIT ();
140                                 return readStatus;
141                             }
142                         
143                             try
144                             {
145                                 //
146                                 //  De-serialize the message
147                                 //
148 mike           1.15             // CIMBuffer frees messageBuffer upon destruction.
149                                 CIMBuffer buf(messageBuffer.release(), messageLength);
150                                 message = CIMBinMsgDeserializer::deserialize(buf, messageLength);
151                         
152                                 if (!message)
153                                 {
154                                     throw CIMException(CIM_ERR_FAILED, "deserialize() failed");
155                                 }
156 kumpf          1.1          }
157                             catch (Exception & e)
158                             {
159                                 //
160                                 //  De-serialization failed
161                                 //
162 thilo.boehm    1.14             PEG_TRACE ((TRC_OS_ABSTRACTION, Tracer::LEVEL2,
163                                     "Failed to de-serialize message: %s",
164                                     (const char*)e.getMessage().getCString()));
165 kumpf          1.1              PEG_METHOD_EXIT ();
166                                 throw;
167                             }
168                         
169                             PEG_METHOD_EXIT ();
170                             return readStatus;
171                         }
172                         
173                         PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2