diff options
author | dims <dims@13f79535-47bb-0310-9956-ffa450edef68> | 2008-06-17 00:23:01 +0000 |
---|---|---|
committer | dims <dims@13f79535-47bb-0310-9956-ffa450edef68> | 2008-06-17 00:23:01 +0000 |
commit | bdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a (patch) | |
tree | 38a92061c0793434c4be189f1d70c3458b6bc41d /tags/cpp-sdo-1.0.incubating-M3/runtime/core/src/commonj/sdo/SDOValue.cpp |
Move Tuscany from Incubator to top level.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tags/cpp-sdo-1.0.incubating-M3/runtime/core/src/commonj/sdo/SDOValue.cpp')
-rw-r--r-- | tags/cpp-sdo-1.0.incubating-M3/runtime/core/src/commonj/sdo/SDOValue.cpp | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/tags/cpp-sdo-1.0.incubating-M3/runtime/core/src/commonj/sdo/SDOValue.cpp b/tags/cpp-sdo-1.0.incubating-M3/runtime/core/src/commonj/sdo/SDOValue.cpp new file mode 100644 index 0000000000..30997ef16c --- /dev/null +++ b/tags/cpp-sdo-1.0.incubating-M3/runtime/core/src/commonj/sdo/SDOValue.cpp @@ -0,0 +1,236 @@ +/* + * + * Copyright 2007 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Rev$ $Date$ */ + +#include "commonj/sdo/SDOValue.h" + +namespace commonj +{ + namespace sdo + { + + SDOValue::SDOValue(const char* inValue, unsigned int len) : + typeOfValue(DataTypeInfo::SDOByteArray), transient_buffer(0) + { + char* temp_buffer = new char[len + 1]; + + // We would like to use strncpy at this point, but it is + // deprecated and its preferred alternative, strncpy_s, does + // not copy nulls if they appear in the input stream so we'll + // do it by hand. + for (unsigned int i = 0; i < len; i++) + { + temp_buffer[i] = (char) inValue[i]; + } + temp_buffer[len] = 0; + + value.TextString = new SDOString(temp_buffer, len); + + delete[] temp_buffer; + } + + SDOValue::SDOValue(const wchar_t* inValue, unsigned int len) : + typeOfValue(DataTypeInfo::SDOWideString), transient_buffer(0) + { + value.WideString.data = new wchar_t[len + 1]; + + for (unsigned int i = 0; i < len; i++) + { + value.WideString.data[i] = (wchar_t) inValue[i]; + } + value.WideString.data[len] = (wchar_t) 0; + + value.WideString.length = len; // NOTE: length is the number of _real_ + // characters in the WideString + + } + + // Copy constructor + SDOValue::SDOValue(const SDOValue& inValue) : + typeOfValue(inValue.typeOfValue), transient_buffer(0) + { + switch (inValue.typeOfValue) + { + case DataTypeInfo::SDObool: + value.Boolean = inValue.value.Boolean; + break; + case DataTypeInfo::SDOchar: + value.Character = inValue.value.Character; + break; + case DataTypeInfo::SDOwchar_t: + value.WideChar = inValue.value.WideChar; + break; + case DataTypeInfo::SDOshort: + value.Short = inValue.value.Short; + break; + case DataTypeInfo::SDOlong: + value.Integer = inValue.value.Integer; + break; + case DataTypeInfo::SDOfloat: + value.Float = inValue.value.Float; + break; + case DataTypeInfo::SDOdouble: + value.Double = inValue.value.Double; + break; + case DataTypeInfo::SDOSDODate: + value.Date = new SDODate((inValue.value.Date)->getTime()); + break; + case DataTypeInfo::SDOCString: + case DataTypeInfo::SDOByteArray: + value.TextString = new SDOString(*(inValue.value.TextString)); + break; + case DataTypeInfo::SDOWideString: + value.WideString.data = new wchar_t[inValue.value.WideString.length + 1]; + // The loop copies the null terminator that was added to the end + // of the source data when _it_ was constructed. + for (unsigned int i = 0; i <= inValue.value.WideString.length; i++) + { + value.WideString.data[i] = inValue.value.WideString.data[i]; + } + value.WideString.length = inValue.value.WideString.length; + break; + } + } + // End of copy constructor + + // Copy assignment + SDOValue& SDOValue::operator=(const SDOValue& inValue) + { + if (this != &inValue) // sval = sval is a no-op. + { + // Clear out any allocated data in the target SDOValue. + switch (typeOfValue) + { + case DataTypeInfo::SDOSDODate: + delete value.Date; + value.Date = 0; + break; + case DataTypeInfo::SDOCString: + case DataTypeInfo::SDOByteArray: + delete value.TextString; + value.TextString = 0; + break; + case DataTypeInfo::SDOWideString: + delete[] value.WideString.data; + value.WideString.data = 0; + value.WideString.length = 0; + break; + default: + // Nothing to delete. + break; + } + + if (transient_buffer != 0) + { + delete transient_buffer; + transient_buffer = 0; + } + + // Copy the source data into the target + switch (inValue.typeOfValue) + { + case DataTypeInfo::SDObool: + value.Boolean = inValue.value.Boolean; + break; + case DataTypeInfo::SDOchar: + value.Character = inValue.value.Character; + break; + case DataTypeInfo::SDOwchar_t: + value.WideChar = inValue.value.WideChar; + break; + case DataTypeInfo::SDOshort: + value.Short = inValue.value.Short; + break; + case DataTypeInfo::SDOlong: + value.Integer = inValue.value.Integer; + break; + case DataTypeInfo::SDOint64_t: + value.Int64 = inValue.value.Int64; + break; + case DataTypeInfo::SDOfloat: + value.Float = inValue.value.Float; + break; + case DataTypeInfo::SDOdouble: + value.Double = inValue.value.Double; + break; + case DataTypeInfo::SDOSDODate: + value.Date = new SDODate((inValue.value.Date)->getTime()); + break; + case DataTypeInfo::SDOCString: + case DataTypeInfo::SDOByteArray: + value.TextString = new SDOString(*(inValue.value.TextString)); + break; + case DataTypeInfo::SDOWideString: + value.WideString.data = new wchar_t[inValue.value.WideString.length + 1]; + // The loop copies the null terminator that was added to the end + // of the source data when _it_ was constructed. + for (unsigned int i = 0; i <= inValue.value.WideString.length; i++) + { + value.WideString.data[i] = inValue.value.WideString.data[i]; + } + value.WideString.length = inValue.value.WideString.length; + break; + } + // Finally, set the new type. + typeOfValue = inValue.typeOfValue; + } + return *this; + } + // End of copy assignment + + // Destructor + SDOValue::~SDOValue() + { + + // Clear out any allocated data in the target SDOValue. + switch (typeOfValue) + { + case DataTypeInfo::SDOSDODate: + delete value.Date; + value.Date = 0; + break; + case DataTypeInfo::SDOCString: + case DataTypeInfo::SDOByteArray: + delete value.TextString; + value.TextString = 0; + break; + case DataTypeInfo::SDOWideString: + delete[] value.WideString.data; + value.WideString.data = 0; + value.WideString.length = 0; + break; + default: + // Nothing to delete. + break; + } + + if (transient_buffer != 0) + { + delete transient_buffer; + transient_buffer = 0; + } + + typeOfValue = DataTypeInfo::SDOunset; + } + // End of Destructor + + + const SDOValue SDOValue::nullSDOValue = SDOValue(DataTypeInfo::SDOnull); + const SDOValue SDOValue::unsetSDOValue = SDOValue(DataTypeInfo::SDOunset); + } // End - namespace sdo +} // End - namespace commonj |