Exemple #1
0
//---------------------------------------------------------------------------
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;
	}
}
Exemple #2
0
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;
    }
}
Exemple #3
0
//---------------------------------------------------------------------------
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;
}
Exemple #5
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);
}
Exemple #7
0
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;

}
Exemple #9
0
// 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;

}
Exemple #14
0
//---------------------------------------------------------------------------
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();
}
Exemple #15
0
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();
}
Exemple #16
0
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);
    
 }
}
Exemple #19
0
//---------------------------------------------------------------------------
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;
}
Exemple #21
0
  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);
}
Exemple #22
0
//---------------------------------------------------------------------------
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;

}
Exemple #27
0
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;

}
Exemple #29
0
/*-------------------------------------------------------------------*/
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;
  }
}