http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedPersistenceManager.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedPersistenceManager.cpp 
b/clicache/src/impl/ManagedPersistenceManager.cpp
new file mode 100644
index 0000000..5eeeeb4
--- /dev/null
+++ b/clicache/src/impl/ManagedPersistenceManager.cpp
@@ -0,0 +1,247 @@
+/*
+ * 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 "ManagedPersistenceManager.hpp"
+#include "../IPersistenceManager.hpp"
+
+#include <string>
+
+using namespace System;
+using namespace System::Text;
+using namespace System::Reflection;
+
+namespace apache
+{
+  namespace geode
+  {
+    namespace client
+    {
+
+      apache::geode::client::PersistenceManager* 
ManagedPersistenceManagerGeneric::create(const char* assemblyPath,
+        const char* factoryFunctionName)
+      {
+        try
+        {
+          String^ mg_assemblyPath = 
Apache::Geode::Client::ManagedString::Get(assemblyPath);
+          String^ mg_factoryFunctionName = 
Apache::Geode::Client::ManagedString::Get(factoryFunctionName);
+          String^ mg_typeName = nullptr;
+
+          String^ mg_genericKey = nullptr;
+          String^ mg_genericVal = nullptr;
+
+          System::Int32 dotIndx = -1;
+          System::Int32 genericsOpenIndx = -1;
+          System::Int32 genericsCloseIndx = -1;
+          System::Int32 commaIndx = -1;
+
+          if (mg_factoryFunctionName == nullptr ||
+            (dotIndx = mg_factoryFunctionName->LastIndexOf('.')) < 0)
+          {
+            std::string ex_str = "ManagedPersistenceManagerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain type name";
+            throw IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((genericsCloseIndx = mg_factoryFunctionName->LastIndexOf('>')) < 
0)
+          {
+            std::string ex_str = "ManagedPersistenceManagerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain any generic type parameters";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((genericsOpenIndx = mg_factoryFunctionName->LastIndexOf('<')) < 
0 ||
+            genericsOpenIndx > genericsCloseIndx)
+          {
+            std::string ex_str = "ManagedPersistenceManagerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain expected generic type parameters";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((commaIndx = mg_factoryFunctionName->LastIndexOf(',')) < 0 ||
+            (commaIndx < genericsOpenIndx || commaIndx > genericsCloseIndx))
+          {
+            std::string ex_str = "ManagedPersistenceManagerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain expected generic type parameter 
comma separator";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          StringBuilder^ typeBuilder = gcnew 
StringBuilder(mg_factoryFunctionName->Substring(0, genericsOpenIndx));
+          mg_typeName = typeBuilder->ToString();
+          mg_genericKey = mg_factoryFunctionName->Substring(genericsOpenIndx + 
1, commaIndx - genericsOpenIndx - 1);
+          mg_genericKey = mg_genericKey->Trim();
+          mg_genericVal = mg_factoryFunctionName->Substring(commaIndx + 1, 
genericsCloseIndx - commaIndx - 1);
+          mg_genericVal = mg_genericVal->Trim();
+          mg_factoryFunctionName = mg_factoryFunctionName->Substring(dotIndx + 
1);
+
+          Apache::Geode::Client::Log::Fine("Attempting to instantiate a 
[{0}<{1}, {2}>] via the [{3}] factory method.",
+            mg_typeName, mg_genericKey, mg_genericVal, mg_factoryFunctionName);
+
+          typeBuilder->Append("`2");
+          mg_typeName = typeBuilder->ToString();
+
+          Assembly^ assmb = nullptr;
+          try
+          {
+            assmb = Assembly::Load(mg_assemblyPath);
+          }
+          catch (System::Exception^)
+          {
+            assmb = nullptr;
+          }
+          if (assmb == nullptr)
+          {
+            std::string ex_str = "ManagedPersistenceManagerGeneric: Could not 
load assembly: ";
+            ex_str += assemblyPath;
+            throw IllegalArgumentException(ex_str.c_str());
+          }
+
+          Apache::Geode::Client::Log::Debug("Loading type: [{0}]", 
mg_typeName);
+
+          Type^ typeInst = assmb->GetType(mg_typeName, false, true);
+
+          if (typeInst != nullptr)
+          {
+            array<Type^>^ types = gcnew array<Type^>(2);
+            types[0] = Type::GetType(mg_genericKey, false, true);
+            types[1] = Type::GetType(mg_genericVal, false, true);
+
+            if (types[0] == nullptr || types[1] == nullptr)
+            {
+              std::string ex_str = "ManagedPersistenceManagerGeneric: Could 
not get both generic type argument instances";
+              throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+            }
+
+            typeInst = typeInst->MakeGenericType(types);
+            Apache::Geode::Client::Log::Info("Loading function: [{0}]", 
mg_factoryFunctionName);
+
+            MethodInfo^ mInfo = typeInst->GetMethod(mg_factoryFunctionName,
+              BindingFlags::Public | BindingFlags::Static | 
BindingFlags::IgnoreCase);
+
+            if (mInfo != nullptr)
+            {
+              Object^ managedptr = nullptr;
+              try
+              {
+                managedptr = mInfo->Invoke(typeInst, nullptr);
+              }
+              catch (System::Exception^ ex)
+              {
+                Apache::Geode::Client::Log::Debug("{0}: {1}", 
ex->GetType()->Name, ex->Message);
+                managedptr = nullptr;
+              }
+              if (managedptr == nullptr)
+              {
+                std::string ex_str = "ManagedPersistenceManagerGeneric: Could 
not create "
+                  "object on invoking factory function [";
+                ex_str += factoryFunctionName;
+                ex_str += "] in assembly: ";
+                ex_str += assemblyPath;
+                throw IllegalArgumentException(ex_str.c_str());
+              }
+
+              ManagedPersistenceManagerGeneric* mgcl = new 
ManagedPersistenceManagerGeneric(managedptr);
+
+              Type^ clgType = 
Type::GetType("Apache.Geode.Client.PersistenceManagerGeneric`2");
+              clgType = clgType->MakeGenericType(types);
+              Object^ clg = Activator::CreateInstance(clgType);
+
+              mInfo = clgType->GetMethod("SetPersistenceManager");
+              array<Object^>^ params = gcnew array<Object^>(1);
+              params[0] = managedptr;
+              mInfo->Invoke(clg, params);
+
+              
mgcl->setptr((Apache::Geode::Client::IPersistenceManagerProxy^)clg);
+
+              return mgcl;
+            }
+            else
+            {
+              std::string ex_str = "ManagedPersistenceManagerGeneric: Could 
not load "
+                "function with name [";
+              ex_str += factoryFunctionName;
+              ex_str += "] in assembly: ";
+              ex_str += assemblyPath;
+              throw IllegalArgumentException(ex_str.c_str());
+            }
+          }
+          else
+          {
+            Apache::Geode::Client::ManagedString typeName(mg_typeName);
+            std::string ex_str = "ManagedPersistenceManagerGeneric: Could not 
load type [";
+            ex_str += typeName.CharPtr;
+            ex_str += "] in assembly: ";
+            ex_str += assemblyPath;
+            throw IllegalArgumentException(ex_str.c_str());
+          }
+        }
+        catch (const apache::geode::client::Exception&)
+        {
+          throw;
+        }
+        catch (System::Exception^ ex)
+        {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedPersistenceManagerGeneric: Got an 
exception while "
+            "loading managed library: ";
+          ex_str += mg_exStr.CharPtr;
+          throw IllegalArgumentException(ex_str.c_str());
+        }
+        return NULL;
+      }
+
+
+      void ManagedPersistenceManagerGeneric::write(const CacheableKeyPtr&  
key, const CacheablePtr&  value, void *& PersistenceInfo)
+      {
+        m_managedptr->write(key, value);
+      }
+
+      bool ManagedPersistenceManagerGeneric::writeAll()
+      {
+        throw gcnew System::NotSupportedException;
+      }
+
+      void ManagedPersistenceManagerGeneric::init(const RegionPtr& region, 
PropertiesPtr& diskProperties)
+      {
+        m_managedptr->init(region, diskProperties);
+      }
+
+      CacheablePtr ManagedPersistenceManagerGeneric::read(const 
CacheableKeyPtr& key, void *& PersistenceInfo)
+      {
+        return m_managedptr->read(key);
+      }
+
+      bool ManagedPersistenceManagerGeneric::readAll()
+      {
+        throw gcnew System::NotSupportedException;
+      }
+
+      void ManagedPersistenceManagerGeneric::destroy(const CacheableKeyPtr& 
key, void *& PersistenceInfo)
+      {
+        m_managedptr->destroy(key);
+      }
+      void ManagedPersistenceManagerGeneric::close()
+      {
+        m_managedptr->close();
+      }
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedPersistenceManager.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedPersistenceManager.hpp 
b/clicache/src/impl/ManagedPersistenceManager.hpp
new file mode 100644
index 0000000..6f19e0a
--- /dev/null
+++ b/clicache/src/impl/ManagedPersistenceManager.hpp
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+
+#pragma once
+#include "../geode_defs.hpp"
+#include <vcclr.h>
+#include "begin_native.hpp"
+#include <geode/PersistenceManager.hpp>
+#include "end_native.hpp"
+
+#include "PersistenceManagerProxy.hpp"
+
+namespace apache {
+  namespace geode {
+    namespace client {
+
+      /// <summary>
+      /// Wraps the managed <see 
cref="Apache.Geode.Client.IPersistenceManager" />
+      /// object and implements the native 
<c>apache::geode::client::PersistenceManager</c> interface.
+      /// </summary>
+      class ManagedPersistenceManagerGeneric : public 
apache::geode::client::PersistenceManager
+      {
+      public:
+
+        inline ManagedPersistenceManagerGeneric(Object^ userptr) : 
m_userptr(userptr) { }
+
+        static apache::geode::client::PersistenceManager* create(const char* 
assemblyPath,
+          const char* factoryFunctionName);
+
+        virtual ~ManagedPersistenceManagerGeneric() { }
+
+
+        virtual void write(const CacheableKeyPtr&  key, const CacheablePtr&  
value, void *& PersistenceInfo);
+        virtual bool writeAll();
+        virtual void init(const RegionPtr& region, PropertiesPtr& 
diskProperties);
+        virtual CacheablePtr read(const CacheableKeyPtr& key, void *& 
PersistenceInfo);
+        virtual bool readAll();
+        virtual void destroy(const CacheableKeyPtr& key, void *& 
PersistenceInfo);
+        virtual void close();
+
+        inline void setptr(Apache::Geode::Client::IPersistenceManagerProxy^ 
managedptr)
+        {
+          m_managedptr = managedptr;
+        }
+
+        inline Object^ userptr() const
+        {
+          return m_userptr;
+        }
+
+      private:
+
+
+        /// <summary>
+        /// Using gcroot to hold the managed delegate pointer (since it cannot 
be stored directly).
+        /// Note: not using auto_gcroot since it will result in 'Dispose' of 
the IPersistenceManager
+        /// to be called which is not what is desired when this object is 
destroyed. Normally this
+        /// managed object may be created by the user and will be handled 
automatically by the GC.
+        /// </summary>
+        gcroot<Apache::Geode::Client::IPersistenceManagerProxy^> m_managedptr;
+
+        gcroot<Object^> m_userptr;
+
+        // Disable the copy and assignment constructors
+        ManagedPersistenceManagerGeneric(const 
ManagedPersistenceManagerGeneric&);
+        ManagedPersistenceManagerGeneric& operator = (const 
ManagedPersistenceManagerGeneric&);
+      };
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedResultCollector.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedResultCollector.cpp 
b/clicache/src/impl/ManagedResultCollector.cpp
new file mode 100644
index 0000000..91a353d
--- /dev/null
+++ b/clicache/src/impl/ManagedResultCollector.cpp
@@ -0,0 +1,227 @@
+/*
+ * 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 "../../geode_includes.hpp"
+//#include "../../../geode_includes.hpp"
+#include "ManagedResultCollector.hpp"
+//#include "../../../IGeodeSerializable.hpp"
+
+
+//#include "../IGeodeSerializable.hpp"
+#include "ManagedString.hpp"
+#include "SafeConvert.hpp"
+#include "../ExceptionTypes.hpp"
+#include <string>
+
+using namespace System;
+using namespace System::Text;
+using namespace System::Reflection;
+
+
+namespace apache
+{
+  namespace geode
+  {
+    namespace client
+    {
+
+      apache::geode::client::ResultCollector* 
ManagedResultCollectorGeneric::create(const char* assemblyPath,
+                                                                               
     const char* factoryFunctionName)
+      {
+        try
+        {
+          String^ mg_assemblyPath =
+            Apache::Geode::Client::ManagedString::Get(assemblyPath);
+          String^ mg_factoryFunctionName =
+            Apache::Geode::Client::ManagedString::Get(factoryFunctionName);
+          String^ mg_typeName = nullptr;
+          Int32 dotIndx = -1;
+
+          if (mg_factoryFunctionName == nullptr ||
+              (dotIndx = mg_factoryFunctionName->LastIndexOf('.')) < 0)
+          {
+            std::string ex_str = "ManagedResultCollector: Factory function 
name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain type name";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          mg_typeName = mg_factoryFunctionName->Substring(0, dotIndx);
+          mg_factoryFunctionName = mg_factoryFunctionName->Substring(dotIndx + 
1);
+
+          Assembly^ assmb = nullptr;
+          try
+          {
+            assmb = Assembly::Load(mg_assemblyPath);
+          }
+          catch (System::Exception^)
+          {
+            assmb = nullptr;
+          }
+          if (assmb == nullptr)
+          {
+            std::string ex_str = "ManagedResultCollector: Could not load 
assembly: ";
+            ex_str += assemblyPath;
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+          Object^ typeInst = assmb->CreateInstance(mg_typeName, true);
+          if (typeInst != nullptr)
+          {
+            MethodInfo^ mInfo = 
typeInst->GetType()->GetMethod(mg_factoryFunctionName,
+                                                               
BindingFlags::Public | BindingFlags::Static | BindingFlags::IgnoreCase);
+            if (mInfo != nullptr)
+            {
+              //Apache::Geode::Client::ResultCollector<Object^>^ managedptr = 
nullptr;
+              Object^ userptr = nullptr;
+              try
+              {
+                throw 
apache::geode::client::UnsupportedOperationException("Not supported");
+                /*managedptr = 
dynamic_cast<Apache::Geode::Client::ResultCollector<Object^>^>(
+                  mInfo->Invoke( typeInst, nullptr ) );*/
+                userptr = mInfo->Invoke(typeInst, nullptr);
+              }
+              catch (System::Exception^ ex)
+              {
+                Apache::Geode::Client::Log::Debug("{0}: {1}", 
ex->GetType()->Name, ex->Message);
+                userptr = nullptr;
+              }
+              if (userptr == nullptr)
+              {
+                std::string ex_str = "ManagedResultCollector: Could not create 
"
+                  "object on invoking factory function [";
+                ex_str += factoryFunctionName;
+                ex_str += "] in assembly: ";
+                ex_str += assemblyPath;
+                throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+              }
+              //TODO::need to pass proper pointer here
+              return new 
ManagedResultCollectorGeneric(/*(Apache::Geode::Client::ResultCollector<Object^>^)
 managedptr*/nullptr);
+            }
+            else
+            {
+              std::string ex_str = "ManagedResultCollector: Could not load "
+                "function with name [";
+              ex_str += factoryFunctionName;
+              ex_str += "] in assembly: ";
+              ex_str += assemblyPath;
+              throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+            }
+          }
+          else
+          {
+            Apache::Geode::Client::ManagedString typeName(mg_typeName);
+            std::string ex_str = "ManagedResultCollector: Could not load type 
[";
+            ex_str += typeName.CharPtr;
+            ex_str += "] in assembly: ";
+            ex_str += assemblyPath;
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+        }
+        catch (const apache::geode::client::Exception&)
+        {
+          throw;
+        }
+        catch (System::Exception^ ex)
+        {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedResultCollector: Got an exception while 
"
+            "loading managed library: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+        return NULL;
+      }
+
+      void ManagedResultCollectorGeneric::addResult(CacheablePtr& result)
+      {
+        try {
+          Object^ rs = 
Apache::Geode::Client::Serializable::GetManagedValueGeneric<Object^>(result);
+          m_managedptr->AddResult(rs);
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedResultCollector: Got an exception in"
+            "addResult: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+      }
+
+      CacheableVectorPtr 
ManagedResultCollectorGeneric::getResult(System::UInt32 timeout)
+      {
+        try {
+          //array<IGeodeSerializable^>^ rs = m_managedptr->GetResult(timeout);
+          //apache::geode::client::CacheableVectorPtr rsptr = 
apache::geode::client::CacheableVector::create();
+          //for( int index = 0; index < rs->Length; index++ )
+          //{
+          //  //apache::geode::client::CacheablePtr 
valueptr(Apache::Geode::Client::Serializable::GetUnmanagedValueGeneric<IGeodeSerializable^>(rs[
 index]));
+          //  apache::geode::client::CacheablePtr valueptr 
(SafeMSerializableConvert(rs[ index]));
+          //  rsptr->push_back(valueptr);
+          //}
+          //return rsptr;
+          throw apache::geode::client::IllegalStateException("This should not 
be get callled.");
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedResultCollector: Got an exception in"
+            "getResult: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+        return nullptr;
+      }
+      void ManagedResultCollectorGeneric::endResults()
+      {
+        try {
+          m_managedptr->EndResults();
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedResultCollector: Got an exception in"
+            "endResults: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+      }
+      void ManagedResultCollectorGeneric::clearResults()
+      {
+        try {
+          m_managedptr->ClearResults(/*false*/);
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedResultCollector: Got an exception in"
+            "clearResults: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+      }
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedResultCollector.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedResultCollector.hpp 
b/clicache/src/impl/ManagedResultCollector.hpp
new file mode 100644
index 0000000..3dd419e
--- /dev/null
+++ b/clicache/src/impl/ManagedResultCollector.hpp
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ */
+
+#pragma once
+#include "../geode_defs.hpp"
+#include <vcclr.h>
+#include "begin_native.hpp"
+#include <geode/ResultCollector.hpp>
+#include "end_native.hpp"
+
+#include "ResultCollectorProxy.hpp"
+#include "SafeConvert.hpp"
+
+//using namespace apache::geode::client;
+namespace apache {
+  namespace geode {
+    namespace client {
+
+      /// <summary>
+      /// Wraps the managed <see cref="Apache.Geode.Client.IResultCollector" />
+      /// object and implements the native 
<c>apache::geode::client::ResultCollector</c> interface.
+      /// </summary>
+      class ManagedResultCollectorGeneric
+        : public apache::geode::client::ResultCollector
+      {
+      public:
+
+        /// <summary>
+        /// Constructor to initialize with the provided managed object.
+        /// </summary>
+        /// <param name="userptr">
+        /// The managed object.
+        /// </param>
+        inline 
ManagedResultCollectorGeneric(Apache::Geode::Client::ResultCollectorG^ userptr)
+          : m_managedptr(userptr) { }
+
+        /// <summary>
+        /// Static function to create a <c>ManagedResultCollector</c> using 
given
+        /// managed assembly path and given factory function.
+        /// </summary>
+        /// <param name="assemblyPath">
+        /// The path of the managed assembly that contains the 
<c>ICacheListener</c>
+        /// factory function.
+        /// </param>
+        /// <param name="factoryFunctionName">
+        /// The name of the factory function of the managed class for creating
+        /// an object that implements <c>IResultCollector</c>.
+        /// This should be a static function of the format
+        /// {Namespace}.{Class Name}.{Method Name}.
+        /// </param>
+        /// <exception cref="IllegalArgumentException">
+        /// If the managed library cannot be loaded or the factory function 
fails.
+        /// </exception>
+        static apache::geode::client::ResultCollector* create(const char* 
assemblyPath,
+          const char* factoryFunctionName);
+
+        /// <summary>
+        /// Destructor -- does nothing.
+        /// </summary>
+        virtual ~ManagedResultCollectorGeneric() { }
+
+        CacheableVectorPtr getResult(System::UInt32 timeout = 
DEFAULT_QUERY_RESPONSE_TIMEOUT);
+        void addResult(CacheablePtr& result);
+        void endResults();
+        void clearResults();
+        /// <summary>
+        /// Returns the wrapped managed object reference.
+        /// </summary>
+        inline Apache::Geode::Client::ResultCollectorG^ ptr() const
+        {
+          return m_managedptr;
+        }
+
+
+      private:
+
+
+        /// <summary>
+        /// Using gcroot to hold the managed delegate pointer (since it cannot 
be stored directly).
+        /// Note: not using auto_gcroot since it will result in 'Dispose' of 
the ICacheListener
+        /// to be called which is not what is desired when this object is 
destroyed. Normally this
+        /// managed object may be created by the user and will be handled 
automatically by the GC.
+        /// </summary>
+        gcroot<Apache::Geode::Client::ResultCollectorG^> m_managedptr;
+        //Apache::Geode::Client::IResultCollector^ m_managedptr;
+        //gcroot<Object^> m_userptr;
+      };
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedString.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedString.hpp 
b/clicache/src/impl/ManagedString.hpp
new file mode 100644
index 0000000..ed67695
--- /dev/null
+++ b/clicache/src/impl/ManagedString.hpp
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+
+
+#include "../geode_defs.hpp"
+
+#ifdef _WIN32
+// FIXME: Why is this needed?
+//#define snprintf _snprintf
+#endif
+
+
+using namespace System;
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+    ref class ManagedString sealed
+    {
+    private:
+
+      IntPtr m_str;
+
+
+    public:
+
+      // Constructors
+
+      inline ManagedString( String^ str )
+      {
+        m_str = (str == nullptr) ? IntPtr::Zero :
+          System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( str 
);
+      }
+
+      // Destructor
+
+      inline ~ManagedString( )
+      {
+        if (m_str != IntPtr::Zero)
+        {
+          System::Runtime::InteropServices::Marshal::FreeHGlobal( m_str );
+        }
+      }
+
+      // The finalizer should normally never be called; either use non-pointer 
object
+      // or call delete explicitly.
+      !ManagedString( )
+      {
+        if (m_str != IntPtr::Zero)
+        {
+          System::Runtime::InteropServices::Marshal::FreeHGlobal( m_str );
+        }
+#if GF_DEVEL_ASSERTS == 1
+        throw gcnew System::ApplicationException(
+          "Finalizer for ManagedString should not have been called!!" );
+#endif
+      }
+
+      inline static String^ Get( const char* str )
+      {
+        return ((str == nullptr) ? nullptr : gcnew String( str ));
+      }
+
+      inline static String^ Get( const wchar_t* str )
+      {
+        return ((str == nullptr) ? nullptr : gcnew String( str ));
+      }
+
+      // Properties
+
+      property const char* CharPtr
+      {
+        inline const char* get( )
+        {
+          return ((m_str == IntPtr::Zero) ? nullptr :
+            static_cast<const char*>( m_str.ToPointer( ) ));
+        }
+      }
+    };
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache
+

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedTransactionListener.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedTransactionListener.cpp 
b/clicache/src/impl/ManagedTransactionListener.cpp
new file mode 100644
index 0000000..99a683b
--- /dev/null
+++ b/clicache/src/impl/ManagedTransactionListener.cpp
@@ -0,0 +1,263 @@
+/*
+ * 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.
+ */
+
+#ifdef CSTX_COMMENTED
+//#include "../geode_includes.hpp"
+#include "ManagedTransactionListener.hpp"
+//#include "../TransactionEvent.hpp"
+#include "../Log.hpp"
+//#include "../ITransactionListener.hpp"
+#include "ManagedString.hpp"
+#include "../ExceptionTypes.hpp"
+
+
+using namespace System;
+using namespace System::Text;
+using namespace System::Reflection;
+
+
+namespace apache
+{
+  namespace geode
+  {
+    namespace client
+    {
+
+      apache::geode::client::TransactionListener* 
ManagedTransactionListenerGeneric::create(const char* assemblyPath,
+                                                                               
             const char* factoryFunctionName)
+      {
+        try
+        {
+          String^ mg_assemblyPath =
+            Apache::Geode::Client::ManagedString::Get(assemblyPath);
+          String^ mg_factoryFunctionName =
+            Apache::Geode::Client::ManagedString::Get(factoryFunctionName);
+          String^ mg_typeName = nullptr;
+
+          String^ mg_genericKey = nullptr;
+          String^ mg_genericVal = nullptr;
+
+          System::Int32 dotIndx = -1;
+          System::Int32 genericsOpenIndx = -1;
+          System::Int32 genericsCloseIndx = -1;
+          System::Int32 commaIndx = -1;
+
+          if (mg_factoryFunctionName == nullptr ||
+              (dotIndx = mg_factoryFunctionName->LastIndexOf('.')) < 0)
+          {
+            std::string ex_str = "ManagedTransactionListenerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain type name";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((genericsCloseIndx = mg_factoryFunctionName->LastIndexOf('>')) < 
0)
+          {
+            std::string ex_str = "ManagedTransactionListenerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain any generic type parameters";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((genericsOpenIndx = mg_factoryFunctionName->LastIndexOf('<')) < 
0 ||
+              genericsOpenIndx > genericsCloseIndx)
+          {
+            std::string ex_str = "ManagedTransactionListenerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain expected generic type parameters";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((commaIndx = mg_factoryFunctionName->LastIndexOf(',')) < 0 ||
+              (commaIndx < genericsOpenIndx || commaIndx > genericsCloseIndx))
+          {
+            std::string ex_str = "ManagedTransactionListenerGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain expected generic type parameter 
comma separator";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          StringBuilder^ typeBuilder = gcnew 
StringBuilder(mg_factoryFunctionName->Substring(0, genericsOpenIndx));
+          mg_typeName = typeBuilder->ToString();
+          mg_genericKey = mg_factoryFunctionName->Substring(genericsOpenIndx + 
1, commaIndx - genericsOpenIndx - 1);
+          mg_genericKey = mg_genericKey->Trim();
+          mg_genericVal = mg_factoryFunctionName->Substring(commaIndx + 1, 
genericsCloseIndx - commaIndx - 1);
+          mg_genericVal = mg_genericVal->Trim();
+          mg_factoryFunctionName = mg_factoryFunctionName->Substring(dotIndx + 
1);
+
+          Apache::Geode::Client::Log::Fine("Attempting to instantiate a 
[{0}<{1}, {2}>] via the [{3}] factory method.",
+                                           mg_typeName, mg_genericKey, 
mg_genericVal, mg_factoryFunctionName);
+
+          typeBuilder->Append("`2");
+          mg_typeName = typeBuilder->ToString();
+
+          Assembly^ assmb = nullptr;
+          try
+          {
+            assmb = Assembly::Load(mg_assemblyPath);
+          }
+          catch (System::Exception^)
+          {
+            assmb = nullptr;
+          }
+          if (assmb == nullptr)
+          {
+            std::string ex_str = "ManagedTransactionListenerGeneric: Could not 
load assembly: ";
+            ex_str += assemblyPath;
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          Apache::Geode::Client::Log::Debug("Loading type: [{0}]", 
mg_typeName);
+
+          Type^ typeInst = assmb->GetType(mg_typeName, false, true);
+
+          if (typeInst != nullptr)
+          {
+            array<Type^>^ types = gcnew array<Type^>(2);
+            types[0] = Type::GetType(mg_genericKey, false, true);
+            types[1] = Type::GetType(mg_genericVal, false, true);
+
+            if (types[0] == nullptr || types[1] == nullptr)
+            {
+              std::string ex_str = "ManagedTransactionListenerGeneric: Could 
not get both generic type argument instances";
+              throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+            }
+
+            typeInst = typeInst->MakeGenericType(types);
+            Apache::Geode::Client::Log::Info("Loading function: [{0}]", 
mg_factoryFunctionName);
+
+            MethodInfo^ mInfo = typeInst->GetMethod(mg_factoryFunctionName,
+                                                    BindingFlags::Public | 
BindingFlags::Static | BindingFlags::IgnoreCase);
+
+            if (mInfo != nullptr)
+            {
+              Object^ userptr = nullptr;
+              try
+              {
+                userptr = mInfo->Invoke(typeInst, nullptr);
+              }
+              catch (System::Exception^ ex)
+              {
+                Apache::Geode::Client::Log::Debug("{0}: {1}", 
ex->GetType()->Name, ex->Message);
+                userptr = nullptr;
+              }
+              if (userptr == nullptr)
+              {
+                std::string ex_str = "ManagedTransactionListenerGeneric: Could 
not create "
+                  "object on invoking factory function [";
+                ex_str += factoryFunctionName;
+                ex_str += "] in assembly: ";
+                ex_str += assemblyPath;
+                throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+              }
+              return new ManagedTransactionListenerGeneric(userptr);
+            }
+            else
+            {
+              std::string ex_str = "ManagedTransactionListenerGeneric: Could 
not load "
+                "function with name [";
+              ex_str += factoryFunctionName;
+              ex_str += "] in assembly: ";
+              ex_str += assemblyPath;
+              throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+            }
+          }
+          else
+          {
+            Apache::Geode::Client::ManagedString typeName(mg_typeName);
+            std::string ex_str = "ManagedTransactionListenerGeneric: Could not 
load type [";
+            ex_str += typeName.CharPtr;
+            ex_str += "] in assembly: ";
+            ex_str += assemblyPath;
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+        }
+        catch (const apache::geode::client::Exception&)
+        {
+          throw;
+        }
+        catch (System::Exception^ ex)
+        {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedTransactionListenerGeneric: Got an 
exception while "
+            "loading managed library: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+        return NULL;
+      }
+      void 
ManagedTransactionListenerGeneric::afterCommit(apache::geode::client::TransactionEventPtr&
 te)
+      {
+        try {
+          
Apache::Geode::Client::Log::Error("ManagedTransactionListenerGeneric::afterCommit
 in");
+          Apache::Geode::Client::TransactionEvent  mevent(te.get());
+          m_managedptr->AfterCommit(%mevent);
+          
Apache::Geode::Client::Log::Error("ManagedTransactionListenerGeneric::afterCommit
 in");
+
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::GeodeException::ThrowNative(ex);
+        }
+      }
+      void 
ManagedTransactionListenerGeneric::afterFailedCommit(apache::geode::client::TransactionEventPtr&
 te)
+      {
+        try {
+          Apache::Geode::Client::TransactionEvent mevent(te.get());
+          m_managedptr->AfterFailedCommit(%mevent);
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::GeodeException::ThrowNative(ex);
+        }
+      }
+      void 
ManagedTransactionListenerGeneric::afterRollback(apache::geode::client::TransactionEventPtr&
 te)
+      {
+        try {
+          Apache::Geode::Client::TransactionEvent mevent(te.get());
+          m_managedptr->AfterRollback(%mevent);
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::GeodeException::ThrowNative(ex);
+        }
+      }
+      void ManagedTransactionListenerGeneric::close()
+      {
+        try {
+          m_managedptr->Close();
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::GeodeException::ThrowNative(ex);
+        }
+      }
+
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache
+
+#endif

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedTransactionListener.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedTransactionListener.hpp 
b/clicache/src/impl/ManagedTransactionListener.hpp
new file mode 100644
index 0000000..cd48375
--- /dev/null
+++ b/clicache/src/impl/ManagedTransactionListener.hpp
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+#ifdef CSTX_COMMENTED
+#pragma once
+
+#include "../geode_defs.hpp"
+#include <vcclr.h>
+#include <cppcache/TransactionListener.hpp>
+#include "../ITransactionListener.hpp"
+
+
+
+namespace apache {
+  namespace geode {
+    namespace client {
+
+      /// <summary>
+      /// Wraps the managed <see 
cref="Apache.Geode.Client.ITransactionListener" />
+      /// object and implements the native 
<c>apache::geode::client::TransactionListener</c> interface.
+      /// </summary>
+      class ManagedTransactionListenerGeneric
+        : public apache::geode::client::TransactionListener
+      {
+      public:
+
+        /// <summary>
+        /// Constructor to initialize with the provided managed object.
+        /// </summary>
+        /// <param name="userptr">
+        /// The managed object.
+        /// </param>
+        inline ManagedTransactionListenerGeneric(Object^ userptr )
+          : m_userptr( userptr ) { }
+
+        static apache::geode::client::TransactionListener* create( const char* 
assemblyPath,
+          const char* factoryFunctionName );
+
+        virtual ~ManagedTransactionListenerGeneric( ) { }
+
+        virtual void afterCommit(apache::geode::client::TransactionEventPtr& 
te);
+
+        virtual void 
afterFailedCommit(apache::geode::client::TransactionEventPtr& te);
+
+        virtual void afterRollback(apache::geode::client::TransactionEventPtr& 
te);
+
+        virtual void close();
+
+        inline Apache::Geode::Client::ITransactionListener^ ptr( ) const
+        {
+          return m_managedptr;
+        }
+
+        inline void setptr( Apache::Geode::Client::ITransactionListener^ 
managedptr )
+        {
+          m_managedptr = managedptr;
+        }
+
+        inline Object^ userptr( ) const
+        {
+          return m_userptr;
+        }
+
+      private:
+
+        /// <summary>
+        /// Using gcroot to hold the managed delegate pointer (since it cannot 
be stored directly).
+        /// Note: not using auto_gcroot since it will result in 'Dispose' of 
the ITransactionListener
+        /// to be called which is not what is desired when this object is 
destroyed. Normally this
+        /// managed object may be created by the user and will be handled 
automatically by the GC.
+        /// </summary>
+        gcroot<Apache::Geode::Client::ITransactionListener^> m_managedptr;
+
+        gcroot<Object^> m_userptr;
+      };
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache
+#endif

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedTransactionWriter.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedTransactionWriter.cpp 
b/clicache/src/impl/ManagedTransactionWriter.cpp
new file mode 100644
index 0000000..bde9cbe
--- /dev/null
+++ b/clicache/src/impl/ManagedTransactionWriter.cpp
@@ -0,0 +1,222 @@
+/*
+ * 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.
+ */
+
+#ifdef CSTX_COMMENTED
+//#include "../geode_includes.hpp"
+#include "ManagedTransactionWriter.hpp"
+//#include "../TransactionEvent.hpp"
+#include "../Log.hpp"
+#include "../ExceptionTypes.hpp"
+//#include "../ITransactionWriter.hpp"
+#include "ManagedString.hpp"
+
+
+using namespace System;
+using namespace System::Text;
+using namespace System::Reflection;
+
+//using namespace Apache::Geode::Client;
+
+namespace apache
+{
+  namespace geode
+  {
+    namespace client
+    {
+
+      apache::geode::client::TransactionWriter* 
ManagedTransactionWriterGeneric::create(const char* assemblyPath,
+                                                                               
         const char* factoryFunctionName)
+      {
+        try
+        {
+          String^ mg_assemblyPath =
+            Apache::Geode::Client::ManagedString::Get(assemblyPath);
+          String^ mg_factoryFunctionName =
+            Apache::Geode::Client::ManagedString::Get(factoryFunctionName);
+          String^ mg_typeName = nullptr;
+
+          String^ mg_genericKey = nullptr;
+          String^ mg_genericVal = nullptr;
+
+          System::Int32 dotIndx = -1;
+          System::Int32 genericsOpenIndx = -1;
+          System::Int32 genericsCloseIndx = -1;
+          System::Int32 commaIndx = -1;
+
+          if (mg_factoryFunctionName == nullptr ||
+              (dotIndx = mg_factoryFunctionName->LastIndexOf('.')) < 0)
+          {
+            std::string ex_str = "ManagedTransactionWriterGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain type name";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((genericsCloseIndx = mg_factoryFunctionName->LastIndexOf('>')) < 
0)
+          {
+            std::string ex_str = "ManagedTransactionWriterGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain any generic type parameters";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((genericsOpenIndx = mg_factoryFunctionName->LastIndexOf('<')) < 
0 ||
+              genericsOpenIndx > genericsCloseIndx)
+          {
+            std::string ex_str = "ManagedTransactionWriterGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain expected generic type parameters";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          if ((commaIndx = mg_factoryFunctionName->LastIndexOf(',')) < 0 ||
+              (commaIndx < genericsOpenIndx || commaIndx > genericsCloseIndx))
+          {
+            std::string ex_str = "ManagedTransactionWriterGeneric: Factory 
function name '";
+            ex_str += factoryFunctionName;
+            ex_str += "' does not contain expected generic type parameter 
comma separator";
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          StringBuilder^ typeBuilder = gcnew 
StringBuilder(mg_factoryFunctionName->Substring(0, genericsOpenIndx));
+          mg_typeName = typeBuilder->ToString();
+          mg_genericKey = mg_factoryFunctionName->Substring(genericsOpenIndx + 
1, commaIndx - genericsOpenIndx - 1);
+          mg_genericKey = mg_genericKey->Trim();
+          mg_genericVal = mg_factoryFunctionName->Substring(commaIndx + 1, 
genericsCloseIndx - commaIndx - 1);
+          mg_genericVal = mg_genericVal->Trim();
+          mg_factoryFunctionName = mg_factoryFunctionName->Substring(dotIndx + 
1);
+
+          Apache::Geode::Client::Log::Fine("Attempting to instantiate a 
[{0}<{1}, {2}>] via the [{3}] factory method.",
+                                           mg_typeName, mg_genericKey, 
mg_genericVal, mg_factoryFunctionName);
+
+          typeBuilder->Append("`2");
+          mg_typeName = typeBuilder->ToString();
+
+          Assembly^ assmb = nullptr;
+          try
+          {
+            assmb = Assembly::Load(mg_assemblyPath);
+          }
+          catch (System::Exception^)
+          {
+            assmb = nullptr;
+          }
+          if (assmb == nullptr)
+          {
+            std::string ex_str = "ManagedTransactionWriterGeneric: Could not 
load assembly: ";
+            ex_str += assemblyPath;
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+
+          Apache::Geode::Client::Log::Debug("Loading type: [{0}]", 
mg_typeName);
+
+          Type^ typeInst = assmb->GetType(mg_typeName, false, true);
+
+          if (typeInst != nullptr)
+          {
+            array<Type^>^ types = gcnew array<Type^>(2);
+            types[0] = Type::GetType(mg_genericKey, false, true);
+            types[1] = Type::GetType(mg_genericVal, false, true);
+
+            if (types[0] == nullptr || types[1] == nullptr)
+            {
+              std::string ex_str = "ManagedTransactionWriterGeneric: Could not 
get both generic type argument instances";
+              throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+            }
+
+            typeInst = typeInst->MakeGenericType(types);
+            Apache::Geode::Client::Log::Info("Loading function: [{0}]", 
mg_factoryFunctionName);
+
+            MethodInfo^ mInfo = typeInst->GetMethod(mg_factoryFunctionName,
+                                                    BindingFlags::Public | 
BindingFlags::Static | BindingFlags::IgnoreCase);
+
+            if (mInfo != nullptr)
+            {
+              Object^ userptr = nullptr;
+              try
+              {
+                userptr = mInfo->Invoke(typeInst, nullptr);
+              }
+              catch (System::Exception^ ex)
+              {
+                Apache::Geode::Client::Log::Debug("{0}: {1}", 
ex->GetType()->Name, ex->Message);
+                userptr = nullptr;
+              }
+              if (userptr == nullptr)
+              {
+                std::string ex_str = "ManagedTransactionWriterGeneric: Could 
not create "
+                  "object on invoking factory function [";
+                ex_str += factoryFunctionName;
+                ex_str += "] in assembly: ";
+                ex_str += assemblyPath;
+                throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+              }
+              return new ManagedTransactionWriterGeneric(userptr);
+            }
+            else
+            {
+              std::string ex_str = "ManagedTransactionWriterGeneric: Could not 
load "
+                "function with name [";
+              ex_str += factoryFunctionName;
+              ex_str += "] in assembly: ";
+              ex_str += assemblyPath;
+              throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+            }
+          }
+          else
+          {
+            Apache::Geode::Client::ManagedString typeName(mg_typeName);
+            std::string ex_str = "ManagedTransactionWriterGeneric: Could not 
load type [";
+            ex_str += typeName.CharPtr;
+            ex_str += "] in assembly: ";
+            ex_str += assemblyPath;
+            throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+          }
+        }
+        catch (const apache::geode::client::Exception&)
+        {
+          throw;
+        }
+        catch (System::Exception^ ex)
+        {
+          Apache::Geode::Client::ManagedString mg_exStr(ex->ToString());
+          std::string ex_str = "ManagedTransactionWriterGeneric: Got an 
exception while "
+            "loading managed library: ";
+          ex_str += mg_exStr.CharPtr;
+          throw 
apache::geode::client::IllegalArgumentException(ex_str.c_str());
+        }
+        return NULL;
+      }
+      void 
ManagedTransactionWriterGeneric::beforeCommit(apache::geode::client::TransactionEventPtr&
 te)
+      {
+        try {
+          Apache::Geode::Client::TransactionEvent  mevent(te.get());
+          m_managedptr->BeforeCommit(%mevent);
+        }
+        catch (Apache::Geode::Client::GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          Apache::Geode::Client::GeodeException::ThrowNative(ex);
+        }
+      }
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache
+
+#endif

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedTransactionWriter.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedTransactionWriter.hpp 
b/clicache/src/impl/ManagedTransactionWriter.hpp
new file mode 100644
index 0000000..b4871cb
--- /dev/null
+++ b/clicache/src/impl/ManagedTransactionWriter.hpp
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+#ifdef CSTX_COMMENTED
+#pragma once
+
+#include "../geode_defs.hpp"
+#include <vcclr.h>
+#include <cppcache/TransactionWriter.hpp>
+#include "../ITransactionWriter.hpp"
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+interface class ITransactionWriter;
+    }
+  }
+}
+
+namespace apache {
+  namespace geode {
+    namespace client {
+
+      /// <summary>
+      /// Wraps the managed <see cref="Apache.Geode.Client.ITransactionWriter" 
/>
+      /// object and implements the native 
<c>apache::geode::client::TransactionWriter</c> interface.
+      /// </summary>
+      class ManagedTransactionWriterGeneric
+        : public apache::geode::client::TransactionWriter
+      {
+      public:
+
+        /// <summary>
+        /// Constructor to initialize with the provided managed object.
+        /// </summary>
+        /// <param name="userptr">
+        /// The managed object.
+        /// </param>
+        inline ManagedTransactionWriterGeneric(Object^ userptr )
+          : m_userptr( userptr ) { }
+
+        static apache::geode::client::TransactionWriter* create( const char* 
assemblyPath,
+          const char* factoryFunctionName );
+
+        virtual ~ManagedTransactionWriterGeneric( ) { }
+
+        virtual void beforeCommit(apache::geode::client::TransactionEventPtr& 
te);
+
+        inline Apache::Geode::Client::ITransactionWriter^ ptr( ) const
+        {
+          return m_managedptr;
+        }
+
+        inline void setptr( Apache::Geode::Client::ITransactionWriter^ 
managedptr )
+        {
+          m_managedptr = managedptr;
+        }
+
+        inline Object^ userptr( ) const
+        {
+          return m_userptr;
+        }
+
+      private:
+
+        /// <summary>
+        /// Using gcroot to hold the managed delegate pointer (since it cannot 
be stored directly).
+        /// Note: not using auto_gcroot since it will result in 'Dispose' of 
the ITransactionWriter
+        /// to be called which is not what is desired when this object is 
destroyed. Normally this
+        /// managed object may be created by the user and will be handled 
automatically by the GC.
+        /// </summary>
+        gcroot<Apache::Geode::Client::ITransactionWriter^> m_managedptr;
+
+        gcroot<Object^> m_userptr;
+      };
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache
+#endif

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedVisitor.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedVisitor.cpp 
b/clicache/src/impl/ManagedVisitor.cpp
new file mode 100644
index 0000000..3808ea8
--- /dev/null
+++ b/clicache/src/impl/ManagedVisitor.cpp
@@ -0,0 +1,52 @@
+/*
+ * 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 "../../../../geode_includes.hpp"
+#include "ManagedVisitor.hpp"
+#include "SafeConvert.hpp"
+#include "../ExceptionTypes.hpp"
+
+
+using namespace System;
+
+namespace apache
+{
+  namespace geode
+  {
+    namespace client
+    {
+
+      void ManagedVisitorGeneric::visit(CacheableKeyPtr& key, CacheablePtr& 
value)
+      {
+        using namespace Apache::Geode::Client;
+        try {
+          ICacheableKey^ mg_key(SafeGenericUMKeyConvert<ICacheableKey^>(key));
+          IGeodeSerializable^ 
mg_value(SafeUMSerializableConvertGeneric(value));
+
+          m_visitor->Invoke(mg_key, 
(Apache::Geode::Client::IGeodeSerializable^)mg_value);
+        }
+        catch (GeodeException^ ex) {
+          ex->ThrowNative();
+        }
+        catch (System::Exception^ ex) {
+          GeodeException::ThrowNative(ex);
+        }
+      }
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/ManagedVisitor.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/ManagedVisitor.hpp 
b/clicache/src/impl/ManagedVisitor.hpp
new file mode 100644
index 0000000..a9f5947
--- /dev/null
+++ b/clicache/src/impl/ManagedVisitor.hpp
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "../geode_defs.hpp"
+#include <vcclr.h>
+#include "begin_native.hpp"
+#include <geode/Properties.hpp>
+#include "end_native.hpp"
+
+#include "../Properties.hpp"
+
+//using namespace apache::geode::client;
+namespace apache
+{
+  namespace geode
+  {
+    namespace client
+    {
+
+      /// <summary>
+      /// Wraps the managed <see cref="Apache.Geode.Client.PropertyVisitor" />
+      /// delegate and implements the native 
<c>apache::geode::client::Properties::Visitor</c> interface.
+      /// </summary>
+      class ManagedVisitorGeneric
+        : public apache::geode::client::Properties::Visitor
+      {
+      public:
+
+        /// <summary>
+        /// Create a <c>apache::geode::client::Properties::Visitor</c> from 
the given managed
+        /// <c>PropertyVisitor</c> delegate.
+        /// </summary>
+        inline ManagedVisitorGeneric(Object^ visitorFunc) : 
m_managedptr(visitorFunc) { }
+
+        /// <summary>
+        /// Invokes the managed <c>PropertyVisitor</c> delegate for the given
+        /// <c>Property</c> key and value.
+        /// </summary>
+        virtual void visit(CacheableKeyPtr& key, CacheablePtr& value);
+
+        /// <summary>
+        /// Destructor -- does nothing.
+        /// </summary>
+        virtual ~ManagedVisitorGeneric() { }
+
+        void setptr(Apache::Geode::Client::PropertyVisitor^ visitor)
+        {
+          m_visitor = visitor;
+        }
+
+      private:
+
+        // Using gcroot to hold the managed delegate pointer (since it cannot 
be stored directly).
+        // Note: not using auto_gcroot since it will result in 'Dispose' of 
the PropertyVisitor
+        // to be called which is not what is desired when this object is 
destroyed. Normally this
+        // managed object may be created by the user and will be handled 
automatically by the GC.
+        gcroot<Object^> m_managedptr;
+
+        gcroot<Apache::Geode::Client::PropertyVisitor^> m_visitor;
+
+        // Disable the copy and assignment constructors
+        ManagedVisitorGeneric();
+        ManagedVisitorGeneric(const ManagedVisitorGeneric&);
+      };
+
+    }  // namespace client
+  }  // namespace geode
+}  // namespace apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/MemoryPressureHandler.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/MemoryPressureHandler.cpp 
b/clicache/src/impl/MemoryPressureHandler.cpp
new file mode 100644
index 0000000..080fa3a
--- /dev/null
+++ b/clicache/src/impl/MemoryPressureHandler.cpp
@@ -0,0 +1,75 @@
+/*
+ * 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 "../geode_includes.hpp"
+#include "MemoryPressureHandler.hpp"
+#include "windows.h"
+#include "psapi.h"
+#include "../Log.hpp"
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+      System::Int64 g_prevUnmanagedSize = 0;
+
+      int MemoryPressureHandler::handle_timeout( const ACE_Time_Value&
+          current_time, const void* arg )
+      {
+        HANDLE hProcess = GetCurrentProcess( );
+
+        PROCESS_MEMORY_COUNTERS pmc;
+
+        if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) ) {
+          System::Int64 totalmem  = (System::Int64)pmc.WorkingSetSize;
+          System::Int64 curr_managed_size = GC::GetTotalMemory( false );
+          System::Int64 curr_unmanagedMemory = totalmem - curr_managed_size;
+          Log::Finest( "Current total memory usage: {0}, managed memory: {1}, "
+              "unmanaged memory: {2}", totalmem, curr_managed_size,
+              curr_unmanagedMemory );
+          if ( curr_unmanagedMemory > 0 ) {
+            System::Int64 increase = curr_unmanagedMemory - 
g_prevUnmanagedSize;
+            if ( Math::Abs( increase ) > 20*1024*1024 ) {
+              if ( increase > 0 ) {
+                Log::Fine( "Adding memory pressure information to assist .NET 
GC: {0} bytes", increase );
+                GC::AddMemoryPressure( increase );
+              }
+              else {
+                Log::Fine( "Removing memory pressure information to assist 
.NET GC: {0} bytes", -increase );
+                GC::RemoveMemoryPressure( -increase );
+              }
+              g_prevUnmanagedSize = curr_unmanagedMemory;
+            }
+          }
+        }
+        else {
+          return -1;
+        }
+        return 0;
+      }
+
+      int MemoryPressureHandler::handle_close(ACE_HANDLE handle,
+        ACE_Reactor_Mask close_mask)
+      {
+        return 0;
+      }
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/MemoryPressureHandler.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/MemoryPressureHandler.hpp 
b/clicache/src/impl/MemoryPressureHandler.hpp
new file mode 100644
index 0000000..c8ac0e7
--- /dev/null
+++ b/clicache/src/impl/MemoryPressureHandler.hpp
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "begin_native.hpp"
+#include <geode/geode_globals.hpp>
+#include <ExpiryTaskManager.hpp>
+#include "end_native.hpp"
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+      class MemoryPressureHandler
+        : public ACE_Event_Handler
+      {
+        public:
+          int handle_timeout( const ACE_Time_Value& current_time,
+              const void* arg );
+
+          int handle_close( ACE_HANDLE handle, ACE_Reactor_Mask close_mask );
+      };
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache
+

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/PartitionResolver.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/PartitionResolver.hpp 
b/clicache/src/impl/PartitionResolver.hpp
new file mode 100644
index 0000000..8223e19
--- /dev/null
+++ b/clicache/src/impl/PartitionResolver.hpp
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+#pragma once
+
+//#include "../geode_includes.hpp"
+//#include "../../../IPartitionResolver.hpp"
+#include "../IPartitionResolver.hpp"
+#include "../Region.hpp"
+#include "SafeConvert.hpp"
+#include "ManagedString.hpp"
+//#include "../../../Region.hpp"
+//#include "../../../Cache.hpp"
+
+using namespace System;
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+      public interface class IPartitionResolverProxy
+      {
+      public:
+        apache::geode::client::CacheableKeyPtr getRoutingObject(const 
apache::geode::client::EntryEvent& ev);
+        const char * getName();
+      };
+
+      generic<class TKey, class TValue>
+      public ref class PartitionResolverGeneric : IPartitionResolverProxy
+      {
+        private:
+
+          IPartitionResolver<TKey, TValue>^ m_resolver;
+
+        public:
+
+          void SetPartitionResolver(IPartitionResolver<TKey, TValue>^ resolver)
+          {
+            m_resolver = resolver;
+          }
+
+          virtual apache::geode::client::CacheableKeyPtr 
getRoutingObject(const apache::geode::client::EntryEvent& ev)
+          {
+            EntryEvent<TKey, TValue> gevent(&ev);
+                                               Object^ groutingobject = 
m_resolver->GetRoutingObject(%gevent);
+            return 
Serializable::GetUnmanagedValueGeneric<Object^>(groutingobject, nullptr);
+          }
+
+          virtual const char * getName()
+          {
+            ManagedString mg_name(m_resolver->GetName());
+            return mg_name.CharPtr;
+          }
+      };
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache
+

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/PdxFieldType.cpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/PdxFieldType.cpp 
b/clicache/src/impl/PdxFieldType.cpp
new file mode 100644
index 0000000..c319ccd
--- /dev/null
+++ b/clicache/src/impl/PdxFieldType.cpp
@@ -0,0 +1,194 @@
+/*
+ * 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.
+ */
+
+#pragma once
+#include "PdxFieldType.hpp"
+#include "begin_native.hpp"
+#include <geode/GeodeTypeIds.hpp>
+#include "end_native.hpp"
+
+
+using namespace System;
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+      namespace Internal
+      {
+        Int32 PdxFieldType::SequenceId::get()
+        {
+          return m_sequenceId;
+        }
+
+        String^ PdxFieldType::FieldName::get()
+        {
+          return m_fieldName;
+        }
+
+        String^ PdxFieldType::ClassName::get()
+        {
+          return m_className;
+        }
+
+        Byte PdxFieldType::TypeId::get()
+        {
+          return m_typeId;
+        }
+
+        bool PdxFieldType::IsVariableLengthType::get()
+        {
+          return m_isVariableLengthType;
+        }
+
+        Int32 PdxFieldType::Size::get()
+        {
+          return m_fixedSize;
+        }
+
+        Int32 PdxFieldType::VarLenFieldIdx::get()
+        {
+          return m_varLenFieldIdx;
+        }
+
+        Int32 PdxFieldType::VarLenOffsetIndex::get()
+        {
+          return m_vlOffsetIndex;
+        }
+
+        void PdxFieldType::VarLenOffsetIndex::set(Int32 val)
+        {
+          m_vlOffsetIndex = val;
+        }
+
+        Int32 PdxFieldType::RelativeOffset::get()
+        {
+          return m_relativeOffset;
+        }
+
+        void PdxFieldType::RelativeOffset::set(Int32 val)
+        {
+          m_relativeOffset = val;
+        }
+
+        //it compares fieldname and type-id
+        bool PdxFieldType::Equals(Object^ otherObj)
+        {
+          if (otherObj == nullptr)
+            return false;
+
+          PdxFieldType^ otherFieldType = dynamic_cast<PdxFieldType^>(otherObj);
+
+          if (otherFieldType == nullptr)
+            return false;
+
+          if (otherFieldType == this)
+            return true;
+
+          if (otherFieldType->m_fieldName == m_fieldName && 
otherFieldType->m_typeId == m_typeId)
+            return true;
+
+          return false;
+        }
+
+        Int32 PdxFieldType::GetHashCode()
+        {
+          int hash = m_cachedHashcode;
+          if (hash == 0)
+          {
+            if (m_fieldName != nullptr)
+            {
+              hash = hash * 31 + m_fieldName->GetHashCode();
+            }
+
+            hash = hash * 31 + m_typeId;
+            if (hash == 0)
+              hash = 1;
+            m_cachedHashcode = hash;
+          }
+
+          return m_cachedHashcode;
+        }
+
+        void PdxFieldType::ToData(DataOutput^ output)
+        {
+          output->WriteString(m_fieldName);
+          output->WriteInt32(m_sequenceId);
+          output->WriteInt32(m_varLenFieldIdx);
+          output->WriteByte(m_typeId);
+
+          output->WriteInt32(m_relativeOffset);
+          output->WriteInt32(m_vlOffsetIndex);
+          output->WriteBoolean(m_isIdentityField);
+        }
+
+        IGeodeSerializable^ PdxFieldType::FromData(DataInput^ input)
+        {
+          m_fieldName = input->ReadString();
+          m_sequenceId = input->ReadInt32();
+          m_varLenFieldIdx = input->ReadInt32();
+          m_typeId = input->ReadByte();
+
+          m_relativeOffset = input->ReadInt32();
+          m_vlOffsetIndex = input->ReadInt32();
+          m_isIdentityField = input->ReadBoolean();
+
+          m_fixedSize = getFixedTypeSize();
+
+          if (m_fixedSize != -1)
+            m_isVariableLengthType = false;
+          else
+            m_isVariableLengthType = true;
+
+          return this;
+        }
+
+        Int32 PdxFieldType::getFixedTypeSize()
+        {
+          switch (m_typeId)
+          {
+          case PdxTypes::BYTE:
+          case PdxTypes::BOOLEAN:
+            return GeodeClassIds::BOOLEAN_SIZE;
+
+          case PdxTypes::SHORT:
+          case PdxTypes::CHAR:
+            //case apache::geode::client::GeodeTypeIds::CacheableChar: //TODO
+            return GeodeClassIds::CHAR_SIZE;
+
+          case PdxTypes::INT:
+          case PdxTypes::FLOAT:
+            //case DSCODE.ENUM:
+            return GeodeClassIds::INTEGER_SIZE;
+
+          case PdxTypes::LONG:
+          case PdxTypes::DOUBLE:
+          case PdxTypes::DATE:
+            return GeodeClassIds::LONG_SIZE;
+
+          default:
+            return -1;
+          }  // namespace Client
+        }  // namespace Geode
+      }  // namespace Apache
+
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/impl/PdxFieldType.hpp
----------------------------------------------------------------------
diff --git a/clicache/src/impl/PdxFieldType.hpp 
b/clicache/src/impl/PdxFieldType.hpp
new file mode 100644
index 0000000..fdef59b
--- /dev/null
+++ b/clicache/src/impl/PdxFieldType.hpp
@@ -0,0 +1,150 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+using namespace System;
+#include "../DataOutput.hpp"
+#include "../DataInput.hpp"
+#include "../GeodeClassIds.hpp"
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+      namespace Internal
+      {
+        public ref class PdxFieldType : IGeodeSerializable
+        {
+        private:
+          String^ m_fieldName;
+          String^ m_className;
+          Byte    m_typeId;
+          Int32   m_sequenceId;
+          bool    m_isVariableLengthType;
+          bool    m_isIdentityField;
+          Int32   m_fixedSize;
+          Int32   m_varLenFieldIdx;
+
+          Int32   m_vlOffsetIndex;
+          Int32   m_relativeOffset;
+          Int32   m_cachedHashcode;
+          Int32 getFixedTypeSize();
+        public:
+          PdxFieldType(String^ fieldName,
+                       String^ className,
+                       Byte typeId,
+                       Int32 sequenceId,
+                       bool isVariableLengthType,
+                       Int32 fixedSize,
+                       Int32 varLenFieldIdx)
+          {
+            m_cachedHashcode = 0;
+            m_fieldName = fieldName;
+            m_className = className;
+            m_typeId = typeId;
+            m_sequenceId = sequenceId;//start with 0
+            m_isVariableLengthType = isVariableLengthType;
+            m_fixedSize = fixedSize;
+            m_varLenFieldIdx = varLenFieldIdx;//start with 0
+            m_isIdentityField = false;
+          }
+
+          PdxFieldType()
+          {
+            m_cachedHashcode = 0;
+          }
+
+          property Int32 SequenceId
+          {
+            Int32 get();
+          }
+
+          property String^ FieldName
+          {
+            String^ get();
+          }
+
+          property String^ ClassName
+          {
+            String^ get();
+          }
+
+          property Byte TypeId
+          {
+            Byte get();
+          }
+
+          property bool IsVariableLengthType
+          {
+            bool get();
+          }
+
+          property bool IdentityField
+          {
+            bool get() { return m_isIdentityField; }
+            void set(bool value) { m_isIdentityField = value; }
+          }
+
+          property Int32 Size
+          {
+            Int32 get();
+          }
+
+          property Int32 VarLenFieldIdx
+          {
+            Int32 get();
+          }
+
+          property Int32 VarLenOffsetIndex
+          {
+            Int32 get();
+            void set(Int32 Value);
+          }
+
+          property Int32 RelativeOffset
+          {
+            Int32 get();
+            void set(Int32 Value);
+          }
+
+          virtual bool Equals(Object^ otherObj) override;
+          virtual Int32 GetHashCode() override;
+
+          virtual void ToData(DataOutput^ output);
+          virtual IGeodeSerializable^ FromData(DataInput^ input);
+          virtual property System::UInt32 ObjectSize
+          {
+            System::UInt32 get(){ return 0; }
+          }
+          virtual property System::UInt32 ClassId
+          {
+            System::UInt32 get(){ return m_typeId; }
+          }
+          virtual String^ ToString() override
+          {
+            return "PdxFieldName:" + m_fieldName + ", TypeId: " + m_typeId + 
", VarLenFieldIdx:" + m_varLenFieldIdx + ", sequenceid:" + m_sequenceId;
+          }
+        };
+      }  // namespace Client
+    }  // namespace Geode
+  }  // namespace Apache
+
+}

Reply via email to