/*
This file is part of Plugin Manager Plugin for Notepad++

Copyright (C)2009-2010 Dave Brotherstone <davegb@pobox.com>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

Modified for inclusion in VS2010 project "Python Script"
*/
#include "stdafx.h"
#include "WcharMbcsConverter.h"

std::shared_ptr<wchar_t> WcharMbcsConverter::char2wchar(const char* mbStr)
{

	std::shared_ptr<wchar_t> wideCharStr;

	size_t len = (size_t)MultiByteToWideChar(CP_UTF8, 0, mbStr, -1, NULL, 0);


	if (len > 0)
	{
		wideCharStr.reset(new wchar_t[len]);
		MultiByteToWideChar(CP_UTF8, 0, mbStr, -1, wideCharStr.get(), (int)len);
	}
	else
	{
		wideCharStr.reset(new wchar_t[1]);
		wideCharStr.get()[0] = 0;
	}

	return wideCharStr;
}


std::shared_ptr<char> WcharMbcsConverter::wchar2char(const wchar_t* wcStr)
{

	std::shared_ptr<char> multiByteStr;

	size_t len = (size_t)WideCharToMultiByte(CP_UTF8, 0, wcStr, -1, NULL, 0, NULL, NULL);

	if (len > 0)
	{
		multiByteStr.reset(new char[len]);
		WideCharToMultiByte(CP_UTF8, 0, wcStr, -1, multiByteStr.get(), (int)len, NULL, NULL);
	}
	else
	{
		multiByteStr.reset(new char[1]);
		multiByteStr.get()[0] = 0;
	}

	return multiByteStr;
}

	//static boost::std::shared_ptr<const TCHAR>   char2tchar(const char* mbStr);
	//static boost::std::shared_ptr<const char>    tchar2char(const TCHAR* tStr);
std::shared_ptr<TCHAR> WcharMbcsConverter::char2tchar(const char* mbStr)
{
#ifdef _UNICODE
	return char2wchar(mbStr);
#else
	size_t len = strlen(mbStr) + 1;
	std::shared_ptr<TCHAR> result(new TCHAR[len]);
	strcpy_s(result.get(), len, mbStr);
	return result;
#endif
}

std::shared_ptr<char> WcharMbcsConverter::tchar2char(const TCHAR* tStr)
{
#ifdef _UNICODE
	return wchar2char(tStr);
#else
	size_t len = _tcslen(tStr) + 1;
	std::shared_ptr<TCHAR> result(new TCHAR[len]);
	strcpy_s(result.get(), len, tStr);
	return result;
#endif
}

std::shared_ptr<TCHAR> WcharMbcsConverter::tchar2tchar(const TCHAR* tStr)
{
	size_t len = _tcslen(tStr) + 1;
	std::shared_ptr<TCHAR> result(new TCHAR[len]);
	_tcscpy_s(result.get(), len, tStr);
	return result;
}
