blob: 2898365501b6cdfd64731d5639ac5c183f16a341 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#include "PdxLocalReader.hpp"
#include "PdxTypeRegistry.hpp"
#include "../DataInput.hpp"
#include "DotNetTypes.hpp"
#include "../Cache.hpp"
using namespace System;
namespace Apache
{
namespace Geode
{
namespace Client
{
namespace Internal
{
void PdxLocalReader::initialize()
{
//pdx header already read before this
m_startBuffer = m_dataInput->GetCursor();
m_startPosition = static_cast<int32_t>(m_dataInput->BytesRead);//number of bytes read in c++;
//m_serializedLengthWithOffsets = PdxHelper::ReadInt32(m_startBuffer);
if(m_serializedLengthWithOffsets <= 0xff)
m_offsetSize = 1;
else if(m_serializedLengthWithOffsets <= 0xffff)
m_offsetSize = 2;
else
m_offsetSize = 4;
if(m_pdxType->NumberOfVarLenFields > 0)
m_serializedLength = m_serializedLengthWithOffsets - ((m_pdxType->NumberOfVarLenFields -1) * m_offsetSize);
else
m_serializedLength = m_serializedLengthWithOffsets;
m_offsetsBuffer = m_startBuffer + m_serializedLength;
}
void PdxLocalReader::MoveStream()
{
//this will reset unmaged datainput as well
m_dataInput->ResetPdx(m_startPosition + m_serializedLengthWithOffsets);
}
PdxRemotePreservedData^ PdxLocalReader::GetPreservedData(PdxType^ mergedVersion, IPdxSerializable^ pdxObject)
{
int nFieldExtra = m_pdxType->NumberOfFieldsExtra;
if(nFieldExtra > 0 && m_dataInput->Cache->GetPdxIgnoreUnreadFields() == false)
{
//m_pdxRemotePreserveData = gcnew PdxRemotePreservedData(m_pdxType!=nullptr? m_pdxType->TypeId : 0, mergedVersion->TypeId,nFieldExtra);
m_pdxRemotePreserveData->Initialize(m_pdxType!=nullptr? m_pdxType->TypeId : 0, mergedVersion->TypeId,nFieldExtra,pdxObject);
m_localToRemoteMap = m_pdxType->GetLocalToRemoteMap(m_dataInput->Cache);
m_remoteToLocalMap = m_pdxType->GetRemoteToLocalMap(m_dataInput->Cache);
int currentIdx = 0;
for(int i = 0; i < m_remoteToLocalMap->Length; i++)
{
if(m_remoteToLocalMap[i] == -1 || m_remoteToLocalMap[i] == -2)//this field needs to preserve
{
int pos = m_pdxType->GetFieldPosition(i, m_offsetsBuffer, m_offsetSize, m_serializedLength);
int nFieldPos = 0;
if( i == m_remoteToLocalMap->Length - 1)
{
nFieldPos = m_serializedLength;
}
else
{
nFieldPos = m_pdxType->GetFieldPosition(i + 1, m_offsetsBuffer, m_offsetSize, m_serializedLength);
}
m_dataInput->ResetAndAdvanceCursorPdx(pos);
m_pdxRemotePreserveData[currentIdx++] = m_dataInput->ReadBytesOnly(nFieldPos - pos);
m_dataInput->RewindCursorPdx(pos);
}
}
//Log::Debug("PdxLocalReader::GetPreservedData:: " + m_isDataNeedToPreserve);
if(m_isDataNeedToPreserve)
return m_pdxRemotePreserveData;
else
{
//sPdxTypeRegistry::SetPreserveData(pdxObject, m_pdxRemotePreserveData);
}
}
return nullptr;
}
IPdxUnreadFields^ PdxLocalReader::ReadUnreadFields()
{
//Log::Debug("PdxLocalReader::ReadUnreadFields:: " + m_isDataNeedToPreserve + " ignore property " + PdxTypeRegistry::PdxIgnoreUnreadFields);
if(m_dataInput->Cache->GetPdxIgnoreUnreadFields() == true)
return nullptr;
m_isDataNeedToPreserve = false;
return m_pdxRemotePreserveData;
}
SByte PdxLocalReader::ReadByte( String^ fieldName )
{
return m_dataInput->ReadSByte();
}
SByte PdxLocalReader::ReadSByte( String^ fieldName )
{
return m_dataInput->ReadSByte();
}
Boolean PdxLocalReader::ReadBoolean( String^ fieldName )
{
return m_dataInput->ReadBoolean();
}
Char PdxLocalReader::ReadChar( String^ fieldName )
{
return m_dataInput->ReadChar();
}
System::UInt16 PdxLocalReader::ReadUInt16( String^ fieldName )
{
return m_dataInput->ReadUInt16();
}
System::UInt32 PdxLocalReader::ReadUInt32( String^ fieldName )
{
return m_dataInput->ReadUInt32();
}
System::UInt64 PdxLocalReader::ReadUInt64( String^ fieldName )
{
return m_dataInput->ReadUInt64();
}
short PdxLocalReader::ReadShort( String^ fieldName )
{
return m_dataInput->ReadInt16();
}
Int32 PdxLocalReader::ReadInt( String^ fieldName )
{
return m_dataInput->ReadInt32();
}
Int64 PdxLocalReader::ReadLong( String^ fieldName )
{
return m_dataInput->ReadInt64();
}
float PdxLocalReader::ReadFloat( String^ fieldName )
{
return m_dataInput->ReadFloat();
}
double PdxLocalReader::ReadDouble( String^ fieldName )
{
return m_dataInput->ReadDouble();
}
String^ PdxLocalReader::ReadString( String^ fieldName )
{
return m_dataInput->ReadString();
}
String^ PdxLocalReader::ReadUTFHuge( String^ fieldName )
{
return m_dataInput->ReadUTFHuge();
}
String^ PdxLocalReader::ReadASCIIHuge( String^ fieldName )
{
return m_dataInput->ReadASCIIHuge();
}
Object^ PdxLocalReader::ReadObject( String^ fieldName )
{
return m_dataInput->ReadObject();
}
//TODO:
//void WriteMap( String^ fieldName, System::Collections::IDictionary^ map );
void PdxLocalReader::ReadCollection( String^ fieldName, System::Collections::IList^ collection)
{
return m_dataInput->ReadCollection(collection);
}
System::DateTime PdxLocalReader::ReadDate( String^ fieldName)
{
return m_dataInput->ReadDate();
}
//void writeFile(String fieldName, File file) ;
array<bool>^ PdxLocalReader::ReadBooleanArray( String^ fieldName )
{
//array<bool>^ arr;
// m_dataInput->ReadObject(arr);
return m_dataInput->ReadBooleanArray();
}
array<Char>^ PdxLocalReader::ReadCharArray(String^ fieldName )
{
//array<Char>^ arr;
//m_dataInput->ReadObject(arr);
return m_dataInput->ReadCharArray();
}
array<Byte>^ PdxLocalReader::ReadByteArray(String^ fieldName)
{
array<Byte>^ arr;
m_dataInput->ReadObject(arr);
return arr;
}
array<SByte>^ PdxLocalReader::ReadSByteArray(String^ fieldName)
{
//array<SByte>^ arr;
//m_dataInput->ReadObject(arr);
return m_dataInput->ReadSBytes();
}
array<System::Int16>^ PdxLocalReader::ReadShortArray(String^ fieldName)
{
//array<Int16>^ arr;
//m_dataInput->ReadObject(arr);
return m_dataInput->ReadShortArray();
}
array<System::UInt16>^ PdxLocalReader::ReadUnsignedShortArray(String^ fieldName)
{
array<UInt16>^ arr;
m_dataInput->ReadObject(arr);
return arr;
}
array<System::Int32>^ PdxLocalReader::ReadIntArray(String^ fieldName)
{
//array<Int32>^ arr;
/// m_dataInput->ReadObject(arr);
return m_dataInput->ReadIntArray();
}
array<System::UInt32>^ PdxLocalReader::ReadUnsignedIntArray(String^ fieldName)
{
array<UInt32>^ arr;
m_dataInput->ReadObject(arr);
return arr;
}
array<Int64>^ PdxLocalReader::ReadLongArray(String^ fieldName)
{
// array<Int64>^ arr;
// m_dataInput->ReadObject(arr);
return m_dataInput->ReadLongArray();
}
array<System::UInt64>^ PdxLocalReader::ReadUnsignedLongArray(String^ fieldName )
{
array<UInt64>^ arr;
m_dataInput->ReadObject(arr);
return arr;
}
array<float>^ PdxLocalReader::ReadFloatArray(String^ fieldName)
{
//array<float>^ arr;
//m_dataInput->ReadObject(arr);
return m_dataInput->ReadFloatArray();
}
array<double>^ PdxLocalReader::ReadDoubleArray(String^ fieldName)
{
//array<Double>^ arr;
//m_dataInput->ReadObject(arr);
return m_dataInput->ReadDoubleArray();
}
array<String^>^ PdxLocalReader::ReadStringArray(String^ fieldName)
{
return m_dataInput->ReadStringArray();
}
List<Object^>^ PdxLocalReader::ReadObjectArray(String^ fieldName)
{
return m_dataInput->ReadObjectArray();
}
array<array<Byte>^>^ PdxLocalReader::ReadArrayOfByteArrays(String^ fieldName )
{
return m_dataInput->ReadArrayOfByteArrays();
}
//TODO:
//void WriteEnum(String^ fieldName, Enum e) ;
//void WriteInetAddress(String^ fieldName, InetAddress address);
bool PdxLocalReader::HasField(String^ fieldName)
{
return m_pdxType->GetPdxField(fieldName) != nullptr;
}
bool PdxLocalReader::IsIdentityField(String^ fieldName)
{
PdxFieldType^ pft = m_pdxType->GetPdxField(fieldName) ;
return (pft != nullptr) && (pft->IdentityField);
}
Object^ PdxLocalReader::ReadField(String^ fieldName, Type^ type)
{
if(type->Equals(DotNetTypes::IntType))
{
return this->ReadInt(fieldName);
}
else if(type->Equals(DotNetTypes::StringType))
{
return this->ReadString(fieldName);
}
else if(type->Equals(DotNetTypes::BooleanType))
{
return this->ReadBoolean(fieldName);
}
else if(type->Equals(DotNetTypes::FloatType))
{
return this->ReadFloat(fieldName);
}
else if(type->Equals(DotNetTypes::DoubleType))
{
return this->ReadDouble(fieldName);
}
else if(type->Equals(DotNetTypes::CharType))
{
return this->ReadChar(fieldName);
}
else if(type->Equals(DotNetTypes::SByteType))
{
return this->ReadByte(fieldName);
}
else if(type->Equals(DotNetTypes::ShortType))
{
return this->ReadShort(fieldName);
}
else if(type->Equals(DotNetTypes::LongType))
{
return this->ReadLong(fieldName);
}
else if(type->Equals(DotNetTypes::ByteArrayType))
{
return this->ReadByteArray(fieldName);
}
else if(type->Equals(DotNetTypes::DoubleArrayType))
{
return this->ReadDoubleArray(fieldName);
}
else if(type->Equals(DotNetTypes::FloatArrayType))
{
return this->ReadFloatArray(fieldName);
}
else if(type->Equals(DotNetTypes::ShortArrayType))
{
return this->ReadShortArray(fieldName);
}
else if(type->Equals(DotNetTypes::IntArrayType))
{
return this->ReadIntArray(fieldName);
}
else if(type->Equals(DotNetTypes::LongArrayType))
{
return this->ReadLongArray(fieldName);
}
else if(type->Equals(DotNetTypes::BoolArrayType))
{
return this->ReadBooleanArray(fieldName);
}
else if(type->Equals(DotNetTypes::CharArrayType))
{
return this->ReadCharArray(fieldName);
}
else if(type->Equals(DotNetTypes::StringArrayType))
{
return this->ReadStringArray(fieldName);
}
else if(type->Equals(DotNetTypes::DateType))
{
return this->ReadDate(fieldName);
}
else if(type->Equals(DotNetTypes::ByteArrayOfArrayType))
{
return this->ReadArrayOfByteArrays(fieldName);
}
else if(type->Equals(DotNetTypes::ObjectArrayType))
{
return this->ReadObjectArray(fieldName);
}
else
{
return this->ReadObject(fieldName);
//throw gcnew IllegalStateException("ReadField unable to de-serialize "
// + fieldName + " of " + type);
}
}
Apache::Geode::Client::Cache^ PdxLocalReader::Cache::get() { return m_dataInput->Cache; }
} // namepsace Internal
} // namespace Client
} // namespace Geode
} // namespace Apache