blob: 4b08940789853aae8edebec37d429f3f0d224dfa [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 "PdxRemoteWriter.hpp"
#include "PdxTypeRegistry.hpp"
using namespace System;
namespace Apache
{
namespace Geode
{
namespace Client
{
namespace Internal
{
/*
* Purpose of this class to map local type to remote type
* If remote type will have extra field then we have to merge that field
* if local type has field then need to put on stream
*/
void PdxRemoteWriter::writePreserveData()
{
m_currentDataIdx++;//it starts from -1
if (m_preserveData != nullptr)
{
while (m_currentDataIdx < m_remoteTolocalMap->Length)
{
if (m_remoteTolocalMap[m_currentDataIdx] == -1)//need to add preserve data with offset
{
PdxLocalWriter::AddOffset();
m_dataOutput->WriteBytesOnly(m_preserveData[m_preserveDataIdx++]);
m_currentDataIdx++;
}
else if (m_remoteTolocalMap[m_currentDataIdx] == -2)//need to add preserve data WITHOUT offset
{
m_dataOutput->WriteBytesOnly(m_preserveData[m_preserveDataIdx++]);
m_currentDataIdx++;
}
else
{
break; //continue writing local data..
}
}
}
}
void PdxRemoteWriter::initialize()
{
//this is default case
if (m_preserveData == nullptr)
{
//this needs to fix for IPdxTypeMapper
m_pdxType = GetLocalPdxType(m_pdxClassName);
m_offsets = gcnew array<int>(m_pdxType->NumberOfVarLenFields);
}
}
bool PdxRemoteWriter::isFieldWritingStarted()
{
return m_currentDataIdx != -1;//field writing NOT started. do we need this??
}
IPdxWriter^ PdxRemoteWriter::WriteUnreadFields(IPdxUnreadFields^ unread)
{
PdxLocalWriter::WriteUnreadFields(unread);
m_remoteTolocalMap = m_pdxType->GetRemoteToLocalMap(m_dataOutput->Cache);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteByte(String^ fieldName, SByte value)
{
writePreserveData();
PdxLocalWriter::WriteByte(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteSByte(String^ fieldName, SByte value)
{
writePreserveData();
PdxLocalWriter::WriteSByte(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteBoolean(String^ fieldName, bool value)
{
writePreserveData();
PdxLocalWriter::WriteBoolean(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteChar(String^ fieldName, Char value)
{
writePreserveData();
PdxLocalWriter::WriteChar(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUInt16(String^ fieldName, System::UInt16 value)
{
writePreserveData();
PdxLocalWriter::WriteUInt16(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUInt32(String^ fieldName, System::UInt32 value)
{
writePreserveData();
PdxLocalWriter::WriteUInt32(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUInt64(String^ fieldName, System::UInt64 value)
{
writePreserveData();
PdxLocalWriter::WriteUInt64(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteShort(String^ fieldName, System::Int16 value)
{
writePreserveData();
PdxLocalWriter::WriteShort(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteInt(String^ fieldName, System::Int32 value)
{
writePreserveData();
PdxLocalWriter::WriteInt(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteLong(String^ fieldName, Int64 value)
{
writePreserveData();
PdxLocalWriter::WriteLong(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteFloat(String^ fieldName, float value)
{
writePreserveData();
PdxLocalWriter::WriteFloat(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteDouble(String^ fieldName, double value)
{
writePreserveData();
PdxLocalWriter::WriteDouble(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteString(String^ fieldName, String^ value)
{
writePreserveData();
PdxLocalWriter::WriteString(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUTFHuge(String^ fieldName, String^ value)
{
writePreserveData();
PdxLocalWriter::WriteUTFHuge(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteASCIIHuge(String^ fieldName, String^ value)
{
writePreserveData();
PdxLocalWriter::WriteASCIIHuge(fieldName, value);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteObject(String^ fieldName, Object^ obj)
{
writePreserveData();
PdxLocalWriter::WriteObject(fieldName, obj);
return this;
}
//TODO:
//IPdxWriter^ PdxRemoteWriter::WriteMap( String^ fieldName, System::Collections::IDictionary^ map );
IPdxWriter^ PdxRemoteWriter::WriteCollection(String^ fieldName, System::Collections::IList^ obj)
{
writePreserveData();
PdxLocalWriter::WriteCollection(fieldName, obj);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteDate(String^ fieldName, System::DateTime date)
{
writePreserveData();
PdxLocalWriter::WriteDate(fieldName, date);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteBooleanArray(String^ fieldName, array<bool>^ boolArray)
{
writePreserveData();
PdxLocalWriter::WriteBooleanArray(fieldName, boolArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteCharArray(String^ fieldName, array<Char>^ charArray)
{
writePreserveData();
PdxLocalWriter::WriteCharArray(fieldName, charArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteByteArray(String^ fieldName, array<Byte>^ byteArray)
{
writePreserveData();
PdxLocalWriter::WriteByteArray(fieldName, byteArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteSByteArray(String^ fieldName, array<SByte>^ sbyteArray)
{
writePreserveData();
PdxLocalWriter::WriteSByteArray(fieldName, sbyteArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteShortArray(String^ fieldName, array<System::Int16>^ shortArray)
{
writePreserveData();
PdxLocalWriter::WriteShortArray(fieldName, shortArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUnsignedShortArray(String^ fieldName, array<System::UInt16>^ ushortArray)
{
writePreserveData();
PdxLocalWriter::WriteUnsignedShortArray(fieldName, ushortArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteIntArray(String^ fieldName, array<System::Int32>^ intArray)
{
writePreserveData();
PdxLocalWriter::WriteIntArray(fieldName, intArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUnsignedIntArray(String^ fieldName, array<System::UInt32>^ uintArray)
{
writePreserveData();
PdxLocalWriter::WriteUnsignedIntArray(fieldName, uintArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteLongArray(String^ fieldName, array<Int64>^ longArray)
{
writePreserveData();
PdxLocalWriter::WriteLongArray(fieldName, longArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteUnsignedLongArray(String^ fieldName, array<System::UInt64>^ ulongArray)
{
writePreserveData();
PdxLocalWriter::WriteUnsignedLongArray(fieldName, ulongArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteFloatArray(String^ fieldName, array<float>^ floatArray)
{
writePreserveData();
PdxLocalWriter::WriteFloatArray(fieldName, floatArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteDoubleArray(String^ fieldName, array<double>^ doubleArray)
{
writePreserveData();
PdxLocalWriter::WriteDoubleArray(fieldName, doubleArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteStringArray(String^ fieldName, array<String^>^ stringArray)
{
writePreserveData();
PdxLocalWriter::WriteStringArray(fieldName, stringArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteObjectArray(String^ fieldName, List<Object^>^ objectArray)
{
writePreserveData();
PdxLocalWriter::WriteObjectArray(fieldName, objectArray);
return this;
}
IPdxWriter^ PdxRemoteWriter::WriteArrayOfByteArrays(String^ fieldName, array<array<Byte>^>^ byteArrays)
{
writePreserveData();
PdxLocalWriter::WriteArrayOfByteArrays(fieldName, byteArrays);
return this;
}
//TODO:
//IPdxWriter^ PdxRemoteWriter::WriteEnum(String^ fieldName, Enum e) ;
//IPdxWriter^ PdxRemoteWriter::WriteInetAddress(String^ fieldName, InetAddress address);
} // namespace Internal
} // namespace Client
} // namespace Geode
} // namespace Apache