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: }