mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
105 lines
3.0 KiB
C++
105 lines
3.0 KiB
C++
// Filename: PPDownloadRequest.cpp
|
|
// Created by: atrestman (14Sept09)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
//
|
|
// All use of this software is subject to the terms of the revised BSD
|
|
// license. You should have received a copy of this license along
|
|
// with this source code in a file named "LICENSE."
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "PPDownloadRequest.h"
|
|
#include "PPInstance.h"
|
|
#include "wstring_encode.h"
|
|
|
|
bool PPDownloadRequest::Begin( )
|
|
{
|
|
m_instance.m_eventStop.ResetEvent( );
|
|
m_instance.m_eventDownloadStopped.ResetEvent( );
|
|
return true;
|
|
}
|
|
|
|
bool PPDownloadRequest::DataNotify( size_t expectedDataSize, const void* data, size_t dataSize )
|
|
{
|
|
bool ret = false;
|
|
if ( m_instance.m_eventStop.m_hObject != NULL )
|
|
{
|
|
if ( ::WaitForSingleObject( m_instance.m_eventStop.m_hObject, 0 ) == WAIT_OBJECT_0 )
|
|
{
|
|
return ret; // canceled by the user
|
|
}
|
|
}
|
|
switch ( this->m_requestType )
|
|
{
|
|
case ( RequestType::P3DObject ):
|
|
{
|
|
if ( m_p3dRequest )
|
|
{
|
|
ret = P3D_instance_feed_url_stream_ptr( m_p3dRequest->_instance,
|
|
m_p3dRequest->_request._get_url._unique_id,
|
|
P3D_RC_in_progress,
|
|
0,
|
|
expectedDataSize,
|
|
data,
|
|
dataSize );
|
|
}
|
|
}
|
|
break;
|
|
case ( RequestType::File ):
|
|
{
|
|
if ( m_hFile == INVALID_HANDLE_VALUE )
|
|
{
|
|
wstring filename_w;
|
|
string_to_wstring(filename_w, m_fileName);
|
|
m_hFile = ::CreateFileW( filename_w.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
|
if ( m_hFile == INVALID_HANDLE_VALUE )
|
|
{
|
|
return ret;
|
|
}
|
|
}
|
|
DWORD numberOfBytesWritten = 0;
|
|
if ( ::WriteFile( m_hFile, data, dataSize, &numberOfBytesWritten, NULL ) == TRUE )
|
|
{
|
|
ret = true;
|
|
}
|
|
}
|
|
break;
|
|
case ( RequestType::Data ):
|
|
{
|
|
if ( m_data )
|
|
{
|
|
std::string bits( static_cast< const char* >( data ), dataSize );
|
|
*m_data << bits;
|
|
ret = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void PPDownloadRequest::ProgressNotify( size_t progress, size_t maxProgress )
|
|
{
|
|
if ( ::IsWindow( m_instance.m_parentWnd ) )
|
|
{
|
|
SendMessage( m_instance.m_parentWnd, WM_PROGRESS, (WPARAM)(progress * 100.0 / maxProgress), 0 );
|
|
}
|
|
}
|
|
|
|
bool PPDownloadRequest::End( )
|
|
{
|
|
if ( m_hFile != INVALID_HANDLE_VALUE )
|
|
{
|
|
::CloseHandle( m_hFile );
|
|
m_hFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
m_instance.m_eventDownloadStopped.SetEvent( );
|
|
return true;
|
|
}
|