#include "stdafx.h"
#include "function.h"


#include "namespace_start.h"

Void GetnliteUserId(NString  &id)
{
	ULONG ulOutBufLen;
	DWORD dwRet;
	std::vector<BYTE> buff;
	PIP_ADAPTER_INFO pAdapterInfo;

	ulOutBufLen = 0;
	// 必要バッファサイズ取得
	::GetAdaptersInfo(NULL, &ulOutBufLen);
	// 必要なバッファサイズで取得用の構造体を用意する。
	buff.resize(ulOutBufLen);
	pAdapterInfo = (PIP_ADAPTER_INFO)&buff[0];
	// 実際にネットワークアダプタの情報を取得する。
	dwRet = ::GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
	// ネットワークアダプターの情報取得をチェック
	if(dwRet == ERROR_SUCCESS) {
		// 取得が成功したら最後のアダプタ情報を採用
		while (1) {
			// 現状NICの正しいMacアドレスを割り出すことが出来ない。
			// 最後に取得されたアダプタを採用。必ずしもNICのMacアドレスとは限らない！
			if (pAdapterInfo->Next == NULL) {// MIB_IF_TYPE_ETHERNETでは判定不可！
				std::array<TCHAR,256> buffer;
				DWORD bufSize = buffer.size();
				CryptBinaryToString(pAdapterInfo->Address,sizeof(pAdapterInfo->Address),CRYPT_STRING_BASE64,&buffer[0],&bufSize);
				
				
				id = &buffer[0];
				return;
				
			}

			pAdapterInfo = pAdapterInfo->Next;
		}
			
	}
}




const tm *CTm::SetNowLocalTime(){

	return SetLocalTime(time(nullptr));

}

const tm *CTm::SetNowGmTime(){

	return SetGmTime(time(nullptr));
}

const tm *CTm::SetLocalTime(time_t timer){
	timet = *localtime(&timer);
	return &timet;
}

const tm *CTm::SetGmTime(time_t timer){
	timet = *gmtime(&timer);
	return &timet;
}

CTm::operator tm*(){

	return &timet;
}

UInt FormatTime(NString &str,const NString &format,tm* timeptr){

	std::array<NChar,_MAX_PATH> buffer;
	_tcsftime(&buffer[0],buffer.size(),format.c_str(),timeptr);
	str = &buffer[0];
	return str.size();
}



Int ReadIni(const NString &path,const NString &section,const NString &key,NString &val){

	std::array<NChar,_MAX_PATH> buf;
	Int result = GetPrivateProfileString(section.c_str(),key.c_str(),_T(""),buf.data(),buf.size(),path.c_str());

	val = buf.data();

	return result;

}







//
//文字列変換
///////////////////////////////////////////////////////////////////////

static Bool ToMStr(UInt cp,MString &buf,const CharU16 *target,UInt targetSize){
	Int rslt = 0;

	std::vector<Char> charList;
	charList.resize(::WideCharToMultiByte(cp,0,target,targetSize,NULL,0,0,NULL) + 1);
	rslt = ::WideCharToMultiByte(cp,0,target,targetSize,&charList[0],charList.size(),0,NULL);
	buf = &charList[0];

	

	return rslt > 0;

}


static Bool ToU16Str(UInt cp,U16String &buf,const Char *target,UInt targetSize){
	Int rslt = 0;
	std::vector<CharU16> charList;
	charList.resize(::MultiByteToWideChar(cp,0,target,targetSize,NULL,0) + 1);

	rslt = ::MultiByteToWideChar(cp,0,target,targetSize,&charList[0],charList.size());

	buf = &charList[0];

	return rslt > 0;

}

Bool ToSJIS(MString &buf,const U16String &target){

	
	return ToSJIS(buf,target.c_str(),target.size());
	
}

Bool ToSJIS(MString &buf,const CharU16 *target,UInt targetSize){
	
	return ToMStr(CP_THREAD_ACP,buf,target,targetSize);
}
	
Bool ToUTF8(MString &buf,const U16String &target){

	return ToUTF8(buf,target.c_str(),target.size());
	
}

Bool ToUTF8(MString &buf,const CharU16 *target,UInt targetSize){
	
	return ToMStr(CP_UTF8,buf,target,targetSize);

}

Bool UTF8ToUTF16(U16String &buf,const MString &target){

	
	return UTF8ToUTF16(buf,target.c_str(),target.size());
}

 Bool UTF8ToUTF16(U16String &buf,const Char *target,UInt targetSize){

	 
	 return ToU16Str(CP_UTF8,buf,target,targetSize);

 }

 
 Bool SJISToUTF16(U16String &buf,const MString &target){

	 return SJISToUTF16(buf,target.c_str(),target.size());
 }

Bool SJISToUTF16(U16String &buf,const Char *target,UInt targetSize){

	return ToU16Str(CP_THREAD_ACP,buf,target,targetSize);
}


Bool PathIsFile(const NString &path){

	return ::PathFileExists( path.c_str() ) && !::PathIsDirectory( path.c_str() );
}

#include "namespace_end.h"