//--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButtonTxtLoadClick(TObject *Sender){ if (ComboBoxTxtTerminal->Text =="") { ShowMessage("请先选好出票终端,请确认文件游戏玩法数据此终端可以出票。"); return; } //打开彩票号码的文本文件,简单的校验一下,导入表格中 if (OpenDialogTxt->Execute()){ TStringList *lines =new TStringList(); lines->LoadFromFile(OpenDialogTxt->FileName); if (lines->Count >=999) { ShowMessage("每次文本出票张数不能超过1000张,请分次导入出票!"); delete lines; return; } for (int i =0, lineIdx=1; i <lines->Count; i++) { AnsiString line =lines->operator [](i); if (line[1] =='#') continue; //忽略注释行 char *lineChars =line.c_str(); char *delim ="\t"; char *item; int itemIndex =1; item =strtok(lineChars, delim); StringGridTxt->Cells[itemIndex++][lineIdx] =item; while(item =strtok(NULL, delim)){ StringGridTxt->Cells[itemIndex++][lineIdx] =item; if (itemIndex >7) break; } lineIdx ++; } if (lines->Count >0) { ComboBoxTxtTerminal->Enabled =false; SpeedButtonTxtPrint->Enabled =true; } delete lines; } }
void __fastcall TPreferencencesForm::FillGroup(AnsiString Name) { g_pLocalStrings->SelectSection("PreferencencesForm"); String Caption = g_pLocalStrings->GetSectionStringW(Name.c_str()); AnsiString PluginClassName = "PPrefs_"+Name; IDCMapSys* pSys = GetDCMapSys(); TStringList* List = new TStringList; if(pSys->SelectClass(PluginClassName.c_str())) { TTreeNode* pNode = TreeView->Items->Add(0,Caption); do { List->Add(pSys->GetPluginName()); } while(pSys->Next()); List->Sort(); for(int i=0;i<List->Count;i++) { IDCMapVCLPanel* pPanel; pPanel = GetDCMapCore()->CreateModuleTyped<IDCMapVCLPanel>(PluginClassName.c_str(),List->Strings[i].c_str()); if(!pPanel)continue; TFrame* pFrame = pPanel->CreateFrame(); pFrame->Align = alClient; pFrame->Visible = false; pFrame->Parent = ClientPanel; m_vecPanels.push_back(pPanel); TreeView->Items->AddChildObject(pNode,pPanel->GetCaption(),pFrame); } delete List; } }
//--------------------------------------------------------------------------- void __fastcall TOptDialog::ReadAntList(void) { AnsiString AntPcvFile_Text=AntPcvFile->Text; TStringList *list; pcvs_t pcvs={0}; char *p; if (!readpcv(AntPcvFile_Text.c_str(),&pcvs)) return; list=new TStringList; list->Add(""); list->Add("*"); for (int i=0;i<pcvs.n;i++) { if (pcvs.pcv[i].sat) continue; if ((p=strchr(pcvs.pcv[i].type,' '))) *p='\0'; if (i>0&&!strcmp(pcvs.pcv[i].type,pcvs.pcv[i-1].type)) continue; list->Add(pcvs.pcv[i].type); } RovAnt->Items=list; RefAnt->Items=list; free(pcvs.pcv); }
//*************************************************** int Logic::RemoveComments(TStringList Lines) { int CommentDepth = 0; for(CurLine=0;CurLine<Lines.num;CurLine++){ string Line = Lines.at(CurLine); string NewLine; bool InQuotes = false; for ( unsigned i=0; i<Line.size(); ++i ){ if ( !InQuotes ){ if (CommentDepth==0 && Line[i] == '[') break; if (i<Line.size()-1){ if (CommentDepth==0 && Line.substr(i,2) == "//") break; else if ( Line.substr(i,2) == "/*"){ ++CommentDepth; ++i; continue; } } else if (CommentDepth>0 && Line.substr(i,2) == "*/" ){ --CommentDepth; ++i; continue; } } if ( CommentDepth == 0 ){ if(Line[i]=='\"' && (i==0 || Line[i-1] != '\\')) InQuotes = !InQuotes; NewLine += Line[i]; } } Lines.replace(CurLine,NewLine); } return 0; }
void TIniFile::ReadSectionValues(const wxString &Section, TStringList &Strings) { wxString N; wxString V; int I; // Assert( !! Strings , SStringsUnassignedError ); Strings.BeginUpdate(); try { Strings.Clear(); if (FFileBuffer->Count() > 0) { I = GetSectionIndex(Section); if (I != -1) { ++I; while ((I < FFileBuffer->Count()) && !IsSection (FFileBuffer->Item(I))) { N = GetName(FFileBuffer->Item(I)); if (N != EmptyStr) { V = GetValue(FFileBuffer->Item(I), N); Strings.Add(N + IniSeparator + V); } ++I; } } } } /* ? *//* FINALLY */ catch (...) { Strings.EndUpdate(); } }
void AutoSearchFrame::addEntry(AutoSearch& search, int index) { TStringList l; l.push_back(Text::toT(search.searchString)); l.push_back(Text::toT(TypeModesToString(search.sourceType))); l.push_back(Text::toT(SizeModesToString(search.sizeModes))); l.push_back(Text::toT(Util::toString(search.size))); l.push_back(Text::toT(SizeTypeToString(search.typeFileSize))); l.push_back(Text::toT(FdmUtil::toString(FdmUtil::toBool(search.onlyIfOp)))); int itemCount = items->insert(l, 0, index); if(index == -1) index = itemCount; items->setChecked(index, search.isActive); items->ensureVisible(index); }
void FavoriteHubsFrame::addEntry(const FavoriteHubEntryPtr& entry, int pos, int groupIndex) { TStringList l; l.push_back(Text::toT(entry->getName())); l.push_back(Text::toT(entry->getDescription())); l.push_back(Text::toT(entry->get(HubSettings::Nick))); l.push_back(tstring(entry->getPassword().size(), '*')); l.push_back(Text::toT(entry->getServer())); l.push_back(Text::toT(entry->get(HubSettings::Description))); l.push_back(Text::toT(entry->getShareProfileName())); bool b = entry->getAutoConnect(); int i = ctrlHubs.insert(pos, l, 0, (LPARAM)entry.get()); ctrlHubs.SetCheckState(i, b); LVITEM lvItem = { 0 }; lvItem.mask = LVIF_GROUPID | LVIF_IMAGE; lvItem.iItem = i; lvItem.iImage = isOnline(entry->getServer()) ? 0 : 1; lvItem.iSubItem = 0; lvItem.iGroupId = groupIndex; ctrlHubs.SetItem( &lvItem ); }
//************************************************* void Logic::ShowError(int Line, string ErrorMsg) { int LineNum = RealLineNum[Line]; if(LineFile[Line] == 0 || Line > EditLines.num){ // error is in logic in editor window sprintf(tmp,"Line %d: %s\n",RealLineNum[Line],ErrorMsg.c_str()); } else{ //error in include file if (LineFile[Line] > IncludeFilenames.num){ sprintf(tmp,"[unknown include file] Line ???: %s\n",ErrorMsg.c_str()); } else{ sprintf(tmp,"File %s Line %d: %s\n",IncludeFilenames.at(LineFile[Line]-1).c_str(),LineNum,ErrorMsg.c_str()); } } ErrorList.append(tmp); ErrorOccured=true; }
// Update a specific search item void ADLSearchFrame::UpdateSearch(int index, BOOL doDelete) { ADLSearchManager::SearchCollection& collection = ADLSearchManager::getInstance()->collection; // Check args if(index >= (int)collection.size()) { return; } ADLSearch& search = collection[index]; // Delete from list control if(doDelete) { ctrlList.DeleteItem(index); } // Generate values TStringList line; tstring fs; line.push_back(Text::toT(search.searchString)); line.push_back(search.SourceTypeToDisplayString(search.sourceType)); line.push_back(Text::toT(search.destDir)); fs = _T(""); if(search.minFileSize >= 0) { fs = Util::toStringW(search.minFileSize); fs += _T(" "); fs += search.SizeTypeToDisplayString(search.typeFileSize); } line.push_back(fs); fs = _T(""); if(search.maxFileSize >= 0) { fs = Util::toStringW(search.maxFileSize); fs += _T(" "); fs += search.SizeTypeToDisplayString(search.typeFileSize); } line.push_back(fs); // Insert in list control ctrlList.insert(index, line); // Update 'Active' check box ctrlList.SetCheckState(index, search.isActive); }
void FavoriteHubsFrame::addEntry(const FavoriteHubEntry* entry, int pos, int groupIndex) { TStringList l; l.push_back(Text::toT(entry->getName())); l.push_back(Text::toT(entry->getDescription())); l.push_back(Text::toT(entry->getNick(false))); l.push_back(tstring(entry->getPassword().size(), 0x25CF)); l.push_back(Text::toT(entry->getServer())); l.push_back(Text::toT(entry->getUserDescription())); bool b = entry->getConnect(); int i = ctrlHubs.insert(pos, l, 0, (LPARAM)entry); ctrlHubs.SetCheckState(i, b); LVITEM lvItem = { 0 }; lvItem.mask = LVIF_GROUPID; lvItem.iItem = i; lvItem.iSubItem = 0; lvItem.iGroupId = groupIndex; ctrlHubs.SetItem( &lvItem ); }
//--------------------------------------------------------------------------- void __fastcall XmlDataProvider::GetData(TStringList &MyValues) { String xmlfile = "items.xml"; CoInitialize(NULL); ISAXXMLReader* pRdr = NULL; HRESULT hr = CoCreateInstance( __uuidof(SAXXMLReader), NULL, CLSCTX_ALL, __uuidof(ISAXXMLReader), (void **)&pRdr); if (!FAILED(hr)) { ISAXContentHandler* pContentHandler = new CSaxContentHandlerImp(MyValues); pRdr->putContentHandler(pContentHandler); //SAXErrorHandlerImpl * pEc = new SAXErrorHandlerImpl(); //hr = pRdr->putErrorHandler(pEc); // SAXDTDHandlerImpl * pDc = new SAXDTDHandlerImpl(); // hr = pRdr->putDTDHandler(pDc); if (FAILED((hr = pRdr->parseURL((wchar_t*)(xmlfile.c_str()))))) MyValues.Add("parsing failed"); pRdr->Release(); delete pContentHandler; } else { ShowMessage("Error creating COM object"); } CoUninitialize(); }
void __fastcall TForm1::FileSaveAs1Accept(TObject *Sender) { String a = FileSaveAs1->Dialog->FileName; if (a!=""){ // Speichern if (ExtractFileExt(a).UpperCase()!=".AD")a=a.SubString(1,a.Length()-ExtractFileExt(a).Length())+".ad"; TStringList *List = new TStringList(); List->Add(IntToStr(Max)); List->Add(Edit1->Text); for (int i=0;i<Max;i++){ List->Add(ListBox1->Items->Strings[i]); for (int b=0;b<66;b++){ List->Add(IntToStr(Data[i][b])); } } List->SaveToFile(a); } }
//*************************************************** void Logic::NextLine() { int NumLines = EditLines.num; CurLine++; if(CurLine>NumLines){ FinishedReading = true; return; } do{ LowerCaseLine = EditLines.at(CurLine); if(LowerCaseLine == empty_tmp || (LinePos=LowerCaseLine.find_first_not_of(" ")) == string::npos){ CurLine++; continue; } //printf("Line %d: %s\n",CurLine,LowerCaseLine.c_str()); toLower(&LowerCaseLine); LineLength = LowerCaseLine.length(); return; }while(CurLine<NumLines); FinishedReading = true; }
//--------------------------------------------------------------------------- void __fastcall TLocationProfilesDialog::RemoveBookmark(TObject * Sender) { TBookmarkList * BookmarkList = GetBookmarkList(Sender); TTreeView * ProfilesView = GetProfilesView(Sender); TStringList * Folders = GetFolders(Sender); assert(ProfilesView->Selected); TTreeNode * Node = ProfilesView->Selected; if (Node->Data) { BookmarkList->Delete((TBookmark *)Node->Data); TTreeNode * ParentNode = Node->Parent; Node->Delete(); if (ParentNode && !ParentNode->Count) { assert(Folders->IndexOfObject(ParentNode) >= 0); Folders->Delete(Folders->IndexOfObject(ParentNode)); ParentNode->Delete(); } } else { UnicodeString Message = MainInstructions(LoadStr(DELETE_BOOKMARK_FOLDER)); if (MessageDialog(Message, qtConfirmation, qaYes | qaNo, HELP_LOCATION_PROFILE_DELETE) == qaYes) { assert(Node->Count); for (int i = 0; i < Node->Count; i++) { BookmarkList->Delete((TBookmark *)Node->Item[i]->Data); } assert(Folders->IndexOfObject(Node) >= 0); Folders->Delete(Folders->IndexOfObject(Node)); Node->Delete(); } } UpdateControls(); }
void __fastcall TfMain::FormShow(TObject *Sender) { TStringList* sl = new(TStringList); sl->NameValueSeparator = '='; TFile f; if(f.Exists(ExtractFileDir(Application->ExeName) + "\\Library.lb")){ sl->LoadFromFile(GetCurrentDir() + "\\Library.lb"); for(int i = 0; i < sl->Count; i++){ TListItem* Item = lvLib->Items->Add(); Item->Caption = ExtractFileName(sl->Names[i]); Item->GroupID = 0; Item->SubItems->Add(sl->Names[i]); //path [0] TStringList* ss = new(TStringList); ss->NameValueSeparator = '/'; ss->Add(sl->ValueFromIndex[i]); Item->SubItems->Add(ss->Names[0]); //bookmark [1] Item->SubItems->Add(ss->ValueFromIndex[0]); //size [2] ss->~TStringList(); } } sl->Clear(); if(f.Exists(ExtractFileDir(Application->ExeName) + "\\Settings.ini")){ sl->LoadFromFile(GetCurrentDir() + "\\Settings.ini"); leLogin->Text = sl->ValueFromIndex[0]; lePass->Text = sl->ValueFromIndex[1]; if(sl->ValueFromIndex[2] == "1") cbRememberPass->Checked = true; else cbRememberPass->Checked = false; leServer->Text = sl->ValueFromIndex[3]; } sl->~TStringList(); }
BOOST_FIXTURE_TEST_CASE(test1, base_fixture_t) { if (1) { UnicodeString Text = ::StringOfChar(' ', 4); BOOST_CHECK_EQUAL(" ", W2MB(Text.c_str()).c_str()); } if (1) { UnicodeString Message = L"long long long long long long long long long text"; TStringList MessageLines; int MaxMessageWidth = 20; FarWrapText(Message, &MessageLines, MaxMessageWidth); BOOST_TEST_MESSAGE("MessageLines = " << W2MB(MessageLines.GetText().c_str())); BOOST_CHECK_EQUAL(4, MessageLines.GetCount()); BOOST_CHECK_EQUAL("long long long", W2MB(MessageLines.GetString(0).c_str()).c_str()); BOOST_CHECK_EQUAL("long long long", W2MB(MessageLines.GetString(1).c_str()).c_str()); BOOST_CHECK_EQUAL("long long long", W2MB(MessageLines.GetString(2).c_str()).c_str()); BOOST_CHECK_EQUAL("text", W2MB(MessageLines.GetString(3).c_str()).c_str()); } }
FavoriteDirsPage::FavoriteDirsPage(dwt::Widget* parent) : PropPage(parent) { createDialog(IDD_FAVORITE_DIRSPAGE); setHelpId(IDH_FAVORITE_DIRSPAGE); WinUtil::setHelpIds(this, helpItems); PropPage::translate(handle(), texts); attachChild(directories, IDC_FAVORITE_DIRECTORIES); directories->setTableStyle(LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT); TStringList columns; columns.push_back(T_("Favorite name")); columns.push_back(T_("Directory")); directories->createColumns(columns); directories->setColumnWidth(0, 100); directories->setColumnWidth(1, directories->getSize().x - 120); StringPairList dirs = FavoriteManager::getInstance()->getFavoriteDirs(); for(StringPairIter j = dirs.begin(); j != dirs.end(); j++) { TStringList row; row.push_back(Text::toT(j->second)); row.push_back(Text::toT(j->first)); directories->insert(row); } directories->onDblClicked(std::tr1::bind(&FavoriteDirsPage::handleDoubleClick, this)); directories->onKeyDown(std::tr1::bind(&FavoriteDirsPage::handleKeyDown, this, _1)); directories->onRaw(std::tr1::bind(&FavoriteDirsPage::handleItemChanged, this, _1, _2), dwt::Message(WM_NOTIFY, LVN_ITEMCHANGED)); onDragDrop(std::tr1::bind(&FavoriteDirsPage::handleDragDrop, this, _1)); attachChild<Button>(IDC_RENAME)->onClicked(std::tr1::bind(&FavoriteDirsPage::handleRenameClicked, this)); attachChild<Button>(IDC_REMOVE)->onClicked(std::tr1::bind(&FavoriteDirsPage::handleRemoveClicked, this)); attachChild<Button>(IDC_ADD)->onClicked(std::tr1::bind(&FavoriteDirsPage::handleAddClicked, this)); }
void __fastcall TFrListMail::RzToolButton1Click(TObject *Sender) { TMemoryStream *pms= new TMemoryStream(); TStringList *LS =new TStringList(); struct rMail rMail; AnsiString NewFileName; int i,viTmpMINfTurn; AnsiString vsQRaspRaspNameRTF; //Если распоряжение уже рассылалось, то не рассылать, если не имеешь на то дополнительных прав. /* vsSQLQw="SELECT Id24NameStatus FROM bm_Rasp " " WHERE Idn=:D0 ; "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value= IdRasp; Qw->Open(); if((Qw->Fields->Fields[0]->AsInteger==5448350)&&(!MainForm->flEditAllRasp)) // Id24NameStatus=5448350//На утверждении {ShowMessage(AnsiString("Это распоряжени уже разосланно на утверждение")); return; } */ //Просто не Enable кнопку рассылки /// if (pcSoglasovanieRassilka->ActivePage==tsSoglasovanie) { ///проверка на отсутствие "_Копия" и "Новый подписной индекс" StartProcedure: vsSQLQw = " SELECT TOP 1 Idn FROM bm_RaspDetail " " WHERE idRasp=:D0 AND DateDel is NULL " " AND LTRIM(RTRIM(NameRaspDetail)) LIKE '%_Копия%'; "; //? Копия_ Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if(Qw->RecordCount>0)// { ShowMessage("Рассылка невозможна. \n В названиях подписных индексов присутствует слово '_Копия'"); return;} { if (MessageDlg("Рассылка невозможна. \n В названиях присутствует слово '_Копия'. Редактировать?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes) {return;}else { {try{Opts.Clear();locvalues[0]=Variant(Qw->Fields->Fields[0]->AsInteger);FrBisniessMenedger->QRaspDetail->Locate("Idn",locvalues,Opts);}catch(...){};}; FrBisniessMenedger->btUpdRaspDetailClick(Sender); goto StartProcedure; } } vsSQLQw = " SELECT TOP 1 Idn, isnull(PIdn,0) FROM bm_RaspDetail " " WHERE idRasp=:D0 AND DateDel is NULL " " AND LTRIM(RTRIM(NameRaspDetail))='Новый подписной индекс' ; "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if(Qw->RecordCount>0) { if (MessageDlg("Рассылка невозможна. \n В названиях подписных индексов присутствует 'Новый подписной индекс'. Удалить?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes) { if (MessageDlg(" Редактировать 'Новый подписной индекс'?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes) {return;}else { {try{Opts.Clear();locvalues[0]=Variant(Qw->Fields->Fields[0]->AsInteger);FrBisniessMenedger->QRaspDetail->Locate("Idn",locvalues,Opts);}catch(...){};}; FrBisniessMenedger->btUpdRaspDetailClick(Sender); goto StartProcedure; } }//Сделать переход к редактированию. else { int TmpIdnPIForDel,TmpIdnComplForDel; TmpIdnComplForDel=0; TmpIdnPIForDel=Qw->Fields->Fields[0]->AsInteger; TmpIdnComplForDel=Qw->Fields->Fields[1]->AsInteger; vsSQLQw = " DECLARE @Idn int; SET @Idn=:D0; " " DELETE FROM bm_RaspDetail " " WHERE Idn=@Idn OR PIdn=@Idn; "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=TmpIdnPIForDel; Qw->ExecSQL(); if(TmpIdnComplForDel>0) { vsSQLQw= " DECLARE @IdInsMod int, @Idn int, @CostWithNDS money, @CostWithoutNDS money, @CostMINWithNDS money, @CostMINWithoutNDS money" " SET @Idn=:D0" " SET @IdInsMod=:D1" " SELECT @CostWithoutNDS=SUM(CostWithoutNDS),@CostWithNDS=SUM(CostWithNDS),@CostMINWithoutNDS=SUM(CostMINWithoutNDS),@CostMINWithNDS=SUM(CostMINWithNDS)" " FROM bm_RaspDetail" " WHERE fType=2 AND PIdn =@Idn and DateDel is null;" " UPDATE bm_RaspDetail SET" " CostWithNDS =@CostWithNDS " " ,CostWithoutNDS =@CostWithoutNDS " " ,CostMINWithNDS =@CostMINWithNDS " " ,CostMINWithoutNDS =@CostMINWithoutNDS " " ,DateMod = GetDate() " " ,IdMod =@IdInsMod " " WHERE Idn= @Idn ;" ; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=TmpIdnComplForDel; Qw->Parameters->Items[1]->Value=PermisHdr.KeyUserStartProgramm;; Qw->ExecSQL(); } ShowMessage("Подписной индекс с наименованием 'Новый подписной индекс' удален.\n Рассылка запустится повторно. "); goto StartProcedure; // return; } } //Проверка что поле Состав ПИ заполненно у всех. vsSQLQw = " SELECT top 1 Idn FROM bm_RaspDetail WHERE IdRasp=:D0 AND DateDel IS NULL and fType=2 and CompositionOfPI=0 "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if((Qw->RecordCount>0)&&((QListRaspVidRasp->AsInteger==4742151)||(QListRaspVidRasp->AsInteger==4742153))) {ShowMessage(AnsiString("В распоряжении не у всех подписных индексов указан \"Cостав ПИ\".\n Вам необходимо заполнить это поле.")); return; } ///Проверка наличия кодов Axapta vsSQLQw = " SELECT Idn FROM bm_RaspDetail WHERE IdRasp=:D0 AND DateDel IS NULL AND fType=3 AND (ItemIdAxapta ='' OR ItemIdAxapta is NULL OR IdnAxapta is NULL)"; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if(Qw->RecordCount>0){ShowMessage(AnsiString("Не у всех номенклатур проставлены коды Axapta. Рассылка распоряжения на утверждение невозможна.")); return;} /// //Проверка заполненности всех полей комментариев и распоряжени QListRasp->Close(); QListRasp->Parameters->Items[0]->Value=IdRasp; QListRasp->Open(); //Проверка наличия ценового комитета. vsSQLQw = " SELECT Idn FROM bm_RaspDetail WHERE IdRasp=:D0 AND DateDel IS NULL "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); //if(QListRasp->Active==false){QListRasp->Open(); } //int ttt= QListRaspVidRasp->AsInteger; // int yyy=Qw->RecordCount; if((Qw->RecordCount>0)&&((QListRaspVidRasp->AsInteger==4742151)||(QListRaspVidRasp->AsInteger==4742153))) { vsSQLQw = " SELECT Idn FROM bm_ListMail WHERE IdRasp=:D0 AND DateDel IS NULL AND fType=3/*Ценовой комитет*/ "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if(Qw->RecordCount==0){ShowMessage(AnsiString("Не заполнен список ценового комитета. Рассылка распоряжения на утверждение невозможна.")); return;} } // /* //Проверка заполненности всех полей комментариев и распоряжени QListRasp->Close(); QListRasp->Parameters->Items[0]->Value=IdRasp; QListRasp->Open(); */ QListComments->Close(); QListComments->Parameters->Items[0]->Value=IdRasp; QListComments->Open(); fAllEntering=true;//Флаг проверки заполненности всех полей //Проверка распоряжения if((QListRaspId256TypeRasp->AsInteger)==0) fAllEntering=false; //Тип распоряжения // Есть всегда if(Trim(QListRaspId24City->AsInteger)==0) fAllEntering=false; //Город if(Trim(QListRaspRaspNameRTF->AsString)=="") fAllEntering=false; //Наименование распоряжения if(Trim(QListRaspContentTargetRTF->AsString)=="") fAllEntering=false; // Цели распоряжения if(Trim(QListRaspId24NameStatuser->AsString)=="") fAllEntering=false; // (Предлагаю:, Приказываю: и прочее) if(Trim(QListRaspContentRTF->AsString)=="") fAllEntering=false; // Содержание распоряжения if((QListRaspEmplDol->AsInteger)==0) fAllEntering=false; //Должность утверждающего if((QListRaspIdEmplUsers->AsInteger)==0) fAllEntering=false; // ФИО утверждающего /* ///проверка на отсутствие "_Копия" и "Новый подписной индекс" vsSQLQw = " SELECT Idn FROM bm_RaspDetail " " WHERE idRasp=:D0 AND DateDel is NULL " " AND ((LTRIM(RTRIM(NameRaspDetail))='Новый подписной индекс') OR (LTRIM(RTRIM(NameRaspDetail)) LIKE '%_Копия%')); "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if(Qw->RecordCount>0) { ShowMessage("Рассылка невозможна. \n В названиях подписных индексов присутствуют 'Новый подписной индекс' или '_Копия'"); return;} */ /// QAddFilesEXEL->Close(); QAddFilesEXEL->Parameters->Items[0]->Value=IdRasp; QAddFilesEXEL->Open(); if ((QListRaspVidRasp->AsInteger==4742152/*"Распоряжение о выпуске нового продукта" После набора статистики переделать под таблицу прав*/)&&(QAddFilesEXEL->RecordCount<1))//Продукт { ShowMessage("Рассылка невозможна. \n Необходимо указать прикрепленный файл EXEL"); return;//Наличие прикрепленного файла } /// /// QAddFilesDOC->Close(); QAddFilesDOC->Parameters->Items[0]->Value=IdRasp; QAddFilesDOC->Open(); if ((QListRaspVidRasp->AsInteger==4742440/*"Техническое задание на разработу в Отдел разработки и сопровождения программных продуктов" После набора статистики переделать под таблицу прав*/)&&(QAddFilesDOC->RecordCount<1))//Продукт { ShowMessage("Рассылка невозможна. \n Необходимо указать прикрепленный файл DOC"); return;//Наличие прикрепленного файла } /// //Проверка распоряжения if ((QListRaspVidRasp->AsInteger==4742151)||((QListRaspVidRasp->AsInteger==4742153)))//Цена { //Проверка по комментариям Тип цены. 1-Базовая;2-Бюджетная;3-Со скидкой. Стандартная;4-Со скидкой. Расчётная if ((QListCommentsTypeCost->AsInteger==3)||((QListCommentsTypeCost->AsInteger==4))) { if(((QListCommentsId256NameDiscount->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==3)) fAllEntering=false; //Код из Lib256 с Видом скидки if(((QListCommentsId256NameAction ->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==4)) fAllEntering=false; //Код из Lib256 с Видом скидки if((QListCommentsId256CostDiscount->AsInteger)==0) fAllEntering=false; //Код из Lib256 с описанием размера скидки if((QListCommentsDateRealization->AsDateTime)==TDateTime(1900, 01, 01)) fAllEntering=false; //Срок реализации if(Trim(QListCommentsPrognozEffects->AsString)=="") fAllEntering=false; //Прогноз эффективности if(Trim(QListCommentsGrantingConditions->AsString)=="") fAllEntering=false; // Условия скидки //Пооверяем CheckBox'ы // vsSQLQw = " SELECT (isnull(A.id256TextActionPurpose,0)+isnull(A.id256TextGroupClients,0)+isnull(A.id256TextAdvancementChannel,0))id256Text,A.TypeFiеld " vsSQLQw = " SELECT DISTINCT A.TypeFiеld " " FROM bm_CheckLists A " " LEFT JOIN bm_CommentsCheckLists B ON B.IdCheckLists=A.Idn " " LEFT JOIN bm_Comments C ON C.Idn= B.IdComments " " WHERE C.idRasp=:D0 AND B.DateDel is NULL "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); if (Qw->RecordCount<3) fAllEntering=false; //Если заполнено меньше 3 CheckBox'ов Qw->Close(); /// if (QListCommentsTypeCost->AsInteger==4) //Проверяем соответствуют ли продукты в таблицы прогнозируемых затрат и у подписных индексов { // при типе распоряжения 4-Со скидкой. расчетное- bool fProduce=true;//Флаг соответствия продуктов. true-соответствуют vsSQLQw = " SELECT DISTINCT IdProduce " " FROM bm_PredictedDebit " " WHERE idRasp=:D0 AND DateDel is NULL "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value=IdRasp; Qw->Open(); vsSQLQw = " SELECT DISTINCT idAdvProduceClass " " FROM bm_RaspDetail " " WHERE idRasp=:D0 AND DateDel is NULL "; Qw2->Close();Qw2->SQL->Clear();Qw2->SQL->Add(vsSQLQw); Qw2->Parameters->Items[0]->Value=IdRasp; Qw2->Open(); if(Qw->RecordCount!=Qw2->RecordCount) fProduce=false; while(Qw->Eof==false) { vsSQLQw = " SELECT TOP 1 idAdvProduceClass " " FROM bm_RaspDetail " " WHERE idRasp=:D0 AND idAdvProduceClass=:D1 AND DateDel is NULL "; Qw2->Close();Qw2->SQL->Clear();Qw2->SQL->Add(vsSQLQw); Qw2->Parameters->Items[0]->Value=IdRasp; Qw2->Parameters->Items[1]->Value=Qw->Fields->Fields[0]->AsInteger; Qw2->Open(); if(Qw2->RecordCount>0) fProduce=false; Qw->Next();} Qw->Close(); Qw2->Close(); if (!fProduce) { if(MessageDlg("Продукты в подписных индексах и в прогнозируемых затратах не соответствуют. Продолжить рассылку?",mtInformation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes) {Abort();return;}} }//if (QListCommentsTypeCost->AsInteger==4) }//if ((QListCommentsTypeCost->AsInteger==3)||((QListCommentsTypeCost->AsInteger==4))) /// }//if (QListRaspVidRasp->AsInteger==0)//Цена /// /// if (!fAllEntering) { ShowMessage(AnsiString("Не все поля заполнены. Рассылка распоряжения на утверждение невозможна.")); //--- первая часть марлезонского балета if ((QListRaspId256TypeRasp->AsInteger)==0) {ShowMessage("Не выбран тип распоряжения...");} if (Trim(QListRaspRaspNameRTF->AsString)=="") {ShowMessage("Не указано наименование распоряжения...");} if (Trim(QListRaspContentTargetRTF->AsString)=="") {ShowMessage("Не указана цель распоряжения...");} if (Trim(QListRaspId24NameStatuser->AsString)=="") {ShowMessage("Не указано ''Предлагаю:'', ''Приказываю:'' и прочее...");} if (Trim(QListRaspContentRTF->AsString)=="") {ShowMessage("Не указано ''Содержание распоряжения''...");} if ((QListRaspEmplDol->AsInteger)==0) {ShowMessage("Не указана ''Должность утверждающего''...");} if ((QListRaspIdEmplUsers->AsInteger)==0) {ShowMessage("Не указаны ''ФИО утверждающего''...");} //--- вторая часть марлезонского балета if (((QListCommentsId256NameDiscount->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==3)) {ShowMessage("Не указан ''Код из Lib256 с Видом скидки''...");} if (((QListCommentsId256NameAction ->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==4)) {ShowMessage("Не указан ''Код из Lib256 с Видом скидки''...");} if ((QListCommentsId256CostDiscount->AsInteger)==0) {ShowMessage("Не указан ''Код из Lib256 с описанием размера скидки''...");} if ((QListCommentsDateRealization->AsDateTime)==TDateTime(1900, 01, 01)) {ShowMessage("Не указан ''Срок реализации''...");} if (Trim(QListCommentsPrognozEffects->AsString)=="") {ShowMessage("Не указан ''Прогноз эффективности''...");} if (Trim(QListCommentsGrantingConditions->AsString)=="") {ShowMessage("Не указаны ''Условия скидки''...");} //конец балета - занавес return; } ///Проверка дробности цены QNE->Close(); QNE->Parameters->Items[0]->Value=IdRasp; QNE->Open(); QNE->First(); while(QNE->Eof==false) {if((((QNECostWithNDS->AsCurrency*100)%1)>0)||(((QNECostWithoutNDS->AsCurrency*100)%1)>0)) {ShowMessage("Сохранение невозможно. \n Сперва приведите значения цен с НДС и без НДС для номенклатурных единиц к целым копейкам."); return; } QNE->Next();} /////////////////////////// /////Запись текста письма в БД vsSQLQw = "DECLARE @IdRasp int, @PermisHdr int;"//, @MailPathAddFiles text, @MailText text ; " //Нельзя создавать переменную типа text " SET @IdRasp =:D0; SET @PermisHdr =:D1;"// SET @MailPathAddFiles =:D2; SET @MailText =:D3; " " UPDATE bm_ListMail SET MailPathAddFiles=:D2, MailText=:D3, DateMod=GetDate(), IdMod= @PermisHdr WHERE IdRasp=@IdRasp "; Qw->Close(); Qw->SQL->Clear(); Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value = IdRasp; Qw->Parameters->Items[1]->Value = PermisHdr.KeyUserStartProgramm; LS->Clear(); pms->Position=0; LS->SaveToStream(pms); pms->Position=0; Qw->Parameters->Items[2]->LoadFromStream(pms,ftMemo); pms->Clear(); pms->Position=0; reContentRTF->Lines->SaveToStream(pms); pms->Position=0; Qw->Parameters->Items[3]->LoadFromStream(pms,ftMemo); pms->Clear(); Qw->ExecSQL(); Qw->Close(); LS->Clear(); RzPanel300->Visible=true; rMail=MainForm->CreateMail(IdRasp,1); ///// рассылаем распоряжение лицам с минимальным порядком очереди fTyrn, но не 0 vsSQLQw=" SELECT MIN(fTurn) FROM bm_ListMail" " WHERE DateDel is null" " AND IdRasp=:D0" " AND ( fType=0 OR fType=2) " " AND fTurn>0" " AND (fResault=0 OR fResault is NULL )"; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value= IdRasp; Qw->Open(); viTmpMINfTurn=Qw->Fields->Fields[0]->AsInteger; QEmplUserDol2->First(); while((QEmplUserDol2->Eof==false)) { if ((Trim(QEmplUserDol2Mail->AsString) != "") && (QEmplUserDol2fTurn->AsInteger == viTmpMINfTurn)) { rMail.ResiveName = QEmplUserDol2FamIO->AsString; rMail.ResiveMailAddress = QEmplUserDol2Mail->AsString; vsSQLQw = "UPDATE bm_ListMail SET DateSheet = GetDate() " "WHERE Idn = :D0;"; Qw->Close(); Qw->SQL->Clear(); Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value = QEmplUserDol2Idn->AsString; Qw->ExecSQL(); MainForm->SendEmail(&rMail); } QEmplUserDol2->Next(); } //Рассылаем замещающим утверждающих QEmplUserDol3->First(); while((QEmplUserDol3->Eof==false)) {if ((Trim(QEmplUserDol3Mail->AsString)!="")&&(QEmplUserDol3fTurn->AsInteger==viTmpMINfTurn)) { rMail.ResiveName=QEmplUserDol3FamIO->AsString; rMail.ResiveMailAddress=QEmplUserDol3Mail->AsString; MainForm->SendEmail(&rMail); } QEmplUserDol3->Next(); } //// ///Выставляем распоряжению состояние-в рассылке- vsSQLQw="UPDATE bm_Rasp SET " " Id24NameStatus=5448350"//На утверждении " ,DateSheet= GetDate() " " ,IdSheet=:D0 " " WHERE Idn=:D1 ; "; Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw); Qw->Parameters->Items[0]->Value= PermisHdr.KeyUserStartProgramm; Qw->Parameters->Items[1]->Value= IdRasp; Qw->ExecSQL(); /// RzPanel300->Visible=false; ShowMessage("Рассылка писем по листу согласования начата."); }// if (pcSoglasovanieRassilka->ActivePage=tsSoglasovanie) if (pcSoglasovanieRassilka->ActivePage==tsRassilka) { MainForm->Sheet(IdRasp); } }
//--------------------------------------------------------------------------- void __fastcall TFormClientRep::ProcHistory(bool All) { AnsiString Title = "ѕросмотр истории изменени¤"; AnsiString FldKey = WrkGData->FieldKey; AnsiString TableName = GetPiece(FldKey,"_ID",1).UpperCase(); int ID = WrkGData->WrkDSet->FieldByName(FldKey)->AsInteger; AnsiString FieldNames; AnsiString TitleNames; AnsiString SS; TDBGridEh* Grid = WrkGData->WrkGrid; TStringList* FieldNamesList = new TStringList(); TStringList* TitleNamesList = new TStringList(); AnsiString AllFieldNames; if (All) { TDBGridColumnsEh* Columns = Grid->Columns; int Cnt = Columns->Count; AnsiString S; bool KeyIncduded = true; for (int i = 0; i < Cnt; i++) { TColumnEh* Column = Columns->Items[i]; if (Column->Visible) { AnsiString X = ","+TranslateName(Column->FieldName); if (!AllFieldNames.Pos(X)) { AllFieldNames += X; FieldNames += X ; SS = Column->Title->Caption; TitleNames += "," + GetPiece(SS, "|",1); SS = GetPiece(SS, "|",2); if (SS != "") TitleNames += "-> " + SS; if (FieldNames.Length() > 230 || TitleNames.Length() > 200) { KeyIncduded = KeyIncduded || FieldNames.Pos("," + FldKey); FieldNames = FieldNames.SubString(2,1000); TitleNames = TitleNames.SubString(2,1000); FieldNames = FieldNames.UpperCase(); FieldNamesList->Add(FieldNames); TitleNamesList->Add(TitleNames); FieldNames = ""; TitleNames = ""; } } } } if (!KeyIncduded) { FieldNames = "," +FldKey + FieldNames + ",STATUS"; TitleNames = ",N записи" + TitleNames + ",—осто¤ние"; } else { FieldNames = FieldNames + ",STATUS"; TitleNames = TitleNames + ",—осто¤ние"; } FieldNames = FieldNames.SubString(2,1000); TitleNames = TitleNames.SubString(2,1000); FieldNames = FieldNames.UpperCase(); FieldNamesList->Add(FieldNames); TitleNamesList->Add(TitleNames); FieldNames = ""; TitleNames = ""; Title = Title + " всех видимых полей"; } else { TColumnEh* Column = Grid->Columns->Items[Grid->Col - 1]; FieldNames = TranslateName(Column->FieldName); SS = Column->Title->Caption; TitleNames = GetPiece(SS, "|",1); SS = GetPiece(SS, "|",2); if (SS != "") TitleNames += "-> " + SS; Title = Title + " пол¤ > "+ TitleNames + " <"; FieldNames = FieldNames.UpperCase(); FieldNamesList->Add(FieldNames); TitleNamesList->Add(TitleNames); } RestValue RestData; if (SimpleSelHistoryID(this, 0,Title,TableName,ID,FieldNamesList,TitleNamesList,RestData)) { // RestoreValue(RestData,!All); } }
//==================================================================== bool reg1test::importReg1test() { //Create and Open File Stream try { THandleStream * hs = new THandleStream( ( int ) regContestFile ); TStringList *sl = new TStringList; sl->LoadFromStream( hs ); if ( !sl->Count ) { return false; } enum reg1Stage {sStart, sHeader, sRemarks, sQSOs} stage = sStart; int nq = 0; int qcount = 0; // and here wade our way through for ( int lineno = 0; lineno < sl->Count; lineno++ ) { String line = sl->Strings[ lineno ].Trim(); if ( line.Length() == 0 ) { continue; } if ( stage == sStart && line == "[REG1TEST;1]" ) { stage = sHeader; continue; } if ( stage == sHeader && line == "[Remarks]" ) { stage = sRemarks; continue; } if ( stage == sRemarks && line.SubString( 1, 12 ) == "[QSORecords;" ) { for ( int i = remarks.size(); i < 4; i++ ) { remarks.push_back( "" ); } ct->entCondx1.setValue( remarks[ 0 ] ); ct->entCondx2.setValue( remarks[ 1 ] ); ct->entCondx3.setValue( remarks[ 2 ] ); ct->entCondx4.setValue( remarks[ 3 ] ); stage = sQSOs; nextBlock = 0; int endq = line.Pos( "]" ); if ( endq == 0 ) { return false; } String snq = line.SubString( 13, endq - 13 ); nq = snq.ToIntDef( 0 ); if ( !nq ) { return false; } continue; } switch ( stage ) { case sStart: { // wait for the start - in case we have an email lead in } break; case sHeader: { // parse out the header line and fill in the contest details if ( !parseHeader( line ) ) return false; } break; case sRemarks: { // read the remarks lines while they still come... if ( !parseRemark( line ) ) return false; } break; case sQSOs: { // parse out the QSO if ( !parseQSO( line ) ) { return false; } qcount++; if ( nq == qcount ) { return true; } } break; default: // there shouldn't be any others break; } } delete sl; } catch ( ... ) { return false; } return true; }
TFarPluginGuard Guard; FarPlugin->GetPluginInfo(pi); } int WINAPI ConfigureW(int item) { DebugAssert(FarPlugin); TFarPluginGuard Guard; return static_cast<int>(FarPlugin->Configure(static_cast<intptr_t>(item))); } HANDLE WINAPI OpenPluginW(int openFrom, intptr_t item) { SELF_TEST( UnicodeString Text = L"text, text text, text text1\ntext text text, text text2\n"; TStringList Lines; Lines.SetCommaText(Text); assert(Lines.GetCount() == 5); UnicodeString Instructions = L"Using keyboard authentication.\x0A\x0A\x0APlease enter your password."; UnicodeString Instructions2 = ReplaceStrAll(Instructions, L"\x0D\x0A", L"\x01"); Instructions2 = ReplaceStrAll(Instructions2, L"\x0A\x0D", L"\x01"); Instructions2 = ReplaceStrAll(Instructions2, L"\x0A", L"\x01"); Instructions2 = ReplaceStrAll(Instructions2, L"\x0D", L"\x01"); Instructions2 = ReplaceStrAll(Instructions2, L"\x01", L"\x0D\x0A"); assert(wcscmp(Instructions2.c_str(), UnicodeString(L"Using keyboard authentication.\x0D\x0A\x0D\x0A\x0D\x0APlease enter your password.").c_str()) == 0); ) DebugAssert(FarPlugin); TFarPluginGuard Guard; return FarPlugin->OpenPlugin(openFrom, item); }
//--------------------------------------------------------------------------- TStringList * __fastcall TWebHelpSystem::GetHelpStrings(const UnicodeString HelpString) { TStringList * Result = new TStringList(); Result->Add(GetViewerName() + L" : " + HelpString); return Result; }
//--------------------------------------------------------------------------- void __fastcall TfrmOpenFTPDialog::SearchFile(AnsiString APath,AnsiString SearchFileName,int Level) { TStringList * DirList = new TStringList; AnsiString FileName; TListItem * Item; AnsiString FileType; try { IdFTP1->ChangeDir(APath); AnsiString CurPath = IdFTP1->RetrieveCurrentDir(); IdFTP1->List(NULL,SearchFileName,true); for(int n = 0;n < IdFTP1->DirectoryListing->Count;n++) { FileName = IdFTP1->DirectoryListing->Items[n]->FileName; if(FileName == "." || FileName == "..") continue; if(IdFTP1->DirectoryListing->Items[n]->ItemType == ditDirectory) { DirList->Add(APath + FileName); } else { //Item = lvFiles->FindCaption(-1,FileName,false,false,false); //if(Item != NULL && strcmp(Item->SubItems->Strings[3].c_str(),CurPath.c_str()) == 0) //{ // continue; //} Item = lvFiles->Items->Add(); Item->Caption = FileName; Item->ImageIndex = IMAGE_FILE; if(IdFTP1->DirectoryListing->Items[n]->Size > 1048576) Item->SubItems->Add(FloatToStr(RoundTo((float)IdFTP1->DirectoryListing->Items[n]->Size / 1048576,-2)) + "MB"); else if(IdFTP1->DirectoryListing->Items[n]->Size > 1024) Item->SubItems->Add(FloatToStr(RoundTo((float)IdFTP1->DirectoryListing->Items[n]->Size / 1024,-2)) + "KB"); else Item->SubItems->Add(IntToStr(IdFTP1->DirectoryListing->Items[n]->Size) +"B"); FileType = ExtractFileExt(FileName); if(FileType != "") Item->SubItems->Add(FileType.SubString(2,FileType.Length() - 1) + "文件"); else Item->SubItems->Add(""); Item->SubItems->Add(IdFTP1->DirectoryListing->Items[n]->ModifiedDate.FormatString("yyyy-mm-dd hh:nn:ss")); Item->SubItems->Add(CurPath); Item->Data = (void *)IdFTP1->DirectoryListing->Items[n]->Size; } } } catch(Exception * E) { Screen->Cursor = crDefault; MessageBox(Handle,E->Message.c_str(),"错误",MB_OK | MB_ICONSTOP); } if(Level > 0) { for(int n = 0;n < DirList->Count;n++) { SearchFile(DirList->Strings[n],SearchFileName,Level - 1); } } delete DirList; }
//=========================================================================== // ヘッダ情報を生成する //=========================================================================== bool __fastcall TAttacheCaseFileEncrypt::CreateHeaderData (TMemoryStream *pms, TStringList *FileList, TStringList *FilePathList, __int64 &AllTotalFileSize) { int i, c; int ret; int Index = 0; int HeaderSizeAddress = 0; TSearchRec sr; String OneLine; String DirPath, FileName; String MsgText; //暗号部トークン const AnsiString Passcode_AttacheCase = "Passcode:AttacheCase\n"; //暗号化ファイルの作成日 AnsiString LastDateTimeString = "LastDateTime:" + DateTimeToStr(Now()) + "\n"; //旧ヘッダーテキストすべて AnsiString Fn_HeaderText; //Unicode用ヘッダーテキストすべて String U_HeaderText; int EncryptHeaderSize = 0; //暗号部ヘッダサイズ char buffer[BUF_SIZE]; char chain_buffer[BUF_SIZE]; TStringList *HeaderDataList; TMemoryStream* tpms; //テンポラリメモリストリーム //----------------------------------- // ヘッダ情報(平文) //----------------------------------- const char charReservedValue[4] = { 0, 0, 0, 0 }; const char charDataSubVersion = ATC_DATA_SUB_VERSION; const char charOptMissTypeLimitsNumOption = intOptMissTypeLimitsNumOption; const char charOptBrokenFileOption = (fOptBrokenFileOption > 0 ? 1 : 0); const char charTokenString[17] = "_AttacheCaseData"; const int DataFileVersion = ATC_DATA_FILE_VERSION; const int AlgorismType = TYPE_ALGORISM_RIJNDAEL; //データサブバージョン : 1byte pms->Write(&charDataSubVersion, sizeof(char)); //予約データ(reserved) : 1byte pms->Write(&charReservedValue, sizeof(char)); //ミスタイプ回数 : 1byte pms->Write(&charOptMissTypeLimitsNumOption, sizeof(char)); //破壊するか否か : 1byte pms->Write(&charOptBrokenFileOption, sizeof(char)); //トークン : 16byte pms->Write(&charTokenString, 16); //データファイルバージョン : 4byte pms->Write(&DataFileVersion, sizeof(int)); //アルゴリズムタイプ : 4byte pms->Write(&AlgorismType, sizeof(int)); //暗号化部分のヘッダデータサイズ(先に確保しておく):4byte HeaderSizeAddress = pms->Position; pms->Write(&EncryptHeaderSize, sizeof(int)); //----------------------------------- // ヘッダ情報(暗号化部分) //----------------------------------- //進捗状況表示 ProgressPercentNum = -1; //'暗号化するファイルリストの生成中...' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_LISTING); //ヘッダデータリスト(文字列) HeaderDataList = new TStringList; //パスワード HeaderDataList->Add(Passcode_AttacheCase); //作成日 HeaderDataList->Add(LastDateTimeString); for ( i = 0; i < FileList->Count; i++ ){ //ファイル if (FileExists(FileList->Strings[i]) == true) { DirPath = ExtractFileDir(FileList->Strings[i]); FileName = ExtractFileName(FileList->Strings[i]); ProgressMsgText = FileName; //処理中のファイル名 AllTotalFileSize += GetFileInfoList(Index, DirPath, FileName, FileList->Strings[i], FilePathList, HeaderDataList); } //ディレクトリ else{ DirPath = ExtractFileDir(FileList->Strings[i]); FileName = ExtractFileName(FileList->Strings[i]); ProgressMsgText = FileName; //処理中のファイル名 //トップディレクトリ GetFileInfoList(Index, DirPath, FileName, FileList->Strings[i], FilePathList, HeaderDataList); //その配下 AllTotalFileSize += GetFileInfoList(Index, FileList->Strings[i], "", FileList->Strings[i], FilePathList, HeaderDataList); } //ユーザーキャンセル if (Terminated == true) { delete HeaderDataList; return(false); } }// end for; //進捗状況表示 ProgressPercentNum = -1; //'ヘッダデータを書き込んでいます...' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_ENCRYPTING_LIST); ProgressMsgText = ""; //メモリストリームへ書き込み tpms = new TMemoryStream; //------------------------------------------------ // 暗号化時にヘッダデータの互換性維持 //--------------------------------------------------- HeaderDataList->SaveToStream(tpms, TEncoding::GetEncoding(932)); //新バージョン(ver.2.8.0~)用(UTF-8)に保存 for (i = 0; i < HeaderDataList->Count; i++) { HeaderDataList->Strings[i] = StringReplace(HeaderDataList->Strings[i],"Fn_","U_",TReplaceFlags()<<rfIgnoreCase ); } HeaderDataList->SaveToStream(tpms, TEncoding::UTF8); delete HeaderDataList; //----------------------------------- //ヘッダ情報の暗号化 //----------------------------------- //暗号化の準備 gentables(); //キー入力 gkey( 8, 8, key); for (i = 0; i < BUF_SIZE; i++) { buffer[i] = 0; } //初期化ベクトル(IV)を生成 fillrand(chain_buffer, BUF_SIZE); pms->Write(chain_buffer, BUF_SIZE); //先頭にポインタを戻す tpms->Seek((__int64)0, TSeekOrigin::soBeginning); EncryptHeaderSize = 0; //CBCモードで書き込む while (tpms->Read( buffer, BUF_SIZE ) != NULL){ EncryptHeaderSize += BUF_SIZE; // xor for ( i = 0; i < BUF_SIZE; i++ ){ buffer[i] ^= chain_buffer[i]; } // rijndael rijndael_encrypt(buffer); pms->Write(buffer, BUF_SIZE); //CBC&バッファの初期化 for ( i = 0; i < BUF_SIZE; i++ ){ chain_buffer[i] = buffer[i]; buffer[i] = 0; } //ユーザーキャンセル if (Terminated == true) { delete tpms; return(false); } }//loop; delete tpms; //暗号化部分のヘッダデータサイズ(確保しておいた場所へ改めて書き込む) pms->Position = HeaderSizeAddress; pms->Write(&EncryptHeaderSize, sizeof(int)); //先頭にポインタを戻す pms->Seek((__int64)0, TSeekOrigin::soBeginning); return(true); }//end CreateHeaderData;
void FavoriteDirsPage::handleDragDrop(const TStringList& files) { for(TStringIterC i = files.begin(); i != files.end(); ++i) if(PathIsDirectory(i->c_str())) addDirectory(*i); }
//=========================================================================== //スレッド実行 //=========================================================================== void __fastcall TAttacheCaseFileDecrypt2::Execute() { int i, c, len; float ProgressPercentNumF; //進捗パーセンテージ(浮動小数点) // バッファ char source_buffer[BUF_SIZE]; char temp_buffer[BUF_SIZE]; char chain_buffer[BUF_SIZE]; char output_buffer[LARGE_BUF_SIZE]; char *headerbuffer; //パスワード bool fPasswordOk; //const int KeyArrayNum = sizeof(key)/sizeof(key[0]); String FilePath, FileName; // ファイルストリーム TFileStream *fsIn; TFileStream *fsOut; bool fInputFileOpen = false; bool fOutputFileOpen = false; float free_space_required; __int64 CurrentPos, TotalSize; __int64 CurrentDriveFreeSpaceSize; //処理する合計サイズ AllTotalSize = 0; int ret; //バッファ出力の返値 int FileIndex = 0; char token[17] = {0, }; const char charTokenString[17] = "_AttacheCaseData"; //復号の正否に使う const char charBrokenToken[17] = "_Atc_Broken_Data"; //ファイルが破壊されていることを示すトークン String AtcFileTokenString; //暗号化ファイルのトークン(文字列) String AtcFileCreateDateString; //暗号化ファイルの生成日時(文字列) //「復号したファイルを関連付けされたソフトで開く」一時的な設定 fTempOpenFile = fOpenFile; //フォルダーを一度開いたか(深いフォルダーすべてを開かないように) fOpenFolderOnce = false; // 出力するディレクトリ OutDirPath = IncludeTrailingPathDelimiter(OutDirPath); String TempRelativePath; // 平文ヘッダサイズ(データサブバージョン、破壊設定など) int PlainHeaderSize = 0; // 暗号化部分のヘッダサイズ int EncryptHeaderSize = 0; int DataVersion; // ver.2.00~は "5", ver.2.70~は "6" int AlgorismType; char reserved; // 0 //int TypeLimits; // ミスタイプ回数 0~10 (グローバル:public宣言とした) //bool fDestroy; // 破壊するか否か 0 or 1 (グローバル:public宣言とした) String PrefixString; //ファイルリストの接頭辞(Fn_*, U_*) int flush, status; // zlib z_stream z; // zlibライブラリとやりとりするための構造体 bool fInputEnd = false; // 入力ストリームの終了 //ヘッダデータから必要情報を取り出すための TMemoryStream *pms; // メモリストリーム int idx; TStringList *DataList; TStringList *tsv; TStringList *FileList = new TStringList(); // 0: ファイル名 __int64 *FileSizeList = 0; // 1: ファイルサイズ(フォルダは-1) int *FileAttrList = 0; // 2: 属性 int *FileDtChangeList = 0; // 3: 更新日 int *FileTmChangeList = 0; // 4: 更新時 int *FileDtCreateList = 0; // 5: 作成日 int *FileTmCreateList = 0; // 6: 作成時 int rest; int buf_size; //---------------------------------------------------------------------- // 平文のヘッダ内容チェック try { fsIn = new TFileStream(AtcFilePath, fmOpenRead | fmShareDenyNone); } catch(...) { //'復号するファイルを開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_OPEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } fInputFileOpen = true; // 平文ヘッダサイズを取得 fsIn->Read(&PlainHeaderSize, sizeof(int)); // トークンを取得 fsIn->Read(token, 16); if (StrComp(token, charTokenString) != 0 ) { //-------------------------------------------------------- //実は自己実行形式ファイル?(拡張子偽装されている場合も) //-------------------------------------------------------- // サイズを再取得 fsIn->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd); fsIn->Read(&AllTotalSize, sizeof(__int64)); // 位置を戻す fsIn->Seek(-(AllTotalSize + sizeof(__int64)), TSeekOrigin::soEnd); // もう一度、平文ヘッダサイズを読み込む fsIn->Read(&PlainHeaderSize, sizeof(int)); // もう一度、トークンを取得 fsIn->Read(token, 16); // トークンを再チェック if (StrComp(token, charTokenString) != 0 ) { if ( StrComp(token, charBrokenToken) == 0 ) { //'復号するファイルを開けません。この暗号化ファイルは破壊されています。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_BROKEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } else { // '暗号化ファイルではありません。アタッシェケースによって暗号化されたファイルでないか、'+#13+ // 'ファイルが壊れている可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_NOT_ATC); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } goto LabelError; } } //----------------------------------- // データバージョンチェック //----------------------------------- DataVersion = -1; fsIn->Read(&DataVersion, sizeof(int)); if (DataVersion > ATC_DATA_FILE_VERSION && DataVersion < 200) { //'データバージョンがちがいます。復号できません。'+#13+ //'ファイルは上位バージョンのアタッシェケースで暗号化されています。'+#13+ //'最新版を入手して復号を試みてください。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_HIGHER_VERSION); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } else if (DataVersion <= 103) { // Blowfishで暗号化されたファイル // 正式版では正常に復号されるが、ここではエラーとする //'データバージョンがちがいます。復号できません。'+#13+ //'ファイルはver.1のアタッシェケースで暗号化されています。'+#13+ //'古いバージョン(ver.2.75以前)か正式版を入手して復号を試みてください。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_LOWER_VERSION); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } else { // 104 ~ // Rijndaelで暗号化されている // アルゴリズムタイプ fsIn->Read(&AlgorismType, sizeof(int)); // ヘッダサイズを読み込む fsIn->Read(&EncryptHeaderSize, sizeof(int)); // int型からポインタキャストでchar配列を取り出す headerbuffer = (char*) & PlainHeaderSize; // データサブバージョンチェック(ver.2.70~) if (headerbuffer[0] >= 6) { TypeLimits = (int)headerbuffer[2]; fDestroy = (bool)headerbuffer[3]; // 有効範囲(1~10)かチェック if (TypeLimits < 1 || 10 < TypeLimits) { TypeLimits = 3; // デフォルト } } else { // headerbuffer[0] == 5 //旧バージョン TypeLimits = 3; fDestroy = false; } } //----------------------------------- // 復号の準備 //----------------------------------- // テーブル生成 gentables(); // パスワードのセット gkey(8, 8, key); //----------------------------------- // 暗号部ヘッダの復号 //----------------------------------- pms = new TMemoryStream; // IVの読み込み fsIn->Read(chain_buffer, BUF_SIZE); len = 0; while (len < EncryptHeaderSize) { // 読み出しバッファ for (c = 0; c < BUF_SIZE; c++) { source_buffer[c] = 0; } // 暗号化されたデータブロックの読み出し len += fsIn->Read(source_buffer, BUF_SIZE); for (c = 0; c < BUF_SIZE; c++) { // あとのxorのためによけておく temp_buffer[c] = source_buffer[c]; } // 復号処理 rijndael_decrypt(source_buffer); // xor for (c = 0; c < BUF_SIZE; c++) { source_buffer[c] ^= chain_buffer[c]; chain_buffer[c] = temp_buffer[c]; // CBC } pms->Write(source_buffer, BUF_SIZE); } pms->Seek((__int64)0, TSeekOrigin::soBeginning); //ポインタを先頭へ戻す DataList = new TStringList; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); // shift-jis //----------------------------------- // 復号正否(復号できたか) //----------------------------------- //MsgText = DataList->Strings[0]; //MsgType = mtError; //MsgButtons = TMsgDlgButtons() << mbOK; //MsgDefaultButton = mbOK; //Synchronize(&PostConfirmMessageForm); if (DataList->Count == 0 || DataList->Strings[0].Pos("AttacheCase") == 0) { fPasswordOk = false; } else{ fPasswordOk = true; //パスワード合致 } if ( fPasswordOk == false ) { //'パスワードがちがいます。復号できません。'+#13+ //'場合によってはファイルが壊れている可能性もあります。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_PASSWORD_WRONG); if ( fCompare == true ) { //メッセージに'コンペアに失敗しました。'を追加 MsgText += "\n" + LoadResourceString(&Msgdecrypt::_MSG_ERROR_COMPARE_FILE); } MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } //----------------------------------- // 復号時のエンコーディング判定 //----------------------------------- pms->Position = 0; //DataList->LoadFromStream(pms, TEncoding::UTF8); DataList->LoadFromStream(pms, TEncoding::GetEncoding(65001)); PrefixString = "Fn_"; for (i = 0; i < DataList->Count; i++) { if ( DataList->Strings[i].Pos("U_0") == 1){ PrefixString = "U_"; //新バージョン(ver.2.8.0~)で暗号化されているようだ break; } } // Unicodeではないので従来のShift-JISで再度読み直し if (PrefixString == "Fn_") { pms->Position = 0; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); } //=================================== // デバッグ //ShowMessage(DataList->Text); //=================================== #ifdef _DEBUG DataList->SaveToFile(OutDirPath + ExtractFileName(AtcFilePath) + ".txt"); #endif delete pms; //----------------------------------- // 暗号化ファイルの生成日時 //----------------------------------- //※特に今は使用していないが、将来的に // 期限付きでファイルを復号できなくなる // などの機能を追加しても良いかも。 //----------------------------------- AtcFileCreateDateString = DataList->Strings[1]; //----------------------------------- // ヘッダデータからファイルリストや // ファイル情報などを各変数を動的確保 //----------------------------------- FileSizeList = new __int64[DataList->Count]; // 1: ファイルサイズ(フォルダは-1) FileAttrList = new int[DataList->Count]; // 2: 属性 FileDtChangeList = new int[DataList->Count]; // 3: 更新日 FileTmChangeList = new int[DataList->Count]; // 4: 更新時 FileDtCreateList = new int[DataList->Count]; // 5: 作成日 FileTmCreateList = new int[DataList->Count]; // 6: 作成時 DataList->NameValueSeparator = ':'; tsv = new TStringList; tsv->Delimiter = '\t'; tsv->StrictDelimiter = true; char lpPath[MAX_PATH]; for (i = 0; i < DataList->Count; i++) { idx = DataList->IndexOfName(PrefixString+IntToStr(i)); if (idx > 0) { tsv->DelimitedText = DataList->ValueFromIndex[idx]; // ディレクトリ・トラバーサル対策(ver.2.8.5.0~) bool fDirectoryTraversal = false; AnsiString CanonicalizePath = AnsiString(OutDirPath + tsv->Strings[0]); if (CanonicalizePath.Length() < MAX_PATH) { // ファイルパスを正規化 if (PathCanonicalize(lpPath, CanonicalizePath.c_str()) == true) { // 正規化したパスが保存先と一致するか if (AnsiString(lpPath).Pos(OutDirPath) != 1 ){ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } if (fDirectoryTraversal == true) { //'不正なファイルパスが含まれています。復号できません。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_INVALID_FILE_PATH) + "\n" + CanonicalizePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } FileList->Add(tsv->Strings[0]); // 0: ファイルパス FileSizeList[i] = StrToIntDef(tsv->Strings[1], -1); // 1: ファイルサイズ(フォルダは-1) FileAttrList[i] = StrToIntDef(tsv->Strings[2], -1); // 2: 属性 FileDtChangeList[i] = StrToIntDef(tsv->Strings[3], -1);// 3: 更新日 FileTmChangeList[i] = StrToIntDef(tsv->Strings[4], -1);// 4: 更新時 FileDtCreateList[i] = StrToIntDef(tsv->Strings[5], -1);// 5: 作成日 FileTmCreateList[i] = StrToIntDef(tsv->Strings[6], -1);// 6: 作成時 } } delete tsv; delete DataList; //----------------------------------- //ディスクの空き容量チェック //----------------------------------- CurrentDriveFreeSpaceSize = GetDiskFreeSpaceNum(OutDirPath); if (CurrentDriveFreeSpaceSize > -1 && fCompare == false) { if ( AllTotalSize > CurrentDriveFreeSpaceSize ) { //'復号する先のドライブの空き容量が足りません。'+#13+ //'復号するには、約%dMBの空き容量が必要です。復号処理を中止します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_DRIVE_NO_FREE_SPACE); free_space_required = (float)AllTotalSize/1024/1024; // MB MsgText = String().sprintf(MsgText.c_str(), free_space_required); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } else{ // OK! // } //----------------------------------- //複数フォルダ/ファイルを開こうとしているので確認 //----------------------------------- //復号したファイルを関連付けされたソフトで開くか if ( fTempOpenFile == true && FileList->Count > 4 && fCompare == false) { //'5つ以上のファイルを復号後に開こうとしていますが、処理を続けますか?'+#13+ //'「いいえ」を選択すると、開かず復号します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OPEN_DECRYPTED_FILES); MsgType = mtConfirmation; MsgButtons = TMsgDlgButtons() << mbYes << mbNo << mbCancel; MsgDefaultButton = mbCancel; Synchronize(&PostConfirmMessageForm); if ( MsgReturnVal == mrCancel ) { goto LabelStop; } else if ( MsgReturnVal == mrNo ) { fTempOpenFile = true; } } //----------------------------------- // 復号開始 //----------------------------------- if (fCompare == false) { //'復号しています...' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_DECRYPTING); ProgressMsgText = ExtractFileName(AtcFilePath); } else{ //'コンペアしています...' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPARING); ProgressMsgText = ExtractFileName(AtcFilePath); } // ファイル(データ本体)サイズを取得する AllTotalSize = fsIn->Size - fsIn->Position + 1; // 初期化ベクトルの読み出し TotalSize = fsIn->Read(chain_buffer, BUF_SIZE); // zlib 前準備 // 圧縮においてすべてのメモリ管理をライブラリに任せる z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; if (inflateInit(&z) != Z_OK) { // エラー // zlibエラーは最後でまとめてメッセージ処理 goto LabelError; } // 通常は deflate() の第2引数は Z_NO_FLUSH にして呼び出す flush = Z_NO_FLUSH; // 入出力バッファ for (i = 0; i < LARGE_BUF_SIZE; i++) { output_buffer[i] = 0; } z.avail_in = 0; // 入力バッファ中のデータのバイト数 z.next_in = Z_NULL; // 入力バッファ中のデータのバイト数 z.next_out = output_buffer; // 出力バッファ残量 z.avail_out = LARGE_BUF_SIZE; // 出力ポインタ(展開するので大きめに) status = Z_OK; while (Terminated == false) { //----------------------------------- // 入力 //----------------------------------- if (z.avail_in == 0) { TotalSize = InputBuffer(len, source_buffer, chain_buffer, fsIn, fInputFileOpen, TotalSize); z.avail_in = len; z.next_in = source_buffer; if ( len == 0 ) { //入力ストリーム終了 fInputEnd = true; } } //----------------------------------- // 展開 //----------------------------------- status = inflate(&z, flush); //----------------------------------- // 処理ステータス //----------------------------------- if ( status == Z_OK ){ if ( z.avail_out == 0 ) { ret = OutputBuffer(output_buffer, LARGE_BUF_SIZE, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileDtChangeList, FileTmChangeList, FileDtCreateList, FileTmCreateList); if ( ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if (ret == -1) { goto LabelError; } else{ goto LabelStop; } }//end if (z.avail_out == 0); } //----------------------------------- // バッファエラー //----------------------------------- else if ( status == Z_BUF_ERROR ) { //出力バッファがいっぱいの可能性 //出力バッファをクリアにして継続させる len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileDtChangeList, FileTmChangeList, FileDtCreateList, FileTmCreateList); if (ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if ( ret == -1) { goto LabelError; } else{ goto LabelStop; } } //----------------------------------- // 終了 //----------------------------------- else if (status == Z_STREAM_END) { break; } //----------------------------------- // エラー //----------------------------------- else{ // #define Z_OK 0 // #define Z_STREAM_END 1 // #define Z_NEED_DICT 2 // #define Z_ERRNO (-1) // #define Z_STREAM_ERROR (-2) // #define Z_DATA_ERROR (-3) // #define Z_MEM_ERROR (-4) // #define Z_BUF_ERROR (-5) // #define Z_VERSION_ERROR (-6) goto LabelError; } //----------------------------------- //進捗状況表示 ProgressPercentNumF = (float)TotalSize/AllTotalSize; ProgressPercentNum = (int)(ProgressPercentNumF*100); if (AllTotalSize < 104857600) { // 100MB未満 ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%"; } else{ ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%"; } if ( fInputEnd == true) { break; } }//while (!Terminated); if (Terminated == true) { //ユーザーキャンセルで抜けてきた goto LabelStop; } //---------------------------------------------------------------------- // 万が一、出力バッファに余りがある場合 //---------------------------------------------------------------------- len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileDtChangeList, FileTmChangeList, FileDtCreateList, FileTmCreateList); if ( ret == 0 ) { } else if ( ret == -1 ){ goto LabelError; } else{ goto LabelStop; } if (inflateEnd(&z) != Z_OK) { goto LabelError; } ProgressPercentNum = 100; //'完了' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPLETE); ProgressMsgText = ExtractFileName(AtcFilePath); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; // 1: ファイルサイズ(フォルダは-1) delete [] FileAttrList; // 2: 属性 delete [] FileDtChangeList; // 3: 更新日 delete [] FileTmChangeList; // 4: 更新時 delete [] FileDtCreateList; // 5: 作成日 delete [] FileTmCreateList; // 6: 作成時 //復号成功 StatusNum = 1; return; //----------------------------------- //パスワード入力ミスの後始末 //----------------------------------- LabelTypeMiss: ProgressPercentNum = 0; //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileDtChangeList; delete [] FileTmChangeList; delete [] FileDtCreateList; delete [] FileTmCreateList; StatusNum = -1; return; //----------------------------------- //エラーの後始末 //----------------------------------- LabelError: ProgressPercentNum = 0; if ( status < 0 ){ //'zlibライブラリからエラーを返されました。' //'エラー番号:' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_ZLIB) + IntToStr(status) + "\n" + z.msg; if ( fCompare == true ) { //メッセージに'コンペアに失敗しました。'を追加 MsgText += "\n" + LoadResourceString(&Msgdecrypt::_MSG_ERROR_COMPARE_FILE); } MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); if (fCompare == true) { //'コンペアで問題を見つけたようです。'; ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_COMPARE_FAILED); } else{ //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); } if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileDtChangeList; delete [] FileTmChangeList; delete [] FileDtCreateList; delete [] FileTmCreateList; StatusNum = -2; return; //----------------------------------- //ユーザーキャンセルの後始末 //----------------------------------- LabelStop: ProgressPercentNum = 0; //'キャンセル' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_USER_CANCEL); //'復号が中止されました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_STOPPED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileDtChangeList; delete [] FileTmChangeList; delete [] FileDtCreateList; delete [] FileTmCreateList; StatusNum = 0; return; }
void __fastcall TfMain::FormClose(TObject *Sender, TCloseAction &Action) { TFile f; TStringList* sl = new(TStringList); for(int i = 0; i < lvLib->Items->Count; i++) sl->Add(lvLib->Items->Item[i]->SubItems->Strings[0] + '=' + lvLib->Items->Item[i]->SubItems->Strings[1] + '/' + lvLib->Items->Item[i]->SubItems->Strings[2]); sl->SaveToFile(ExtractFileDir(Application->ExeName) + "\\Library.lb"); sl->Clear(); sl->Add("Login="******"Pass="******"Pass="******"RememberPass=1"); else sl->Add("RememberPass=0"); sl->Add("Server=" + leServer->Text); sl->SaveToFile(ExtractFileDir(Application->ExeName) + "\\Settings.ini"); sl->~TStringList(); }
//=========================================================================== //スレッド実行 //=========================================================================== void __fastcall TAttacheCaseFileDecrypt1::Execute() { int i, c, len; float ProgressPercentNumF; //進捗パーセンテージ(浮動小数点) // バッファ char buffer[BUF_SIZE]; char source_buffer[BUF_SIZE]; char temp_buffer[BUF_SIZE]; char output_buffer[LARGE_BUF_SIZE]; char *headerbuffer; //パスワード bool fPasswordOk; String FilePath, FileName; // ファイルストリーム TFileStream *fsIn; TFileStream *fsOut; bool fInputFileOpen = false; bool fOutputFileOpen = false; float free_space_required; __int64 CurrentPos, TotalSize; __int64 CurrentDriveFreeSpaceSize; //処理する合計サイズ AllTotalSize = 0; int ret; //バッファ出力の返値 int FileIndex = 0; //Blowfish CBlowFish *bf; char token[17] = {0, }; const String PrefixString = "Fn_"; const char charTokenString[17] = "_AttacheCaseData"; //復号の正否に使う String AtcFileTokenString; //暗号化ファイルのトークン(文字列) String AtcFileCreateDateString; //暗号化ファイルの生成日時(文字列) //同名ファイル/フォルダーはすべて上書きして復号する //(ユーザーがダイアログで「すべてはい」を選択したとき = true ) fOverwirteYesToAll = false; //「復号したファイルを関連付けされたソフトで開く」一時的な設定 fTempOpenFile = fOpenFile; //フォルダーを一度開いたか(深いフォルダーすべてを開かないように) fOpenFolderOnce = false; // 出力するディレクトリ OutDirPath = IncludeTrailingPathDelimiter(OutDirPath); String TempRelativePath; // 暗号化部分のヘッダサイズ int EncryptHeaderSize = 0; int DataVersion; // ver.2.00~は "5", ver.2.70~は "6" int flush, status; // zlib z_stream z; // zlibライブラリとやりとりするための構造体 bool fInputEnd = false; // 入力ストリームの終了 //ヘッダデータから必要情報を取り出すための TMemoryStream *pms; // メモリストリーム int idx; TStringList *DataList; TStringList *tsv; TStringList *FileList = new TStringList(); // 0: ファイル名 __int64 *FileSizeList = 0; // 1: ファイルサイズ(フォルダは-1) int *FileAttrList = 0; // 2: 属性 int *FileAgeList = 0; // 3: タイムスタンプ int rest; int buf_size; //---------------------------------------------------------------------- // 平文のヘッダ内容チェック try { fsIn = new TFileStream(AtcFilePath, fmOpenRead | fmShareDenyNone); } catch(...) { //'復号するファイルを開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_OPEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } fInputFileOpen = true; // 暗号部ヘッダサイズを取得 fsIn->Read(&EncryptHeaderSize, sizeof(int)); // トークンを取得 fsIn->Read(token, 16); if (StrComp(token, charTokenString) != 0 ) { //-------------------------------------------------------- //実は自己実行形式ファイル?(拡張子偽装されている場合も) //-------------------------------------------------------- // サイズを再取得 fsIn->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd); fsIn->Read(&AllTotalSize, sizeof(__int64)); // 位置を戻す fsIn->Seek(-(AllTotalSize + sizeof(__int64)), TSeekOrigin::soEnd); // もう一度、暗号部ヘッダサイズを取得 fsIn->Read(&EncryptHeaderSize, sizeof(int)); // もう一度、トークンを取得 fsIn->Read(token, 16); // トークンを再チェック if (StrComp(token, charTokenString) != 0 ) { // '暗号化ファイルではありません。アタッシェケースによって暗号化されたファイルでないか、'+#13+ // 'ファイルが壊れている可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_NOT_ATC); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } else{ AllTotalSize = fsIn->Size; } //----------------------------------- // データバージョンチェック //----------------------------------- DataVersion = -1; fsIn->Read(&DataVersion, sizeof(int)); if (DataVersion <= 103) { // Blowfishで暗号化されたファイル } else{ //'バージョンがちがいます。復号できません。'+#13+ //'ファイルはver.1のアタッシェケースで暗号化されていません。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_NOT_BLOWFISH_ENCRYPTION); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } //----------------------------------- // 復号の準備 //----------------------------------- bf = new CBlowFish; bf->Initialize( KeyString.c_str(), KeyString.Length() ); //初期化 //----------------------------------- // 暗号部ヘッダの復号(ECBモード) //----------------------------------- pms = new TMemoryStream; len = 0; while (len < EncryptHeaderSize) { // 読み出しバッファ for (c = 0; c < BUF_SIZE; c++) { source_buffer[c] = 0; } // 暗号化されたデータブロックの読み出し len += fsIn->Read(source_buffer, BUF_SIZE); // 復号処理 bf->Decode( source_buffer, buffer, BUF_SIZE); pms->Write(buffer, BUF_SIZE); } pms->Seek((__int64)0, TSeekOrigin::soBeginning); //ポインタを先頭へ戻す DataList = new TStringList; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); // shift-jis //----------------------------------- // 復号正否(復号できたか) //----------------------------------- if (DataList->Count == 0 || DataList->Strings[0].Pos("AttacheCase") == 0) { fPasswordOk = false; } else{ fPasswordOk = true; //パスワード合致 } if ( fPasswordOk == false ) { //'パスワードがちがいます。復号できません。'+#13+ //'場合によってはファイルが壊れている可能性もあります。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_PASSWORD_WRONG); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } //----------------------------------- // 復号時のエンコーディング判定 //----------------------------------- pms->Position = 0; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); // shift-jis //=================================== // デバッグ //ShowMessage(DataList->Text); //=================================== delete pms; //----------------------------------- // 暗号化ファイルの生成日時 //----------------------------------- //※特に今は使用していないが、将来的に // 期限付きでファイルを復号できなくなる // などの機能を追加しても良いかも。 //----------------------------------- AtcFileCreateDateString = DataList->Strings[1]; //----------------------------------- // ヘッダデータからファイルリストや // ファイル情報などを各変数を動的確保 //----------------------------------- FileSizeList = new __int64[DataList->Count]; // 1: ファイルサイズ(フォルダは-1) FileAttrList = new int[DataList->Count]; // 2: 属性 FileAgeList = new int[DataList->Count]; // 3: タイムスタンプ DataList->NameValueSeparator = ':'; tsv = new TStringList; tsv->Delimiter = '\t'; tsv->StrictDelimiter = true; char lpPath[MAX_PATH]; for (i = 0; i < DataList->Count; i++) { idx = DataList->IndexOfName(PrefixString+IntToStr(i)); if (idx > 0) { tsv->DelimitedText = DataList->ValueFromIndex[idx]; // ディレクトリ・トラバーサル対策(ver.2.8.5.0~) bool fDirectoryTraversal = false; AnsiString CanonicalizePath = AnsiString(OutDirPath + tsv->Strings[0]); if (CanonicalizePath.Length() < MAX_PATH) { // ファイルパスを正規化 if (PathCanonicalize(lpPath, CanonicalizePath.c_str()) == true) { // 正規化したパスが保存先と一致するか if (AnsiString(lpPath).Pos(OutDirPath) != 1 ){ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } if (fDirectoryTraversal == true) { //'不正なファイルパスが含まれています。復号できません。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_INVALID_FILE_PATH) + "\n" + CanonicalizePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } FileList->Add(tsv->Strings[0]); // 0: ファイルパス FileSizeList[i] = StrToIntDef(tsv->Strings[1], -1); // 1: ファイルサイズ(フォルダは-1) FileAttrList[i] = StrToIntDef(tsv->Strings[2], -1); // 2: 属性 FileAgeList[i] = StrToIntDef(tsv->Strings[3], -1); // 3: タイムスタンプ } } delete tsv; delete DataList; //----------------------------------- //ディスクの空き容量チェック //----------------------------------- CurrentDriveFreeSpaceSize = GetDiskFreeSpaceNum(OutDirPath); if (CurrentDriveFreeSpaceSize > -1) { if ( AllTotalSize > CurrentDriveFreeSpaceSize ) { //'復号する先のドライブの空き容量が足りません。'+#13+ //'復号するには、約%dMBの空き容量が必要です。復号処理を中止します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_DRIVE_NO_FREE_SPACE); free_space_required = (float)AllTotalSize/1024/1024; // MB MsgText = String().sprintf(MsgText.c_str(), free_space_required); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } else{ // OK! // } //----------------------------------- //複数フォルダ/ファイルを開こうとしているので確認 //----------------------------------- //復号したファイルを関連付けされたソフトで開くか if ( fTempOpenFile == true && FileList->Count > 4) { //'5つ以上のファイルを復号後に開こうとしていますが、処理を続けますか?'+#13+ //'「いいえ」を選択すると、開かず復号します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OPEN_DECRYPTED_FILES); MsgType = mtConfirmation; MsgButtons = TMsgDlgButtons() << mbYes << mbNo << mbCancel; MsgDefaultButton = mbCancel; Synchronize(&PostConfirmMessageForm); if ( MsgReturnVal == mrCancel ) { goto LabelStop; } else if ( MsgReturnVal == mrNo ) { fTempOpenFile = true; } } //----------------------------------- // 復号開始 //----------------------------------- //'復号しています...' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_DECRYPTING); ProgressMsgText = ExtractFileName(AtcFilePath); // ファイル(データ本体)サイズを取得する AllTotalSize = fsIn->Size - fsIn->Position + 1; // zlib 前準備 // 圧縮においてすべてのメモリ管理をライブラリに任せる z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; if (inflateInit(&z) != Z_OK) { // エラー // zlibエラーは最後でまとめてメッセージ処理 goto LabelError; } // 通常は deflate() の第2引数は Z_NO_FLUSH にして呼び出す flush = Z_NO_FLUSH; // 入出力バッファ for (i = 0; i < LARGE_BUF_SIZE; i++) { output_buffer[i] = 0; } z.avail_in = 0; // 入力バッファ中のデータのバイト数 z.next_in = Z_NULL; // 入力バッファ中のデータのバイト数 z.next_out = output_buffer; // 出力バッファ残量 z.avail_out = LARGE_BUF_SIZE; // 出力ポインタ(展開するので大きめに) status = Z_OK; while (Terminated == false) { //----------------------------------- // 入力 //----------------------------------- if (z.avail_in == 0) { TotalSize = InputBuffer(bf, len, source_buffer, fsIn, fInputFileOpen, TotalSize); z.avail_in = len; z.next_in = source_buffer; if ( len == 0 ) { //入力ストリーム終了 fInputEnd = true; } } //----------------------------------- // 展開 //----------------------------------- status = inflate(&z, flush); //----------------------------------- // 処理ステータス //----------------------------------- if ( status == Z_OK ){ if ( z.avail_out == 0 ) { ret = OutputBuffer(output_buffer, LARGE_BUF_SIZE, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileAgeList); if ( ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if (ret == -1) { goto LabelError; } else{ goto LabelStop; } }//end if (z.avail_out == 0); } //----------------------------------- // バッファエラー //----------------------------------- else if ( status == Z_BUF_ERROR ) { //出力バッファがいっぱいの可能性 //出力バッファをクリアにして継続させる len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileAgeList); if (ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if ( ret == -1) { goto LabelError; } else{ goto LabelStop; } } //----------------------------------- // 終了 //----------------------------------- else if (status == Z_STREAM_END) { break; } //----------------------------------- // エラー //----------------------------------- else{ // #define Z_OK 0 // #define Z_STREAM_END 1 // #define Z_NEED_DICT 2 // #define Z_ERRNO (-1) // #define Z_STREAM_ERROR (-2) // #define Z_DATA_ERROR (-3) // #define Z_MEM_ERROR (-4) // #define Z_BUF_ERROR (-5) // #define Z_VERSION_ERROR (-6) goto LabelError; } //----------------------------------- //進捗状況表示 ProgressPercentNumF = (float)TotalSize/AllTotalSize; ProgressPercentNum = (int)(ProgressPercentNumF*100); if (AllTotalSize < 104857600) { // 100MB未満 ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%"; } else{ ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%"; } if ( fInputEnd == true) { break; } }//while (!Terminated); if (Terminated == true) { //ユーザーキャンセルで抜けてきた goto LabelStop; } //---------------------------------------------------------------------- // 万が一、出力バッファに余りがある場合 //---------------------------------------------------------------------- len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileAgeList); if ( ret == 0 ) { } else if ( ret == -1 ){ goto LabelError; } else{ goto LabelStop; } if (inflateEnd(&z) != Z_OK) { goto LabelError; } ProgressPercentNum = 100; //'完了' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPLETE); ProgressMsgText = ExtractFileName(AtcFilePath); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; // 1: ファイルサイズ(フォルダは-1) delete [] FileAttrList; // 2: 属性 delete [] FileAgeList; // 3: 更新日 //復号成功 StatusNum = 1; return; //----------------------------------- //パスワード入力ミスの後始末 //----------------------------------- LabelTypeMiss: ProgressPercentNum = 0; //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileAgeList; StatusNum = -1; return; //----------------------------------- //エラーの後始末 //----------------------------------- LabelError: ProgressPercentNum = 0; if ( status < 0 ){ //'zlibライブラリからエラーを返されました。' //'エラー番号:' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_ZLIB) + IntToStr(status) + "\n" + z.msg; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileAgeList; StatusNum = -2; return; //----------------------------------- //ユーザーキャンセルの後始末 //----------------------------------- LabelStop: ProgressPercentNum = 0; //'キャンセル' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_USER_CANCEL); //'復号が中止されました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_STOPPED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileAgeList; StatusNum = 0; return; }
/*-------------------------------------------------------------------*/ zonebase* zonebase::factory (std::string settings) { TStringList argv; //# rect if (settings.substr (0,5)=="rect=") { argv = helper::tokenizer (settings.substr (5),","); if (argv.size() != 4) { throw ("rect= is invalid"); } return new zoneRect (argv.ToFloat(0),argv.ToFloat(1),argv.ToFloat(2),argv.ToFloat(3)); } //# point else if (settings.substr (0,6) == "point=") { argv = helper::tokenizer (settings.substr (6),","); if (argv.size() != 2) { throw ("point= is invalid"); } return new zonePoint (argv.ToFloat(0),argv.ToFloat(1)); } //# circle else if (settings.substr (0,7) == "circle=") { argv = helper::tokenizer (settings.substr (7),","); if (argv.size() != 3) { throw ("circle= is invalid"); } return new zoneCircle(argv.ToFloat(0),argv.ToFloat(1),argv.ToFloat(2)); } //# bitmap else if (settings.substr (0,7) == "bitmap=") { argv = helper::tokenizer (settings.substr (7),","); if (argv.size()==1) { return new zoneBitmap (argv[0].c_str()); } else if (argv.size()==3) { return new zoneBitmap (argv[0].c_str(), argv.ToFloat(1),argv.ToFloat(2)); } else { throw ("bitmap= is invalid"); } } throw helper::errormessage("unknown zone command: %s",settings.c_str()); return NULL; }
//--------------------------------------------------------------------------- bool __fastcall TThreadSubmitToDB::SubmitToOracle() { SECURITY_ATTRIBUTES se = {0}; se.nLength = sizeof(se); se.bInheritHandle = true; se.lpSecurityDescriptor = NULL; CreatePipe(&hReadPipe,&hWritePipe,&se,0); STARTUPINFO si = {0}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdOutput = hWritePipe; si.hStdError = hWritePipe; memset(&pi,sizeof(pi),0); if(CreateProcess(NULL,(ToolPath + " " + DBUserName + "/" + DBPassword + "@" + DBServer + " control=\"" + TempFileName + "\" errors=" + MaxError).c_str(),&se,&se,true,NORMAL_PRIORITY_CLASS,NULL,WorkDir.c_str(),&si,&pi)) { bool bContinue = CloseHandle(hWritePipe); hWritePipe = NULL; char chBuffer[2049]; unsigned long Bytesread; AnsiString Text; int pos = 0; while(bContinue) { bContinue = ReadFile(hReadPipe,&chBuffer[0],2048,&Bytesread,NULL); try { chBuffer[Bytesread] = 0; if(strlen(&chBuffer[0]) > 0) { Text = chBuffer; } //Text = AnsiReplaceStr(AnsiReplaceStr(Text,"\r",""),"\n",""); if(Text != "") { if(MessageTextList->Count > MaxMessageLine) MessageTextList->Clear(); if(SlentMode) { printf("%s\n",Text); } MessageTextList->Add(Text); } pos = GetRowsForSQLLDR(Text); if(pos > -1) { SendMessage(hWnd,MSG_SET_PROCESS_POS,pos,0); } } catch(...) { } } WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); pi.hProcess = NULL; CloseHandle(pi.hThread); CloseHandle(hReadPipe); hReadPipe = NULL; if(MessageTextList->Text.Pos("SQL*Loader-") > 0) { ErrorMessage = "提交数据失败,请查看状态窗口中的出错信息."; return false; } else { int n; AnsiString str;// = "逻辑记录计数"; /*for(n = MessageTextList->Count - 1;n > -1;n--) { Text = MessageTextList->Strings[n]; pos = Text.Pos(str); if(pos > 0) { pos = StrToIntEx(Text.SubString(pos + str.Length(),Text.Length() - str.Length() + 1).c_str()); SendMessage(hWnd,MSG_SET_PROCESS_POS,pos,0); if(pos != TotalRecordCount) { ErrorMessage = "提交的数据行数与转换的行数不一致.转换的数据行数为:" + IntToStr(TotalRecordCount) + ",实际提交的行数为:" + IntToStr(pos) + "."; } break; } } if(n == -1) { ErrorMessage = "找不到SQLLDR关键字.导入失败."; }*/ //分析日志文件 TStringList * LogFile = new TStringList; LogFile->LoadFromFile(ExtractFilePath(Application->ExeName) + DestTableName + ".log"); //if(LogFile->Pos(" str = "成功"; for(n = LogFile->Count - 1;n > -1;n--) { Text = LogFile->Strings[n]; int pos1 = Text.Pos(str); if(pos1 > 0) { pos1 = StrToIntEx(Text.c_str());//Text.SubString(pos1 + str.Length(),Text.Length() - str.Length() + 1).c_str()); if(TotalRecordCount - pos1 > StrToInt(MaxError)) { ErrorMessage = "共有" + IntToStr(TotalRecordCount) + "行需要导入,但实际上只载入了" + IntToStr(pos1) + "行."; } break; } } if(n == -1) { ErrorMessage = "找不到SQLLDR关键字,无法分析日志."; } delete LogFile; //如果导入成功,则继续执行SQL语句 if(ErrorMessage == "" && SQLCommandList != NULL) { for(int n = 0;n < SQLCommandList->Count;n++) { try { if(SlentMode) { printf("正在执行语句:%s\n",SQLCommandList->Strings[n]); } MessageTextList->Add("正在执行语句:" + SQLCommandList->Strings[n]); ADOConnection->Execute(SQLCommandList->Strings[n]); } catch(...){} } } //MessageTextList->Clear(); try { for(int n = 0;n < 10;n++) { try { MessageTextList->LoadFromFile(ExtractFilePath(Application->ExeName) + DestTableName + ".log"); break; } catch(...) { } } MessageTextList->Insert(0,"*********************************数据提交报告*********************************"); MessageTextList->Insert(1,"完成时间:" + FormatDateTime("yyyy-mm-dd hh:nn:ss",Now()) + "."); MessageTextList->Insert(2,"目标表:" + DestTableName); MessageTextList->Insert(3,"临时文件:" + TempFileName); MessageTextList->Insert(4,"共转换了" + IntToStr(TotalRecordCount) + "条记录,导入了" + IntToStr(pos) + "条记录."); MessageTextList->Insert(5,"以下是Oracle 的 SQLLDR 生成的报告:"); } catch(...) { } return true; } } else { CloseHandle(hWritePipe); CloseHandle(hReadPipe); ErrorMessage = "创建SQLLDR进程失败.请检查是否安装了Oracle客户端软件和ibill.ini中[ExternalTools]的sqlldrpath是否配置正确."; return false; } }