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

  1 karl  1.4 //%2005////////////////////////////////////////////////////////////////////////
  2 kumpf 1.1 //
  3 karl  1.2 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4           // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5           // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 kumpf 1.1 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.2 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8           // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl  1.4 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10           // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 kumpf 1.1 //
 12           // Permission is hereby granted, free of charge, to any person obtaining a copy
 13           // of this software and associated documentation files (the "Software"), to
 14           // deal in the Software without restriction, including without limitation the
 15           // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16           // sell copies of the Software, and to permit persons to whom the Software is
 17           // furnished to do so, subject to the following conditions:
 18           // 
 19           // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20           // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21           // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22           // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23           // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24           // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25           // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26           // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27           //
 28           //==============================================================================
 29           //
 30           // Author: Carol Ann Krug Graves, Hewlett-Packard Company
 31           //             (carolann_graves@hp.com)
 32 kumpf 1.1 //
 33 david.dillard 1.3 // Modified By: David Dillard, VERITAS Software Corp.
 34                   //                  (david.dillard@veritas.com)
 35 gs.keenan     1.5 // 		Sean Keenan (sean.keenan@hp.com)
 36 kumpf         1.1 //
 37                   //%/////////////////////////////////////////////////////////////////////////////
 38                   
 39                   #include <Pegasus/Common/CIMMessageSerializer.h>
 40                   #include <Pegasus/Common/CIMMessageDeserializer.h>
 41                   #include <Pegasus/Common/MessageLoader.h>
 42                   #include <Pegasus/Common/Exception.h>
 43                   #include <Pegasus/Common/Tracer.h>
 44                   
 45                   #include "AnonymousPipe.h"
 46                   
 47                   
 48                   #if defined (PEGASUS_OS_TYPE_WINDOWS)
 49                   # include "AnonymousPipeWindows.cpp"
 50                   #elif defined (PEGASUS_OS_TYPE_UNIX)
 51                   # include "AnonymousPipeUnix.cpp"
 52 gs.keenan     1.5 #elif defined (PEGASUS_OS_VMS)
 53                   # include "AnonymousPipeVms.cpp"
 54 kumpf         1.1 #else
 55                   # error "Unsupported platform"
 56                   #endif
 57                   
 58                   PEGASUS_NAMESPACE_BEGIN
 59                   
 60                   AnonymousPipe::Status AnonymousPipe::writeMessage (CIMMessage * message)
 61                   {
 62                       PEG_METHOD_ENTER (TRC_OS_ABSTRACTION, "AnonymousPipe::writeMessage");
 63                   
 64                       //
 65                       // Serialize the request
 66                       //
 67 david.dillard 1.3     Array<char> messageBuffer;
 68 kumpf         1.1     messageBuffer.reserveCapacity (4096);
 69                       try
 70                       {
 71                           CIMMessageSerializer::serialize (messageBuffer, message);
 72                       }
 73                       catch (Exception & e)
 74                       {
 75                           PEG_TRACE_STRING (TRC_OS_ABSTRACTION, Tracer::LEVEL2,
 76                               "Failed to serialize message: " + e.getMessage ());
 77                           PEG_METHOD_EXIT ();
 78                           throw;
 79                       }
 80                   
 81                       //
 82                       // Write the serialized message to the pipe
 83                       //
 84                       Status writeStatus;
 85                       try
 86                       {
 87                           Uint32 messageLength = messageBuffer.size ();
 88                           const char * messageData = messageBuffer.getData ();
 89 kumpf         1.1 
 90                           writeStatus = writeBuffer ((const char *) &messageLength, 
 91                               sizeof (Uint32));
 92                   
 93                           if (writeStatus == STATUS_SUCCESS)
 94                           {
 95                               writeStatus = writeBuffer (messageBuffer.getData (), 
 96                                   messageLength);
 97                           }
 98                       }
 99                       catch (...)
100                       {
101                           PEG_METHOD_EXIT ();
102                           throw;
103                       }
104                   
105                       PEG_METHOD_EXIT ();
106                       return writeStatus;
107                   }
108                   
109                   AnonymousPipe::Status AnonymousPipe::readMessage (CIMMessage * & message)
110 kumpf         1.1 {
111                       PEG_METHOD_ENTER (TRC_OS_ABSTRACTION, "AnonymousPipe::readMessage");
112                   
113                       message = 0;
114                   
115                       //
116                       //  Read the message length
117                       //
118                       Uint32 messageLength;
119                       Status readStatus = readBuffer ((char *) &messageLength, sizeof (Uint32));
120                   
121                       if (readStatus != STATUS_SUCCESS)
122                       {
123                           PEG_METHOD_EXIT ();
124                           return readStatus;
125                       }
126                   
127                       if (messageLength == 0)
128                       {
129                           //
130                           //  Null message
131 kumpf         1.1         //
132                           PEG_METHOD_EXIT ();
133                           return STATUS_SUCCESS;
134                       }
135                   
136                       //
137                       //  Read the message data
138                       //
139                       AutoArrayPtr <char> messageBuffer (new char [messageLength + 1]);
140                   
141                       //
142                       //  We know a message is coming
143                       //  Keep reading even if interrupted
144                       //
145                       do
146                       {
147                           readStatus = readBuffer (messageBuffer.get (), messageLength);
148                       } while (readStatus == STATUS_INTERRUPT);
149                   
150                       if (readStatus != STATUS_SUCCESS)
151                       {
152 kumpf         1.1         PEG_METHOD_EXIT ();
153                           return readStatus;
154                       }
155                   
156                       try
157                       {
158                           //
159                           //  De-serialize the message
160                           //
161                           message = CIMMessageDeserializer::deserialize (messageBuffer.get ());
162                       }
163                       catch (Exception & e)
164                       {
165                           //
166                           //  De-serialization failed
167                           //
168                           PEG_TRACE_STRING (TRC_OS_ABSTRACTION, Tracer::LEVEL2,
169                               "Failed to de-serialize message: " + e.getMessage ());
170                           PEG_METHOD_EXIT ();
171                           throw;
172                       }
173 kumpf         1.1 
174                       PEG_METHOD_EXIT ();
175                       return readStatus;
176                   }
177                   
178                   PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2