Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
.gif)
| Previous | Next |
IWMSPlaylistParser::ReadPlaylist
The ReadPlaylist method is called by the server to retrieve a playlist from an INSSBuffer object.
Syntax
Parameters
pBuffer
[in] Pointer to an INSSBuffer interface specifying the buffer to read from, in which the playlist file is loaded.
pPlaylist
[in] Pointer to an IXMLDOMDocument interface to be used to store the interpreted playlist that can be understood by the server.
pCallback
[in] Pointer to an IWMSPlaylistParserCallback interface that is used by the plug-in to report to the server the result of a call to the ReadPlaylist method.
qwContext
[in] QWORD containing a value defined by the server to identify which call to ReadPlaylist the plug-in is responding to when it calls IWMSPlaylistParserCallback::OnReadPlaylist. You must pass this value back unaltered when you call OnReadPlaylist.
Return Values
If the method succeeds, the plug-in must return S_OK. To report an error, the plug-in can return any HRESULT other than S_OK. If the plug-in uses the IWMSEventLog interface to log error information directly to the Windows Event Viewer, it is recommended that it return NS_E_PLUGIN_ERROR_REPORTED. Typically, the server attempts to make plug-in error information available to the server object model, the Windows Event Viewer, and the troubleshooting list in the details pane of the Windows Media Services MMC. However, if the plug-in uses the IWMSEventLog interface to send custom error information to the Windows Event Viewer, returning NS_E_PLUGIN_ERROR_REPORTED stops the server from also logging to the event viewer. For more information about retrieving plug-in error information, see Identifying Plug-in Errors.
Remarks
This method retrieves a playlist from an INSSBuffer object, parses it, and populates an IXMLDOMDocument object. This method is implemented by the plug-in and called by the server.
Example Code
HRESULT STDMETHODCALLTYPE
CSDKSamplePlaylistParser::ReadPlaylist(
INSSBuffer *pIBuffer,
IXMLDOMDocument *pPlayList,
IWMSPlaylistParserCallback *pCallback,
QWORD qwContext)
{
HRESULT hr = S_OK;
BYTE *pbBuffer = NULL;
BYTE *pbEndBuffer = NULL;
BYTE *pbUrl = NULL;
BYTE *pbLineEnd = NULL;
BYTE *pbEndUrl = NULL;
DWORD dwLength = 0;
BYTE bPrevious = '\0';
BSTR bstrUrl = NULL;
CComPtr<IXMLDOMNode> spWsxNode;
CComPtr<IXMLDOMElement> spPlayListMediaEntry;
CComPtr<IXMLDOMElement> spPlayListTopEntry;
CComPtr<IXMLDOMNode> spOldPlayListEntry;
BSTR bstrWsx = SysAllocString( L"wsx" );
BSTR bstrEmpty = SysAllocString( L"" );
BSTR bstrVersion = SysAllocString( L"version='1.0'" );
BSTR bstrSmil = SysAllocString( L"smil" );
BSTR bstrTagName = SysAllocString( L"media" );
BSTR bstrAttrName = SysAllocString( L"src" );
VARIANT varNodeType;
VariantInit( &varNodeType );
V_VT( &varNodeType ) = VT_I4;
V_I4( &varNodeType ) = NODE_PROCESSING_INSTRUCTION;
hr = pPlayList->createNode(
varNodeType,
bstrWsx,
bstrEmpty,
&spWsxNode
);
VariantClear( &varNodeType );
if ( FAILED(hr) ) goto EXIT;
hr = pPlayList->appendChild( spWsxNode, &spOldPlayListEntry );
if ( FAILED(hr) ) goto EXIT;
hr = spWsxNode->put_text( bstrVersion );
if ( FAILED(hr) ) goto EXIT;
hr = pPlayList->createElement( bstrSmil, &spPlayListTopEntry );
if ( FAILED(hr) ) goto EXIT;
spOldPlayListEntry = NULL;
hr = pPlayList->appendChild( spPlayListTopEntry,
&spOldPlayListEntry );
if ( FAILED(hr) ) goto EXIT;
hr = pIBuffer->GetBufferAndLength( &pbBuffer, &dwLength );
if ( FAILED( hr ) ) goto EXIT;
pbEndBuffer = pbBuffer + dwLength;
pbUrl = pbBuffer;
while ( pbUrl < pbEndBuffer )
{
while( ( pbUrl < pbEndBuffer )
&& isspace( *pbUrl ) )
++pbUrl;
if( pbUrl >= pbEndBuffer )
break;
pbLineEnd = pbUrl + 1;
while( ( pbLineEnd < pbEndBuffer )
&& ( '\n' != *pbLineEnd )
&& ( '\r' != *pbLineEnd ) )
++pbLineEnd;
if( '#' == *pbUrl )
{
pbUrl = pbLineEnd;
continue;
}
pbEndUrl = pbLineEnd;
while( ( pbUrl < pbEndUrl )
&& isspace( pbEndUrl[-1] ) )
--pbEndUrl;
if( ( pbUrl < pbEndUrl )
&& ( ',' == pbEndUrl[-1] ) )
--pbEndUrl;
while( ( pbUrl < pbEndUrl )
&& isspace( pbEndUrl[-1] ) )
--pbEndUrl;
if( pbUrl == pbEndUrl )
{
pbUrl = pbLineEnd;
continue;
}
int cchNeeded = MultiByteToWideChar(
CP_ACP,
0,
(LPCSTR)pbUrl,
(int)( pbEndUrl - pbUrl ),
NULL,
0
);
if( 0 >= cchNeeded )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
goto EXIT;
}
bstrUrl = SysAllocStringLen( NULL, cchNeeded );
if( NULL == bstrUrl )
{
hr = E_OUTOFMEMORY;
goto EXIT;
}
int cchConverted = MultiByteToWideChar(
CP_ACP,
0,
(LPCSTR)pbUrl,
(int)( pbEndUrl - pbUrl ),
bstrUrl,
cchNeeded
);
if( cchConverted != cchNeeded )
{
hr = HRESULT_FROM_WIN32( ERROR_NO_UNICODE_TRANSLATION );
goto EXIT;
}
hr = pPlayList->createElement(
bstrTagName,
&spPlayListMediaEntry
);
if ( FAILED( hr ) ) goto EXIT;
VARIANT varAttribute;
VariantInit( &varAttribute );
V_VT( &varAttribute ) = VT_BSTR;
V_BSTR( &varAttribute ) = bstrUrl;
hr = spPlayListMediaEntry->setAttribute( bstrAttrName, varAttribute );
V_BSTR( &varAttribute ) = NULL;
V_VT( &varAttribute ) = VT_EMPTY;
VariantClear( &varAttribute );
if ( FAILED( hr ) ) goto EXIT;
spOldPlayListEntry = NULL;
hr = spPlayListTopEntry->appendChild( spPlayListMediaEntry, &spOldPlayListEntry );
if ( FAILED( hr ) ) goto EXIT;
spPlayListMediaEntry.Release();
pbUrl = pbLineEnd;
}
pCallback->OnReadPlaylist( S_OK, qwContext );
EXIT:
// TODO: Release temporary COM objects and pointers.
return( hr );
}
Requirements
Header: wmsplaylistparser.h.
Library: WMSServerTypeLib.dll.
Platform: Windows Server 2003, Enterprise Edition; Windows Server 2003, Datacenter Edition; Windows Server 2008.
See Also
- Creating Playlist Parser Plug-ins
- INSSBuffer Interface
- IWMSPlaylistParser Interface
- IWMSPlaylistParser::WritePlaylist
- IWMSPlaylistParserCallback Interface
- IXMLDOMDocument Interface
- Playlist Parser Plug-in Sample
| Previous | Next |