File Annotation

Not logged in
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: #include "stdafx.h"
5128eecc9f 2011-02-23        kinaba: #include "resource.h"
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // ユーティリティー
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: #ifndef ListView_SetCheckState
5128eecc9f 2011-02-23        kinaba: #define ListView_SetCheckState(_hwndLV, _i, _fCheck) \
5128eecc9f 2011-02-23        kinaba: 	ListView_SetItemState(_hwndLV, _i, \
5128eecc9f 2011-02-23        kinaba: 	INDEXTOSTATEIMAGEMASK((_fCheck)+1), LVIS_STATEIMAGEMASK)
5128eecc9f 2011-02-23        kinaba: #endif
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // なんか長いし分り難いんで(w
5128eecc9f 2011-02-23        kinaba: #define IsDblChar(x) IsDBCSLeadByte((BYTE)(x))
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 一番前=TRUE(後ろ=FALSE)の何か=cのインデックスを探して返す
5128eecc9f 2011-02-23        kinaba: int GetcX(char *buf,char c,BOOL fl)
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	int rt;
5128eecc9f 2011-02-23        kinaba: 	int i,len;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	len = lstrlen(buf);
5128eecc9f 2011-02-23        kinaba: 	rt = 0;
5128eecc9f 2011-02-23        kinaba: 	for (i = 0;i < len;i++){
5128eecc9f 2011-02-23        kinaba: 		// 2バイト文字なら飛ばす
5128eecc9f 2011-02-23        kinaba: 		if (IsDblChar(buf[i])){
5128eecc9f 2011-02-23        kinaba: 			i++;
5128eecc9f 2011-02-23        kinaba: 			continue;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		else{
5128eecc9f 2011-02-23        kinaba: 			if (buf[i] == c){
5128eecc9f 2011-02-23        kinaba: 				rt = i;
5128eecc9f 2011-02-23        kinaba: 				// 最初の奴を探すのなら
5128eecc9f 2011-02-23        kinaba: 				if (fl)
5128eecc9f 2011-02-23        kinaba: 					return(rt);
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	// 最後まで無かった
5128eecc9f 2011-02-23        kinaba: 	if (!rt && (i == len))
5128eecc9f 2011-02-23        kinaba: 		rt = len;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	return(rt);
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // ファイル名取得
5128eecc9f 2011-02-23        kinaba: char *GetFileName(char *buf)
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	int ly;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 最後の¥
5128eecc9f 2011-02-23        kinaba: 	ly = GetcX(buf,'\\',FALSE);
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// そのまま返す
5128eecc9f 2011-02-23        kinaba: 	if (ly == lstrlen(buf))
5128eecc9f 2011-02-23        kinaba: 		return(buf);
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// \の次のポインタを返す
5128eecc9f 2011-02-23        kinaba: 	return(&buf[ly+1]);
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: static void move_later( const char* from, const char* to )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// 移動先と同じディレクトリへ動かしておく
5128eecc9f 2011-02-23        kinaba: 	kiPath tmp( to );
5128eecc9f 2011-02-23        kinaba: 	::CopyFile( from, tmp+=".tmp", FALSE );
5128eecc9f 2011-02-23        kinaba: 	::DeleteFile( from );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// NT系ならMoveFileExが成功するはず
5128eecc9f 2011-02-23        kinaba: 	if( ::MoveFileEx( tmp, to, MOVEFILE_REPLACE_EXISTING|MOVEFILE_DELAY_UNTIL_REBOOT ) )
5128eecc9f 2011-02-23        kinaba: 		return;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 9x系ならWININIT.INIをいじる
5128eecc9f 2011-02-23        kinaba: 	char inifile[MAX_PATH];
5128eecc9f 2011-02-23        kinaba: 	::GetWindowsDirectory( inifile, sizeof(inifile) );
5128eecc9f 2011-02-23        kinaba: 	::lstrcat( inifile, "\\WININIT.INI" );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// ショート名前に変換
5128eecc9f 2011-02-23        kinaba: 	char sfrom[MAX_PATH], sto[MAX_PATH];
5128eecc9f 2011-02-23        kinaba: 	::GetShortPathName(  tmp, sfrom, MAX_PATH );
5128eecc9f 2011-02-23        kinaba: 	::GetShortPathName(   to,   sto, MAX_PATH );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// Renameセクションに追加
5128eecc9f 2011-02-23        kinaba: 	static char buf[30000];
5128eecc9f 2011-02-23        kinaba: 	::GetPrivateProfileSection( "Rename", buf, 30000, inifile );
5128eecc9f 2011-02-23        kinaba: 	char* p = buf;
5128eecc9f 2011-02-23        kinaba: 	while(*p)while(*p++);
5128eecc9f 2011-02-23        kinaba: 	::lstrcpy( p, "NUL=" );
5128eecc9f 2011-02-23        kinaba: 	::lstrcat( p, sto );
5128eecc9f 2011-02-23        kinaba: 	::lstrcat( p, "\r\n" );
5128eecc9f 2011-02-23        kinaba: 	::lstrcat( p, sto );
5128eecc9f 2011-02-23        kinaba: 	::lstrcat( p, "=" );
5128eecc9f 2011-02-23        kinaba: 	::lstrcat( p, sfrom );
5128eecc9f 2011-02-23        kinaba: 	while(*p++);
5128eecc9f 2011-02-23        kinaba: 	*p='\0';
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 2発打って確実に書き込む
5128eecc9f 2011-02-23        kinaba: 	::WritePrivateProfileSection( "Rename", buf, inifile );
5128eecc9f 2011-02-23        kinaba: 	::WritePrivateProfileString( NULL, NULL, NULL, inifile );
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: static void rebootWindows()
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	if( app()->osver().dwPlatformId == VER_PLATFORM_WIN32_NT )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// NT系では特権を取得しなくてはいけない
5128eecc9f 2011-02-23        kinaba: 		HANDLE hToken;
5128eecc9f 2011-02-23        kinaba: 		TOKEN_PRIVILEGES tkp;
5128eecc9f 2011-02-23        kinaba: 		::OpenProcessToken( ::GetCurrentProcess(),
5128eecc9f 2011-02-23        kinaba: 			TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken );
5128eecc9f 2011-02-23        kinaba: 		::LookupPrivilegeValue(
5128eecc9f 2011-02-23        kinaba: 			NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid );
5128eecc9f 2011-02-23        kinaba: 		tkp.PrivilegeCount = 1;
5128eecc9f 2011-02-23        kinaba: 		tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
5128eecc9f 2011-02-23        kinaba: 		::AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, NULL, 0 );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	::ExitWindowsEx( EWX_REBOOT, 0 );
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: static bool cancelShiteIidesuka()
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	return IDYES == app()->msgBox( kiStr().loadRsrc( IDS_CANCELOK ),
5128eecc9f 2011-02-23        kinaba: 		"caldix", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 );
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: template <class T> static inline bool show( const T& dlg )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	(const_cast<T&>(dlg)).doModal();
5128eecc9f 2011-02-23        kinaba: 	return IDOK == (const_cast<T&>(dlg)).getEndCode();
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // 解凍関係
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: #include "kiutil.h"
5128eecc9f 2011-02-23        kinaba: #include "LzhTool.h"
5128eecc9f 2011-02-23        kinaba: #include "CabTool.h"
5128eecc9f 2011-02-23        kinaba: #include "ZipTool.h"
5128eecc9f 2011-02-23        kinaba: #define is_lzh(xx) (xx[2]=='-' && xx[3]=='l' && xx[4]=='h' && xx[6]=='-' && '0'<=xx[5] && xx[5]<='9')
5128eecc9f 2011-02-23        kinaba: #define is_zip(xx) (xx[2]=='P' && xx[3]=='K' && xx[4]==0x3 && xx[6]==0x4)
5128eecc9f 2011-02-23        kinaba: #define is_cab(xx) (xx[0]=='M' && xx[1]=='S' && xx[2]=='C' && xx[3]=='F')
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: enum arctype{ e_lzh, e_zip, e_cab, unknown };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: static arctype get_archive_type( const char* arcname )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// 手抜き判別
5128eecc9f 2011-02-23        kinaba: 	arctype ans = unknown;
5128eecc9f 2011-02-23        kinaba: 	kiFile fp;
5128eecc9f 2011-02-23        kinaba: 	if( fp.open(arcname) )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		unsigned long asize = 128 << 10;
5128eecc9f 2011-02-23        kinaba: 		unsigned char *buf = new unsigned char[asize];
5128eecc9f 2011-02-23        kinaba: 		unsigned char *p=buf, *end=buf+fp.read( buf, asize-6 );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		while( p!=end )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 				 if( is_lzh(p) ) { ans=e_lzh; break; }
5128eecc9f 2011-02-23        kinaba: 			else if( is_zip(p) ) { ans=e_zip; break; }
5128eecc9f 2011-02-23        kinaba: 			else if( is_cab(p) ) { ans=e_cab; break; }
5128eecc9f 2011-02-23        kinaba: 			p++;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		delete [] buf;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	return ans;
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: static void melt_it( const char* arcname, const char* dllname, kiPath& dll_rel_path )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	const char* ext = kiPath::ext( arcname );
5128eecc9f 2011-02-23        kinaba: 	arctype type = unknown;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 判別
5128eecc9f 2011-02-23        kinaba: 		 if( 0==stricmp( ext, "lzh" ) ) type = e_lzh;
5128eecc9f 2011-02-23        kinaba: 	else if( 0==stricmp( ext, "zip" ) ) type = e_zip;
5128eecc9f 2011-02-23        kinaba: 	else if( 0==stricmp( ext, "cab" ) ) type = e_cab;
5128eecc9f 2011-02-23        kinaba: 	else type = get_archive_type(arcname);
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 展開
5128eecc9f 2011-02-23        kinaba: 	switch( type )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 	case e_lzh:{ CLzhTool().Extract( arcname, dllname, dll_rel_path ); }break;
5128eecc9f 2011-02-23        kinaba: 	case e_zip:{ CZipTool().Extract( arcname, dllname, dll_rel_path ); }break;
5128eecc9f 2011-02-23        kinaba: 	case e_cab:{ CCabTool().Extract( arcname, dllname, dll_rel_path ); }break;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // DLL情報管理:Meta-WWWC-Contentの解析など
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class DLLInfo
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	DLLInfo( const char* _name, const char* _html, int _wwwc )
5128eecc9f 2011-02-23        kinaba: 		: name( _name ), html( _html ), wwwc( _wwwc ), size( 0 ) {}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	bool  ParseHTML( char* str );
5128eecc9f 2011-02-23        kinaba: 	const kiStr& htmlName() const { return html; }
5128eecc9f 2011-02-23        kinaba: 	bool  needToUpdate( kiPath& dlldir );
5128eecc9f 2011-02-23        kinaba: 	const kiStr& getName() const { return name; }
5128eecc9f 2011-02-23        kinaba: 	const kiStr& getState() const { return stat; }
5128eecc9f 2011-02-23        kinaba: 	const int getSize() const { return size; }
5128eecc9f 2011-02-23        kinaba: 	const kiStr& getArchiveName() const { return arch; }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	char* Get_WWWC_Content( char* str );
5128eecc9f 2011-02-23        kinaba: 	bool  ParseWWWC( char* str );
5128eecc9f 2011-02-23        kinaba: 	bool  CheckDateTime( const char* localDLL );
5128eecc9f 2011-02-23        kinaba: 	bool  VersionCheckLogic(
5128eecc9f 2011-02-23        kinaba: 		const kiStr& dllName, const kiStr& htmlVer, int Ver, int subVer );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 固定情報
5128eecc9f 2011-02-23        kinaba: 	const kiStr name; // DLLの名前
5128eecc9f 2011-02-23        kinaba: 	const kiStr html; // チェック先HTMLの名前
5128eecc9f 2011-02-23        kinaba: 	const int   wwwc; // 何番目のWWWCタグを利用するか
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// HTMLから取得する情報
5128eecc9f 2011-02-23        kinaba: 	kiStr       arch; // 書庫名
5128eecc9f 2011-02-23        kinaba: 	kiStr       vers; // バージョン
5128eecc9f 2011-02-23        kinaba: 	kiStr       dttm; // 日付&時刻
5128eecc9f 2011-02-23        kinaba: 	int         size; // サイズ
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// バージョン照合の結果
5128eecc9f 2011-02-23        kinaba: 	kiStr       stat; // 更新状況
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: char* DLLInfo::Get_WWWC_Content( char* x )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// もーれつに雑。
5128eecc9f 2011-02-23        kinaba: 	while( *x==' ' || *x=='\t' || *x=='\r' || *x=='\n' ) x++;
5128eecc9f 2011-02-23        kinaba: 	if( (x[0]=='m' || x[0]=='M')
5128eecc9f 2011-02-23        kinaba: 	 && (x[1]=='e' || x[1]=='E')
5128eecc9f 2011-02-23        kinaba: 	 && (x[2]=='t' || x[2]=='T')
5128eecc9f 2011-02-23        kinaba: 	 && (x[3]=='a' || x[3]=='A') )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		x+=4;
5128eecc9f 2011-02-23        kinaba: 		while( *x==' ' || *x=='\t' || *x=='\r' || *x=='\n' ) x++;
5128eecc9f 2011-02-23        kinaba: 		if( (x[0]=='n' || x[0]=='N')
5128eecc9f 2011-02-23        kinaba: 		 && (x[1]=='a' || x[1]=='A')
5128eecc9f 2011-02-23        kinaba: 		 && (x[2]=='m' || x[2]=='M')
5128eecc9f 2011-02-23        kinaba: 		 && (x[3]=='e' || x[3]=='E')
5128eecc9f 2011-02-23        kinaba: 		 &&       (x[4]=='=')
5128eecc9f 2011-02-23        kinaba: 		 &&       (x[5]=='"')
5128eecc9f 2011-02-23        kinaba: 		 && (x[6]=='w' || x[6]=='W')
5128eecc9f 2011-02-23        kinaba: 		 && (x[7]=='w' || x[7]=='W')
5128eecc9f 2011-02-23        kinaba: 		 && (x[8]=='w' || x[8]=='W')
5128eecc9f 2011-02-23        kinaba: 		 && (x[9]=='c' || x[9]=='C')
5128eecc9f 2011-02-23        kinaba: 		 &&       (x[10]=='"') )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			x+=11;
5128eecc9f 2011-02-23        kinaba: 			while( *x==' ' || *x=='\t' || *x=='\r' || *x=='\n' ) x++;
5128eecc9f 2011-02-23        kinaba: 			if( (x[0]=='c' || x[0]=='C')
5128eecc9f 2011-02-23        kinaba: 			 && (x[1]=='o' || x[1]=='O')
5128eecc9f 2011-02-23        kinaba: 			 && (x[2]=='n' || x[2]=='N')
5128eecc9f 2011-02-23        kinaba: 			 && (x[3]=='t' || x[3]=='T')
5128eecc9f 2011-02-23        kinaba: 			 && (x[4]=='e' || x[4]=='E')
5128eecc9f 2011-02-23        kinaba: 			 && (x[5]=='n' || x[5]=='N')
5128eecc9f 2011-02-23        kinaba: 			 && (x[6]=='t' || x[6]=='T')
5128eecc9f 2011-02-23        kinaba: 			 &&       (x[7]=='=')
5128eecc9f 2011-02-23        kinaba: 			 &&       (x[8]=='"') )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				x+=9;
5128eecc9f 2011-02-23        kinaba: 				char* p=x;
5128eecc9f 2011-02-23        kinaba: 				while( *p!='\0' && *p!='"' ) p++;
5128eecc9f 2011-02-23        kinaba: 				*p='\0';
5128eecc9f 2011-02-23        kinaba: 				return x;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	return NULL;
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: bool DLLInfo::ParseHTML( char* str )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	int ct = wwwc;
5128eecc9f 2011-02-23        kinaba: 	for( char* p=str; *p; ++p )
5128eecc9f 2011-02-23        kinaba: 		if( *p == '<' )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			for( char* x=p+1; *x; ++x )
5128eecc9f 2011-02-23        kinaba: 				if( *x == '>' )
5128eecc9f 2011-02-23        kinaba: 					break;
5128eecc9f 2011-02-23        kinaba: 			*x = '\0';
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			char* w = Get_WWWC_Content( p+1 );
5128eecc9f 2011-02-23        kinaba: 			if( w && (--ct)==0 )
5128eecc9f 2011-02-23        kinaba: 				return ParseWWWC( w );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			p = x;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	return false;
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: bool DLLInfo::ParseWWWC( char* str )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	char *x,*k,*t,*p=str;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 2個目のスペースまでが更新日時
5128eecc9f 2011-02-23        kinaba: 	for( int spc=2; *p; ++p )
5128eecc9f 2011-02-23        kinaba: 		if( *p==' ' )
5128eecc9f 2011-02-23        kinaba: 			if( (--spc)==0 )
5128eecc9f 2011-02-23        kinaba: 				break;
5128eecc9f 2011-02-23        kinaba: 	if( *p=='\0' )
5128eecc9f 2011-02-23        kinaba: 		return false;
5128eecc9f 2011-02-23        kinaba: 	*(p++) = '\0';
5128eecc9f 2011-02-23        kinaba: 	dttm = str;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// [xxx: ---] 部分
5128eecc9f 2011-02-23        kinaba: 	while( true )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		while( *p!='\0' && *p!='[' ) ++p;
5128eecc9f 2011-02-23        kinaba: 		if( *p!='\0' ) ++p;
5128eecc9f 2011-02-23        kinaba: 		if( *p=='\0' )break;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		t=x=k=p;
5128eecc9f 2011-02-23        kinaba: 		while( *x!='\0' && *x!=']' ) x++;
5128eecc9f 2011-02-23        kinaba: 		while( *k!='\0' && *k!=':' ) k++;
5128eecc9f 2011-02-23        kinaba: 		if( *x=='\0' || *k=='\0' || k>=x )break;
5128eecc9f 2011-02-23        kinaba: 		*k=*x='\0';
5128eecc9f 2011-02-23        kinaba: 		p=k+1;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( 0==lstrcmpi( t, "File" ) )
5128eecc9f 2011-02-23        kinaba: 			arch = p;
5128eecc9f 2011-02-23        kinaba: 		else if( 0==lstrcmpi( t, "Ver" ) )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			while( *p && (*p<'0' || '9'<*p) )
5128eecc9f 2011-02-23        kinaba: 				++p;
5128eecc9f 2011-02-23        kinaba: 			vers = p;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		else if( 0==lstrcmpi( t, "Size" ) )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// atoi
5128eecc9f 2011-02-23        kinaba: 			for( int n=0; *p; p++ )
5128eecc9f 2011-02-23        kinaba: 				if( '0'<=*p && *p<='9' )
5128eecc9f 2011-02-23        kinaba: 					n = (10*n) + (*p - '0');
5128eecc9f 2011-02-23        kinaba: 			size = n;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		p=x+1;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	return ( size!=0 && arch.len()!=0 );
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // caldixの設定項目管理
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: enum {
5128eecc9f 2011-02-23        kinaba: 	UNLHA, UNZIP, ZIP, CAB, TAR, UNRAR, UNGCA,
5128eecc9f 2011-02-23        kinaba: 	UNARJ, YZ1, BGA, JACK, AISH, ISH, UNBEL, SvZIP,
5128eecc9f 2011-02-23        kinaba: 	UNIMP, BH, YZ2,
5128eecc9f 2011-02-23        kinaba: DLLID_NUM };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: struct CldxConfig
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	kiStr   UA;            // ユーザーエージェント名
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	bool    SuperAutoMode; // (利用しない)
5128eecc9f 2011-02-23        kinaba: 	bool    AutoMode;      // 全自動ならtrue, カスタムならfalse
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	kiPath  InstallTo;     // インストール先
5128eecc9f 2011-02-23        kinaba: 	int     CheckServer;   // 更新チェックに使うサーバ 窓辺=0, CSD=1, 惑星=2
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	int     ProxyPort;     // プロキシのポート番号
5128eecc9f 2011-02-23        kinaba: 	kiStr   ProxyServer;   // プロキシサーバ名
5128eecc9f 2011-02-23        kinaba: 	kiStr   ProxyUser;     // プロキシユーザ名(利用しない)
5128eecc9f 2011-02-23        kinaba: 	kiStr   ProxyPwd;      // プロキシパスワード(利用しない)
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	bool    George;        // 常時接続モードならtrue, 汎用モードならfalse
5128eecc9f 2011-02-23        kinaba: 	bool    UseCustomDir;  // 全自動でも、カスタムと同じディレクトリを用いる
5128eecc9f 2011-02-23        kinaba: 	bool    ShowReadMe;    // 最後にcldxフォルダを開くか否か
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 	kiStr   Filer;         // フォルダを開くファイラー
5128eecc9f 2011-02-23        kinaba: 	kiStr   F_Prefix;      // ファイラに渡すオプション前
5128eecc9f 2011-02-23        kinaba: 	kiStr   F_Suffix;      // ファイラに渡すオプション後ろ
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	bool    DoCheck[DLLID_NUM]; // 各DLLをチェック対象にするかどうか
5128eecc9f 2011-02-23        kinaba: 	int     InstMode;           // ダウンロードしたDLLの扱い
5128eecc9f 2011-02-23        kinaba: 	int     Expire;             // 日時チェックで更新対象とする範囲(単位:Day)
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	kiArray<DLLInfo*> List;     // チェック対象DLLのリスト
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	CldxConfig()
5128eecc9f 2011-02-23        kinaba: 		: UA( "caldix/1.21" )
5128eecc9f 2011-02-23        kinaba: 		, SuperAutoMode( false )
5128eecc9f 2011-02-23        kinaba: 		, AutoMode( true )
5128eecc9f 2011-02-23        kinaba: 		, InstallTo( kiPath::Sys )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		kiIniFile ini;
5128eecc9f 2011-02-23        kinaba: 		ini.setFileName( "caldix.ini" );
5128eecc9f 2011-02-23        kinaba: 		ini.setSection( "conf" );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		InstallTo    = ini.getStr ( "dll",       InstallTo );
5128eecc9f 2011-02-23        kinaba: 		CheckServer  = ini.getInt ( "checkserv", 0 ) % 3;
5128eecc9f 2011-02-23        kinaba: 		ProxyServer  = ini.getStr ( "proxy",     "" );
5128eecc9f 2011-02-23        kinaba: 		ProxyPort    = ini.getInt ( "proxyport", -80 );
5128eecc9f 2011-02-23        kinaba: 		George       =!ini.getBool( "askhang",   false ); // [1.21] デフォルトを false に変更。流石に今時…
5128eecc9f 2011-02-23        kinaba: 		UseCustomDir = ini.getBool( "custdir",   false );
5128eecc9f 2011-02-23        kinaba: 		ShowReadMe   = ini.getBool( "readme",    true );
5128eecc9f 2011-02-23        kinaba: 		InstMode     = ini.getInt ( "mode",      1 );
5128eecc9f 2011-02-23        kinaba: 		Expire       = ini.getInt ( "expire",    7 );
5128eecc9f 2011-02-23        kinaba: 		int version  = ini.getInt ( "ver",     110 );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 		Filer        = ini.getStr ( "Filer","explorer");
5128eecc9f 2011-02-23        kinaba: 		F_Prefix     = ini.getStr ( "F_Prefix","");
5128eecc9f 2011-02-23        kinaba: 		F_Suffix     = ini.getStr ( "F_Suffix","");
5128eecc9f 2011-02-23        kinaba: 		if( Filer=="" || Filer.isSame("explorer") )
5128eecc9f 2011-02-23        kinaba: 			Filer = kiPath(kiPath::Win,true), Filer += "explorer.exe";
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		for( int i=0; i<DLLID_NUM; ++i )
5128eecc9f 2011-02-23        kinaba: 			DoCheck[i] = false;
5128eecc9f 2011-02-23        kinaba: 		const char* ptr = ini.getStr( "DLLList", "LZzCTRGAYBJaIb7iH" );
5128eecc9f 2011-02-23        kinaba: 		while( *ptr )
5128eecc9f 2011-02-23        kinaba: 			switch( 0x7f & (*(ptr++)) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 			case 'L': DoCheck[UNLHA] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'Z': DoCheck[UNZIP] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'z': DoCheck[ZIP]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'C': DoCheck[CAB]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'T': DoCheck[TAR]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'R': DoCheck[UNRAR] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'G': DoCheck[UNGCA] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'A': DoCheck[UNARJ] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'Y': DoCheck[YZ1]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'B': DoCheck[BGA]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'J': DoCheck[JACK]  = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'a': DoCheck[AISH]  = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'I': DoCheck[ISH]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'b': DoCheck[UNBEL] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case '7': DoCheck[SvZIP] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'i': DoCheck[UNIMP] = true; break;
5128eecc9f 2011-02-23        kinaba: 			case 'H': DoCheck[BH]    = true; break;
5128eecc9f 2011-02-23        kinaba: 			case '2': DoCheck[YZ2]   = true; break;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		if( version<111 )
5128eecc9f 2011-02-23        kinaba: 			DoCheck[SvZIP] = true; // ver1.11より前には7-zip32.dllは
5128eecc9f 2011-02-23        kinaba: 			                       // 存在しなかったのでここで強制ON
5128eecc9f 2011-02-23        kinaba: 		if( version<112 )
5128eecc9f 2011-02-23        kinaba: 			DoCheck[UNIMP] = true; // ver1.12より前にはUnImp32.dllは
5128eecc9f 2011-02-23        kinaba: 			                       // 存在しなかったのでここで強制ON
5128eecc9f 2011-02-23        kinaba: 		if( version<118 )
5128eecc9f 2011-02-23        kinaba: 			DoCheck[BH]    = true; // ver1.18より前にはBh32.dllは
5128eecc9f 2011-02-23        kinaba: 			                       // 存在しなかったのでここで強制ON
5128eecc9f 2011-02-23        kinaba: 		if( version<120 )
5128eecc9f 2011-02-23        kinaba: 			DoCheck[YZ2]   = true; // ver1.20より前にはYz2.dllは
5128eecc9f 2011-02-23        kinaba: 			                       // 存在しなかったのでここで強制ON
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	void GenerateDLLList()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNLHA] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "Unlha32.dll",  "unlha32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNZIP] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "UnZip32.dll",  "unzip32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[ZIP]   )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(   "Zip32j.dll",   "zip32j.html", 1 ) ),
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(    "Zip32.dll",   "zip32j.html", 2 ) ),
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo( "Sfx32gui.dat", "sfx32gui.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[CAB]   )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(    "Cab32.dll",    "cab32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[TAR]   )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(    "Tar32.dll",    "tar32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNRAR] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "Unrar32.dll",  "unrar32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNGCA] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "UnGCA32.dll",  "ungca32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNARJ] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo( "Unarj32j.dll",  "unarj32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[YZ1]   )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(      "Yz1.dll",      "yz1.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[BGA]   )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(    "Bga32.dll",    "bga32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[JACK]  )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(   "Jack32.dll",   "jack32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[AISH]  )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(   "Aish32.dll",   "aish32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[ISH]   )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(    "Ish32.dll",    "ish32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNBEL] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "Unbel32.dll",  "unbel32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[SvZIP] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "7-zip32.dll",  "7-zip32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[UNIMP] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(  "UnImp32.dll",  "unimp32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[BH] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(     "Bh32.dll",     "bh32.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 		if( DoCheck[YZ2] )
5128eecc9f 2011-02-23        kinaba: 			List.add( new DLLInfo(      "Yz2.dll",      "yz2.html", 1 ) );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	~CldxConfig()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		if( !AutoMode )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			kiIniFile ini;
5128eecc9f 2011-02-23        kinaba: 			ini.setFileName( "caldix.ini" );
5128eecc9f 2011-02-23        kinaba: 			ini.setSection( "conf" );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			ini.putStr ( "dll",       InstallTo );
5128eecc9f 2011-02-23        kinaba: 			ini.putInt ( "checkserv", CheckServer );
5128eecc9f 2011-02-23        kinaba: 			ini.putStr ( "proxy",     ProxyServer );
5128eecc9f 2011-02-23        kinaba: 			ini.putInt ( "proxyport", ProxyPort );
5128eecc9f 2011-02-23        kinaba: 			ini.putBool( "askhang",  !George );
5128eecc9f 2011-02-23        kinaba: 			ini.putBool( "custdir",   UseCustomDir );
5128eecc9f 2011-02-23        kinaba: 			ini.putBool( "readme",    ShowReadMe );
5128eecc9f 2011-02-23        kinaba: 			ini.putInt ( "mode",      InstMode );
5128eecc9f 2011-02-23        kinaba: 			ini.putInt ( "expire",    Expire );
5128eecc9f 2011-02-23        kinaba: 			ini.putInt ( "ver",       121 );
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 			ini.putStr ( "Filer",     Filer );
5128eecc9f 2011-02-23        kinaba: 			ini.putStr ( "F_Prefix",  F_Prefix );
5128eecc9f 2011-02-23        kinaba: 			ini.putStr ( "F_Suffix",  F_Suffix );
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			kiStr chk;
5128eecc9f 2011-02-23        kinaba: 			for( int i=0; i<DLLID_NUM; ++i )
5128eecc9f 2011-02-23        kinaba: 				if( DoCheck[i] )
5128eecc9f 2011-02-23        kinaba: 					chk += "LZzCTRGAYBJaIb7iH2"[i];
5128eecc9f 2011-02-23        kinaba: 			ini.putStr( "DLLList", chk );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i<List.len(); ++i )
5128eecc9f 2011-02-23        kinaba: 			delete List[i];
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: CldxConfig* cfg = NULL;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // DLLのバージョンチェック
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: struct _zip_version_type
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	unsigned char major;
5128eecc9f 2011-02-23        kinaba: 	unsigned char minor;
5128eecc9f 2011-02-23        kinaba: 	unsigned char patchlevel;
5128eecc9f 2011-02-23        kinaba: 	unsigned char not_used;
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: struct ZpVer
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	unsigned long structlen;
5128eecc9f 2011-02-23        kinaba: 	unsigned long flag;
5128eecc9f 2011-02-23        kinaba: 	char betalevel[10];
5128eecc9f 2011-02-23        kinaba: 	char date[20];
5128eecc9f 2011-02-23        kinaba: 	char zlib_version[10];
5128eecc9f 2011-02-23        kinaba: 	_zip_version_type zip;
5128eecc9f 2011-02-23        kinaba: 	_zip_version_type os2dll;
5128eecc9f 2011-02-23        kinaba: 	_zip_version_type windll;
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: static WORD Zip32DLLGetVersion( const char* dll )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	WORD ans=0;
5128eecc9f 2011-02-23        kinaba: 	HINSTANCE inst = kiutil::safepathLoadLibrary( dll ); // dll はフルパスなので要らないはずだけど念のため
5128eecc9f 2011-02-23        kinaba: 	if( inst )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		typedef int (WINAPI * ZPVR)(ZpVer*);
5128eecc9f 2011-02-23        kinaba: 		ZPVR v = (ZPVR)::GetProcAddress( inst, "ZpVersion" );
5128eecc9f 2011-02-23        kinaba: 		if( v )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			ZpVer x;
5128eecc9f 2011-02-23        kinaba: 			v( &x );
5128eecc9f 2011-02-23        kinaba: 			ans = x.zip.major*100 + x.zip.minor*10 + x.zip.patchlevel;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		::FreeLibrary( inst );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	return ans;
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: bool DLLInfo::CheckDateTime( const char* localDLL )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// ローカルのDLLの日付を取得
5128eecc9f 2011-02-23        kinaba: 	FILETIME ft;
5128eecc9f 2011-02-23        kinaba: 	SYSTEMTIME StLocal;
5128eecc9f 2011-02-23        kinaba: 	HANDLE h = ::CreateFile(
5128eecc9f 2011-02-23        kinaba: 		localDLL, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
5128eecc9f 2011-02-23        kinaba: 		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
5128eecc9f 2011-02-23        kinaba: 	if( h == INVALID_HANDLE_VALUE )
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	::GetFileTime( h, NULL, NULL, &ft );
5128eecc9f 2011-02-23        kinaba: 	::FileTimeToSystemTime( &ft, &StLocal );
5128eecc9f 2011-02-23        kinaba: 	::CloseHandle( h );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// Webの方のの日付を取得
5128eecc9f 2011-02-23        kinaba: 	const char* p = dttm;
5128eecc9f 2011-02-23        kinaba: 	SYSTEMTIME StWeb = StLocal;
5128eecc9f 2011-02-23        kinaba: 	for( StWeb.wYear=0; *p && *p!='/'; ++p )
5128eecc9f 2011-02-23        kinaba: 		StWeb.wYear = StWeb.wYear*10 + (*p-'0');
5128eecc9f 2011-02-23        kinaba: 	if(*p)++p;
5128eecc9f 2011-02-23        kinaba: 	for( StWeb.wMonth=0; *p && *p!='/'; ++p )
5128eecc9f 2011-02-23        kinaba: 		StWeb.wMonth = StWeb.wMonth*10 + (*p-'0');
5128eecc9f 2011-02-23        kinaba: 	if(*p)++p;
5128eecc9f 2011-02-23        kinaba: 	for( StWeb.wDay=0; *p && *p!=' '; ++p )
5128eecc9f 2011-02-23        kinaba: 		StWeb.wDay = StWeb.wDay*10 + (*p-'0');
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// Webの方が1週間以上新しければ更新とかそんな感じ
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	if( (StLocal.wYear> StWeb.wYear)
5128eecc9f 2011-02-23        kinaba: 	 || (StLocal.wYear==StWeb.wYear && StLocal.wMonth>StWeb.wMonth)
5128eecc9f 2011-02-23        kinaba: 	 || (StLocal.wYear==StWeb.wYear && StLocal.wMonth==StWeb.wMonth && StLocal.wDay>=StWeb.wDay) )
5128eecc9f 2011-02-23        kinaba: 		return false; // ローカルの方が新しいので更新しない
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	if( StLocal.wYear+2 < StWeb.wYear )
5128eecc9f 2011-02-23        kinaba: 		return true; // 確実に1年以上新しいので更新
5128eecc9f 2011-02-23        kinaba: 	if( StLocal.wYear+1 == StWeb.wYear )
5128eecc9f 2011-02-23        kinaba: 		StWeb.wMonth += 12;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// cfg->Expire 日以上新しければ更新
5128eecc9f 2011-02-23        kinaba: 	StWeb.wDay += 30 * (StWeb.wMonth - StLocal.wMonth);
5128eecc9f 2011-02-23        kinaba: 	return ( StLocal.wDay+cfg->Expire < StWeb.wDay );
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //-------------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // バージョンチェック for caldix/1.15 or older + caldixF fix
5128eecc9f 2011-02-23        kinaba: //-------------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: /*
5128eecc9f 2011-02-23        kinaba: bool DLLInfo::VersionCheckLogic(
5128eecc9f 2011-02-23        kinaba: 	const kiStr& dllName,
5128eecc9f 2011-02-23        kinaba: 	const kiStr& htmlVer,
5128eecc9f 2011-02-23        kinaba: 	int ver, int sub )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// 文字列に変換
5128eecc9f 2011-02-23        kinaba: 	char verstr[100];
5128eecc9f 2011-02-23        kinaba: 	if( dllName=="Unimp32.dll" )
5128eecc9f 2011-02-23        kinaba: 		if( sub==0 )
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( verstr, "%d.%02d", ver/100, ver%100 );
5128eecc9f 2011-02-23        kinaba: 		else if( sub >= 100 )
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( verstr, "%d.%02d%c", ver/100, ver%100, sub/100+'a'-1 );
5128eecc9f 2011-02-23        kinaba: 		else
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( verstr, "%d.%02d%c", ver/100, ver%100, sub+'a'-1 );
5128eecc9f 2011-02-23        kinaba: 	else if( dllName=="7-zip32.dll" ) // 7-zipだけは無条件でSubVersionも数値で入れる
5128eecc9f 2011-02-23        kinaba: 		::wsprintf( verstr, "%d.%02d.%02d.%02d", ver/100, ver%100, sub/100,sub%100 );
5128eecc9f 2011-02-23        kinaba: 	else if( sub < 100 )
5128eecc9f 2011-02-23        kinaba: 		::wsprintf( verstr, "%d.%02d", ver/100, ver%100 );
5128eecc9f 2011-02-23        kinaba: 	else
5128eecc9f 2011-02-23        kinaba: 		::wsprintf( verstr, "%d.%02d%c", ver/100, ver%100, sub/100+'a'-1 );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 比較(htmlVerの方がVer.subVerより新しければtrue)
5128eecc9f 2011-02-23        kinaba: 	return
5128eecc9f 2011-02-23        kinaba: 		(CSTR_GREATER_THAN == ::CompareString(LOCALE_USER_DEFAULT,SORT_STRINGSORT,vers,-1,verstr,-1));
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: */
5128eecc9f 2011-02-23        kinaba: //-------------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // バージョンチェック for caldix/1.17 or newer
5128eecc9f 2011-02-23        kinaba: //-------------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: const char* find_first_non_digit( const char* p )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	while( '0'<=*p && *p<='9' ) ++p;
5128eecc9f 2011-02-23        kinaba: 	return p;
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: bool DLLInfo::VersionCheckLogic(
5128eecc9f 2011-02-23        kinaba: 	const kiStr& dllName,    // DLL名
5128eecc9f 2011-02-23        kinaba: 	const kiStr& htmVerStr,  // HTML上のバージョン文字列
5128eecc9f 2011-02-23        kinaba: 	int locVer, int locSub ) // ローカルDLLのバージョン
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	const char* vs = htmVerStr;
5128eecc9f 2011-02-23        kinaba: 	if( dllName == "Unimp32.dll" && locSub<100 )
5128eecc9f 2011-02-23        kinaba: 		locSub *= 100;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// バージョン文字列を解析。以下の4つの形式を認識する
5128eecc9f 2011-02-23        kinaba: 	//("%d.%d.%d.%d", ver/100, ver%100, sub/100, sub%100)
5128eecc9f 2011-02-23        kinaba: 	//("%d.%d",       ver/100, ver%100) && sub<100
5128eecc9f 2011-02-23        kinaba: 	//("%d.%d%c",     ver/100, ver%100, sub/100+'a'-1)
5128eecc9f 2011-02-23        kinaba: 	//("%d.%d.%d",    ver/100, ver%100, sub)
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	int htmVer=0, htmSub=0;
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// [%d][.]
5128eecc9f 2011-02-23        kinaba: 		const int d1 = atoi(vs);
5128eecc9f 2011-02-23        kinaba: 		vs = find_first_non_digit(vs);
5128eecc9f 2011-02-23        kinaba: 		if( *vs!='.' ) return false; ++vs;
5128eecc9f 2011-02-23        kinaba: 		// [%d]
5128eecc9f 2011-02-23        kinaba: 		const int d2 = atoi(vs);
5128eecc9f 2011-02-23        kinaba: 		const char* vs2 = find_first_non_digit(vs);
5128eecc9f 2011-02-23        kinaba: 		if( vs2-vs==1 && dllName=="Zip32.dll" ) // adhoc対処
5128eecc9f 2011-02-23        kinaba: 			htmVer = d1*100 + d2*10;
5128eecc9f 2011-02-23        kinaba: 		else
5128eecc9f 2011-02-23        kinaba: 			htmVer = d1*100 + d2;
5128eecc9f 2011-02-23        kinaba: 		vs = vs2;
5128eecc9f 2011-02-23        kinaba: 		if( *vs=='.' ) // [.]
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			++vs;
5128eecc9f 2011-02-23        kinaba: 			// [%d]
5128eecc9f 2011-02-23        kinaba: 			const int d3 = atoi(vs);
5128eecc9f 2011-02-23        kinaba: 			vs = find_first_non_digit(vs);
5128eecc9f 2011-02-23        kinaba: 			if( *vs=='.' ) // [.]
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				++vs;
5128eecc9f 2011-02-23        kinaba: 				// [%d]
5128eecc9f 2011-02-23        kinaba: 				const int d4 = atoi(vs);
5128eecc9f 2011-02-23        kinaba: 				htmSub = d3*100 + d4;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else
5128eecc9f 2011-02-23        kinaba: 				htmSub = d3;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		else if( 'a'<=*vs && *vs<='z' ) // [a-z]
5128eecc9f 2011-02-23        kinaba: 			htmSub = (*vs-'a'+1) * 100;
5128eecc9f 2011-02-23        kinaba: 		else if( 'A'<=*vs && *vs<='Z' ) // [A-Z]
5128eecc9f 2011-02-23        kinaba: 			htmSub = (*vs-'A'+1) * 100;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	return (locVer < htmVer) || (locVer==htmVer && locSub<htmSub);
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: bool DLLInfo::needToUpdate( kiPath& dlldir )
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// 情報取得できていなかった場合は更新しない
5128eecc9f 2011-02-23        kinaba: 	if( vers.len() == 0 )
5128eecc9f 2011-02-23        kinaba: 		return false;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 対象DLLのフルパス
5128eecc9f 2011-02-23        kinaba: 	kiPath dllPath( dlldir );
5128eecc9f 2011-02-23        kinaba: 	dllPath += name;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// DLLが存在しなかった場合は新しくインストール
5128eecc9f 2011-02-23        kinaba: 	if( !kiSUtil::exist( dllPath ) )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		stat.loadRsrc( IDS_NEWINST );
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 存在した場合…
5128eecc9f 2011-02-23        kinaba: 	bool updatable = false;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	if( name=="Sfx32gui.dat" )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// 特別処理1:Sfx32gui.datの場合は日付チェック
5128eecc9f 2011-02-23        kinaba: 		updatable = CheckDateTime( dllPath );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	else
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// それ以外は、バージョン番号でチェック
5128eecc9f 2011-02-23        kinaba: 		WORD ver=1, sub=0;
5128eecc9f 2011-02-23        kinaba: 		if( name == "Zip32.dll" )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			ver = Zip32DLLGetVersion( dllPath );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		else if( name != "Sfx32gui.dat" )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			kiArcDLLRaw dll( dllPath );
5128eecc9f 2011-02-23        kinaba: 			ver = dll.getVer();
5128eecc9f 2011-02-23        kinaba: 			sub = dll.getVerSub();
5128eecc9f 2011-02-23        kinaba: 			if( name=="Unimp32.dll" && !dll.isVerSubAvail() )
5128eecc9f 2011-02-23        kinaba: 				ver=6, sub=0; // 特殊処理2:古いunimpは0.0.6.0として扱う
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// バージョンチェックをここで実行
5128eecc9f 2011-02-23        kinaba: 		updatable = VersionCheckLogic( name, vers, ver, sub );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 特殊処理3:Unrar32.dllで、違いがSubVersionだけのときは日付チェック
5128eecc9f 2011-02-23        kinaba: 		if( updatable && name=="Unrar32.dll" )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			char verstr[100];
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( verstr, "%d.%02dz", ver/100, ver%100 );
5128eecc9f 2011-02-23        kinaba: 			if( CSTR_GREATER_THAN == ::CompareString(LOCALE_USER_DEFAULT,SORT_STRINGSORT,verstr,-1,vers,-1) )
5128eecc9f 2011-02-23        kinaba: 				updatable = CheckDateTime( kiPath(dlldir)+="Unrar.dll" );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 更新可能
5128eecc9f 2011-02-23        kinaba: 	if( updatable )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		char str[100];
5128eecc9f 2011-02-23        kinaba: 		::wsprintf( str, stat.loadRsrc( IDS_UPDINST ), (const char*)vers );
5128eecc9f 2011-02-23        kinaba: 		stat = str;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	return updatable;
5128eecc9f 2011-02-23        kinaba: }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // startDlg : 自動|カスタムの選択
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class startDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	startDlg() : kiDialog( IDD_START ) {}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	virtual BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// 二重起動禁止
5128eecc9f 2011-02-23        kinaba: 		char cls[256], wnd[256];
5128eecc9f 2011-02-23        kinaba: 		::GetClassName(  hwnd(), cls, sizeof(cls)-1 );
5128eecc9f 2011-02-23        kinaba: 		::GetWindowText( hwnd(), wnd, sizeof(wnd)-1 );
5128eecc9f 2011-02-23        kinaba: 		if( HWND h = ::FindWindow(cls,wnd) )
5128eecc9f 2011-02-23        kinaba: 			if( h!=hwnd() || (h=::FindWindowEx(NULL,h,cls,wnd)) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				end( IDCANCEL );
5128eecc9f 2011-02-23        kinaba: 				setFront( h );
5128eecc9f 2011-02-23        kinaba: 				return FALSE;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		app()->setMainWnd( this );
5128eecc9f 2011-02-23        kinaba: 		UINT md = (cfg->AutoMode ? IDC_WORKTYPE1 : IDC_WORKTYPE2);
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( md, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	virtual bool onOK()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		cfg->AutoMode =
5128eecc9f 2011-02-23        kinaba: 			(BST_CHECKED == sendMsgToItem( IDC_WORKTYPE1, BM_GETCHECK ));
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // customDlg : 接続先/インストール先の選択 プロキシ|詳細への分岐
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class customDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	customDlg() : kiDialog( IDD_CUSTOM1 ) {}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	virtual BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		app()->setMainWnd( this );
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_DLLDIR, WM_SETTEXT, 0, (LPARAM)(const char*)(cfg->InstallTo) );
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_CONNECTTO1+cfg->CheckServer, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	virtual BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		if( msg==WM_COMMAND )
5128eecc9f 2011-02-23        kinaba: 			if( LOWORD(wp)==IDC_REF )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				kiSUtil::getFolderDlgOfEditBox( item(IDC_DLLDIR), hwnd(), NULL );
5128eecc9f 2011-02-23        kinaba: 				return TRUE;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else if(  LOWORD(wp)==IDC_PROXY )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				show( proxyDlg() );
5128eecc9f 2011-02-23        kinaba: 				return TRUE;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else if(  LOWORD(wp)==IDC_DETAIL )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				show( detailDlg() );
5128eecc9f 2011-02-23        kinaba: 				return TRUE;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	virtual bool onOK()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		char str[MAX_PATH];
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_DLLDIR, WM_GETTEXT, sizeof(str)-1, (LPARAM)str );
5128eecc9f 2011-02-23        kinaba: 		cfg->InstallTo=str, cfg->InstallTo.beBackSlash( true );
5128eecc9f 2011-02-23        kinaba: 		for(int i=0; i<=2; ++i)
5128eecc9f 2011-02-23        kinaba: 			if( BST_CHECKED == sendMsgToItem( IDC_CONNECTTO1+i, BM_GETCHECK ) )
5128eecc9f 2011-02-23        kinaba: 				cfg->CheckServer = i;
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	virtual bool onCancel()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		return cancelShiteIidesuka();
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	class detailDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 	public:
5128eecc9f 2011-02-23        kinaba: 		detailDlg() : kiDialog( IDD_DETAIL ) {}
5128eecc9f 2011-02-23        kinaba: 	private:
5128eecc9f 2011-02-23        kinaba: 		virtual BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			if( cfg->George )
5128eecc9f 2011-02-23        kinaba: 				sendMsgToItem( IDC_CONNECT_ALWAYS, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: 			if( cfg->ShowReadMe )
5128eecc9f 2011-02-23        kinaba: 				sendMsgToItem( IDC_SHOW_README, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: 			if( cfg->UseCustomDir )
5128eecc9f 2011-02-23        kinaba: 				sendMsgToItem( IDC_SAVE_DESTDIR, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: 			for( int i=0; i<DLLID_NUM; ++i )
5128eecc9f 2011-02-23        kinaba: 				if( cfg->DoCheck[i] )
5128eecc9f 2011-02-23        kinaba: 					sendMsgToItem( IDC_DLHA+i, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_FILERPATH, WM_SETTEXT, 0, (LPARAM)(const char*)(cfg->Filer) );
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_FILEROPT, WM_SETTEXT, 0, (LPARAM)(const char*)(cfg->F_Prefix) );
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_FILEROPT2, WM_SETTEXT, 0, (LPARAM)(const char*)(cfg->F_Suffix) );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 			return FALSE;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 		virtual BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// 指定ボタン
5128eecc9f 2011-02-23        kinaba: 			if((msg==WM_COMMAND) && (LOWORD(wp)==IDC_REF )){
5128eecc9f 2011-02-23        kinaba: 				kiSUtil::getOpenFileNameDlgOfEditBox(item(IDC_FILERPATH),hwnd());
5128eecc9f 2011-02-23        kinaba: 				return TRUE;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			return FALSE;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		virtual bool onOK()
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			cfg->George =
5128eecc9f 2011-02-23        kinaba: 				(BST_CHECKED==sendMsgToItem( IDC_CONNECT_ALWAYS, BM_GETCHECK ));
5128eecc9f 2011-02-23        kinaba: 			cfg->ShowReadMe =
5128eecc9f 2011-02-23        kinaba: 				(BST_CHECKED==sendMsgToItem( IDC_SHOW_README, BM_GETCHECK ));
5128eecc9f 2011-02-23        kinaba: 			cfg->UseCustomDir =
5128eecc9f 2011-02-23        kinaba: 				(BST_CHECKED==sendMsgToItem( IDC_SAVE_DESTDIR, BM_GETCHECK ));
5128eecc9f 2011-02-23        kinaba: 			for( int i=0; i<DLLID_NUM; ++i )
5128eecc9f 2011-02-23        kinaba: 				cfg->DoCheck[i] =
5128eecc9f 2011-02-23        kinaba: 					(BST_CHECKED==sendMsgToItem( IDC_DLHA+i, BM_GETCHECK ));
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 			char str[500];
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_FILERPATH, WM_GETTEXT, sizeof(str)-1, (LPARAM)str );
5128eecc9f 2011-02-23        kinaba: 			cfg->Filer = str;
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_FILEROPT, WM_GETTEXT, sizeof(str)-1, (LPARAM)str );
5128eecc9f 2011-02-23        kinaba: 			cfg->F_Prefix = str;
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_FILEROPT2, WM_GETTEXT, sizeof(str)-1, (LPARAM)str );
5128eecc9f 2011-02-23        kinaba: 			cfg->F_Suffix = str;
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 			return true;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	};
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	class proxyDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 	public:
5128eecc9f 2011-02-23        kinaba: 		proxyDlg() : kiDialog( IDD_PROXY ) {}
5128eecc9f 2011-02-23        kinaba: 	private:
5128eecc9f 2011-02-23        kinaba: 		virtual BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			if( cfg->ProxyPort>0 )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				sendMsgToItem( IDC_USEPROXY, BM_SETCHECK, BST_CHECKED );
5128eecc9f 2011-02-23        kinaba: 				::EnableWindow( item(IDC_HOST_N), TRUE );
5128eecc9f 2011-02-23        kinaba: 				::EnableWindow( item(IDC_PORT_N), TRUE );
5128eecc9f 2011-02-23        kinaba: 				::EnableWindow( item(IDC_HOST),   TRUE );
5128eecc9f 2011-02-23        kinaba: 				::EnableWindow( item(IDC_PORT),   TRUE );
5128eecc9f 2011-02-23        kinaba: 				::SetDlgItemInt( hwnd(), IDC_PORT, cfg->ProxyPort, FALSE );
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else
5128eecc9f 2011-02-23        kinaba: 				::SetDlgItemInt( hwnd(), IDC_PORT, -cfg->ProxyPort, FALSE );
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_HOST, WM_SETTEXT, 0, (LPARAM)(const char*)cfg->ProxyServer );
5128eecc9f 2011-02-23        kinaba: 			return FALSE;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		virtual BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			if((msg==WM_COMMAND) && (LOWORD(wp)==IDC_USEPROXY)){
5128eecc9f 2011-02-23        kinaba: 					BOOL x = ( BST_CHECKED==sendMsgToItem( IDC_USEPROXY, BM_GETCHECK ) );
5128eecc9f 2011-02-23        kinaba: 					::EnableWindow( item(IDC_HOST_N), x );
5128eecc9f 2011-02-23        kinaba: 					::EnableWindow( item(IDC_PORT_N), x );
5128eecc9f 2011-02-23        kinaba: 					::EnableWindow( item(IDC_HOST),   x );
5128eecc9f 2011-02-23        kinaba: 					::EnableWindow( item(IDC_PORT),   x );
5128eecc9f 2011-02-23        kinaba: 					return TRUE;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			return FALSE;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		virtual bool onOK()
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			char str[500];
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_HOST, WM_GETTEXT, sizeof(str)-1, (LPARAM)str );
5128eecc9f 2011-02-23        kinaba: 			cfg->ProxyServer = str;
5128eecc9f 2011-02-23        kinaba: 			cfg->ProxyPort = ::GetDlgItemInt( hwnd(), IDC_PORT, NULL, FALSE );
5128eecc9f 2011-02-23        kinaba: 			if( BST_CHECKED!=sendMsgToItem( IDC_USEPROXY, BM_GETCHECK ) )
5128eecc9f 2011-02-23        kinaba: 				cfg->ProxyPort *= -1;
5128eecc9f 2011-02-23        kinaba: 			return true;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	};
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // mirrorMan : バージョンチェック先サーバ情報管理
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class mirrorInfo
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	enum { MAD, CSD, WAK, SERVER_NUM };
5128eecc9f 2011-02-23        kinaba: 	static const char* c_serv[SERVER_NUM];
5128eecc9f 2011-02-23        kinaba: 	static const char* c_path[SERVER_NUM];
5128eecc9f 2011-02-23        kinaba: 	static const char* c_nick[SERVER_NUM];
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	int mirrors[SERVER_NUM+1];
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	mirrorInfo()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		for(int i=0; i!=SERVER_NUM+1; ++i)
5128eecc9f 2011-02-23        kinaba: 			mirrors[i] = -1;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// どのサーバを先に見に行くか選択。
5128eecc9f 2011-02-23        kinaba: 	void setPreferedServer( int p )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		switch( p )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 		default:
5128eecc9f 2011-02-23        kinaba: 		case MAD:
5128eecc9f 2011-02-23        kinaba: 			mirrors[0] = MAD;
5128eecc9f 2011-02-23        kinaba: 			mirrors[1] = CSD;
5128eecc9f 2011-02-23        kinaba: 			mirrors[2] = WAK;
5128eecc9f 2011-02-23        kinaba: 			break;
5128eecc9f 2011-02-23        kinaba: 		case CSD:
5128eecc9f 2011-02-23        kinaba: 			mirrors[0] = CSD;
5128eecc9f 2011-02-23        kinaba: 			mirrors[1] = MAD;
5128eecc9f 2011-02-23        kinaba: 			mirrors[2] = WAK;
5128eecc9f 2011-02-23        kinaba: 			break;
5128eecc9f 2011-02-23        kinaba: 		case WAK:
5128eecc9f 2011-02-23        kinaba: 			mirrors[0] = WAK;
5128eecc9f 2011-02-23        kinaba: 			mirrors[1] = MAD;
5128eecc9f 2011-02-23        kinaba: 			mirrors[2] = CSD;
5128eecc9f 2011-02-23        kinaba: 			break;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// m番目のミラーサーバがDownしてるっぽい場合、候補から消去
5128eecc9f 2011-02-23        kinaba: 	void server_is_down( int m )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		for(int i=m; i!=SERVER_NUM; ++i)
5128eecc9f 2011-02-23        kinaba: 			mirrors[i] = mirrors[i+1];
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// t番目のミラーサーバの情報を取得
5128eecc9f 2011-02-23        kinaba: 	bool isMirrorLeft( int m ) const { return mirrors[m] >= 0; }
5128eecc9f 2011-02-23        kinaba: 	kiStr serverName ( int m ) const { return c_serv[mirrors[m]]; }
5128eecc9f 2011-02-23        kinaba: 	kiStr basePath   ( int m ) const { return c_path[mirrors[m]]; }
5128eecc9f 2011-02-23        kinaba: 	kiStr nickname   ( int m ) const { return c_nick[mirrors[m]]; }
5128eecc9f 2011-02-23        kinaba: 	kiStr baseURL    ( int m ) const {
5128eecc9f 2011-02-23        kinaba: 		return (kiStr("http://")+=c_serv[mirrors[m]])+=c_path[mirrors[m]];
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // static constants
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: const char* mirrorInfo::c_serv[mirrorInfo::SERVER_NUM] = {
5128eecc9f 2011-02-23        kinaba: 	"www.madobe.net",
5128eecc9f 2011-02-23        kinaba: 	"www.csdinc.co.jp",
5128eecc9f 2011-02-23        kinaba: 	"archiver.wakusei.ne.jp",
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: const char* mirrorInfo::c_path[mirrorInfo::SERVER_NUM] = {
5128eecc9f 2011-02-23        kinaba: 	"/archiver/lib/",
5128eecc9f 2011-02-23        kinaba: 	"/archiver/lib/",
5128eecc9f 2011-02-23        kinaba: 	"/lib/",
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: const char* mirrorInfo::c_nick[mirrorInfo::SERVER_NUM] = {
5128eecc9f 2011-02-23        kinaba: 	"Madobe",
5128eecc9f 2011-02-23        kinaba: 	"CSD",
5128eecc9f 2011-02-23        kinaba: 	"Wakusei",
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: static mirrorInfo mirrorMan;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // verDlg : 接続して実際のバージョンチェックを行う
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class verDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	verDlg( HINTERNET hi )
5128eecc9f 2011-02-23        kinaba: 		: kiDialog( IDD_VERCHECK ), h(hi), ss(NULL), http(NULL) {}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	~verDlg()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		if( ss )
5128eecc9f 2011-02-23        kinaba: 			::InternetCloseHandle( ss );
5128eecc9f 2011-02-23        kinaba: 		if( http )
5128eecc9f 2011-02-23        kinaba: 			::InternetCloseHandle( http );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	HANDLE        hT;
5128eecc9f 2011-02-23        kinaba: 	HINTERNET     h, http, ss;
5128eecc9f 2011-02-23        kinaba: 	volatile bool m_endFlag;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		app()->setMainWnd( this );
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_BAR, PBM_SETSTEP, 1 );
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_BAR, PBM_SETRANGE, 0, MAKELPARAM(0,cfg->List.len()*3) );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		m_endFlag = false;
5128eecc9f 2011-02-23        kinaba: 		DWORD id;
5128eecc9f 2011-02-23        kinaba: 		if( !(hT = ::CreateThread( NULL, 0, threadEntry, this, 0, &id )) )
5128eecc9f 2011-02-23        kinaba: 			end( IDCANCEL );
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	bool onCancel()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		m_endFlag = true;
5128eecc9f 2011-02-23        kinaba: 		DWORD ex;
5128eecc9f 2011-02-23        kinaba: 		while( ::GetExitCodeThread( hT, &ex ) && ex==STILL_ACTIVE )
5128eecc9f 2011-02-23        kinaba: 			::Sleep(0);
5128eecc9f 2011-02-23        kinaba: 		::CloseHandle( hT );
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	static DWORD WINAPI threadEntry( void* prm )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		((verDlg*)prm)->threadWorker();
5128eecc9f 2011-02-23        kinaba: 		return 0;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 作業用マクロ
5128eecc9f 2011-02-23        kinaba: 	#define CHECK_CANCEL()      if(m_endFlag) break
5128eecc9f 2011-02-23        kinaba: 	#define STEP_GRAPH()	    CHECK_CANCEL(); sendMsgToItem( IDC_BAR, PBM_STEPIT )
5128eecc9f 2011-02-23        kinaba: 	#define RETRY_()            ::InternetCloseHandle( http ); http=NULL; goto retry;
5128eecc9f 2011-02-23        kinaba: 	#define RETRY_error()       do{ ++Mir; RETRY_() }while(0)
5128eecc9f 2011-02-23        kinaba: 	#define RETRY_serverdown()  do{ mirrorMan.server_is_down(Mir); RETRY_() }while(0)
5128eecc9f 2011-02-23        kinaba: 	#define INET_CONNECT( __s ) ::InternetConnect( h, __s, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 )
5128eecc9f 2011-02-23        kinaba: 	#define HTTP_REQ( __n )     ::HttpOpenRequest( http, "GET", __n, "HTTP/1.0", NULL, NULL, 0, 0 )
5128eecc9f 2011-02-23        kinaba: 	#define HTTP_SEND()         status=0,::HttpSendRequest( ss, NULL, 0, NULL, 0 ), ::HttpQueryInfoA( ss, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,&status,&size,&dw),status;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	void threadWorker()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// 作業変数
5128eecc9f 2011-02-23        kinaba: 		DWORD dw = 0, size = sizeof(DWORD), status;
5128eecc9f 2011-02-23        kinaba: 		kiStr name;
5128eecc9f 2011-02-23        kinaba: 		char buf[4000];
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// メインループ
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i<cfg->List.len(); ++i )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			if( !mirrorMan.isMirrorLeft(0) )
5128eecc9f 2011-02-23        kinaba: 				break; // どのサーバにも繋げない場合、終了
5128eecc9f 2011-02-23        kinaba: 			STEP_GRAPH();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			// 未接続ならサーバへ繋ぐ
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			int Mir = 0;
5128eecc9f 2011-02-23        kinaba: 		retry:
5128eecc9f 2011-02-23        kinaba: 			if( !http )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				if( !mirrorMan.isMirrorLeft(Mir) )
5128eecc9f 2011-02-23        kinaba: 					continue; // このDLLの情報取得は無理でした
5128eecc9f 2011-02-23        kinaba: 				http = INET_CONNECT( mirrorMan.serverName(Mir) );
5128eecc9f 2011-02-23        kinaba: 				if( !http )
5128eecc9f 2011-02-23        kinaba: 					RETRY_serverdown(); // 次のミラーを試す
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			// HTTPリクエスト作成
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			name = mirrorMan.basePath(Mir);
5128eecc9f 2011-02-23        kinaba: 			name+= cfg->List[i]->htmlName();
5128eecc9f 2011-02-23        kinaba: 			ss   = HTTP_REQ( name );
5128eecc9f 2011-02-23        kinaba: 			if( !ss )
5128eecc9f 2011-02-23        kinaba: 				RETRY_serverdown();
5128eecc9f 2011-02-23        kinaba: 			CHECK_CANCEL();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			// HTTPリクエスト送信
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			bool succeeded = false;
5128eecc9f 2011-02-23        kinaba: 			int try_auth = 3;
5128eecc9f 2011-02-23        kinaba: 			while( !succeeded && (try_auth-->0) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				status = HTTP_SEND();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 				if( status/100 == 2 )  // 200など。成功
5128eecc9f 2011-02-23        kinaba: 				{
5128eecc9f 2011-02-23        kinaba: 					succeeded = true;
5128eecc9f 2011-02-23        kinaba: 					break;
5128eecc9f 2011-02-23        kinaba: 				}
5128eecc9f 2011-02-23        kinaba: 				else if( status == 0 ) // タイムアウト。別サーバをtry
5128eecc9f 2011-02-23        kinaba: 				{
5128eecc9f 2011-02-23        kinaba: 					::InternetCloseHandle( ss );
5128eecc9f 2011-02-23        kinaba: 					RETRY_serverdown();
5128eecc9f 2011-02-23        kinaba: 				}
5128eecc9f 2011-02-23        kinaba: 				else if( status == 407 ) // 407 Proxy Authentication Required
5128eecc9f 2011-02-23        kinaba: 				{
5128eecc9f 2011-02-23        kinaba: 					// パスワードを打たせてもう一度
5128eecc9f 2011-02-23        kinaba: 					DWORD dwRet = ::InternetErrorDlg(
5128eecc9f 2011-02-23        kinaba: 						hwnd(), ss, GetLastError(),
5128eecc9f 2011-02-23        kinaba: 						FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
5128eecc9f 2011-02-23        kinaba: 						FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS |
5128eecc9f 2011-02-23        kinaba: 						FLAGS_ERROR_UI_FLAGS_GENERATE_DATA,
5128eecc9f 2011-02-23        kinaba: 						NULL );
5128eecc9f 2011-02-23        kinaba: 					// 認証失敗したら終了
5128eecc9f 2011-02-23        kinaba: 					if( dwRet != ERROR_INTERNET_FORCE_RETRY )
5128eecc9f 2011-02-23        kinaba: 					{
5128eecc9f 2011-02-23        kinaba: 						::InternetCloseHandle( ss );
5128eecc9f 2011-02-23        kinaba: 						end( IDOK ); return;
5128eecc9f 2011-02-23        kinaba: 					}
5128eecc9f 2011-02-23        kinaba: 					continue;
5128eecc9f 2011-02-23        kinaba: 				}
5128eecc9f 2011-02-23        kinaba: 				else // その他のエラー。あきらめて次のDLLに進む
5128eecc9f 2011-02-23        kinaba: 				{
5128eecc9f 2011-02-23        kinaba: 					::InternetCloseHandle( ss );
5128eecc9f 2011-02-23        kinaba: 					break;
5128eecc9f 2011-02-23        kinaba: 				}
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			// 読込
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			STEP_GRAPH();
5128eecc9f 2011-02-23        kinaba: 			if( succeeded )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				DWORD read;
5128eecc9f 2011-02-23        kinaba: 				::InternetReadFile( ss, buf, sizeof(buf)-1, &read );
5128eecc9f 2011-02-23        kinaba: 				::InternetCloseHandle( ss );
5128eecc9f 2011-02-23        kinaba: 				buf[ read ] = '\0';
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			// 解析
5128eecc9f 2011-02-23        kinaba: 			//
5128eecc9f 2011-02-23        kinaba: 			STEP_GRAPH();
5128eecc9f 2011-02-23        kinaba: 			if( succeeded )
5128eecc9f 2011-02-23        kinaba: 				cfg->List[i]->ParseHTML( buf );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( !m_endFlag )
5128eecc9f 2011-02-23        kinaba: 			end( IDOK );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // dllDlg: ダウンロードするDLLの選択
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class dllDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	dllDlg( kiArray<DLLInfo*>& upd ) : kiDialog( IDD_CUSTOM2 ), m_upd(upd) {}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	kiArray<DLLInfo*>& m_upd;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		app()->setMainWnd( this );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		SHFILEINFO fi;
5128eecc9f 2011-02-23        kinaba: 		HIMAGELIST hI = (HIMAGELIST)::SHGetFileInfo(
5128eecc9f 2011-02-23        kinaba: 			kiPath(kiPath::Sys)+="KERNEL32.DLL", 0, &fi, sizeof(fi),
5128eecc9f 2011-02-23        kinaba: 			SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON );
5128eecc9f 2011-02-23        kinaba: 		int iDLL = fi.iIcon;
5128eecc9f 2011-02-23        kinaba: 		int iEXE = kiSUtil::getSysIcon( "exe" );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		kiStr str;
5128eecc9f 2011-02-23        kinaba: 		kiListView list( this, IDC_UPDATELIST );
5128eecc9f 2011-02-23        kinaba: 		list.setImageList( NULL, hI );
5128eecc9f 2011-02-23        kinaba: 		list.insertColumn( 0, str.loadRsrc( IDS_LV_DLLNAME ), 120 );
5128eecc9f 2011-02-23        kinaba: 		list.insertColumn( 1, str.loadRsrc( IDS_LV_STATE ), 110 );
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i<m_upd.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			list.insertItem( i, m_upd[i]->getName(), 0, strcmpi( "dll", kiPath::ext(m_upd[i]->getName()) ) ? iEXE : iDLL );
5128eecc9f 2011-02-23        kinaba: 			list.setSubItem( i, 1, m_upd[i]->getState() );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_UPDATELIST,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_CHECKBOXES,LVS_EX_CHECKBOXES );
5128eecc9f 2011-02-23        kinaba: 		for( i=0; i!=m_upd.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 			ListView_SetCheckState( item(IDC_UPDATELIST), i, TRUE );
5128eecc9f 2011-02-23        kinaba: 		for( int j=0; j!=3; j++ )
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_INSTMODE1+j,BM_SETCHECK,j==cfg->InstMode ? BST_CHECKED : BST_UNCHECKED );
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	bool onCancel()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		if( !cancelShiteIidesuka() )
5128eecc9f 2011-02-23        kinaba: 			return false;
5128eecc9f 2011-02-23        kinaba: 		kiListView( this, IDC_UPDATELIST ).setImageList( NULL, NULL );
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	bool onOK()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i!=3; i++ )
5128eecc9f 2011-02-23        kinaba: 			if( BST_CHECKED == sendMsgToItem( IDC_INSTMODE1+i, BM_GETCHECK ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				cfg->InstMode = i;
5128eecc9f 2011-02-23        kinaba: 				break;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		kiArray<DLLInfo*> res;
5128eecc9f 2011-02-23        kinaba: 		res = m_upd, m_upd.empty();
5128eecc9f 2011-02-23        kinaba: 		for( i=0; i<res.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 			if( ListView_GetCheckState( item(IDC_UPDATELIST), i ) )
5128eecc9f 2011-02-23        kinaba: 				m_upd.add( res[i] );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		kiListView( this, IDC_UPDATELIST ).setImageList( NULL, NULL );
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // downloadDlg : ダウンロード
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class downloadDlg : public kiDialog, IBindStatusCallback
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	downloadDlg( const kiArray<DLLInfo*>& lst, const kiPath& pth )
5128eecc9f 2011-02-23        kinaba: 		: kiDialog( IDD_VERCHECK ), m_lst( lst ), m_pth( pth ), m_cRef( 1 ){}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	const kiArray<DLLInfo*>& m_lst;
5128eecc9f 2011-02-23        kinaba: 	const kiPath& m_pth;
5128eecc9f 2011-02-23        kinaba: 	unsigned long m_cRef;
5128eecc9f 2011-02-23        kinaba: 	unsigned long m_total;
5128eecc9f 2011-02-23        kinaba: 	unsigned long m_step;
5128eecc9f 2011-02-23        kinaba: 	unsigned long m_startTime, m_lastTime;
5128eecc9f 2011-02-23        kinaba: 	bool m_stateCancel;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		app()->setMainWnd( this );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		m_startTime = m_lastTime = ::GetTickCount();
5128eecc9f 2011-02-23        kinaba: 		m_stateCancel = false;
5128eecc9f 2011-02-23        kinaba: 		m_step = m_total = 0;
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i<m_lst.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 			m_total += m_lst[i]->getSize();
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_BAR, PBM_SETRANGE,0, MAKELPARAM(0,32768) );
5128eecc9f 2011-02-23        kinaba: 		setTimeInfo( 0 );
5128eecc9f 2011-02-23        kinaba: 		::ShowWindow( hwnd(), SW_SHOW );
5128eecc9f 2011-02-23        kinaba: 		::UpdateWindow( hwnd() );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		kiPath url, fil;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// メインループ
5128eecc9f 2011-02-23        kinaba: 		for( i=0; i<m_lst.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			int Mir = 0;
5128eecc9f 2011-02-23        kinaba: 		retry:
5128eecc9f 2011-02-23        kinaba: 			if( !mirrorMan.isMirrorLeft(Mir) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				app()->msgBox( kiStr(1000).loadRsrc( IDS_DLERROR ), "caldix", MB_ICONINFORMATION|MB_SYSTEMMODAL );
5128eecc9f 2011-02-23        kinaba: 				break;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			// "○○をダウンロード中..." のテキストを更新
5128eecc9f 2011-02-23        kinaba: 			char msg[300];
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( msg, kiStr().loadRsrc(IDS_DOWNLOADING),
5128eecc9f 2011-02-23        kinaba: 						(const char*)m_lst[i]->getName(), (const char*)mirrorMan.nickname(Mir) );
5128eecc9f 2011-02-23        kinaba: 			sendMsgToItem( IDC_MSG, WM_SETTEXT, 0, (LPARAM)msg );
5128eecc9f 2011-02-23        kinaba: 			::EnableWindow( item(IDC_MSG), FALSE );
5128eecc9f 2011-02-23        kinaba: 			::EnableWindow( item(IDC_MSG), TRUE );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			// ダウンロード元とダウンロード先
5128eecc9f 2011-02-23        kinaba: 			url = mirrorMan.baseURL(Mir), url += m_lst[i]->getArchiveName();
5128eecc9f 2011-02-23        kinaba: 			fil = m_pth,                  fil += m_lst[i]->getArchiveName();
5128eecc9f 2011-02-23        kinaba: 			if( S_OK != ::URLDownloadToFile( NULL, url, fil, 0, this ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				++Mir;
5128eecc9f 2011-02-23        kinaba: 				goto retry;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			m_step += m_lst[i]->getSize();
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		end( i==m_lst.len() ? IDOK : IDCANCEL );
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	bool onCancel()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		if( cancelShiteIidesuka() )
5128eecc9f 2011-02-23        kinaba: 			m_stateCancel = true;
5128eecc9f 2011-02-23        kinaba: 		return false;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	void setTimeInfo( unsigned long bytesread )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		int sec = (bytesread==0 || m_lastTime==m_startTime)
5128eecc9f 2011-02-23        kinaba: 		  ? (int)((double)(m_total) / 7000)
5128eecc9f 2011-02-23        kinaba: 		  : (int)((double)((m_total-bytesread)) * (m_lastTime - m_startTime) / 1000 / bytesread);
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		static char str[300];
5128eecc9f 2011-02-23        kinaba: 		::wsprintf( str, (const char*)(kiStr().loadRsrc(IDS_REST)),
5128eecc9f 2011-02-23        kinaba: 			(m_total-bytesread)/1000, sec/60, sec%60 );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_RESTTIME, WM_SETTEXT, 0, (LPARAM)str );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) AddRef()	{ return (++m_cRef); }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) Release()	{ return (m_cRef ? --m_cRef : 0L); }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP GetBindInfo( DWORD*, BINDINFO* ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP GetPriority( LONG* ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP OnLowResource( DWORD ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP OnDataAvailable( DWORD, DWORD, FORMATETC*, STGMEDIUM* ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP OnObjectAvailable( REFIID, IUnknown* ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP OnStartBinding( DWORD, IBinding* ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP OnStopBinding( HRESULT, LPCWSTR ) { return E_NOTIMPL; }
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		*ppv = NULL;
5128eecc9f 2011-02-23        kinaba: 		AddRef();
5128eecc9f 2011-02-23        kinaba: 		if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IBindStatusCallback ) )
5128eecc9f 2011-02-23        kinaba: 			*ppv = (IBindStatusCallback*)this;
5128eecc9f 2011-02-23        kinaba: 		else
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			Release();
5128eecc9f 2011-02-23        kinaba: 			return E_NOINTERFACE;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		return NOERROR;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 	STDMETHODIMP OnProgress( ULONG cur, ULONG max, ULONG status, LPCWSTR txt )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		msgLoop( PEEK );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( m_stateCancel )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			end( IDCANCEL );
5128eecc9f 2011-02-23        kinaba: 			return E_ABORT;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		DWORD time = ::GetTickCount();
5128eecc9f 2011-02-23        kinaba: 		if( time-m_lastTime >= 5000 )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			m_lastTime = time;
5128eecc9f 2011-02-23        kinaba: 			setTimeInfo( m_step+cur );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		sendMsgToItem( IDC_BAR, PBM_SETPOS, (int)(((double)(m_step+cur))/m_total*32768) );
5128eecc9f 2011-02-23        kinaba: 		return S_OK;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // instDlg : system等へインストール
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class instDlg : public kiDialog
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	instDlg( kiArray<DLLInfo*>& upd, const kiPath& arcdir, const kiPath& work, const kiPath& to )
5128eecc9f 2011-02-23        kinaba: 		: kiDialog( IDD_INSTALL ), m_upd( upd ), m_arcdir( arcdir ), m_workdir( work ), m_dlldir( to ) {}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	kiArray<DLLInfo*>& m_upd;
5128eecc9f 2011-02-23        kinaba: 	const kiPath& m_arcdir;
5128eecc9f 2011-02-23        kinaba: 	const kiPath& m_workdir;
5128eecc9f 2011-02-23        kinaba: 	const kiPath& m_dlldir;
5128eecc9f 2011-02-23        kinaba: 	bool onCancel()	{ return false; }
5128eecc9f 2011-02-23        kinaba: 	bool onOK()		{ return false; }
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	BOOL onInit()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		bool needreboot=false;
5128eecc9f 2011-02-23        kinaba: 		app()->setMainWnd( this );
5128eecc9f 2011-02-23        kinaba: 		::ShowWindow( hwnd(), SW_SHOW );
5128eecc9f 2011-02-23        kinaba: 		::UpdateWindow( hwnd() );
5128eecc9f 2011-02-23        kinaba: 		//-- 解凍&インストール開始〜 ---------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		char tmp[MAX_PATH];
5128eecc9f 2011-02-23        kinaba: 		kiPath arc, dll, path;
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i<m_upd.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// 書庫名:フルパス
5128eecc9f 2011-02-23        kinaba: 			arc = m_arcdir, arc += m_upd[i]->getArchiveName();
5128eecc9f 2011-02-23        kinaba: 			// ドキュメント保存先:フルパス
5128eecc9f 2011-02-23        kinaba: 			dll = m_workdir, ::lstrcpyn(tmp,m_upd[i]->getName(),m_upd[i]->getName().len()-3), dll += tmp, dll.remove();
5128eecc9f 2011-02-23        kinaba: 			dll += "\\", dll.mkdir(), ::SetCurrentDirectory( dll );
5128eecc9f 2011-02-23        kinaba: 			// 解凍( path=書庫内のDLLの相対パス )
5128eecc9f 2011-02-23        kinaba: 			melt_it( arc, m_upd[i]->getName(), path );
5128eecc9f 2011-02-23        kinaba: 			// インストール
5128eecc9f 2011-02-23        kinaba: 			if( !install_it( dll, path ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				needreboot = true;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			if( path.isSame( "aish32.dll" ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				if( !install_it( dll, "Aishmv32.dll" ) )
5128eecc9f 2011-02-23        kinaba: 					needreboot = true;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else if( path.isSame( "unrar32.dll" ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				if( !install_it( dll, "unrar.dll" ) )
5128eecc9f 2011-02-23        kinaba: 					needreboot = true;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else if( path.isSame( "yz1.dll" ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				if( !install_it( dll, "yzdec.exe" ) )
5128eecc9f 2011-02-23        kinaba: 					needreboot = true;
5128eecc9f 2011-02-23        kinaba: 				kiPath uyz( m_dlldir );
5128eecc9f 2011-02-23        kinaba: 				if( !kiSUtil::exist( uyz+="UnYz1.dll" ) )
5128eecc9f 2011-02-23        kinaba: 					if( !install_it( dll, "UnYz1.dll" ) )
5128eecc9f 2011-02-23        kinaba: 						needreboot = true;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			else if( path.isSame( "bh32.dll" ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				if( !install_it( dll, "bhsfx.exe" ) )
5128eecc9f 2011-02-23        kinaba: 					needreboot = true;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			// メッセージ処理
5128eecc9f 2011-02-23        kinaba: 			msg();
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		//-- 解凍&インストール終了〜 ---------------
5128eecc9f 2011-02-23        kinaba: 		end( needreboot ? IDCANCEL : IDOK );
5128eecc9f 2011-02-23        kinaba: 		return FALSE;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private:
5128eecc9f 2011-02-23        kinaba: 	bool install_it( const char* position, const char* relpath )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		kiPath from( position ); from += relpath;
5128eecc9f 2011-02-23        kinaba: 		if( ::GetFileAttributes(from) != 0xffffffff )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			kiPath to( m_dlldir ); to += kiPath::name(relpath);
5128eecc9f 2011-02-23        kinaba: 			if( ::CopyFile( from, to, FALSE ) )
5128eecc9f 2011-02-23        kinaba: 				::DeleteFile( from );
5128eecc9f 2011-02-23        kinaba: 			else
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				// 再起動後コピー準備
5128eecc9f 2011-02-23        kinaba: 				move_later( from, to );
5128eecc9f 2011-02-23        kinaba: 				return false;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		return true;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: // caldix : メインルーチン
5128eecc9f 2011-02-23        kinaba: //----------------------------------------------------------------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: #include <ras.h>
5128eecc9f 2011-02-23        kinaba: #include <raserror.h>
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class caldix : public kiApp
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	caldix()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		shellInit();
5128eecc9f 2011-02-23        kinaba: 		kiutil::pathInit();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		cfg = new CldxConfig;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	void run( kiCmdParser& cmd )
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// ダイアログ [全自動/カスタム]
5128eecc9f 2011-02-23        kinaba: 		if( !cfg->SuperAutoMode && !show( startDlg() ) )
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( cfg->AutoMode )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// 全自動なら、インストール先をシステムにするかもしれない
5128eecc9f 2011-02-23        kinaba: 			if( !cfg->UseCustomDir )
5128eecc9f 2011-02-23        kinaba: 				cfg->InstallTo.beSpecialPath( kiPath::Sys );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		else
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// ダイアログ [インストール先とか]
5128eecc9f 2011-02-23        kinaba: 			if( !show( customDlg() ) )
5128eecc9f 2011-02-23        kinaba: 				return;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 設定の調整
5128eecc9f 2011-02-23        kinaba: 		cfg->InstallTo.beBackSlash( true );
5128eecc9f 2011-02-23        kinaba: 		cfg->GenerateDLLList();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 常時接続モードでない場合、接続を確立
5128eecc9f 2011-02-23        kinaba: 		if( !cfg->George )
5128eecc9f 2011-02-23        kinaba: 			if( ERROR_SUCCESS != ::InternetAttemptConnect(0) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				msgBox( kiStr().loadRsrc( IDS_NOINTERNET ) );
5128eecc9f 2011-02-23        kinaba: 				return;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// WinInet開始…
5128eecc9f 2011-02-23        kinaba: 		HINTERNET h = ::InternetOpen( cfg->UA, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
5128eecc9f 2011-02-23        kinaba: 		if( !h )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			msgBox( kiStr().loadRsrc( IDS_NOINTERNET ) );
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// プロクシの設定
5128eecc9f 2011-02-23        kinaba: 		if( cfg->ProxyServer.len() && cfg->ProxyPort>0 )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			kiStr pr( "http=http://" );
5128eecc9f 2011-02-23        kinaba: 			pr += cfg->ProxyServer;
5128eecc9f 2011-02-23        kinaba: 			pr += ':';
5128eecc9f 2011-02-23        kinaba: 			pr += kiStr().setInt(cfg->ProxyPort);
5128eecc9f 2011-02-23        kinaba: 			INTERNET_PROXY_INFO pi = {INTERNET_OPEN_TYPE_PROXY,(const char*)pr,"<local>"};
5128eecc9f 2011-02-23        kinaba: 			::InternetSetOption(  h, INTERNET_OPTION_PROXY, (void*)&pi, sizeof(pi) );
5128eecc9f 2011-02-23        kinaba: 			::UrlMkSetSessionOption( INTERNET_OPTION_PROXY, (void*)&pi, sizeof(pi), 0 );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// タイムアウトは5秒
5128eecc9f 2011-02-23        kinaba: 		DWORD TimeOut = 5*1000;
5128eecc9f 2011-02-23        kinaba: 		::InternetSetOption( h, INTERNET_OPTION_RECEIVE_TIMEOUT, &TimeOut, sizeof(TimeOut) );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 接続先サーバ情報を設定から取得
5128eecc9f 2011-02-23        kinaba: 		mirrorMan.setPreferedServer( cfg->CheckServer );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// ダイアログ [WWWC META CHECK]
5128eecc9f 2011-02-23        kinaba: 		if( !show( verDlg(h) ) )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			::InternetCloseHandle( h );
5128eecc9f 2011-02-23        kinaba: 			askRasHangUp();
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// バージョン比較
5128eecc9f 2011-02-23        kinaba: 		kiStr tmp;
5128eecc9f 2011-02-23        kinaba: 		kiArray<DLLInfo*> upd;
5128eecc9f 2011-02-23        kinaba: 		for( unsigned int i=0; i<cfg->List.len(); ++i )
5128eecc9f 2011-02-23        kinaba: 			if( cfg->List[i]->needToUpdate( cfg->InstallTo ) )
5128eecc9f 2011-02-23        kinaba: 				upd.add( cfg->List[i] );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( upd.len()==0 )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			::InternetCloseHandle( h );
5128eecc9f 2011-02-23        kinaba: 			msgBox( kiStr().loadRsrc( IDS_NONEED ), "caldix", MB_ICONINFORMATION );
5128eecc9f 2011-02-23        kinaba: 			askRasHangUp();
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( ! cfg->AutoMode )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// ダイアログ [インストールするDLLとか]
5128eecc9f 2011-02-23        kinaba: 			if( !show(dllDlg(upd)) || upd.len()==0 )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				::InternetCloseHandle( h );
5128eecc9f 2011-02-23        kinaba: 				askRasHangUp();
5128eecc9f 2011-02-23        kinaba: 				return;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// ダウンロード
5128eecc9f 2011-02-23        kinaba: 		char buf[MAX_PATH];
5128eecc9f 2011-02-23        kinaba: 		::GetTempFileName( kiPath( kiPath::Tmp ), "cld", 0, buf );
5128eecc9f 2011-02-23        kinaba: 		::DeleteFile( buf );
5128eecc9f 2011-02-23        kinaba: 		kiPath dlto( buf );
5128eecc9f 2011-02-23        kinaba: 		dlto.beBackSlash( true );
5128eecc9f 2011-02-23        kinaba: 		dlto.mkdir();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( !show( downloadDlg(upd, dlto) ) )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			dlto.remove();
5128eecc9f 2011-02-23        kinaba: 			::InternetCloseHandle( h );
5128eecc9f 2011-02-23        kinaba: 			askRasHangUp();
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// インストール準備
5128eecc9f 2011-02-23        kinaba: 		bool needreboot = false;
5128eecc9f 2011-02-23        kinaba: 		cfg->InstallTo.mkdir();
5128eecc9f 2011-02-23        kinaba: 		kiPath workDir( kiPath::Exe ); workDir.lower();
5128eecc9f 2011-02-23        kinaba: 		UINT drv = workDir.getDriveType();
5128eecc9f 2011-02-23        kinaba: 		if( strstr(workDir,"temporary internet files")!=NULL
5128eecc9f 2011-02-23        kinaba: 		 || (drv!=DRIVE_FIXED && drv!=DRIVE_REMOTE && drv!=DRIVE_UNKNOWN) )
5128eecc9f 2011-02-23        kinaba: 			workDir.beSpecialPath( kiPath::Dsk ), workDir.beBackSlash( true );
5128eecc9f 2011-02-23        kinaba: 		workDir += "cldx\\";
5128eecc9f 2011-02-23        kinaba: 		workDir.mkdir();
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( cfg->InstMode != 1 )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// 書庫コピー
5128eecc9f 2011-02-23        kinaba: 			kiPath from, to;
5128eecc9f 2011-02-23        kinaba: 			for( unsigned int i=0; i<upd.len(); i++ )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				from = dlto, from += upd[i]->getArchiveName();
5128eecc9f 2011-02-23        kinaba: 				to = workDir,  to += upd[i]->getArchiveName();
5128eecc9f 2011-02-23        kinaba: 				::CopyFile( from, to, FALSE );
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		if( cfg->InstMode != 0 )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			// インストール
5128eecc9f 2011-02-23        kinaba: 			if( !show( instDlg( upd, dlto, workDir, cfg->InstallTo ) ) )
5128eecc9f 2011-02-23        kinaba: 				needreboot = true;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 閉じ処理
5128eecc9f 2011-02-23        kinaba: 		dlto.remove();
5128eecc9f 2011-02-23        kinaba: 		::InternetCloseHandle( h );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( !needreboot )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			if( ! cfg->SuperAutoMode )
5128eecc9f 2011-02-23        kinaba: 				msgBox( kiStr(500).loadRsrc( IDS_FINISHED ), "caldix", MB_ICONINFORMATION|MB_SYSTEMMODAL );
5128eecc9f 2011-02-23        kinaba: 			askRasHangUp();
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		else
5128eecc9f 2011-02-23        kinaba: 			if( IDYES!=msgBox( kiStr(1000).loadRsrc( IDS_REBOOT ), "caldix", MB_ICONINFORMATION|MB_YESNO|MB_SYSTEMMODAL ) )
5128eecc9f 2011-02-23        kinaba: 				needreboot = false;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 簡易説明書出力
5128eecc9f 2011-02-23        kinaba: 		if( ::GetACP() == 932 )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			kiFile fp;
5128eecc9f 2011-02-23        kinaba: 			if( fp.open( kiPath(workDir)+="読んでね.txt", false ) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				static const char * text =
5128eecc9f 2011-02-23        kinaba: "このフォルダには、caldixでダウンロードされた\r\n"
5128eecc9f 2011-02-23        kinaba: "DLLの説明書を格納してあります。よくお読み下さい。\r\n"
5128eecc9f 2011-02-23        kinaba: "\r\n"
5128eecc9f 2011-02-23        kinaba: "★ UNZIP32.DLL を企業内等で利用する場合には、必ず\r\n"
5128eecc9f 2011-02-23        kinaba: "★ ライセンス契約が必要です。詳細は下記ページにて。\r\n"
5128eecc9f 2011-02-23        kinaba: "★ http://www.csdinc.co.jp/archiver/lib/unzip32.html\r\n"
5128eecc9f 2011-02-23        kinaba: "\r\n"
5128eecc9f 2011-02-23        kinaba: "それぞれのDLLの作者様のサイトは、\r\n"
5128eecc9f 2011-02-23        kinaba: " 『統合アーカイバプロジェクト』\r\n"
5128eecc9f 2011-02-23        kinaba: "   http://www.csdinc.co.jp/archiver/ \r\n"
5128eecc9f 2011-02-23        kinaba: "からリンクをたどって訪れることが出来ます。\r\n"
5128eecc9f 2011-02-23        kinaba: "是非一度は行ってみることをお勧めします。\r\n"
5128eecc9f 2011-02-23        kinaba: "\r\n"
5128eecc9f 2011-02-23        kinaba: "DLLのアンインストールは uncaldix が便利。\r\n"
5128eecc9f 2011-02-23        kinaba: "     http://www6.plala.or.jp/amasoft/soft/uncaldix.html\r\n"
5128eecc9f 2011-02-23        kinaba: "\r\n"
5128eecc9f 2011-02-23        kinaba: "caldixに関するご質問等は( http://www.kmonos.net/ )へ\r\n"
5128eecc9f 2011-02-23        kinaba: 				; fp.write( text, ki_strlen(text) );
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// 出力先開く
5128eecc9f 2011-02-23        kinaba: 		if( cfg->ShowReadMe )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			char cmdline[1000];
5128eecc9f 2011-02-23        kinaba: // コメントアウトcaldixF
5128eecc9f 2011-02-23        kinaba: /*
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( cmdline, "explorer \"%s\"", (const char*)workDir );
5128eecc9f 2011-02-23        kinaba: 			::WinExec( cmdline, SW_SHOWDEFAULT );
5128eecc9f 2011-02-23        kinaba: */
5128eecc9f 2011-02-23        kinaba: // コメントアウトここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 挿入caldixF
5128eecc9f 2011-02-23        kinaba: 			char wdir[MAX_PATH*3];
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			// caldixのパスを取得
5128eecc9f 2011-02-23        kinaba: 			GetModuleFileName(NULL,wdir,MAX_PATH);
5128eecc9f 2011-02-23        kinaba: 			// caldix.exe→cldxにする
5128eecc9f 2011-02-23        kinaba: 			lstrcpy(GetFileName(wdir),"cldx");
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			// prefixとpostfixをつける( modified by k.inaba )
5128eecc9f 2011-02-23        kinaba: 			bool bNeedQuote = false;
5128eecc9f 2011-02-23        kinaba: 			for(int i=0; i!=cfg->Filer.len(); ++i)
5128eecc9f 2011-02-23        kinaba: 				if(cfg->Filer[i]==' ') { bNeedQuote=true; break; }
5128eecc9f 2011-02-23        kinaba: 			::wsprintf( cmdline,
5128eecc9f 2011-02-23        kinaba: 				bNeedQuote ? "\"%s\" %s\"%s\"%s" : "%s %s\"%s\"%s",
5128eecc9f 2011-02-23        kinaba: 				(const char*)cfg->Filer,
5128eecc9f 2011-02-23        kinaba: 				(const char*)cfg->F_Prefix, wdir, (const char*)cfg->F_Suffix);
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			// ファイラ起動( modified by k.inaba )
5128eecc9f 2011-02-23        kinaba: 			STARTUPINFO si = {sizeof(si)};
5128eecc9f 2011-02-23        kinaba: 			PROCESS_INFORMATION pi;
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				kiPath original_cur(kiPath::Cur), sys(kiPath::Sys); // 大丈夫なはずだけど念のためのカレント移動
5128eecc9f 2011-02-23        kinaba: 				::SetCurrentDirectory(sys);
5128eecc9f 2011-02-23        kinaba: 				::CreateProcess( NULL, cmdline, NULL, NULL, FALSE, 0, NULL, wdir, &si, &pi );
5128eecc9f 2011-02-23        kinaba: 				::SetCurrentDirectory(original_cur);
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			::CloseHandle(pi.hProcess);
5128eecc9f 2011-02-23        kinaba: 			::CloseHandle(pi.hThread);
5128eecc9f 2011-02-23        kinaba: // 挿入ここまでcaldixF
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		if( needreboot )
5128eecc9f 2011-02-23        kinaba: 			rebootWindows(); // 再起動でーす
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	void askRasHangUp()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		// 訊かないモード
5128eecc9f 2011-02-23        kinaba: 		if( cfg->George )
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 		// DLL,及び必要な関数をロード
5128eecc9f 2011-02-23        kinaba: 		HINSTANCE rasdll = kiutil::safepathLoadLibrary( "RASAPI32.DLL" );
5128eecc9f 2011-02-23        kinaba: 		if( rasdll == NULL )
5128eecc9f 2011-02-23        kinaba: 			return;
5128eecc9f 2011-02-23        kinaba: 		typedef DWORD (WINAPI * rE)( LPRASCONN,LPDWORD,LPDWORD );
5128eecc9f 2011-02-23        kinaba: 		typedef DWORD (WINAPI * rH)( HRASCONN );
5128eecc9f 2011-02-23        kinaba: 		typedef BOOL  (WINAPI * rS)( HRASCONN,LPRASCONNSTATUS );
5128eecc9f 2011-02-23        kinaba: 		rE RasEnumConnections = (rE)::GetProcAddress( rasdll, "RasEnumConnectionsA" );
5128eecc9f 2011-02-23        kinaba: 		rH RasHangUp          = (rH)::GetProcAddress( rasdll, "RasHangUpA" );
5128eecc9f 2011-02-23        kinaba: 		rS RasGetConnectStatus= (rS)::GetProcAddress( rasdll, "RasGetConnectStatusA" );
5128eecc9f 2011-02-23        kinaba: 		if( RasEnumConnections!=NULL && RasHangUp!=NULL && RasGetConnectStatus!=NULL )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			RASCONN* RasConn = new RASCONN[1];
5128eecc9f 2011-02-23        kinaba: 			DWORD Num, Size = sizeof(RASCONN);
5128eecc9f 2011-02-23        kinaba: 			RasConn->dwSize = sizeof(RASCONN);
5128eecc9f 2011-02-23        kinaba: 			int Sts = RasEnumConnections( RasConn, &Size, &Num );
5128eecc9f 2011-02-23        kinaba: 			if( (Sts==ERROR_BUFFER_TOO_SMALL) || (Sts==ERROR_NOT_ENOUGH_MEMORY) )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				delete [] RasConn;
5128eecc9f 2011-02-23        kinaba: 				RasConn = new RASCONN[Size/sizeof(RASCONN)];
5128eecc9f 2011-02-23        kinaba: 				Sts = RasEnumConnections( RasConn, &Size, &Num );
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			if( Sts==0 && Num>=1 )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				// 訊く。
5128eecc9f 2011-02-23        kinaba: 				if( IDYES==msgBox( kiStr(1000).loadRsrc( IDS_RASHANGUP ), "caldix", MB_ICONINFORMATION|MB_YESNO|MB_SYSTEMMODAL ) )
5128eecc9f 2011-02-23        kinaba: 				{
5128eecc9f 2011-02-23        kinaba: 					// 切る
5128eecc9f 2011-02-23        kinaba: 					RASCONNSTATUS RasSts;
5128eecc9f 2011-02-23        kinaba: 					RasSts.dwSize = sizeof(RASCONNSTATUS);
5128eecc9f 2011-02-23        kinaba: 					for( DWORD i=0; i<Num; i++ )
5128eecc9f 2011-02-23        kinaba: 					{
5128eecc9f 2011-02-23        kinaba: 						RasHangUp( RasConn->hrasconn );
5128eecc9f 2011-02-23        kinaba: 						while( RasGetConnectStatus( RasConn->hrasconn, &RasSts ) != ERROR_INVALID_HANDLE )
5128eecc9f 2011-02-23        kinaba: 							::Sleep( 10 );
5128eecc9f 2011-02-23        kinaba: 					}
5128eecc9f 2011-02-23        kinaba: 				}
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			delete [] RasConn;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 		::FreeLibrary( rasdll );
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	~caldix()
5128eecc9f 2011-02-23        kinaba: 	{
5128eecc9f 2011-02-23        kinaba: 		delete cfg;
5128eecc9f 2011-02-23        kinaba: 	}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	friend void kilib_create_new_app();
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: void kilib_create_new_app()
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	new caldix;
5128eecc9f 2011-02-23        kinaba: }