mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
solve blocking p3d download for ActiveX
This commit is contained in:
parent
c29e31eb2b
commit
3431dd0790
@ -74,7 +74,7 @@ void P3D_NotificationSync(P3D_instance *instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PPInstance::PPInstance( CP3DActiveXCtrl& parentCtrl ) :
|
PPInstance::PPInstance( CP3DActiveXCtrl& parentCtrl ) :
|
||||||
m_parentCtrl( parentCtrl ), m_p3dInstance( NULL ), m_p3dObject( NULL ), m_handleRequestOnUIThread( true ), m_isInit( false )
|
m_parentCtrl( parentCtrl ), m_p3dInstance( NULL ), m_p3dObject( NULL ), m_isInit( false )
|
||||||
{
|
{
|
||||||
// We need the root dir first.
|
// We need the root dir first.
|
||||||
m_rootDir = find_root_dir( );
|
m_rootDir = find_root_dir( );
|
||||||
@ -726,13 +726,18 @@ void PPInstance::HandleRequestLoop() {
|
|||||||
void PPInstance::HandleRequestGetUrl( void* data )
|
void PPInstance::HandleRequestGetUrl( void* data )
|
||||||
{
|
{
|
||||||
HRESULT hr( S_OK );
|
HRESULT hr( S_OK );
|
||||||
P3D_request *request = static_cast<P3D_request*>( data );
|
ThreadedRequestData *trdata = static_cast<ThreadedRequestData*>( data );
|
||||||
|
PPInstance *self = trdata->_self;
|
||||||
|
P3D_request *request = trdata->_request;
|
||||||
|
std::string host_url = trdata->_host_url;
|
||||||
|
delete trdata;
|
||||||
|
|
||||||
if ( !request )
|
if ( !request )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int unique_id = request->_request._get_url._unique_id;
|
int unique_id = request->_request._get_url._unique_id;
|
||||||
const std::string &url = request->_request._get_url._url;
|
std::string url = request->_request._get_url._url;
|
||||||
CP3DActiveXCtrl* parent = static_cast<CP3DActiveXCtrl*> ( request->_instance->_user_data );
|
CP3DActiveXCtrl* parent = static_cast<CP3DActiveXCtrl*> ( request->_instance->_user_data );
|
||||||
|
|
||||||
if ( !parent )
|
if ( !parent )
|
||||||
@ -741,6 +746,31 @@ void PPInstance::HandleRequestGetUrl( void* data )
|
|||||||
}
|
}
|
||||||
|
|
||||||
nout << "Handling P3D_RT_get_url request from " << url << "\n";
|
nout << "Handling P3D_RT_get_url request from " << url << "\n";
|
||||||
|
|
||||||
|
// Convert a relative URL into a full URL.
|
||||||
|
size_t colon = url.find(':');
|
||||||
|
size_t slash = url.find('/');
|
||||||
|
if (colon == std::string::npos || colon > slash) {
|
||||||
|
// Not a full URL, so it's a relative URL. Prepend the current
|
||||||
|
// URL.
|
||||||
|
if (url.empty() || url[0] == '/') {
|
||||||
|
// It starts with a slash, so go back to the root of this
|
||||||
|
// particular host.
|
||||||
|
colon = host_url.find(':');
|
||||||
|
if (colon != std::string::npos &&
|
||||||
|
colon + 2 < host_url.size() &&
|
||||||
|
host_url[colon + 1] == '/' && host_url[colon + 2] == '/') {
|
||||||
|
slash = host_url.find('/', colon + 3);
|
||||||
|
url = host_url.substr(0, slash) + url;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// It doesn't start with a slash, so it's relative to this
|
||||||
|
// page.
|
||||||
|
url = host_url + url;
|
||||||
|
}
|
||||||
|
nout << "Made fullpath: " << url << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
PPDownloadRequest p3dObjectDownloadRequest( parent->m_instance, request );
|
PPDownloadRequest p3dObjectDownloadRequest( parent->m_instance, request );
|
||||||
PPDownloadCallback bsc( p3dObjectDownloadRequest );
|
PPDownloadCallback bsc( p3dObjectDownloadRequest );
|
||||||
@ -782,25 +812,16 @@ HandleRequest( P3D_request *request ) {
|
|||||||
}
|
}
|
||||||
case P3D_RT_get_url:
|
case P3D_RT_get_url:
|
||||||
{
|
{
|
||||||
if ( !m_handleRequestOnUIThread ) {
|
// We always handle url requests on a thread.
|
||||||
_beginthread( HandleRequestGetUrl, 0, request );
|
ThreadedRequestData *trdata = new ThreadedRequestData;
|
||||||
} else {
|
trdata->_self = this;
|
||||||
HandleRequestGetUrl( request );
|
trdata->_request = request;
|
||||||
}
|
trdata->_host_url = GetHostUrl();
|
||||||
|
|
||||||
|
_beginthread( HandleRequestGetUrl, 0, trdata );
|
||||||
handled = true;
|
handled = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case P3D_RT_notify:
|
|
||||||
{
|
|
||||||
CString notification = request->_request._notify._message;
|
|
||||||
if ( notification == "ondownloadbegin" ) {
|
|
||||||
m_handleRequestOnUIThread = false;
|
|
||||||
} else if ( notification == "ondownloadcomplete" ) {
|
|
||||||
m_handleRequestOnUIThread = true;
|
|
||||||
}
|
|
||||||
handled = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case P3D_RT_callback:
|
case P3D_RT_callback:
|
||||||
{
|
{
|
||||||
// In the case of a callback, yield control temporarily to JavaScript.
|
// In the case of a callback, yield control temporarily to JavaScript.
|
||||||
|
@ -87,7 +87,6 @@ protected:
|
|||||||
CP3DActiveXCtrl& m_parentCtrl;
|
CP3DActiveXCtrl& m_parentCtrl;
|
||||||
PPLogger m_logger;
|
PPLogger m_logger;
|
||||||
|
|
||||||
bool m_handleRequestOnUIThread;
|
|
||||||
bool m_isInit;
|
bool m_isInit;
|
||||||
bool m_pluginLoaded;
|
bool m_pluginLoaded;
|
||||||
|
|
||||||
@ -100,4 +99,11 @@ protected:
|
|||||||
bool _failed;
|
bool _failed;
|
||||||
|
|
||||||
std::string m_rootDir;
|
std::string m_rootDir;
|
||||||
|
|
||||||
|
class ThreadedRequestData {
|
||||||
|
public:
|
||||||
|
PPInstance *_self;
|
||||||
|
P3D_request *_request;
|
||||||
|
std::string _host_url;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user