
/*!
@since 2003/10/17
@auther d金魚
@note
Licence is BSD Licence
*/



#include "stdafx.h"
#include "dkutilFSWin32Common.h"

namespace dkutil{



//汎用？Win32API用保存関数。
int SaveFile(const char *filename,const void *filedata,size_t size){
	HANDLE hFile;
	hFile = CreateFile(filename, GENERIC_WRITE, 0, 0, 
					OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile==INVALID_HANDLE_VALUE){
		//MB("CreateFile FAILED");
		//VISUAL_LASTERROR();//エラー表示マクロ
		return edk_FAILED;
	}
	SetFilePointer(
		hFile,    // ファイルハンドル 
		0,    // ファイルポインタを移動する距離
		0,    // 距離６４ビット分の上位３２ビット 
		FILE_BEGIN     // 移動の仕方 
	   );
	DWORD dwAccBytes;
	WriteFile(hFile, filedata, size , &dwAccBytes, NULL);
	SetFilePointer(hFile,size,0,FILE_BEGIN);
	SetEndOfFile(hFile);
	FlushFileBuffers(hFile);
	//wsprintf(szTitle, szTitle_org, szFile);
	//SetWindowText(hEdit, szTitle);
	if(CloseHandle(hFile) == 0){
		//MB("CloseHandle FAILED");
		 //VISUAL_LASTERROR();
		 return edk_FAILED;
	}
	return edk_SUCCEEDED;
}

//汎用？？かなぁ？
int LoadFile(const char *filename,void *Buff,size_t BuffSize,DWORD *GetReadSize)
{
	HANDLE hFile;
	DWORD dwSize;//ファイルサイズ
    DWORD dwAccBytes;//実際に読み込んだバイトサイズ？

	hFile = CreateFile(filename, GENERIC_READ, 0, 0, //OPEN_ALWAYS,
		OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
  if(INVALID_HANDLE_VALUE==hFile){
		//VISUAL_LASTERROR();
		return edk_FileNotFound;
	}
	dwSize = ::GetFileSize(hFile, NULL);
    
  SetFilePointer(hFile, 0, 0, FILE_BEGIN);

  ReadFile(hFile, Buff, dwSize, &dwAccBytes, NULL);
	*GetReadSize = dwAccBytes;
    if(CloseHandle(hFile) == 0){
		 //ODS("CloseHandle FAILED");
		 //VISUAL_LASTERROR();
		return edk_FAILED;
	}
	return edk_SUCCEEDED;
}
	

bool SaveData( char *pFile, void *pData, unsigned long Size )
{
	bool result = false;
	unsigned char *p = (unsigned char *)pData;
	char *guid = "LSD";
	char key = (char)(Size&0xFF);
	FILE *fp = NULL;

	// ファイルオープン
	fp = fopen( pFile, "wb" );
	if ( fp == NULL ) goto END;

	// 識別子
	fwrite( guid, sizeof(char), 4, fp );

	// データサイズ
	fwrite( &Size, sizeof(unsigned long), 1, fp );

	// データ書き出し
	while ( Size-- )
	{
		// 簡単な暗号
		char data = *p++;
		data ^= key++;
		char temp = 0;
		temp |= (char)((data&0x0F)<<4);
		temp |= (char)((data&0xF0)>>4);

		fputc( temp, fp );
	}

	result = true;

END:
	if ( fp != NULL ) fclose( fp );

	return result;
}


bool LoadData( char *pFile, void *pData, unsigned long Size )
{
	bool result = false;
	unsigned char *p = (unsigned char *)pData;
	char guid[4] = "";
	unsigned long SizeTemp = 0;
	char key = 0;
	FILE *fp = NULL;

	//別にいらないかな^^;
	//Luna::ResetCurrentDirectory();

	 //ファイルオープン
	fp = fopen( pFile, "rb" );
	if ( fp == NULL ) goto END;

	// 識別子
	fread( guid, sizeof(char), 4, fp );
	if ( strcmp( guid, "LSD" ) ) goto END;

	// データサイズ
	fread( &SizeTemp, sizeof(unsigned long), 1, fp );
	if ( SizeTemp != Size ) goto END;

	// ファイルサイズからキー生成
	key = (char)(Size&0xFF);
	unsigned long i;
	// データ読み出し
	for ( i = 0; i < Size; i++ )
	{
		// 簡単な暗号
		char temp = (char)fgetc( fp );
		char data = 0;
		data |= (char)((temp&0x0F)<<4);
		data |= (char)((temp&0xF0)>>4);
		data ^= key++;

		p[i] = data;
	}

	result = true;

END:
	if ( fp != NULL ) fclose( fp );

	return result;
}

bool CreateDirectory( const char *pPath )
{
	SECURITY_ATTRIBUTES attr={0};
	char work[MAX_PATH] = "";
	unsigned long n = 0;
	unsigned long len = strlen(pPath);
	
	while ( n < len )
	{
		 //フォルダ名取得
		while ( n < len )
		{
			if ( (pPath[n] == '\\') && (n != '\0') )
			{
				if ( work[n-1] != ':' )
				{
					break;
				}
			}
			work[n] = pPath[n];
			n++;
		}
		work[n] = '\0';

		 //フォルダ作成
		attr.nLength = sizeof(SECURITY_ATTRIBUTES);
		attr.lpSecurityDescriptor = NULL;
		attr.bInheritHandle = false;

		::CreateDirectory( work, &attr );

		work[n++] = '\\';
	}
	
	return true;
}
	
bool CheckCDVolumeLabel( char *pLabel, char *pPath ,size_t pPathSize)
{
	// 全ドライブ検索
	for ( char i = 'A'; i <= 'Z'; i++ )
	{
		char Drive[8];
		_snprintf( Drive,8, "%c:\\", i );

		// CD-ROM発見
		if ( ::GetDriveType( Drive ) == DRIVE_CDROM )
		{
			unsigned long SerialNo;
			unsigned long MaximumComponentLength;
			unsigned long FileSystemFlag;
			char FileSystemName[256];
			char szVolumeLabel[256] = "NO CDROM";

			 //ボリュームラベル取得
			::GetVolumeInformation(
					Drive,
					szVolumeLabel,
					512,
					&SerialNo,
					&MaximumComponentLength,
					&FileSystemFlag,
					FileSystemName,
					512 );
			if ( !strcmp( pLabel, szVolumeLabel ) )
			{
				strncpy( pPath, Drive ,pPathSize);
				return true;
			}
		}
	}

	return false;
}



}//end of dkutil namespace



