/*=========================================================================
 * Copyright (c) 2010-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
 * one or more patents listed at http://www.pivotal.io/patents.
 *=========================================================================
 */
#include "CacheableFileName.hpp"
#include "GemfireTypeIds.hpp"
#include "DataOutput.hpp"
#include "DataInput.hpp"

#include <ace/ACE.h>
#include <ace/OS.h>

namespace gemfire
{

  void CacheableFileName::toData(DataOutput& output) const
  {
    output.write(m_type);
    CacheableString::toData(output);
  }

  Serializable* CacheableFileName::fromData(DataInput& input)
  {
    input.read(&m_type);
    (void) CacheableString::fromData(input);
    return this;
  }

  int32_t CacheableFileName::classId() const
  {
    return 0;
  }

  int8_t CacheableFileName::typeId() const
  {
    return GemfireTypeIds::CacheableFileName;
  }

  uint32_t CacheableFileName::hashcode() const
  {
#ifndef _WIN32
    if (m_hashcode == 0) {
      m_hashcode = CacheableString::hashcode() ^ 1234321;
    }
    return m_hashcode;
#endif
    if (m_hashcode == 0) {
      int localHashcode = 0;
      if (CacheableString::isCString())
      {
        const char *data = CacheableString::asChar();  
        for (uint32_t i = 0; i < CacheableString::length(); i++) {
          localHashcode = 31*localHashcode + ACE_OS::ace_tolower(data[i]);
        }  
      }
      else {
        const wchar_t *data = CacheableString::asWChar();
        for (uint32_t i = 0; i < CacheableString::length(); i++) {
          localHashcode = 31*localHashcode + ACE_OS::ace_tolower(data[i]);
        }
      }
      m_hashcode = localHashcode ^ 1234321;
    }
    return m_hashcode;
  }
}
