panda3d/direct/src/plugin_activex/PPDownloadRequest.cpp

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;
}