mirror of
https://github.com/Team-Resurgent/XBMC4Xbox.git
synced 2026-08-15 11:18:13 -07:00
112 lines
2.9 KiB
C++
112 lines
2.9 KiB
C++
/*
|
|||
|
|
* Copyright (C) 2005-2013 Team XBMC
|
||
|
|
* http://xbmc.org
|
||
|
|
*
|
||
|
|
* This Program is free software; you can redistribute it and/or modify
|
||
|
|
* it under the terms of the GNU General Public License as published by
|
||
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
||
|
|
* any later version.
|
||
|
|
*
|
||
|
|
* This Program is distributed in the hope that it will be useful,
|
||
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
|
* GNU General Public License for more details.
|
||
|
|
*
|
||
|
|
* You should have received a copy of the GNU General Public License
|
||
|
|
* along with XBMC; see the file COPYING. If not, see
|
||
|
|
* <http://www.gnu.org/licenses/>.
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "AsyncFileCopy.h"
|
||
|
|
#include "dialogs/GUIDialogProgress.h"
|
||
|
|
#include "GUIWindowManager.h"
|
||
|
|
#include "URL.h"
|
||
|
|
#include "utils/log.h"
|
||
|
|
|
||
|
|
CAsyncFileCopy::CAsyncFileCopy()
|
||
|
|
{
|
||
|
|
m_cancelled = false;
|
||
|
|
m_succeeded = false;
|
||
|
|
m_running = false;
|
||
|
|
m_percent = 0;
|
||
|
|
m_speed = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
CAsyncFileCopy::~CAsyncFileCopy()
|
||
|
|
{
|
||
|
|
StopThread();
|
||
|
|
}
|
||
|
|
|
||
|
|
bool CAsyncFileCopy::Copy(const CStdString &from, const CStdString &to, const CStdString &heading)
|
||
|
|
{
|
||
|
|
// reset the variables to their appropriate states
|
||
|
|
m_from = from;
|
||
|
|
m_to = to;
|
||
|
|
m_cancelled = false;
|
||
|
|
m_succeeded = false;
|
||
|
|
m_percent = 0;
|
||
|
|
m_speed = 0;
|
||
|
|
m_running = true;
|
||
|
|
CURL url1(from);
|
||
|
|
CURL url2(to);
|
||
|
|
|
||
|
|
// create our thread, which starts the file copy operation
|
||
|
|
Create();
|
||
|
|
CGUIDialogProgress *dlg = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
|
||
|
|
DWORD time = timeGetTime();
|
||
|
|
while (m_running)
|
||
|
|
{
|
||
|
|
m_event.WaitMSec(1000 / 30);
|
||
|
|
if (!m_running)
|
||
|
|
break;
|
||
|
|
// start the dialog up as needed
|
||
|
|
if (dlg && !dlg->IsDialogRunning() && timeGetTime() > time + 500) // wait 0.5 seconds before starting dialog
|
||
|
|
{
|
||
|
|
dlg->SetHeading(heading);
|
||
|
|
dlg->SetLine(0, url1.GetWithoutUserDetails());
|
||
|
|
dlg->SetLine(1, url2.GetWithoutUserDetails());
|
||
|
|
dlg->SetPercentage(0);
|
||
|
|
dlg->StartModal();
|
||
|
|
}
|
||
|
|
// and update the dialog as we go
|
||
|
|
if (dlg && dlg->IsDialogRunning())
|
||
|
|
{
|
||
|
|
CStdString speedString;
|
||
|
|
speedString.Format("%2.2f KB/s", m_speed / 1024);
|
||
|
|
dlg->SetHeading(heading);
|
||
|
|
dlg->SetLine(0, url1.Get());
|
||
|
|
dlg->SetLine(1, url2.Get());
|
||
|
|
dlg->SetLine(2, speedString);
|
||
|
|
dlg->SetPercentage(m_percent);
|
||
|
|
dlg->Progress();
|
||
|
|
m_cancelled = dlg->IsCanceled();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (dlg)
|
||
|
|
dlg->Close();
|
||
|
|
return !m_cancelled && m_succeeded;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool CAsyncFileCopy::OnFileCallback(void *pContext, int ipercent, float avgSpeed)
|
||
|
|
{
|
||
|
|
m_percent = ipercent;
|
||
|
|
m_speed = avgSpeed;
|
||
|
|
m_event.Set();
|
||
|
|
return !m_cancelled;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CAsyncFileCopy::Process()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
m_succeeded = XFILE::CFile::Cache(m_from, m_to, this);
|
||
|
|
}
|
||
|
|
catch (...)
|
||
|
|
{
|
||
|
|
m_succeeded = false;
|
||
|
|
CLog::Log(LOGERROR, "%s: unhandled exception copying file", __FUNCTION__);
|
||
|
|
}
|
||
|
|
m_running = false;
|
||
|
|
}
|