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); } }
//=========================================================================== // ヘッダ情報を生成する //=========================================================================== 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;