Beispiel #1
0
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnPreviewClick(TObject *Sender)
{
  int i,j;
  TJvDesktopAlert* DA;
  TJvDesktopAlertOptions FOptions;

  for (i = 0; i < udWindowCount->Position; i++)
  {
    DA = new TJvDesktopAlert(this);
    DA->Images = imlCustBtns;
    DA->HeaderText = Format("%s (%d)", ARRAYOFCONST((edHeader->Text, FCount)));
    DA->MessageText = edMessage->Text;
    DA->Image = Image1->Picture;
    DA->OnMessageClick = DoMessageClick;
    DA->OnShow = DoAlertShow;
    DA->OnClose = DoAlertClose;
    FOptions = TJvDesktopAlertOptions();
    DA->Options = FOptions;
    DA->Location->AlwaysResetPosition = false;
    DA->Location->Position = static_cast<TJvDesktopAlertPosition>(cbLocation->ItemIndex);
    DA->Location->Width = StrToIntDef(edWidth->Text,0);
    DA->Location->Height = StrToIntDef(edHeight->Text,0);
    if (DA->Location->Position == dapCustom)
    {
      DA->Location->Left = random(Screen->Width - 200);
      DA->Location->Top =  random(Screen->Height - 100);
    }
    DA->AlertStyle = static_cast<TJvAlertStyle>(cmbStyle->ItemIndex);
    DA->StyleHandler->StartInterval = udFadeIn->Position;
    DA->StyleHandler->StartSteps = udStartSteps->Position;
    DA->StyleHandler->DisplayDuration = udWait->Position; //  + Random(WaitTime);
    DA->StyleHandler->EndInterval = udFadeOut->Position;
    DA->StyleHandler->EndSteps = udEndSteps->Position;
    if (chkClickable->Checked)
      FOptions << daoCanClick;
    if (chkMovable->Checked)
      FOptions << daoCanMove;
    if (chkClose->Checked)
      FOptions << daoCanClose;
    DA->Options = FOptions;
    if (chkShowDropDown->Checked)
      DA->DropDownMenu = PopupMenu1;
    for (j = 0; j < udButtons->Position; j++)
    {
      TJvDesktopAlertButtonItem* btn = DA->Buttons->Add();

      btn->ImageIndex = random(imlCustBtns->Count);
      btn->Tag = j;
      btn->OnClick = DoButtonClick;
    }
    DA->Execute();
  }
}
//---------------------------------------------------------------------------
bool __fastcall TForm8::CheckValues()
{
	switch (BeaconDevice1->BeaconType) {
		case TBeaconDeviceMode::Standard:
		case TBeaconDeviceMode::Alternative:
			if (!CheckUUID()) {
				return False;
			}
			break;
		case TBeaconDeviceMode::EddystoneUID:
			SetNamespaceGeneration();
			switch (BeaconDevice1->NamespaceGenerator) {
				case ngNone:
				case ngHashFQDN:
					if (EdtEddyNamespace->Text == "") {
						ShowMessage("Please, enter a valid Namespace");
						EdtEddyNamespace->SetFocus();
						return False;
					}
					break;
				case ngElidedUUID:
					if (!CheckUUID()) {
						return False;
					}
					break;
			}
			if (EdtEddyInstance->Text == "") {
				ShowMessage("Please, enter a valid Instance value");
				EdtEddyNamespace->SetFocus();
				return False;
			}
			break;
		case TBeaconDeviceMode::EddystoneURL:
			if (EdtEddyURL->Text == "") {
				ShowMessage("Please, enter a URL");
				EdtEddyURL->SetFocus();
				return False;
			}
			break;
	}

	FMajor = StrToIntDef(EdtBeaconMajor->Text, 0);
	EdtBeaconMajor->Text = IntToStr(FMajor);
	FMinor = StrToIntDef(EdtBeaconMinor->Text, 0);
	EdtBeaconMinor->Text = IntToStr(FMinor);
	FTxPower = StrToIntDef(EdTxPower->Text, -56);
	EdTxPower->Text = IntToStr(FTxPower);
	FEddyNamespace = EdtEddyNamespace->Text;
	FEddyInstance = EdtEddyInstance->Text;
	FEddyURL = EdtEddyURL->Text;
	return True;
}
//---------------------------------------------------------------------------
bool __fastcall TRawPrint::ValidaComando(AnsiString Comando)
{
 bool Retorno;
 AnsiString Parametro;
 int Indice = 1;
 int Valor;
 try
  {
   for(int i = 0; i < Comando.Length() / 3; i++)//Percorre o Comando
   {
    Parametro = Comando.SubString(Indice, 3);

    if(Indice < 4)
     Indice = Indice + 3 + i;
    else
     Indice = Indice + 3;//Índice de Início do Último Parâmetro (7)

    Valor = StrToIntDef(Parametro, -1); //Verifica se é Inteiro

    if(Valor >= 0 && Valor < 256) //Verifica se o Valor do Parâmetro está de acordo com Manual da Epson
     {
      Retorno = true;
     }
    else
     {
      Retorno = false;
     }
   }
  }
 catch(Exception & E)
  {
   Erro("Erro ao validar Comando informado no Texto.\r\n\r\n" + E.Message + "\r\n");
  }
 return Retorno;
};
Beispiel #4
0
//-----------------------------------------------------------
//return no of times function key {xx y} will be pressed
//strip out count charcters
int GetFunctionKeyCount(CString &fk)
{
	int rv=1;

	int numstart=fk.LastDelimiter(" ");

	if (numstart!=0 && numstart<fk.GetLength())
	{
		//extract count
		rv=StrToIntDef(fk.SubString(numstart,999),-1);

		//valid numeric characters?
		if (rv>=0)
		{
			//strip out count characters
			fk=fk.SubString(1,numstart-1);
		}
		else
		{
			rv=1;
		}
	}

	return rv;
}
Beispiel #5
0
string CWRequest::GetScriptURL(bool bRelative)
{
    if(bRelative)
        return Env->GetValue("SCRIPT_NAME");

    string link = "";
    int server_port = StrToIntDef(Env->GetValue("SERVER_PORT"), -1);

    if(Env->GetValue("HTTPS") == "on")
    {
        link.append("https://");
        link.append(Env->GetValue("SERVER_NAME"));

        if(server_port > 0 && server_port != 443)
            link.append(":" + IntToStr(server_port));
    }
    else
    {
        link.append("http://");
        link.append(Env->GetValue("SERVER_NAME"));
        if(server_port > 0 && server_port != 80)
            link.append(":" + IntToStr(server_port));
    }

    link.append(Env->GetValue("SCRIPT_NAME"));

    return link;
}
Beispiel #6
0
void __fastcall TFormOptions::btnOKClick(TObject *Sender)
{
  FormMain->VideoInterval = StrToIntDef(EditVideoInt->Text, 100);
	FormMain->PenWidth = StrToIntDef(EditPenWidth->Text,2);
  FormMain->Dir_AceToolBox = EditDirAce->Text;
  FormMain->Dir_SegTools = EditDirSeg->Text;
  FormMain->Dir_StoredData = EditDirOut->Text;
  FormMain->SegExe =  EditSegExe->Text;
  FormMain->SegOptions = EditSegOptions->Text;

  FormMain->ActionForward->ShortCut = HotKeyFrameFWD->HotKey;
  FormMain->ActionBackward->ShortCut = HotKeyFrameREW->HotKey;
  FormMain->ActionBBWI->ShortCut = HotKeyBBWI->HotKey;
  FormMain->ActionBBWD->ShortCut = HotKeyBBWD->HotKey;
  FormMain->ActionBBHI->ShortCut = HotKeyBBHI->HotKey;
  FormMain->ActionBBHD->ShortCut = HotKeyBBHD->HotKey;
}
Beispiel #7
0
int TFastIniSection::ReadInteger(AnsiString Key, int Default)
{
    int index = SearchKey(Key);
    if (index >= 0){
        return StrToIntDef(Values(index), Default);
    }else{
        return Default;
    }
}
//---------------------------------------------------------------------------
bool __fastcall TForm8::CheckValues()
{
	try
	{
		FGuid = StringToGUID("{" + EdtBeaconUUID->Text + "}");
	}
	catch (EConvertError &e)
	{
	  ShowMessage(EdtBeaconUUID->Text + " is not a valid UUID value");
	  return False;
	}
	FMajor = StrToIntDef(EdtBeaconMajor->Text, 0);
	EdtBeaconMajor->Text = IntToStr(FMajor);
	FMinor = StrToIntDef(EdtBeaconMinor->Text, 0);
	EdtBeaconMinor->Text = IntToStr(FMinor);
	FTxPower = StrToIntDef(EdTxPower->Text, -56);
	EdTxPower->Text = IntToStr(FTxPower);
	return True;
}
void __fastcall TTimelineMainForm::btnAddClick(TObject *Sender)
{
  TJvTimeItem* aItem;

  aItem             = TimeLine1->Items->Add();
  aItem->Caption    = edCaption->Text;
  aItem->ImageIndex = StrToIntDef(edImIndex->Text, -1);
  aItem->Level      = StrToIntDef(edLevel->Text, 0);
  aItem->Date       = dtpItemDate->Date;
  aItem->Color      = FCurColor;
  if( FCurColor != clWhite )
  {
    aItem->TextColor = clWhite;
  }
  else
  {
    aItem->TextColor = clBlack;
  }

}
Beispiel #10
0
//---------------------------------------------------------------------------
TDrawing::TDrawing(AnsiString S) :
    TList(),
    m_nTool(0),
    m_TmpItem(NULL),
    m_nDragMode(0),
    m_nDragIndex(0),
    m_bDrawRequest(true),
    m_bModified(false),
    m_nPenColor(TColor(0x7fffffff)),
    m_nBrushColor(TColor(-1))
{
    //文字列からデコード
    int count = StrToIntDef(AnsiString("0x") + S.SubString(1, 8), 0);
    int pos = 9;
    for (int i = 0 ; i < count ; i++) {
        int len = StrToIntDef(AnsiString("0x") + S.SubString(pos, 8), 0);
        pos += 8;
        Add(new TDrawingItem(S.SubString(pos, len)));
        pos += len;
    }
}
Beispiel #11
0
long TIniFile::ReadInteger(const wxString &Section, const wxString &Ident,
  long Default)
{
	long result;
	wxString IntStr;
	IntStr = ReadString(Section, Ident, wxT(""));
	// convert a Hex-Value
	if ((Length(IntStr) > 2) && (IntStr.GetChar(1) == '0') &&
	  ((IntStr.GetChar(2) == 'X') || (IntStr.GetChar(2) == 'x')))
		IntStr = wxT("$") + Copy(IntStr, 3, MaxInt);
	result = StrToIntDef(IntStr, Default);
	return result;
}
Beispiel #12
0
//---------------------------------------------------------------------------
void TFileFr::FromDialog(TStorageFile * p)
{
  p->SetFileName(FileEdit->Text);

  if( RotationRB2->Checked )
    p->rotation_type = 1;
  else if( RotationRB3->Checked )
    p->rotation_type = 2;
  else
    p->rotation_type = 0;

  p->rotation_size = StrToIntDef(SizeEdit->Text, 10);
  if( p->rotation_size < 1 )
    p->rotation_size = 1;

  if( MultCB->ItemIndex == -1 )
    p->rotation_mult = 1;
  else
    p->rotation_mult = MultCB->ItemIndex;

  if( MomentCB->ItemIndex == -1 )
    p->rotation_moment = 1;
  else
    p->rotation_moment = MomentCB->ItemIndex;

  p->rotation_hour = StrToIntDef(HourEdit->Text, 0);
  if( p->rotation_hour < 0 || p->rotation_hour > 23 )
    p->rotation_hour = 0;

  if( RenamingRB0->Checked )
    p->rotation_renaming = 0;
  else
    p->rotation_renaming = 1;
  p->rotation_name = NewNameEdit->Text.Trim();
  p->rotation_count = StrToIntDef(CountEdit->Text, 1);
  if( p->rotation_count < 1 )
    p->rotation_count = 1;
}
void __fastcall TfrmPropVisor::UpClickInt(TObject *Sender)
{
  const int inc = 1;
  int value;
  try{
    value = StrToIntDef(((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Text, 1);
  }catch(...){
    return;}
  if( (value + inc) <= ((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Tag )
    value += inc;
  else
    value = ((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Tag;
  ((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Text = FloatToStr(value);
}
Beispiel #14
0
//---------------------------------------------------------------------------
void __fastcall TEditorForm::GoToLine()
{
  UnicodeString Str;
  if (InputDialog(LoadStr(EDITOR_GO_TO_LINE), LoadStr(EDITOR_LINE_NUMBER), Str))
  {
    int Line = StrToIntDef(Str, -1);
    if (Line <= 0 || Line > EditorMemo->Lines->Count)
    {
      throw Exception(MainInstructions(LoadStr(EDITOR_INVALID_LINE)));
    }
    else
    {
      EditorMemo->CaretPos = TPoint(0, Line-1);
    }
  }
}
Beispiel #15
0
bool TController::editLink(TLink *lnk)
{
	if (lnk == NULL) //создание новой ссылки
	{
		TLink *link = new TLink;
		link->szNumber = STR(formLink->teNum->Text);
		link->ulWorkNum = StrToIntDef(formLink->teWorkNum->Text, 0);
		link->dtDate = formLink->dtDate->Date;
		link->center = VController->nowPoint;

		link->slText->Text = formLink->memoTitle->Text;

		bool isCorrect = true;

		for(int i=0; i<selectedKHR->Works.size(); i++)
		{
			 if (link->ulWorkNum == selectedKHR->Works[i]->ulWorkNum)
				isCorrect = false;
		}
		if (link->ulWorkNum == 0)
			isCorrect = false;
		if (isCorrect)
			{
				selectedKHR->Links.push_back(link);
				return true;
			}
		else
			{
				link->ulWorkNum = 100000 + selectedKHR->Links.size() + 1;
//				ShowMessage("Неверная ссылка");
//				delete link;
//				return false;
				selectedKHR->Links.push_back(link);
				return true;
			}
	}
	else // редактирование
	{
		lnk->szNumber = STR(formLink->teNum->Text);
		lnk->ulWorkNum = StrToInt(formLink->teWorkNum->Text);
		lnk->dtDate = formLink->dtDate->Date;
		lnk->center = VController->nowPoint;
		lnk->slText->Text = formLink->memoTitle->Text;
	}
}
Beispiel #16
0
void __fastcall TfrmDSAKeys::btnCreateKeysClick(TObject *Sender)
{
  Screen->Cursor = crHourGlass;
  StatusBar1->SimpleText = "Generating key pair, this may take a while";
  try
  {
    LbDSA1->PrimeTestIterations = (unsigned char) StrToIntDef(edtIterations->Text, 20);
    LbDSA1->KeySize = TLbAsymKeySize(cbxKeySize->ItemIndex);
    LbDSA1->GenerateKeyPair();
    UpdatePrivateKeyFields();
    UpdatePublicKeyFields();
  }
  __finally
  {
    Screen->Cursor = crDefault;
    StatusBar1->SimpleText = "";
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCreateKeysClick(TObject *Sender)
{
  Screen->Cursor = crHourGlass;
  StatusBar1->SimpleText = "Generating key pair, this may take a while";
  try {
    LbRSA1->PrimeTestIterations = StrToIntDef(edtIterations->Text, 20);
    LbRSA1->KeySize = TLbAsymKeySize(cbxKeySize->ItemIndex);
    LbRSA1->GenerateKeyPair();
    edtPublicE->Text  = LbRSA1->PublicKey->ExponentAsString;
    edtPublicM->Text  = LbRSA1->PublicKey->ModulusAsString;
    edtPrivateE->Text = LbRSA1->PrivateKey->ExponentAsString;
    edtPrivateM->Text = LbRSA1->PrivateKey->ModulusAsString;
  }
  catch (...) {
  } // swallow any errors
  Screen->Cursor = crDefault;
  StatusBar1->SimpleText = "";
}
Beispiel #18
0
//---------------------------------------------------------------------------
void __fastcall TSynchronizeChecklistDialog::CreateParams(TCreateParams & Params)
{
  if (!FFormRestored)
  {
    FFormRestored = True;
    UnicodeString WindowParams = CustomWinConfiguration->SynchronizeChecklist.WindowParams;
    bool CustomPos = (StrToIntDef(::CutToChar(WindowParams, L';', true), 0) != 0);

    if (!CustomPos && (Application->MainForm != NULL))
    {
      BoundsRect = Application->MainForm->BoundsRect;
    }
    else
    {
      RestoreForm(WindowParams, this);
    }
  }
  TForm::CreateParams(Params);
}
Beispiel #19
0
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnLaunchClick(TObject *Sender)
{
    TJvIconKind LIcon;
    int LImageIndex;
    int LVisibleTime;
    TControl * LCtrl;

    if (rgrDefaultIcon->ItemIndex >= 0)
        LIcon = static_cast<TJvIconKind>(rgrDefaultIcon->ItemIndex);
    else
        LIcon = ikNone;
    LImageIndex = -1;

    if (LIcon == Jvballoonhint::ikCustom)
    {
        LImageIndex = ilbDefaultImageIndex->ItemIndex;
        if (LImageIndex < 0)
            LIcon = ikNone;
    }

    if (cmbAnchorCtrl->ItemIndex >= 0)
        LCtrl = dynamic_cast<TControl*>(cmbAnchorCtrl->Items->Objects[cmbAnchorCtrl->ItemIndex]);
    else
        LCtrl = NULL;

    LVisibleTime = StrToIntDef(edtVisibleTime->Text, 5000);

    switch(LIcon)
    {
    case ikNone:
        JvBalloonHint1->ActivateHint(LCtrl, memMessage->Text, edtHeader->Text, LVisibleTime);
    case Jvballoonhint::ikCustom:
        JvBalloonHint1->ActivateHint(LCtrl, memMessage->Text, LImageIndex, edtHeader->Text,
                                     LVisibleTime);
    default:
        JvBalloonHint1->ActivateHint(LCtrl, memMessage->Text, LIcon, edtHeader->Text, LVisibleTime);
    }
}
Beispiel #20
0
void TGuiToProfile::_actionTypeSettings()
{
    // Shortcut for readability & convenience:
    TFrameActionTypeSettings* frACTSETS = f_Main->fr_ActionTypeSettings;

    // Shortcut for readability:
    abakt::TConfig::TActions* act = &PProfile->config.Actions;
    #ifdef ABT_TEST
        if (act == NULL) ShowMessage(__FUNC__ ": [act] can not be NULL");
    #endif

	// Zip:
	/*	The cmbx_Zip_... objects get their values from act->Zip,
		so it is safe to use setIndex(). */
	act->Zip->eMethod->setIndex(        _actZipMethod() );
	act->Zip->eStorePath->setIndex(     (TActZipStorePath)frACTSETS->cmbx_Zip_StorePath->ItemIndex );
	act->Zip->iCompression->set(        frACTSETS->ud_Zip_Compression->Position );
	act->Zip->tPassword->value	        = frACTSETS->ed_Zip_Password->Text;
	act->Zip->bSplit->value		        = frACTSETS->cb_Zip_Split->Checked;
	act->Zip->eSplitPreset->setIndex(   frACTSETS->cmbx_Zip_SplitVolumeSizePreset->ItemIndex );
	act->Zip->iSplitCustomSize->set(
        StrToIntDef(frACTSETS->ed_Zip_SplitCustomSize->Text, act->Zip->iSplitCustomSize->getMin()) );
	act->Zip->bAddComment->value        = frACTSETS->cb_Zip_AddComment->Checked;
	act->Zip->tCommentTemplate->value   = frACTSETS->ed_Zip_CommentTemplate->Text;

	// 7-Zip:
	act->SevenZip->tCommandLineTemplate->value  = frACTSETS->ed_7z_Template->Text;
	act->SevenZip->tCommand->value              = frACTSETS->ed_7z_Command->Text;
	act->SevenZip->tArchiveType->value          = frACTSETS->cmbx_7z_ArchiveType->Text;
	act->SevenZip->tPassword->value             = frACTSETS->ed_7z_Password->Text;

	// File:
	act->File->bOverwrite->value            = frACTSETS->cb_File_Overwrite->Checked;
	act->File->bOverwriteReadOnly->value    = frACTSETS->cb_File_OverwriteReadOnly->Checked;
	act->File->bUseRecycleBin->value        = frACTSETS->cb_File_UseRecycleBin->Checked;
//removed 095b1:	act->File->bUseSHFileOperation->value   = frACTSETS->cb_File_UseSHFileOperation->Checked;
	act->File->ePathInformation->setIndex(  (TActZipStorePath)frACTSETS->cmbx_File_PathInformation->ItemIndex );
}
Beispiel #21
0
//---------------------------------------------------------------------
bool __fastcall TSynchronizeChecklistDialog::Execute(TSynchronizeChecklist * Checklist)
{
  FChecklist = Checklist;

  bool Result = (ShowModal() == DefaultResult(this));

  if (Result)
  {
    for (int Index = 0; Index < ListView->Items->Count; Index++)
    {
      TListItem * Item = ListView->Items->Item[Index];
      // const violation !
      TSynchronizeChecklist::TItem * ChecklistItem =
        static_cast<TSynchronizeChecklist::TItem *>(Item->Data);
      ChecklistItem->Checked = Item->Checked;
    }

    TSynchronizeChecklistConfiguration FormConfiguration =
      CustomWinConfiguration->SynchronizeChecklist;
    FormConfiguration.ListParams = ListView->ColProperties->ParamsStr;

    UnicodeString WindowParams = FormConfiguration.WindowParams;
    // if there is no main window, keep previous "custom pos" indication,
    bool CustomPos = (StrToIntDef(::CutToChar(WindowParams, L';', true), 0) != 0);
    if (Application->MainForm != NULL)
    {
      CustomPos = (Application->MainForm->BoundsRect != BoundsRect);
    }
    FormConfiguration.WindowParams =
      FORMAT(L"%d;%s", ((CustomPos ? 1 : 0), StoreForm(this)));

    CustomWinConfiguration->SynchronizeChecklist = FormConfiguration;
  }

  return Result;
}
Beispiel #22
0
//---------------------------------------------------------------------------
TDrawingItem::TDrawingItem(AnsiString S) :
    TList(),
    m_bSelected(true),
    m_bExist(true)
{
    //文字列からデコード
    m_nType = StrToIntDef(AnsiString("0x") + S.SubString(1, 8), 0);
    m_nPenColor = (TColor)StrToIntDef(AnsiString("0x") + S.SubString(9, 8), 0);
    m_nBrushColor = (TColor)StrToIntDef(AnsiString("0x") + S.SubString(17, 8), 0);
    int count = StrToIntDef(AnsiString("0x") + S.SubString(25, 8), 0);

    int pos = 33;
    for (int i = 0 ; i < 4 ; i++) {
        int l = StrToIntDef(AnsiString("0x") + S.SubString(pos, 8), 0);
        pos += 8;
        m_Rect[i] = *(float*)&l;
    }
    for (int i = 0 ; i < count ; i++) {
        Add((void*)StrToIntDef(AnsiString("0x") + S.SubString(pos, 8), 0));
        pos += 8;
    }
}
Beispiel #23
0
//---------------------------------------------------------------------------
void __fastcall TfrmMain::edtCustomAnimationTimeChange(TObject *Sender)
{
    JvBalloonHint1->CustomAnimationTime = StrToIntDef(edtCustomAnimationTime->Text, 0);
}
//===========================================================================
//スレッド実行
//===========================================================================
void __fastcall TAttacheCaseFileDecrypt2::Execute()
{

int i, c, len;
float ProgressPercentNumF;  //進捗パーセンテージ(浮動小数点)

// バッファ
char source_buffer[BUF_SIZE];
char temp_buffer[BUF_SIZE];
char chain_buffer[BUF_SIZE];
char output_buffer[LARGE_BUF_SIZE];
char *headerbuffer;

//パスワード
bool fPasswordOk;
//const int KeyArrayNum = sizeof(key)/sizeof(key[0]);

String FilePath, FileName;

// ファイルストリーム
TFileStream *fsIn;
TFileStream *fsOut;

bool fInputFileOpen = false;
bool fOutputFileOpen = false;

float free_space_required;
__int64 CurrentPos, TotalSize;
__int64 CurrentDriveFreeSpaceSize;

//処理する合計サイズ
AllTotalSize = 0;

int ret;	//バッファ出力の返値
int FileIndex = 0;

char token[17] = {0, };
const char charTokenString[17] = "_AttacheCaseData";         //復号の正否に使う
const char charBrokenToken[17] = "_Atc_Broken_Data";         //ファイルが破壊されていることを示すトークン
String AtcFileTokenString;                                   //暗号化ファイルのトークン(文字列)
String AtcFileCreateDateString;                              //暗号化ファイルの生成日時(文字列)

//「復号したファイルを関連付けされたソフトで開く」一時的な設定
fTempOpenFile = fOpenFile;
//フォルダーを一度開いたか(深いフォルダーすべてを開かないように)
fOpenFolderOnce = false;

// 出力するディレクトリ
OutDirPath = IncludeTrailingPathDelimiter(OutDirPath);

String TempRelativePath;


// 平文ヘッダサイズ(データサブバージョン、破壊設定など)
int PlainHeaderSize = 0;
// 暗号化部分のヘッダサイズ
int EncryptHeaderSize = 0;

int DataVersion;        // ver.2.00~は "5", ver.2.70~は "6"
int AlgorismType;

char reserved;          // 0
//int TypeLimits;       // ミスタイプ回数 0~10  (グローバル:public宣言とした)
//bool fDestroy;        // 破壊するか否か 0 or 1 (グローバル:public宣言とした)

String PrefixString;	  //ファイルリストの接頭辞(Fn_*, U_*)

int flush, status;      // zlib
z_stream z;             // zlibライブラリとやりとりするための構造体
bool fInputEnd = false; // 入力ストリームの終了

//ヘッダデータから必要情報を取り出すための
TMemoryStream *pms;     // メモリストリーム

int idx;
TStringList *DataList;
TStringList *tsv;

TStringList *FileList = new TStringList();  // 0: ファイル名
__int64 *FileSizeList = 0;               // 1: ファイルサイズ(フォルダは-1)
int *FileAttrList     = 0;               // 2: 属性
int *FileDtChangeList = 0;               // 3: 更新日
int *FileTmChangeList = 0;               // 4: 更新時
int *FileDtCreateList = 0;               // 5: 作成日
int *FileTmCreateList = 0;               // 6: 作成時

int rest;
int buf_size;

//----------------------------------------------------------------------
// 平文のヘッダ内容チェック

try {
	fsIn = new TFileStream(AtcFilePath, fmOpenRead | fmShareDenyNone);
}
catch(...) {
	//'復号するファイルを開けません。他のアプリケーションが使用中の可能性があります。'
	MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_OPEN);
	MsgType = mtError;
	MsgButtons = TMsgDlgButtons() << mbOK;
	MsgDefaultButton = mbOK;
	Synchronize(&PostConfirmMessageForm);
	goto LabelError;
}

fInputFileOpen = true;

// 平文ヘッダサイズを取得
fsIn->Read(&PlainHeaderSize, sizeof(int));
// トークンを取得
fsIn->Read(token, 16);

if (StrComp(token, charTokenString) != 0 ) {
	//--------------------------------------------------------
	//実は自己実行形式ファイル?(拡張子偽装されている場合も)
	//--------------------------------------------------------
	// サイズを再取得
	fsIn->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd);
	fsIn->Read(&AllTotalSize, sizeof(__int64));
	// 位置を戻す
	fsIn->Seek(-(AllTotalSize + sizeof(__int64)), TSeekOrigin::soEnd);
	// もう一度、平文ヘッダサイズを読み込む
	fsIn->Read(&PlainHeaderSize, sizeof(int));
	// もう一度、トークンを取得
	fsIn->Read(token, 16);

	// トークンを再チェック
	if (StrComp(token, charTokenString) != 0 ) {

		if ( StrComp(token, charBrokenToken) == 0 ) {
			//'復号するファイルを開けません。この暗号化ファイルは破壊されています。'
			MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_BROKEN);
			MsgType = mtError;
			MsgButtons = TMsgDlgButtons() << mbOK;
			MsgDefaultButton = mbOK;
			Synchronize(&PostConfirmMessageForm);
		}
		else {
			// '暗号化ファイルではありません。アタッシェケースによって暗号化されたファイルでないか、'+#13+
			// 'ファイルが壊れている可能性があります。'
			MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_NOT_ATC);
			MsgType = mtError;
			MsgButtons = TMsgDlgButtons() << mbOK;
			MsgDefaultButton = mbOK;
			Synchronize(&PostConfirmMessageForm);
		}
		goto LabelError;
	}

}

//-----------------------------------
// データバージョンチェック
//-----------------------------------
DataVersion = -1;
fsIn->Read(&DataVersion, sizeof(int));

if (DataVersion > ATC_DATA_FILE_VERSION && DataVersion < 200) {
	//'データバージョンがちがいます。復号できません。'+#13+
	//'ファイルは上位バージョンのアタッシェケースで暗号化されています。'+#13+
	//'最新版を入手して復号を試みてください。';
	MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_HIGHER_VERSION);
	MsgType = mtError;
	MsgButtons = TMsgDlgButtons() << mbOK;
	MsgDefaultButton = mbOK;
	Synchronize(&PostConfirmMessageForm);
	goto LabelError;
}
else if (DataVersion <= 103) {

	// Blowfishで暗号化されたファイル
	// 正式版では正常に復号されるが、ここではエラーとする

	//'データバージョンがちがいます。復号できません。'+#13+
	//'ファイルはver.1のアタッシェケースで暗号化されています。'+#13+
	//'古いバージョン(ver.2.75以前)か正式版を入手して復号を試みてください。';
	MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_LOWER_VERSION);
	MsgType = mtError;
	MsgButtons = TMsgDlgButtons() << mbOK;
	MsgDefaultButton = mbOK;
	Synchronize(&PostConfirmMessageForm);
	goto LabelError;

}
else {

	// 104 ~
	// Rijndaelで暗号化されている

	// アルゴリズムタイプ
	fsIn->Read(&AlgorismType, sizeof(int));
	// ヘッダサイズを読み込む
	fsIn->Read(&EncryptHeaderSize, sizeof(int));
	// int型からポインタキャストでchar配列を取り出す
	headerbuffer = (char*) & PlainHeaderSize;
	// データサブバージョンチェック(ver.2.70~)
	if (headerbuffer[0] >= 6) {
		TypeLimits = (int)headerbuffer[2];
		fDestroy = (bool)headerbuffer[3];
		// 有効範囲(1~10)かチェック
		if (TypeLimits < 1 || 10 < TypeLimits) {
			TypeLimits = 3; // デフォルト
		}
	}
	else { // headerbuffer[0] == 5            //旧バージョン
		TypeLimits = 3;
		fDestroy = false;
	}
}


//-----------------------------------
// 復号の準備
//-----------------------------------

// テーブル生成
gentables();

// パスワードのセット
gkey(8, 8, key);

//-----------------------------------
// 暗号部ヘッダの復号
//-----------------------------------

pms = new TMemoryStream;

// IVの読み込み
fsIn->Read(chain_buffer, BUF_SIZE);

len = 0;

while (len < EncryptHeaderSize) {

	// 読み出しバッファ
	for (c = 0; c < BUF_SIZE; c++) {
		source_buffer[c] = 0;
	}
	// 暗号化されたデータブロックの読み出し
	len += fsIn->Read(source_buffer, BUF_SIZE);

	for (c = 0; c < BUF_SIZE; c++) {
		// あとのxorのためによけておく
		temp_buffer[c] = source_buffer[c];
	}

	// 復号処理
	rijndael_decrypt(source_buffer);

	// xor
	for (c = 0; c < BUF_SIZE; c++) {
		source_buffer[c] ^= chain_buffer[c];
		chain_buffer[c] = temp_buffer[c]; // CBC
	}

	pms->Write(source_buffer, BUF_SIZE);

}

pms->Seek((__int64)0, TSeekOrigin::soBeginning);  //ポインタを先頭へ戻す
DataList = new TStringList;
DataList->LoadFromStream(pms, TEncoding::GetEncoding(932));  // shift-jis

//-----------------------------------
// 復号正否(復号できたか)
//-----------------------------------

//MsgText = DataList->Strings[0];
//MsgType = mtError;
//MsgButtons = TMsgDlgButtons() << mbOK;
//MsgDefaultButton = mbOK;
//Synchronize(&PostConfirmMessageForm);

if (DataList->Count == 0 || DataList->Strings[0].Pos("AttacheCase") == 0) {
	fPasswordOk = false;
}
else{
	fPasswordOk = true;   //パスワード合致
}

if ( fPasswordOk == false ) {
	//'パスワードがちがいます。復号できません。'+#13+
	//'場合によってはファイルが壊れている可能性もあります。';
	MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_PASSWORD_WRONG);
	if ( fCompare == true ) {
		//メッセージに'コンペアに失敗しました。'を追加
		MsgText += "\n" + LoadResourceString(&Msgdecrypt::_MSG_ERROR_COMPARE_FILE);
	}
	MsgType = mtError;
	MsgButtons = TMsgDlgButtons() << mbOK;
	MsgDefaultButton = mbOK;
	Synchronize(&PostConfirmMessageForm);
	delete DataList;
	goto LabelTypeMiss;
}

//-----------------------------------
// 復号時のエンコーディング判定
//-----------------------------------
pms->Position = 0;
//DataList->LoadFromStream(pms, TEncoding::UTF8);
DataList->LoadFromStream(pms, TEncoding::GetEncoding(65001));

PrefixString = "Fn_";
for (i = 0; i < DataList->Count; i++) {
	if ( DataList->Strings[i].Pos("U_0") == 1){
		PrefixString = "U_";	//新バージョン(ver.2.8.0~)で暗号化されているようだ
		break;
	}
}

// Unicodeではないので従来のShift-JISで再度読み直し
if (PrefixString == "Fn_") {
	pms->Position = 0;
	DataList->LoadFromStream(pms, TEncoding::GetEncoding(932));
}

//===================================
// デバッグ
//ShowMessage(DataList->Text);
//===================================

#ifdef _DEBUG
DataList->SaveToFile(OutDirPath + ExtractFileName(AtcFilePath) + ".txt");
#endif

delete pms;


//-----------------------------------
// 暗号化ファイルの生成日時
//-----------------------------------
//※特に今は使用していないが、将来的に
//  期限付きでファイルを復号できなくなる
//  などの機能を追加しても良いかも。
//-----------------------------------
AtcFileCreateDateString = DataList->Strings[1];

//-----------------------------------
// ヘッダデータからファイルリストや
// ファイル情報などを各変数を動的確保
//-----------------------------------

FileSizeList = new __int64[DataList->Count];  // 1: ファイルサイズ(フォルダは-1)
FileAttrList = new int[DataList->Count];      // 2: 属性
FileDtChangeList = new int[DataList->Count];  // 3: 更新日
FileTmChangeList = new int[DataList->Count];  // 4: 更新時
FileDtCreateList = new int[DataList->Count];  // 5: 作成日
FileTmCreateList = new int[DataList->Count];  // 6: 作成時

DataList->NameValueSeparator = ':';

tsv = new TStringList;
tsv->Delimiter = '\t';
tsv->StrictDelimiter = true;

char lpPath[MAX_PATH];

for (i = 0; i < DataList->Count; i++) {
	idx = DataList->IndexOfName(PrefixString+IntToStr(i));
	if (idx > 0) {
		tsv->DelimitedText = DataList->ValueFromIndex[idx];

		// ディレクトリ・トラバーサル対策(ver.2.8.5.0~)
		bool fDirectoryTraversal = false;
		AnsiString CanonicalizePath = AnsiString(OutDirPath + tsv->Strings[0]);

		if (CanonicalizePath.Length() < MAX_PATH) {
			// ファイルパスを正規化
			if (PathCanonicalize(lpPath, CanonicalizePath.c_str()) == true) {
				// 正規化したパスが保存先と一致するか
				if (AnsiString(lpPath).Pos(OutDirPath) != 1 ){
					fDirectoryTraversal = true;
				}
			}
			else{
				fDirectoryTraversal = true;
			}
		}
		else{
			fDirectoryTraversal = true;
		}

		if (fDirectoryTraversal == true) {
			//'不正なファイルパスが含まれています。復号できません。';
			MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_INVALID_FILE_PATH) +
								"\n" + CanonicalizePath;
			MsgType = mtError;
			MsgButtons = TMsgDlgButtons() << mbOK;
			MsgDefaultButton = mbOK;
			Synchronize(&PostConfirmMessageForm);
			delete DataList;
			goto LabelTypeMiss;
		}

		FileList->Add(tsv->Strings[0]);                        // 0: ファイルパス
		FileSizeList[i] = StrToIntDef(tsv->Strings[1], -1);    // 1: ファイルサイズ(フォルダは-1)
		FileAttrList[i] = StrToIntDef(tsv->Strings[2], -1);    // 2: 属性
		FileDtChangeList[i] = StrToIntDef(tsv->Strings[3], -1);// 3: 更新日
		FileTmChangeList[i] = StrToIntDef(tsv->Strings[4], -1);// 4: 更新時
		FileDtCreateList[i] = StrToIntDef(tsv->Strings[5], -1);// 5: 作成日
		FileTmCreateList[i] = StrToIntDef(tsv->Strings[6], -1);// 6: 作成時
	}

}

delete tsv;
delete DataList;


//-----------------------------------
//ディスクの空き容量チェック
//-----------------------------------

CurrentDriveFreeSpaceSize = GetDiskFreeSpaceNum(OutDirPath);

if (CurrentDriveFreeSpaceSize > -1 && fCompare == false) {
	if ( AllTotalSize > CurrentDriveFreeSpaceSize ) {
		//'復号する先のドライブの空き容量が足りません。'+#13+
		//'復号するには、約%dMBの空き容量が必要です。復号処理を中止します。';
		MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_DRIVE_NO_FREE_SPACE);
		free_space_required = (float)AllTotalSize/1024/1024;  // MB
		MsgText = String().sprintf(MsgText.c_str(), free_space_required);
		MsgType = mtError;
		MsgButtons = TMsgDlgButtons() << mbOK;
		MsgDefaultButton = mbOK;
		Synchronize(&PostConfirmMessageForm);
		goto LabelError;
	}
}
else{
	// OK!
	//
}

//-----------------------------------
//複数フォルダ/ファイルを開こうとしているので確認
//-----------------------------------

//復号したファイルを関連付けされたソフトで開くか
if ( fTempOpenFile == true && FileList->Count > 4 && fCompare == false) {

	//'5つ以上のファイルを復号後に開こうとしていますが、処理を続けますか?'+#13+
	//'「いいえ」を選択すると、開かず復号します。';
	MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OPEN_DECRYPTED_FILES);
	MsgType = mtConfirmation;
	MsgButtons = TMsgDlgButtons() << mbYes << mbNo << mbCancel;
	MsgDefaultButton = mbCancel;
	Synchronize(&PostConfirmMessageForm);

	if ( MsgReturnVal == mrCancel ) {
		goto LabelStop;
	}
	else if ( MsgReturnVal == mrNo ) {
		fTempOpenFile = true;
	}

}

//-----------------------------------
// 復号開始
//-----------------------------------

if (fCompare == false) {
	//'復号しています...'
	ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_DECRYPTING);
	ProgressMsgText = ExtractFileName(AtcFilePath);
}
else{
	//'コンペアしています...'
	ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPARING);
	ProgressMsgText = ExtractFileName(AtcFilePath);
}

// ファイル(データ本体)サイズを取得する
AllTotalSize = fsIn->Size - fsIn->Position + 1;
// 初期化ベクトルの読み出し
TotalSize = fsIn->Read(chain_buffer, BUF_SIZE);

// zlib 前準備
// 圧縮においてすべてのメモリ管理をライブラリに任せる
z.zalloc = Z_NULL;
z.zfree = Z_NULL;
z.opaque = Z_NULL;

if (inflateInit(&z) != Z_OK) {
	// エラー
	// zlibエラーは最後でまとめてメッセージ処理
	goto LabelError;
}

// 通常は deflate() の第2引数は Z_NO_FLUSH にして呼び出す
flush = Z_NO_FLUSH;

// 入出力バッファ
for (i = 0; i < LARGE_BUF_SIZE; i++) {
	output_buffer[i] = 0;
}

z.avail_in  = 0;               // 入力バッファ中のデータのバイト数
z.next_in   = Z_NULL;          // 入力バッファ中のデータのバイト数
z.next_out  = output_buffer;   // 出力バッファ残量
z.avail_out = LARGE_BUF_SIZE;  // 出力ポインタ(展開するので大きめに)
status      = Z_OK;

while (Terminated == false) {

	//-----------------------------------
	// 入力
	//-----------------------------------
	if (z.avail_in == 0) {

		TotalSize = InputBuffer(len, source_buffer, chain_buffer, fsIn, fInputFileOpen, TotalSize);
		z.avail_in = len;
		z.next_in = source_buffer;

		if ( len == 0 ) {  //入力ストリーム終了
			fInputEnd = true;
		}

	}

	//-----------------------------------
	// 展開
	//-----------------------------------
	status = inflate(&z, flush);


	//-----------------------------------
	// 処理ステータス
	//-----------------------------------
	if ( status == Z_OK ){

		if ( z.avail_out == 0 ) {

			ret = OutputBuffer(output_buffer, LARGE_BUF_SIZE,
												 fsOut, fOutputFileOpen,
												 FileList, FileIndex,
												 FileSizeList, FileAttrList,
												 FileDtChangeList, FileTmChangeList,
												 FileDtCreateList, FileTmCreateList);

			if ( ret == 0) {
				z.next_out = output_buffer;
				z.avail_out = LARGE_BUF_SIZE;
			}
			else if (ret == -1) {
				goto LabelError;
			}
			else{
				goto LabelStop;
			}

		}//end if (z.avail_out == 0);


	}
	//-----------------------------------
	// バッファエラー
	//-----------------------------------
	else if ( status == Z_BUF_ERROR ) { //出力バッファがいっぱいの可能性

		//出力バッファをクリアにして継続させる
		len = LARGE_BUF_SIZE - z.avail_out;
		ret = OutputBuffer(output_buffer, len,
											 fsOut, fOutputFileOpen,
											 FileList, FileIndex,
											 FileSizeList, FileAttrList,
											 FileDtChangeList, FileTmChangeList,
											 FileDtCreateList, FileTmCreateList);
		if (ret == 0) {
			z.next_out = output_buffer;
			z.avail_out = LARGE_BUF_SIZE;
		}
		else if ( ret == -1) {
			goto LabelError;
		}
		else{
			goto LabelStop;
		}

	}
	//-----------------------------------
	// 終了
	//-----------------------------------
	else if (status == Z_STREAM_END) {
		break;
	}
	//-----------------------------------
	// エラー
	//-----------------------------------
	else{
		// #define Z_OK              0
		// #define Z_STREAM_END      1
		// #define Z_NEED_DICT       2
		// #define Z_ERRNO         (-1)
		// #define Z_STREAM_ERROR  (-2)
		// #define Z_DATA_ERROR    (-3)
		// #define Z_MEM_ERROR     (-4)
		// #define Z_BUF_ERROR     (-5)
		// #define Z_VERSION_ERROR (-6)
		goto LabelError;
	}


	//-----------------------------------
	//進捗状況表示
	ProgressPercentNumF = (float)TotalSize/AllTotalSize;
	ProgressPercentNum = (int)(ProgressPercentNumF*100);
	if (AllTotalSize < 104857600) {	// 100MB未満
		ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%";
	}
	else{
		ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%";
	}

	if ( fInputEnd == true) {
		break;
	}

}//while (!Terminated);

if (Terminated == true) {
	//ユーザーキャンセルで抜けてきた
	goto LabelStop;
}

//----------------------------------------------------------------------
// 万が一、出力バッファに余りがある場合
//----------------------------------------------------------------------

len = LARGE_BUF_SIZE - z.avail_out;
ret = OutputBuffer(output_buffer, len,
									 fsOut, fOutputFileOpen,
									 FileList, FileIndex,
									 FileSizeList, FileAttrList,
									 FileDtChangeList, FileTmChangeList,
									 FileDtCreateList, FileTmCreateList);
if ( ret == 0 ) {
}
else if ( ret == -1 ){
	goto LabelError;
}
else{
	goto LabelStop;
}


if (inflateEnd(&z) != Z_OK) {
	goto LabelError;
}

ProgressPercentNum = 100;
//'完了'
ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPLETE);
ProgressMsgText = ExtractFileName(AtcFilePath);

if ( fInputFileOpen == true ) {
	delete fsIn;
	fInputFileOpen = false;
}
if ( fOutputFileOpen == true ) {
	delete fsOut;
	fOutputFileOpen = false;
}

delete FileList;
delete [] FileSizeList;      // 1: ファイルサイズ(フォルダは-1)
delete [] FileAttrList;      // 2: 属性
delete [] FileDtChangeList;  // 3: 更新日
delete [] FileTmChangeList;  // 4: 更新時
delete [] FileDtCreateList;  // 5: 作成日
delete [] FileTmCreateList;  // 6: 作成時

//復号成功
StatusNum = 1;
return;


//-----------------------------------
//パスワード入力ミスの後始末
//-----------------------------------
LabelTypeMiss:

	ProgressPercentNum = 0;

	//'エラー'
	ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR);
	//'復号に失敗しました。'
	ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED);

	if ( fInputFileOpen == true ) {
		delete fsIn;
		fInputFileOpen = false;
	}
	if ( fOutputFileOpen == true ) {
		delete fsOut;
		fOutputFileOpen = false;
	}

	delete FileList;
	delete [] FileSizeList;
	delete [] FileAttrList;
	delete [] FileDtChangeList;
	delete [] FileTmChangeList;
	delete [] FileDtCreateList;
	delete [] FileTmCreateList;

	StatusNum = -1;
	return;


//-----------------------------------
//エラーの後始末
//-----------------------------------
LabelError:

	ProgressPercentNum = 0;

	if ( status < 0 ){
		//'zlibライブラリからエラーを返されました。'
		//'エラー番号:'
		MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_ZLIB) + IntToStr(status) + "\n" + z.msg;
		if ( fCompare == true ) {
			//メッセージに'コンペアに失敗しました。'を追加
			MsgText += "\n" + LoadResourceString(&Msgdecrypt::_MSG_ERROR_COMPARE_FILE);
		}
		MsgType = mtError;
		MsgButtons = TMsgDlgButtons() << mbOK;
		MsgDefaultButton = mbOK;
		Synchronize(&PostConfirmMessageForm);
	}

	//'エラー'
	ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR);

	if (fCompare == true) {
		//'コンペアで問題を見つけたようです。';
		ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_COMPARE_FAILED);
	}
	else{
		//'復号に失敗しました。'
		ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED);
	}

	if ( fInputFileOpen == true ) {
		delete fsIn;
		fInputFileOpen = false;
	}
	if ( fOutputFileOpen == true ) {
		delete fsOut;
		fOutputFileOpen = false;
	}

	delete FileList;
	delete [] FileSizeList;
	delete [] FileAttrList;
	delete [] FileDtChangeList;
	delete [] FileTmChangeList;
	delete [] FileDtCreateList;
	delete [] FileTmCreateList;

	StatusNum = -2;
	return;


//-----------------------------------
//ユーザーキャンセルの後始末
//-----------------------------------
LabelStop:

	ProgressPercentNum = 0;
	//'キャンセル'
	ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_USER_CANCEL);
	//'復号が中止されました。'
	ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_STOPPED);

	if ( fInputFileOpen == true ) {
		delete fsIn;
		fInputFileOpen = false;
	}
	if ( fOutputFileOpen == true ) {
		delete fsOut;
		fOutputFileOpen = false;
	}

	delete FileList;
	delete [] FileSizeList;
	delete [] FileAttrList;
	delete [] FileDtChangeList;
	delete [] FileTmChangeList;
	delete [] FileDtCreateList;
	delete [] FileTmCreateList;

	StatusNum = 0;
	return;

}
void __fastcall TfrmPropVisor::edtWidthGridYChange(TObject *Sender)
{
  if( StrToIntDef(edtWidthGridY->Text,1) > 0)
    dsgPrevia->GridY->Width = StrToIntDef(edtWidthGridY->Text,1);
}
void __fastcall TfrmPropVisor::edtZoomYChange(TObject *Sender)
{
  if( StrToIntDef(edtZoomY->Text, 100) > 0 )
    dsgPrevia->ZoomAxeY = StrToIntDef(edtZoomY->Text, 100);
}
Beispiel #27
0
DWORD WINAPI _readOutputThread(LPVOID hPipeRead)
// Monitors handle for input. Exits when child exits or pipe breaks.
{
    String str, substr;
    int bsCount = 0;

    CHAR lpBuffer[128];
    DWORD nBytesRead;

    FORMACTION->logB("< --- " + _("Reading Output") + " - " + _("Please wait") + " --- >", 1);
    Application->ProcessMessages();

    while (1)
    {
//      if (_aborted) break;
        if ( !ReadFile(hPipeRead, lpBuffer, sizeof(lpBuffer), &nBytesRead, NULL) )
        {
            if (GetLastError() == ERROR_BROKEN_PIPE)
                break; // pipe done - normal exit path.
            else
            {
                FORMACTION->log(__FUNC__ ": Something bad happened, please report.");
                Application->ProcessMessages();
                break;
            }
        }

        str = str + AnsiString(lpBuffer, nBytesRead);
        str = ecc::ReplaceStr(str, "\r", "");

        // Eat "\b" and the character before "\b":
        int pos = str.Pos("\b");
        bool percCharFound = false;
        String perc = "";
        while (pos && (pos > 1))
        {
            ++bsCount;
            perc = str.SubString(pos - 1, 1) + perc; // Append char in reverse.
            if (bsCount == 4)
            {
                if (perc.Pos("%"))  // If the line is too long perc does not contain a '%'.
                {
                    percCharFound = true;
                    FORMACTION->lbl_ProfilePerc->Caption = perc.Trim();
                    FORMACTION->pb_Profile->Position = StrToIntDef(ecc::ReplaceStr(perc.Trim(), "%", ""), 0);
                    FORMACTION->updateAppTitlePerc();   //092b8
                    Application->ProcessMessages();
                }
                perc = "";
                bsCount = 0;
            }
            str.Delete(pos - 1, 2);
            pos = str.Pos("\b");
        }

        // Split lines:
        pos = str.Pos("\n");
        while (pos)
        {
            substr = str.SubString(1, pos - 1);
            bool suppressLog = false;       //093b1

            // If string starts with "Compressing" calculate and display progress percentage:
            if (substr.Pos("Compressing") == 1)
            {
                if (!PGlobals->LogFullAction)
                    suppressLog = true;     //093b1: Do not log succesful "Compressing..." messages.
                ++__compressingFileCount;
                float perc = ((float)__compressingFileCount / (float)FORMACTION->abtFileList->incFilesTotalCount) * 100;
                if (!percCharFound) { // Since 7z 4.19b the '%' character is not present in the captured output.
                    FORMACTION->lbl_ProfilePerc->Caption = IntToStr((int)perc) + "%";
                    FORMACTION->pb_Profile->Position = (int)perc;
                    FORMACTION->updateAppTitlePerc();   //092b8
                }
            }
            if (!suppressLog)                       //093b1
                FORMACTION->log(substr);            //093b1

            Application->ProcessMessages();
            str.Delete(1, pos);
            pos = str.Pos("\n");
        }
    }

    FORMACTION->logB("< --- " + _("Finished Reading Output") + " --- >", 1);
    Application->ProcessMessages();
    __threadIsRunning = false;
    return 1;
}
//===========================================================================
//スレッド実行
//===========================================================================
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;

}
Beispiel #29
0
//---------------------------------------------------------------------------
void __fastcall RestoreForm(UnicodeString Data, TForm * Form)
{
  assert(Form);
  if (!Data.IsEmpty())
  {
    Forms::TMonitor * Monitor = FormMonitor(Form);

    UnicodeString LeftStr = ::CutToChar(Data, L';', true);
    UnicodeString TopStr = ::CutToChar(Data, L';', true);
    UnicodeString RightStr = ::CutToChar(Data, L';', true);
    UnicodeString BottomStr = ::CutToChar(Data, L';', true);
    TWindowState State = (TWindowState)StrToIntDef(::CutToChar(Data, L';', true), (int)wsNormal);
    int PixelsPerInch = LoadPixelsPerInch(::CutToChar(Data, L';', true));

    TRect Bounds = Form->BoundsRect;
    int Left = StrToDimensionDef(LeftStr, PixelsPerInch, Bounds.Left);
    int Top = StrToDimensionDef(TopStr, PixelsPerInch, Bounds.Top);
    bool DefaultPos = (Left == -1) && (Top == -1);
    if (!DefaultPos)
    {
      Bounds.Left = Left;
      Bounds.Top = Top;
    }
    else
    {
      Bounds.Left = 0;
      Bounds.Top = 0;
    }
    Bounds.Right = StrToDimensionDef(RightStr, PixelsPerInch, Bounds.Right);
    Bounds.Bottom = StrToDimensionDef(BottomStr, PixelsPerInch, Bounds.Bottom);
    Form->WindowState = State;
    if (State == wsNormal)
    {
      // move to the target monitor
      OffsetRect(Bounds, Monitor->Left, Monitor->Top);

      // reduce window size to that of monitor size
      // (this does not cut window into monitor!)
      if (Bounds.Width() > Monitor->WorkareaRect.Width())
      {
        Bounds.Right -= (Bounds.Width() - Monitor->WorkareaRect.Width());
      }
      if (Bounds.Height() > Monitor->WorkareaRect.Height())
      {
        Bounds.Bottom -= (Bounds.Height() - Monitor->WorkareaRect.Height());
      }

      if (DefaultPos ||
          ((Bounds.Left < Monitor->Left) ||
           (Bounds.Left > Monitor->Left + Monitor->WorkareaRect.Width() - 20) ||
           (Bounds.Top < Monitor->Top) ||
           (Bounds.Top > Monitor->Top + Monitor->WorkareaRect.Height() - 20)))
      {
        if (Monitor->Primary)
        {
          if ((Application->MainForm == NULL) || (Application->MainForm == Form))
          {
            Form->Position = poDefaultPosOnly;
          }
          else
          {
            Form->Position = poOwnerFormCenter;
          }
          Form->Width = Bounds.Width();
          Form->Height = Bounds.Height();
        }
        else
        {
          // when positioning on non-primary monitor, we need
          // to handle that ourselves, so place window to center
          Form->SetBounds(Monitor->Left + ((Monitor->Width - Bounds.Width()) / 2),
            Monitor->Top + ((Monitor->Height - Bounds.Height()) / 2),
            Bounds.Width(), Bounds.Height());
          Form->Position = poDesigned;
        }
      }
      else
      {
        Form->Position = poDesigned;
        Form->BoundsRect = Bounds;
      }
    }
    else if (State == wsMaximized)
    {
      Form->Position = poDesigned;

      Bounds = Form->BoundsRect;
      OffsetRect(Bounds, Monitor->Left, Monitor->Top);
      Form->BoundsRect = Bounds;
    }
  }
  else if (Form->Position == poDesigned)
  {
    Form->Position = poDefaultPosOnly;
  }
}