return E_NOTIMPL;
};
-STDMETHODIMP VLCControl::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
+STDMETHODIMP VLCControl::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
UINT cNames, LCID lcid, DISPID* rgDispID)
{
if( SUCCEEDED(getTypeInfo()) )
}
return result;
};
-
+
STDMETHODIMP VLCControl::pause(void)
{
int i_vlc;
}
return result;
};
-
+
STDMETHODIMP VLCControl::stop(void)
{
int i_vlc;
}
return result;
};
-
+
STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying)
{
if( NULL == isPlaying )
*isPlaying = VARIANT_FALSE;
return result;
};
-
+
STDMETHODIMP VLCControl::get_Position(float *position)
{
if( NULL == position )
*position = 0.0f;
return result;
};
-
+
STDMETHODIMP VLCControl::put_Position(float position)
{
HRESULT result = E_UNEXPECTED;
}
return result;
};
-
+
STDMETHODIMP VLCControl::get_Time(int *seconds)
{
if( NULL == seconds )
return result;
};
-
+
STDMETHODIMP VLCControl::put_Time(int seconds)
{
_p_instance->setTime(seconds);
return NOERROR;
};
-
+
STDMETHODIMP VLCControl::shuttle(int seconds)
{
HRESULT result = E_UNEXPECTED;
}
return result;
};
-
+
STDMETHODIMP VLCControl::fullscreen(void)
{
HRESULT result = E_UNEXPECTED;
}
return result;
};
-
+
STDMETHODIMP VLCControl::get_Length(int *seconds)
{
if( NULL == seconds )
*seconds = 0;
return result;
};
-
+
STDMETHODIMP VLCControl::playFaster(void)
{
HRESULT result = E_UNEXPECTED;
}
return result;
};
-
+
STDMETHODIMP VLCControl::playSlower(void)
{
HRESULT result = E_UNEXPECTED;
}
return result;
};
-
+
STDMETHODIMP VLCControl::get_Volume(int *volume)
{
if( NULL == volume )
*volume = _p_instance->getVolume();
return NOERROR;
};
-
+
STDMETHODIMP VLCControl::put_Volume(int volume)
{
_p_instance->setVolume(volume);
return NOERROR;
};
-
+
STDMETHODIMP VLCControl::toggleMute(void)
{
int i_vlc;
int i_type;
vlc_value_t val;
-
+
if( VLC_SUCCESS == VLC_VariableType(i_vlc, psz_varname, &i_type) )
{
VARIANT arg;
void VLCControl::FreeTargetOptions(char **cOptions, int cOptionCount)
{
- // clean up
+ // clean up
if( NULL != cOptions )
{
for( int pos=0; pos<cOptionCount; ++pos )
}
};
+static HRESULT parseStringOptions(int codePage, BSTR bstr, char*** cOptions, int *cOptionCount)
+{
+ HRESULT hr = E_INVALIDARG;
+ if( SysStringLen(bstr) > 0 )
+ {
+ hr = E_OUTOFMEMORY;
+ char *s = CStrFromBSTR(codePage, bstr);
+ char *val = s;
+ if( val )
+ {
+ long capacity = 16;
+ char **options = (char **)CoTaskMemAlloc(capacity*sizeof(char *));
+ if( options )
+ {
+ int nOptions = 0;
+
+ char *end = val + strlen(val);
+ while( val < end )
+ {
+ // skip leading blanks
+ while( (val < end)
+ && ((*val == ' ' ) || (*val == '\t')) )
+ ++val;
+
+ char *start = val;
+ // skip till we get a blank character
+ while( (val < end)
+ && (*val != ' ' )
+ && (*val != '\t') )
+ {
+ char c = *(val++);
+ if( ('\'' == c) || ('"' == c) )
+ {
+ // skip till end of string
+ while( (val < end) && (*(val++) != c ) );
+ }
+ }
+
+ if( val > start )
+ {
+ if( nOptions == capacity )
+ {
+ capacity += 16;
+ char **moreOptions = (char **)CoTaskMemRealloc(options, capacity*sizeof(char*));
+ if( ! moreOptions )
+ {
+ /* failed to allocate more memory */
+ CoTaskMemFree(s);
+ /* return what we got so far */
+ *cOptionCount = nOptions;
+ *cOptions = options;
+ return NOERROR;
+ }
+ options = moreOptions;
+ }
+ *(val++) = '\0';
+ options[nOptions] = (char *)CoTaskMemAlloc(val-start);
+ if( options[nOptions] )
+ {
+ memcpy(options[nOptions], start, val-start);
+ ++nOptions;
+ }
+ else
+ {
+ /* failed to allocate memory */
+ CoTaskMemFree(s);
+ /* return what we got so far */
+ *cOptionCount = nOptions;
+ *cOptions = options;
+ return NOERROR;
+ }
+ }
+ else
+ // must be end of string
+ break;
+ }
+ *cOptionCount = nOptions;
+ *cOptions = options;
+ hr = NOERROR;
+ }
+ CoTaskMemFree(s);
+ }
+ }
+ return hr;
+}
+
HRESULT VLCControl::CreateTargetOptions(int codePage, VARIANT *options, char ***cOptions, int *cOptionCount)
{
HRESULT hr = E_INVALIDARG;
}
else if( VT_DISPATCH == V_VT(options) )
{
- // collection parameter
+ // if object is a collection, retrieve enumerator
VARIANT colEnum;
V_VT(&colEnum) = VT_UNKNOWN;
hr = GetObjectProperty(V_DISPATCH(options), DISPID_NEWENUM, colEnum);
enumVar->Release();
}
}
+ else
+ {
+ // coerce object into a string and parse it
+ VARIANT v_name;
+ VariantInit(&v_name);
+ hr = VariantChangeType(&v_name, options, 0, VT_BSTR);
+ if( SUCCEEDED(hr) )
+ {
+ hr = parseStringOptions(codePage, V_BSTR(&v_name), cOptions, cOptionCount);
+ VariantClear(&v_name);
+ }
+ }
}
else if( V_ISARRAY(options) )
{
hr = SafeArrayGetElement(array, &pos, &option);
if( SUCCEEDED(hr) )
{
- if( VT_BSTR == V_VT(&option) )
+ if( VT_BSTR == V_VT(&option) )
{
char *cOption = CStrFromBSTR(codePage, V_BSTR(&option));
(*cOptions)[pos-lBound] = cOption;
}
}
}
- else
+ else
{
// unsupported type
return E_INVALIDARG;
return NOERROR;
}
}
+ else if( VT_UNKNOWN == V_VT(options) )
+ {
+ // coerce object into a string and parse it
+ VARIANT v_name;
+ VariantInit(&v_name);
+ hr = VariantChangeType(&v_name, options, 0, VT_BSTR);
+ if( SUCCEEDED(hr) )
+ {
+ hr = parseStringOptions(codePage, V_BSTR(&v_name), cOptions, cOptionCount);
+ VariantClear(&v_name);
+ }
+ }
+ else if( VT_BSTR == V_VT(options) )
+ {
+ hr = parseStringOptions(codePage, V_BSTR(options), cOptions, cOptionCount);
+ }
return hr;
};
}
return hr;
};
-
+
STDMETHODIMP VLCControl::get_PlaylistIndex(int *index)
{
if( NULL == index )
*index = 0;
return result;
};
-
+
STDMETHODIMP VLCControl::get_PlaylistCount(int *count)
{
int i_vlc;
*count = 0;
return result;
};
-
+
STDMETHODIMP VLCControl::playlistNext(void)
{
int i_vlc;
}
return result;
};
-
+
STDMETHODIMP VLCControl::playlistPrev(void)
{
int i_vlc;
}
return result;
};
-
+
STDMETHODIMP VLCControl::playlistClear(void)
{
int i_vlc;
}
return result;
};
-
+
STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version)
{
if( NULL == version )
if( NULL != versionStr )
{
*version = BSTRFromCStr(CP_UTF8, versionStr);
-
+
return NULL == *version ? E_OUTOFMEMORY : NOERROR;
}
*version = NULL;
return E_FAIL;
};
-
+
STDMETHODIMP VLCControl::get_MRL(BSTR *mrl)
{
if( NULL == mrl )
_p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
return S_OK;
};
-