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;
}
Exemple #2
0
void PPInstance::HandleRequestGetUrl( void* data )
{
	HRESULT hr( S_OK );
    P3D_request *request = static_cast<P3D_request*>( data );
    if ( !request )
    {
        return;
    }
    int unique_id = request->_request._get_url._unique_id;
    const std::string &url = request->_request._get_url._url;
    CP3DActiveXCtrl* parent = static_cast<CP3DActiveXCtrl*> ( request->_instance->_user_data );

    if ( !parent )
    {
        return;
    }

    nout << "Handling P3D_RT_get_url request from " << url << "\n";
	{
		PPDownloadRequest p3dObjectDownloadRequest( parent->m_instance, request ); 
		PPDownloadCallback bsc( p3dObjectDownloadRequest );
		hr = ::URLOpenStream( parent->GetControllingUnknown(), url.c_str(), 0, &bsc );
	}
    P3D_result_code result_code = P3D_RC_done;
    if ( FAILED( hr ) )
    {
        nout << "Error handling P3D_RT_get_url request" << " :" << hr << "\n"; 
        result_code = P3D_RC_generic_error;
    }

    P3D_instance_feed_url_stream_ptr( 
        request->_instance, 
        request->_request._get_url._unique_id, 
        result_code, 
        0, 
        0, 
        (const void*)NULL, 
        0 
        );
    P3D_request_finish_ptr( request, true );
}