BUG#: 8523
authorsahana.prabhakar <sahana.prabhakar>
Wed, 10 Jun 2009 16:23:40 +0000 (16:23 +0000)
committersahana.prabhakar <sahana.prabhakar>
Wed, 10 Jun 2009 16:23:40 +0000 (16:23 +0000)
TITLE: UTC offset is 0 for any datetime property which is deserialized using CIMBinMsgDeserializer.
DESCRIPTION: DateTime conversion in CIMBuffer loses the UTC offset.

src/Pegasus/Common/CIMBuffer.h
src/Pegasus/Common/CIMDateTime.cpp
src/Pegasus/Common/CIMDateTime.h
src/Pegasus/Common/CIMDateTimeRep.h [new file with mode: 0644]
src/Pegasus/Common/tests/CIMBuffer/TestCIMBuffer.cpp

index 84ad1f29a21d844e3e198ef7ba1181f5b643a364..9dec216e72a38b31bd24479adfffb20e0eae52c2 100644 (file)
@@ -37,6 +37,7 @@
 #include <Pegasus/Common/CIMParamValue.h>
 #include <Pegasus/Common/Buffer.h>
 #include <Pegasus/Common/CIMNameCast.h>
+#include <Pegasus/Common/CIMDateTimeRep.h>
 
 #define PEGASUS_USE_MAGIC
 
@@ -262,8 +263,10 @@ public:
 
     void putDateTime(const CIMDateTime& x)
     {
-        putUint64(x.toMicroSeconds());
-        putBoolean(x.isInterval());
+        putUint64(x._rep->usec);
+        putUint32(x._rep->utcOffset);
+        putUint16(x._rep->sign);
+        putUint16(x._rep->numWildcards); 
     }
 
     void putBooleanA(const Array<Boolean>& x)
@@ -554,12 +557,27 @@ public:
         if (!getUint64(usec))
             return false;
 
-        Boolean interval;
+        Uint32 utcOffset;
 
-        if (!getBoolean(interval))
+        if (!getUint32(utcOffset))
             return false;
 
-        x = CIMDateTime(usec, interval);
+        Uint16 sign;
+
+        if (!getUint16(sign))
+            return false;
+
+        Uint16 numWildcards;
+
+        if (!getUint16(numWildcards))
+            return false;
+
+        CIMDateTimeRep *rep = new CIMDateTimeRep;
+        rep->usec = usec;
+        rep->utcOffset = utcOffset;
+        rep->sign = sign;
+        rep->numWildcards = numWildcards; 
+        x = CIMDateTime(rep);
         return true;
     }
 
index 647ac811c3803c240f11235ee3bdb8bfa026ce40..1646a74e79e96e0963014e80b862a2f9507d8fc4 100644 (file)
@@ -33,6 +33,7 @@
 #include <cassert>
 #include <fstream>
 #include "CIMDateTime.h"
+#include "CIMDateTimeRep.h"
 #include "Exception.h"
 #include "System.h"
 #include "AutoPtr.h"
@@ -57,29 +58,6 @@ PEGASUS_NAMESPACE_BEGIN
 # include "ArrayImpl.h"
 #undef PEGASUS_ARRAY_T
 
-//==============================================================================
-//
-// CIMDateTimeRep
-//
-//==============================================================================
-
-class CIMDateTimeRep
-{
-public:
-
-    // Number of microseconds elapsed since January 1, 1 BCE.
-    Uint64 usec;
-
-    // UTC offset
-    Uint32 utcOffset;
-
-    // ':' for intervals. '-' or '+' for time stamps.
-    Uint16 sign;
-
-    // Number of wild characters ('*') used to initialize this object.
-    Uint16 numWildcards;
-};
-
 //==============================================================================
 //
 // Local constants.
index df60924d2fb1356963c0bb618ef43d4c01f5ee1a..4e6ef5fed8c919bffd59f2f07e245d4849c8f8f2 100644 (file)
@@ -534,6 +534,8 @@ public:
 private:
     CIMDateTimeRep* _rep;
     CIMDateTime(CIMDateTimeRep*);
+   
+    friend class CIMBuffer;
 };
 
 /** Compares two CIMDateTime objects and returns true if they represent the
diff --git a/src/Pegasus/Common/CIMDateTimeRep.h b/src/Pegasus/Common/CIMDateTimeRep.h
new file mode 100644 (file)
index 0000000..bd5aa9d
--- /dev/null
@@ -0,0 +1,59 @@
+//%LICENSE////////////////////////////////////////////////////////////////
+//
+// Licensed to The Open Group (TOG) under one or more contributor license
+// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
+// this work for additional information regarding copyright ownership.
+// Each contributor licenses this file to you under the OpenPegasus Open
+// Source License; you may not use this file except in compliance with the
+// License.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 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.
+//
+//////////////////////////////////////////////////////////////////////////
+//
+//%/////////////////////////////////////////////////////////////////////////////
+
+#ifndef Pegasus_CIMDateTimeRep_h
+#define Pegasus_CIMDateTimeRep_h
+
+PEGASUS_NAMESPACE_BEGIN
+
+/** This class defines the internal representation of the CIMDateTime class.
+    The CIMDateTimeRep is a private memeber of CIMDateTime class.
+*/
+class CIMDateTimeRep
+{
+public:
+
+    // Number of microseconds elapsed since January 1, 1 BCE.
+    Uint64 usec;
+
+    // UTC offset
+    Uint32 utcOffset;
+
+    // ':' for intervals. '-' or '+' for time stamps.
+    Uint16 sign;
+
+    // Number of wild characters ('*') used to initialize this object.
+    Uint16 numWildcards;
+};
+
+PEGASUS_NAMESPACE_END
+
+#endif /* Pegasus_CIMDateTimeRep_h */
index 19a7fb42b7730979bb2b862fdcbd13b5ab28e5c9..467b29fd60287061986692fb7dece9f2939b9531 100644 (file)
@@ -236,6 +236,20 @@ void test9()
     PEGASUS_TEST_ASSERT(cb.getUint32(y) && y == 1234);
 }
 
+void test10()
+{
+    CIMBuffer cb;
+    CIMDateTime dateTime1("20090602104500.123456+330");
+
+    cb.putDateTime(dateTime1);
+
+    cb.rewind();
+
+    CIMDateTime dateTime2;
+    PEGASUS_TEST_ASSERT(cb.getDateTime(dateTime2));
+    PEGASUS_TEST_ASSERT(dateTime1.toString() == dateTime2.toString());
+}
+
 int main(int argc, char** argv)
 {
     test1();
@@ -247,6 +261,7 @@ int main(int argc, char** argv)
     test7();
     test8();
     test9();
+    test10();
 
     cout << argv[0] << " +++++ passed all tests" << endl;
     return 0;