//--------------------------------------------------------------------------- #include #pragma hdrstop #include "AutoUpdate_F.h" #include "common.h" #include "systdate.h" #include #include "Define.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "RzButton" #pragma link "RzEdit" #pragma link "RzLabel" #pragma link "RzRadChk" #pragma resource "*.dfm" TAutoUpdateForm *AutoUpdateForm; //--------------------------------------------------------------------------- __fastcall TAutoUpdateForm::TAutoUpdateForm(TComponent* Owner) : TForm(Owner) { MainPanel->Left = 0; MainPanel->Top = 0; ClientWidth = MainPanel->Width; ClientHeight = MainPanel->Height; } //--------------------------------------------------------------------------- void __fastcall TAutoUpdateForm::FormDestroy(TObject *Sender) { // } //--------------------------------------------------------------------------- //0010(2): Á¤ºñ°è¾à //0100(4): ÃֽŹöÀü //1000(8): ´Ù¸¥ ¹öÀü Á¸Àç(ÇöÀç ¹öÀü ÀÌÈÄ ¹öÀü) bool __fastcall TAutoUpdateForm::InitForm(bool bFirst) { if (bFirst) { if (!(Done_Check_AutoUpdate & 2) && due_date == 0) return false; //Á¤ºñ°è¾àÀÌ µÇ¾î ÀÖÁö ¾ÊÀ¸¸é ¸®ÅÏ if (!(Done_Check_AutoUpdate & 4)) return false; //¾÷µ¥ÀÌÆ® ¹öÀüÀÌ ¾øÀ¸¸é ¸®ÅÏ } InfoMemo->Clear(); if (Done_Check_AutoUpdate & 2 || due_date > 0) { // ¾÷µ¥ÀÌÆ® ³»¿ëÀÌ ÀÖ´ÂÁö °Ë»ç if (Done_Check_AutoUpdate & 4) { if (Language == "Korean") { InfoMemo->Lines->Add("TexStylist " + Last_Version + "ÀÇ Update ÆÄÀÏÀÌ Á¸ÀçÇÕ´Ï´Ù."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("Update¸¦ ¿øÇϽøé \"Next\" ¹öưÀ» ´©¸£½Ã±â ¹Ù¶ø´Ï´Ù."); } else { InfoMemo->Lines->Add("You have to download files for TexStylist " + Last_Version +" for updating."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("If you want to update, click \"Next\" button."); } mNextBtn->Visible = true; } else { if (Language == "Korean") { InfoMemo->Lines->Add("ÇöÀç ÃֽйöÀüÀÔ´Ï´Ù. Update ÇÏ½Ç Çʿ䰡 ¾ø½À´Ï´Ù."); } else { InfoMemo->Lines->Add("It is the last version."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("You don't have to upate the program."); } mNextBtn->Visible = false; } // ÃֽйöÀüÀÌ ÀÖÀ¸¸é È­¸é¿¡ Ç¥½Ã if (Done_Check_AutoUpdate & 8) { InfoMemo->Lines->Add("\r"); if (Language == "Korean") { InfoMemo->Lines->Add("»õ·Î¿î ¹öÀü(TexStylist " + New_Version + ")ÀÇ ÇÁ·Î±×·¥ÀÌ Ãâ½ÃµÇ¾ú½À´Ï´Ù."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("´ã´çÀÚ ¶Ç´Â (ÁÖ)¿µ¿ì¾¾¿£¾ÆÀÌ·Î ¹®ÀÇ ÇϽñ⠹ٶø´Ï´Ù."); } else { InfoMemo->Lines->Add("New program(TexStylist " + New_Version + ")version in coming."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("Please, contact YoungWoo CNI."); } } //if (due_date < 30 && !(Done_Check_AutoUpdate & 2)) { if (due_date >= 0 && !(Done_Check_AutoUpdate & 2)) { InfoMemo->Lines->Add("\r"); if (Language == "Korean") { InfoMemo->Lines->Add("¹«»ó ±â°£ÀÌ " + IntToStr(due_date) + "ÀÏ ³²¾Ò½À´Ï´Ù."); } else { InfoMemo->Lines->Add("Free maintenance contract remains " + IntToStr(due_date) + " days."); } } } else {//Á¤ºñ°è¾à ¹Ìü°á ¾÷ü if (Language == "Korean") { InfoMemo->Lines->Add("Á¤ºñ °è¾àÀÌ µÇ¾î ÀÖÁö ¾Ê¾Æ Update¸¦ ÁøÇà ÇÒ ¼ö ¾ø½À´Ï´Ù."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("´ã´çÀÚ ¶Ç´Â (ÁÖ)¿µ¿ì¾¾¿£¾ÆÀÌ·Î ¹®ÀÇ ÇϽñ⠹ٶø´Ï´Ù."); } else { InfoMemo->Lines->Add("Setup cannot update because you did not renew the maintenance contract."); InfoMemo->Lines->Add("\r"); InfoMemo->Lines->Add("Please, contact YoungWoo CNI."); } mNextBtn->Visible = false; } if (bFirst) { if (Language == "Korean") { AgreeCkBox->Caption = "15ÀÏ µ¿¾È ¾Ë¸² º¸Áö ¾Ê±â"; } else { AgreeCkBox->Caption = "Do not check for 15 days."; } } else { AgreeCkBox->Visible = false; } return true; } //--------------------------------------------------------------------------- void __fastcall TAutoUpdateForm::mNextBtnClick(TObject *Sender) { String temp, auto_upgrade_program, params; if (AgreeCkBox->Checked) { TIniFile *IniFile = NULL; TDateTime date, tdate; int delay = 15; tdate = date.CurrentDate() + delay; IniFile = new TIniFile(AppDataBin + "\\Configuration.ini"); if (IniFile) { IniFile->WriteString("AutoUpdate", "LimitedDate", DateToStr(tdate)); delete IniFile; } } params = "texstylist " + Textile_Version; auto_upgrade_program = DirectoryBin + "\\AutoUpdate.exe"; OSVERSIONINFO osinfo; osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osinfo); SHELLEXECUTEINFO shExecInfo; shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); shExecInfo.fMask = NULL; shExecInfo.hwnd = NULL; shExecInfo.lpFile = auto_upgrade_program.c_str(); shExecInfo.lpParameters = params.c_str(); shExecInfo.lpDirectory = NULL; shExecInfo.nShow = SW_SHOW; shExecInfo.hInstApp = NULL; if ((osinfo.dwMajorVersion == 6) && (osinfo.dwMinorVersion >= 0)) { //osinfo.dwMinorVersion == 0 Vista //osinfo.dwMinorVersion == 1 Windows 7 shExecInfo.lpVerb = L"runas"; } else { shExecInfo.lpVerb = L"open"; } ShellExecuteEx(&shExecInfo); ModalResult = mrOk; } //--------------------------------------------------------------------------- void __fastcall TAutoUpdateForm::mCancelBtnClick(TObject *Sender) { if (AgreeCkBox->Checked) { TIniFile *IniFile = NULL; TDateTime date, tdate; int delay = 15; tdate = date.CurrentDate() + delay; IniFile = new TIniFile(AppDataBin + "\\Configuration.ini"); if (IniFile) { IniFile->WriteString("AutoUpdate", "LimitedDate", DateToStr(tdate)); delete IniFile; } } ModalResult = mrCancel; } //--------------------------------------------------------------------------- bool __fastcall TAutoUpdateForm::AutoUpdate(bool bUpdate) { //file version or serial Á¤º¸°¡ ¾øÀ» °æ¿ì Á¾·á if (!Get_Own_InformationFrom(bUpdate)) return false; /////////////////////////////////////////////////////////////////////// String response; String address = "http://www.texclub.com/cms2/autoup_check.php"; TIdHTTP *IdHTTP = new TIdHTTP(this); TIdMultiPartFormDataStream* pData = NULL; pData = new TIdMultiPartFormDataStream(); try { pData->AddFormField("serial", HASP_Serial); // pData->AddFormField("version", Textile_Version); // pData->AddFormField("name", "texstylist"); // response = IdHTTP->Post(address, pData); } catch(...) { if (pData != NULL) delete pData; pData = NULL; delete IdHTTP; Done_Check_AutoUpdate = 1; //skip return false; } if (pData != NULL) delete pData; pData = NULL; delete IdHTTP; if (response.Length() == 0) { Done_Check_AutoUpdate = 1; //skip return false; } try { if (!Process_XML_File(response)) { Done_Check_AutoUpdate = 1; //skip return false; } } catch(...) { return false; } return true; } //--------------------------------------------------------------------------- bool __fastcall TAutoUpdateForm::Get_Own_InformationFrom(bool bUpdate) { String strTemp; /////////////////////////////////////////////////////////////////////////// //Config¿¡¼­ Update ó¸® ¿©ºÎ(1/0)È®ÀÎ //15ÀÏ À̳»ÀÏ °æ¿ì ó¸® ¿©ºÎ(³¯Â¥) È®ÀÎ if (!bUpdate) { //Porgram Update¸¦ ½ÇÇàÇßÀ» °æ¿ì´Â ±×³É È®ÀÎ ÇÔ. TIniFile *IniFile = NULL; bool bExistIniFile = false; int bAutoUpdate = 0; IniFile = new TIniFile(AppDataBin + "\\Configuration.ini"); if(FileExists(AppDataBin + "\\Configuration.ini")) bExistIniFile = true; if (bExistIniFile && IniFile) { bAutoUpdate = IniFile->ReadInteger("AutoUpdate", "CanDo", 1); // 1:¾÷µ¥ÀÌÆ® ½ÇÇà if (!bAutoUpdate) return false; strTemp = IniFile->ReadString("AutoUpdate", "LimitedDate", ""); // if (strTemp.Length() > 0 && strTemp.Pos("-")) { int t_date[3], delay = 15; _stscanf(strTemp.c_str(), L"%d-%d-%d", &t_date[0], &t_date[1], &t_date[2]); TDateTime date = Date(), tdate; tdate = TDateTime(t_date[0], t_date[1], t_date[2]); //15ÀÏ À̳»ÀÌ¸é ¸®ÅÏÇÑ´Ù. if (tdate > date) return false; } } } /////////////////////////////////////////////////////////////////////////// TRegIniFile *RegIniFile = NULL; //String serial, version; RegIniFile = new TRegIniFile(RegFilename); RegIniFile->RootKey = HKEY_LOCAL_MACHINE; RegIniFile->OpenKey(RegFilename + "\\",true); // yw if (RegIniFile) { HASP_Serial = RegIniFile->ReadString("Common", "Serial", ""); //version = RegIniFile->ReadString("Common", "Version", ""); delete RegIniFile; } //serial Á¤º¸°¡ ¾øÀ» °æ¿ì if (HASP_Serial.Length() == 0) return false; /////////////////////////////////////////////////////////////////////////// String strVerInfo = "FileVersion"; Char *pBuf = NULL; LPVOID pValue = NULL; DWORD dwFileVersionInfoSize; unsigned int nLen; WORD *dwID = NULL; dwFileVersionInfoSize = GetFileVersionInfoSize(Application->ExeName.c_str(), &dwFileVersionInfoSize); if (dwFileVersionInfoSize > 0) { pBuf = new Char[dwFileVersionInfoSize]; if (pBuf) { GetFileVersionInfo(Application->ExeName.c_str(), 0, dwFileVersionInfoSize, pBuf); strTemp = "VarFileInfo\\Translation"; VerQueryValue(pBuf, strTemp.c_str(), &pValue, &nLen); dwID = (WORD *)pValue; strTemp = "StringFileInfo\\" + IntToHex(dwID[0], 4) + IntToHex(dwID[1], 4) + "\\" + strVerInfo; if (VerQueryValue(pBuf, strTemp.c_str(), &pValue, &nLen)) { Textile_Version = String((Char *)pValue); } delete []pBuf; pBuf = NULL; } return true; } else { //file version Á¤º¸°¡ ¾øÀ» °æ¿ì return false; } } //--------------------------------------------------------------------------- bool __fastcall TAutoUpdateForm::Process_XML_File(String xml) { String program_path, temp_string; int _version[4]; int _newest_version[4]; int _last_version[4]; _stscanf(Textile_Version.c_str(), L"%d.%d.%d.%d", &_version[0], &_version[1], &_version[2], &_version[3]); TXMLDocument* XMLDoc = XMLDocument1; XMLDoc->LoadFromXML(xml); //XMLDoc->LoadFromFile("C:\\Documents and Settings\\¹Ú»óÈÆ\\Application Data\\YoungWoo\\Texpro10.0\\AutoUpdate\\TexStylist\\updata.xml"); String NodeText, NodeName; _di_IXMLNode XmlNode, ChildNode, AttrNode, FileNode; XmlNode = XMLDoc->DocumentElement; NodeName = XmlNode->GetNodeName(); if (!XmlNode->HasChildNodes) goto fail; for (int i = 0; i < XmlNode->ChildNodes->Count; i++) { ChildNode = XmlNode->ChildNodes->Nodes[i]; NodeName = ChildNode->NodeName; if (NodeName == "key") { AttrNode = ChildNode->GetAttributeNodes()->Get(1);//0:type="HASP/NetHASP", 1:value=serial NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; if (NodeText == "NONE") goto fail; AttrNode = ChildNode->GetAttributeNodes()->Get(2);//1:version="10.0" NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; if (NodeText == "NONE") goto fail; if (NodeText.SubString(1,4) != Textile_Version.SubString(1,4)) goto fail; } else if (NodeName == "contract") { AttrNode = ChildNode->GetAttributeNodes()->Get(0);//valid:true(Àåºñ°è¾à yes) NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; if (NodeText == "TRUE") Done_Check_AutoUpdate |= 2;//Á¤ºñ°è¾à È®ÀÎ AttrNode = ChildNode->GetAttributeNodes()->Get(1);//type:GRATIS(¹«»ó±â°£) NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; if (NodeText == "GRATIS") { AttrNode = ChildNode->GetAttributeNodes()->Get(2);//duedate:±â°£ NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; due_date = NodeText.ToInt(); } } //postÇÑ ¹öÀü°ú ºñ±³ÇÏ¿© °°Àº ¹öÀü¿¡¼­ ÃֽйöÀüÀ» ¸®ÅÏ //post version: 10.0.0.21, update version: 10.0.0.55ÀÏ °æ¿ì //10.0.0.55 ¸®ÅÏ else if (NodeName == "newest-version") { AttrNode = ChildNode->GetAttributeNodes()->Get(0);//0:valid=true NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; if (NodeText == "FALSE") goto fail; AttrNode = ChildNode->GetAttributeNodes()->Get(1);//1:version=10.0.0.21 NodeName = AttrNode->GetNodeName(); New_Version = AttrNode->Text; if (Textile_Version == New_Version) { goto fail; } _stscanf(New_Version.c_str(), L"%d.%d.%d.%d", &_newest_version[0], &_newest_version[1], &_newest_version[2], &_newest_version[3]); if (_newest_version[0] > _version[0] || _newest_version[1] > _version[1]) { Done_Check_AutoUpdate |= 8;//´Ù¸¥ ¹öÀü Á¸Àç } } //postÇÑ ¹öÀü¿¡¼­ °¡Àå ¸¶Áö¸·¿¡ ¿Ã·ÁÁø ¹öÀüÀ» ¸®ÅÏ //post version: 11.0.0.0, update version: 10.0.0.55ÀÏ °æ¿ì false ¸®ÅÏ //11.0.0.0 ¹öÀü Áß¿¡ ÃÖ±Ù ¿Ã·ÁÁø ¹öÀüÀÌ ¾ø±â ¶§¹®¿¡ false ¸®ÅÏÇÑ´Ù. else if (NodeName == "last-version") { AttrNode = ChildNode->GetAttributeNodes()->Get(0);//0:valid=true NodeName = AttrNode->GetNodeName(); NodeText = AttrNode->Text; if (NodeText == "FALSE") goto fail; AttrNode = ChildNode->GetAttributeNodes()->Get(1);//1:version=10.0.0.21 NodeName = AttrNode->GetNodeName(); Last_Version = AttrNode->Text; _stscanf(Last_Version.c_str(), L"%d.%d.%d.%d", &_last_version[0], &_last_version[1], &_last_version[2], &_last_version[3]); if (Textile_Version == Last_Version) { goto fail; } if (_last_version[3] > _version[3]) { Done_Check_AutoUpdate |= 4;//´Ù¸¥ ¹öÀü Á¸Àç } Update_Content = ChildNode->ChildNodes->Nodes[0]->Text; } } //XMLDoc->SaveToFile(program_path + "\\update.xml"); XMLDoc->Active = false; return true; fail: return false; } //---------------------------------------------------------------------------