IWMSCacheProxyServerCallback.OnGetContentInformation (C#)
Previous | Next |
IWMSCacheProxyServerCallback.OnGetContentInformation (C#)
The OnGetContentInformation method is called by the server to respond when a cache plug-in calls IWMSCacheProxyServer::GetContentInformation.
Syntax
Parameters
lHr
[in] int indicating whether the call to IWMSCacheProxyServer.GetContentInformation succeeded.
pContentInfo
[in] IWMSContext object containing a cache content information context. The context includes a variable named WMS_CACHE_CONTENT_INFORMATION_CONTENT_TYPE, which can be zero to indicate on-demand content, or one of the values in the following table, or a bitwise OR of both values.
Value | Description |
WMS_CACHE_CONTENT_TYPE_BROADCAST | The content is a broadcast. |
WMS_CACHE_CONTENT_TYPE_PLAYLIST | The content is a playlist. |
varContext
[in] object containing a value defined by the plug-in when it called IWMSCacheProxyServer.GetContentInformation. For example, your plug-in can use this parameter to persist state information. The server does not alter this value and passes it back when calling OnGetContentInformation.
Return Values
This method does not return a value. To report an error, the plug-in can throw a COMException object to the server. If the plug-in uses the IWMSEventLog object to log error information, it is recommended that it throw NS_E_PLUGIN_ERROR_REPORTED (0xC00D157D). 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 object to send custom error information to the Windows Event Viewer, throwing NS_E_PLUGIN_ERROR_REPORTED stops the server from also logging to the event viewer. For more information about plug-in error information, see Identifying Plug-in Errors.
Remarks
Cache proxy plug-ins generally call GetContentInformation when performing any of the following operations:
- Rolling over to a different protocol
- Establishing a cache-miss policy
- Processing a prestuff request
In each case, the plug-in must get more information about the content before it can proceed. For example, to establish a cache-miss policy, the plug-in must determine whether the content is a broadcast, a playlist, or on demand. Also, before prestuffing content, it must determine whether the content can be cached.
Example Code
using Microsoft.WindowsMediaServices.Interop; using System.Runtime.InteropServices; void IWMSCacheProxyServerCallback.OnGetContentInformation( int lHr, IWMSContext pContentInfo, object varContext ) { try { int nFlag=0; bool bAddCacheItem = false; int nRetHr = lHr; // Retrieve the user-defined ContentInfo object from the // varContext parameter. ContentInfo ci = (ContentInfo)varContext; // If this function is called from AddCacheItem(), lExpiration // will not be zero, and you can call DownloadContent(). if(ci.lExpiration!=0) { bAddCacheItem=true; lHr=0; } // Download the content if the server indicates that your // plug-in's call to GetContentInformation() succeeded. if(lHr==0) { // Call a user-defined function, GetContentInfoFromContext(), // to retrieve cache content information from the pContentInfo // parameter. The context contains a reference to an // IWMSDataContainerVersion object that the plug-in can use // to retrieve content information. GetContentInfoFromContext(pContentInfo, ref ci); // Determine whether the content can be downloaded. nFlag = ci.CacheFlags & (int)WMS_DATA_CONTAINER_VERSION_CACHE_FLAGS.WMS_DATA_CONTAINER_VERSION_ALLOW_PROXY_CACHING; if((nFlag!=0)||(bAddCacheItem)) { // Identify a cache URL. if((!bAddCacheItem)||(bAddCacheItem && (ci.CacheUrl==null))) { ci.CacheUrl = "c:\\WMSCache\\test"; } // Call a user-defined function, IsDownloadInProgress(), to // determine whether there is a download in progress. if(!IsDownloadInProgress(ci)) { // If there is no current download, call a user-defined // function, AddForDownload(), to add cache content // information to the DataSet object. AddForDownload(ci); // Download the content. CacheProxyServer.DownloadContent(ci.OriginUrl, ci.CacheUrl, 0,0,0,0, this, null, this, ci); } else { // Debugging is already in progress. } } // If the content is a broadcast, do not download it, but // store the content information in the DataSet with an empty // cache URL. if((ci.ContentType & 1)!=0) { UpdateTable(ci); } } // The server returned E_ACCESSDENIED in response to the // plug-in's call to GetContentInformation(). else { if(lHr==-2147024891) nRetHr=0; } // Determine whether stream splitting is allowed. WMS_CACHE_QUERY_MISS_RESPONSE MissResponse = WMS_CACHE_QUERY_MISS_RESPONSE.WMS_CACHE_QUERY_MISS_PLAY_ON_DEMAND; nFlag = ci.CacheFlags & (int)WMS_DATA_CONTAINER_VERSION_CACHE_FLAGS.WMS_DATA_CONTAINER_VERSION_ALLOW_STREAM_SPLITTING; // If the stream can be split, broadcast the content. // Otherwise, play the content on demand. if(nFlag!=0) { MissResponse = WMS_CACHE_QUERY_MISS_RESPONSE.WMS_CACHE_QUERY_MISS_PLAY_BROADCAST; } // Request that the server proxy the content on demand. if(ci.CacheProxyCallback!=null) { ci.CacheProxyCallback.OnQueryCacheMissPolicy((int)nRetHr,MissResponse ,ci.OriginUrl,null,pContentInfo,ci.varContext); } } catch(Exception e) { throw new COMException(); } return; }
Requirements
Reference: Add a reference to Microsoft.WindowsMediaServices.
Namespace: Microsoft.WindowsMediaServices.Interop.
Assembly: Microsoft.WindowsMediaServices.dll.
Library: WMSServerTypeLib.dll.
Platform: Windows Server 2003, Enterprise Edition; Windows Server 2003, Datacenter Edition; Windows Server 2008.
See Also
Previous | Next |