text: // LostOdysseyEncryptionToolDlg.cpp : implementation file
  //
  
  #include "stdafx.h"
  #include "LostOdysseyEncryptionTool.h"
  #include "LostOdysseyEncryptionToolDlg.h"
  #include "LOCrypto.h"
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #endif
  
  
  // CAboutDlg dialog used for App About
  
  class CAboutDlg : public CDialog
  {
  public:
  	CAboutDlg();
  
  // Dialog Data
  	enum { IDD = IDD_ABOUTBOX };
  
  	protected:
  	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  
  // Implementation
  protected:
  	DECLARE_MESSAGE_MAP()
  };
  
  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  {
  }
  
  void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  {
  	CDialog::DoDataExchange(pDX);
  }
  
  BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  END_MESSAGE_MAP()
  
  
  // CLostOdysseyEncryptionToolDlg dialog
  
  
  
  
  CLostOdysseyEncryptionToolDlg::CLostOdysseyEncryptionToolDlg(CWnd* pParent /*=NULL*/)
  	: CDialog(CLostOdysseyEncryptionToolDlg::IDD, pParent)
  {
  	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  }
  
  void CLostOdysseyEncryptionToolDlg::DoDataExchange(CDataExchange* pDX)
  {
  	CDialog::DoDataExchange(pDX);
  	DDX_Control(pDX, IDC_FBTB, FilePathInTheTextBox);
  }
  
  BEGIN_MESSAGE_MAP(CLostOdysseyEncryptionToolDlg, CDialog)
  	ON_WM_SYSCOMMAND()
  	ON_WM_PAINT()
  	ON_WM_QUERYDRAGICON()
  	//}}AFX_MSG_MAP
  	ON_BN_CLICKED(IDC_BROWSEBUTTON, &CLostOdysseyEncryptionToolDlg::OnBnClickedBrowsebutton)
  	ON_BN_CLICKED(IDC_DECRYPTBUTTON, &CLostOdysseyEncryptionToolDlg::OnBnClickedDecryptbutton)
  	ON_BN_CLICKED(IDC_ENCRYPTBUTTON, &CLostOdysseyEncryptionToolDlg::OnBnClickedEncryptbutton)
  END_MESSAGE_MAP()
  
  
  // CLostOdysseyEncryptionToolDlg message handlers
  
  BOOL CLostOdysseyEncryptionToolDlg::OnInitDialog()
  {
  	CDialog::OnInitDialog();
  
  	// Add "About..." menu item to system menu.
  
  	// IDM_ABOUTBOX must be in the system command range.
  	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  	ASSERT(IDM_ABOUTBOX < 0xF000);
  
  	CMenu* pSysMenu = GetSystemMenu(FALSE);
  	if (pSysMenu != NULL)
  	{
  		CString strAboutMenu;
  		strAboutMenu.LoadString(IDS_ABOUTBOX);
  		if (!strAboutMenu.IsEmpty())
  		{
  			pSysMenu->AppendMenu(MF_SEPARATOR);
  			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  		}
  	}
  
  	// Set the icon for this dialog.  The framework does this automatically
  	//  when the application's main window is not a dialog
  	SetIcon(m_hIcon, TRUE);			// Set big icon
  	SetIcon(m_hIcon, FALSE);		// Set small icon
  
  	// TODO: Add extra initialization here
  
  	return TRUE;  // return TRUE  unless you set the focus to a control
  }
  
  void CLostOdysseyEncryptionToolDlg::OnSysCommand(UINT nID, LPARAM lParam)
  {
  	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  	{
  		CAboutDlg dlgAbout;
  		dlgAbout.DoModal();
  	}
  	else
  	{
  		CDialog::OnSysCommand(nID, lParam);
  	}
  }
  
  // If you add a minimize button to your dialog, you will need the code below
  //  to draw the icon.  For MFC applications using the document/view model,
  //  this is automatically done for you by the framework.
  
  void CLostOdysseyEncryptionToolDlg::OnPaint()
  {
  	if (IsIconic())
  	{
  		CPaintDC dc(this); // device context for painting
  
  		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  
  		// Center icon in client rectangle
  		int cxIcon = GetSystemMetrics(SM_CXICON);
  		int cyIcon = GetSystemMetrics(SM_CYICON);
  		CRect rect;
  		GetClientRect(&rect);
  		int x = (rect.Width() - cxIcon + 1) / 2;
  		int y = (rect.Height() - cyIcon + 1) / 2;
  
  		// Draw the icon
  		dc.DrawIcon(x, y, m_hIcon);
  	}
  	else
  	{
  		CDialog::OnPaint();
  	}
  }
  
  // The system calls this function to obtain the cursor to display while the user drags
  //  the minimized window.
  HCURSOR CLostOdysseyEncryptionToolDlg::OnQueryDragIcon()
  {
  	return static_cast<HCURSOR>(m_hIcon);
  }
  
  
  void CLostOdysseyEncryptionToolDlg::OnBnClickedBrowsebutton()
  {
  	CFileDialog dialog(TRUE, "", "", NULL, "", this);
  
  	if (dialog.DoModal() == IDOK) {
  		CString FileName = dialog.GetPathName();
  
  		FilePathInTheTextBox.SetWindowTextA(FileName);
  	}
  }
  
  void CLostOdysseyEncryptionToolDlg::OnBnClickedDecryptbutton()
  {
  	CString n_name;
  	FilePathInTheTextBox.GetWindowTextA(n_name);
  
  	if (strlen(n_name) == 0)
  		return;
  
  	FILE* f = fopen(n_name, "rb+");
  	if (!f) {
  		MessageBox("File dose not exist!", "Error", NULL);
  		return;
  	}
  
  	DWORD datasize = 0;
  	fseek(f, 0, SEEK_END);
  	datasize = ftell(f);
  	rewind(f);
  
  	BYTE* data = new BYTE[datasize];
  	fread(data, 1, datasize, f);
  	fseek(f, 0, SEEK_SET);
  
  	LostOdysseyHeader* p_header = (LostOdysseyHeader*)data;
  
  	if (p_header->Magic1 != 0x56534F4C || p_header->Magic2 != 0xFA07534D) {
  		MessageBox("Invalid Header Magic!", "Error", NULL);
  		free(data);
  		fclose(f);
  		return;
  	}
  
  	CLostOdysseyCrypto* loc = new CLostOdysseyCrypto();
  
  	loc->DecryptData((data + 0x70), bswap32(p_header->EncryptedDataSize));
  	
  	fwrite(data, 1, datasize, f);
  
  	fflush(f);
  	fclose(f);
  
  	MessageBox("Done decrypting data!", "Done", NULL);
  }
  
  void CLostOdysseyEncryptionToolDlg::OnBnClickedEncryptbutton()
  {
  	CString n_name;
  	FilePathInTheTextBox.GetWindowTextA(n_name);
  
  	if (strlen(n_name) == 0)
  		return;
  
  	FILE* f = fopen(n_name, "rb+");
  	if (!f) {
  		MessageBox("File dose not exist!", "Error", NULL);
  		return;
  	}
  
  	DWORD datasize = 0;
  	fseek(f, 0, SEEK_END);
  	datasize = ftell(f);
  	rewind(f);
  
  	BYTE* data = new BYTE[datasize];
  	fread(data, 1, datasize, f);
  	fseek(f, 0, SEEK_SET);
  
  	LostOdysseyHeader* p_header = (LostOdysseyHeader*)data;
  
  	if (p_header->Magic1 != 0x56534F4C || p_header->Magic2 != 0xFA07534D) {
  		MessageBox("Invalid Header Magic!", "Error", NULL);
  		free(data);
  		fclose(f);
  		return;
  	}
  
  	CLostOdysseyCrypto* loc = new CLostOdysseyCrypto();
  
  	p_header->DataChecksum = bswap32(loc->CalculateChecksum((data + 0x70), bswap32(p_header->EncryptedDataSize)));
  	p_header->HeaderChecksum = 0;
  	p_header->HeaderChecksum = bswap32(loc->CalculateChecksum(data, 0x70));
  	loc->EncryptData((data + 0x70), bswap32(p_header->EncryptedDataSize));
  
  	fwrite(data, 1, datasize, f);
  
  	fflush(f);
  	fclose(f);
  
  	MessageBox("Done encrypting data!", "Done", NULL);
  }
  