/*=========================================================================
 * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
 * This product is protected by U.S. and international copyright
 * and intellectual property laws. Pivotal products are covered by
 * more patents listed at http://www.pivotal.io/patents.
 *=========================================================================
 */



//#include "gf_includesN.hpp"
#include <cppcache/impl/GemfireTypeIdsImpl.hpp>
#include "CacheableObjectArrayMN.hpp"
#include "DataOutputMN.hpp"
#include "DataInputMN.hpp"
#include "ExceptionTypesMN.hpp"
#include "impl/SafeConvertN.hpp"
#include "impl/PdxTypeRegistry.hpp"

using namespace System;
using namespace System::Collections::Generic;

using namespace GemStone::GemFire::Cache::Generic;

namespace GemStone
{
  namespace GemFire
  {
    namespace Cache { namespace Generic
    {
      // Region: IGFSerializable Members

      void CacheableObjectArray::ToData(DataOutput^ output)
      {
        output->WriteArrayLen((int32_t)Count);
        output->WriteByte((int8_t)gemfire::GemfireTypeIdsImpl::Class);
        output->WriteByte((int8_t)gemfire::GemfireTypeIds::CacheableASCIIString);
        output->WriteUTF("java.lang.Object");

        for each (Object^ obj in this) {
					//TODO::split
          output->WriteObject(obj);
        }

        /*_GF_MG_EXCEPTION_TRY

          gemfire::DataOutput& nativeOutput = *(output->_NativePtr);
          nativeOutput.writeArrayLen((int32_t)Count);
          nativeOutput.write((int8_t)gemfire::GemfireTypeIdsImpl::Class);
          nativeOutput.write((int8_t)gemfire::GemfireTypeIds::CacheableASCIIString);
          nativeOutput.writeASCII("java.lang.Object");
          for each (IGFSerializable^ obj in this) {
            gemfire::SerializablePtr objPtr(SafeMSerializableConvert(obj));
            nativeOutput.writeObject(objPtr);
          }

        _GF_MG_EXCEPTION_CATCH_ALL*/
      }

      IGFSerializable^ CacheableObjectArray::FromData(DataInput^ input)
      {
        int len = input->ReadArrayLen();
        if (len >= 0) {
          //int8_t typeCode;
          input->ReadByte(); // ignore CLASS typeid
          input->ReadByte(); // ignore string typeid
          unsigned short classLen;
          classLen = input->ReadInt16();
          input->AdvanceCursor(classLen);
          //nativeInput.readInt(&classLen);
          //nativeInput.advanceCursor(classLen);
        }
        for (int32_t index = 0; index < len; ++index) {
          Add(input->ReadObject());
        }
        return this;
        /*_GF_MG_EXCEPTION_TRY

          gemfire::DataInput& nativeInput = *(input->_NativePtr);
          int32_t len;
          nativeInput.readArrayLen(&len);
          if (len >= 0) {
            int8_t typeCode;
            nativeInput.read(&typeCode); // ignore CLASS typeid
            nativeInput.read(&typeCode); // ignore string typeid
            uint16_t classLen;
            nativeInput.readInt(&classLen);
            nativeInput.advanceCursor(classLen);
          }
          gemfire::CacheablePtr value;
          for (int32_t index = 0; index < len; ++index) {
            nativeInput.readObject(value);
            Add(SafeUMSerializableConvert(value.ptr()));
          }

        _GF_MG_EXCEPTION_CATCH_ALL
        return this;*/
      }

      uint32_t CacheableObjectArray::ObjectSize::get()
      { 
       /* uint32_t size = static_cast<uint32_t> (sizeof(CacheableObjectArray^));
        for each (IGFSerializable^ val in this) {
          if (val != nullptr) {
            size += val->ObjectSize;
          }
        }*/
        return Count;
      }      
      // End Region: IGFSerializable Members
    }
  }
}
 } //namespace 
