+ // initialize persistable properties
+ _bstr_mrl = NULL;
+ _b_autoplay = TRUE;
+ _b_autoloop = FALSE;
+ _b_visible = TRUE;
+ _b_mute = FALSE;
+ _i_volume = 50;
+ _i_time = 0;
+ // set default/preferred size (320x240) pixels in HIMETRIC
+ HDC hDC = CreateDevDC(NULL);
+ _extent.cx = 320;
+ _extent.cy = 240;
+ HimetricFromDP(hDC, (LPPOINT)&_extent, 1);
+ DeleteDC(hDC);
+
+ return S_OK;
+ }
+ return CO_E_ALREADYINITIALIZED;
+};
+
+HRESULT VLCPlugin::onLoad(void)
+{
+ if( SysStringLen(_bstr_mrl) > 0 )
+ {
+ /*
+ ** try to combine MRL with client site moniker, which for Internet Explorer
+ ** is the URL of the page the plugin is embedded into. Hence, if the MRL
+ ** is a relative URL, we should end up with an absolute URL
+ */
+ LPOLECLIENTSITE pClientSite;
+ if( SUCCEEDED(vlcOleObject->GetClientSite(&pClientSite)) && (NULL != pClientSite) )
+ {
+ IBindCtx *pBC = 0;
+ if( SUCCEEDED(CreateBindCtx(0, &pBC)) )
+ {
+ LPMONIKER pContMoniker = NULL;
+ if( SUCCEEDED(pClientSite->GetMoniker(OLEGETMONIKER_ONLYIFTHERE,
+ OLEWHICHMK_CONTAINER, &pContMoniker)) )
+ {
+ LPOLESTR base_url;
+ if( SUCCEEDED(pContMoniker->GetDisplayName(pBC, NULL, &base_url)) )
+ {
+ /*
+ ** check that the moniker name is a URL
+ */
+ if( UrlIsW(base_url, URLIS_URL) )
+ {
+ DWORD len = INTERNET_MAX_URL_LENGTH;
+ LPOLESTR abs_url = (LPOLESTR)CoTaskMemAlloc(sizeof(OLECHAR)*len);
+ if( NULL != abs_url )
+ {
+ if( SUCCEEDED(UrlCombineW(base_url, _bstr_mrl, abs_url, &len,
+ URL_ESCAPE_UNSAFE|URL_PLUGGABLE_PROTOCOL)) )
+ {
+ SysFreeString(_bstr_mrl);
+ _bstr_mrl = SysAllocStringLen(abs_url, len);
+ }
+ CoTaskMemFree(abs_url);
+ }
+ }
+ CoTaskMemFree(base_url);
+ }
+ pContMoniker->Release();
+ }
+ pBC->Release();
+ }
+ pClientSite->Release();
+ }
+ }
+ setDirty(FALSE);
+ return S_OK;
+};
+
+HRESULT VLCPlugin::getVLCObject(int *i_vlc)
+{
+ if( ! isRunning() )
+ {
+ _i_vlc = VLC_Create();
+ if( _i_vlc < 0 )
+ {
+ _i_vlc = 0;
+ return E_FAIL;
+ }
+
+ /*
+ ** default initialization options
+ */
+ char *ppsz_argv[10] = { "vlc", };
+ int ppsz_argc = 1;
+