IWMSDataSourcePluginCallback::OnOpenDirectory
Previous | Next |
IWMSDataSourcePluginCallback::OnOpenDirectory
The OnOpenDirectory method is called by a data source plug-in to respond when the server calls IWMSDataSourcePlugin::OpenDirectory.
Syntax
HRESULT OnOpenDirectory( HRESULT hr, IWMSDirectory* pDirectory, QWORD qwContext );
Parameters
hr
[in] HRESULT containing the result of the call to IWMSDataSourcePlugin::OpenDirectory.
pDirectory
[in] Pointer to an IWMSDirectory interface that contains information about the subdirectories and media files in the directory.
qwContext
[in] QWORD containing a value defined by the server to identify which IWMSDataSourcePlugin::OpenDirectory request the plug-in is responding to when it calls OnOpenDirectory. The plug-in must pass this value back unaltered.
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.
Example Code
The OnOpenDirectory method is called near the end of the following example to send a pointer to an IWMSDirectory interface to the server. The CDirectory class is user-defined and implements the IWMSDirectory interface.
CDirectory::Initialize( IWMSContext *pUserContext, LPWSTR pszContainerName, CNTFSStorageSystem *pOwnerStorageSystem, IWMSDataSourcePluginCallback *pCallback, QWORD qwContext ) { HRESULT hr = S_OK; HRESULT hr = S_OK; WCHAR *pszNtfsPathname; size_t sFileName; DWORD dwFileAttributes; DWORD dwIndex; HANDLE hFileEnum = INVALID_HANDLE_VALUE; BOOL fSuccess = FALSE; WIN32_FIND_DATA FileInfo; // Parse the path name to remove the scheme type and // use the GetFileAttributes() function to determine // whether the path identifies a directory. pszNtfsPathname = pszContainerName + URL_SCHEME_LENGTH; dwFileAttributes = GetFileAttributes( pszNtfsPathname ); if( !( FILE_ATTRIBUTE_DIRECTORY & dwFileAttributes ) ) { hr = HRESULT_FROM_WIN32( ERROR_DIRECTORY ); } // Add the global wildcard character '*' to the end // of the directory name. sFileName = wcslen( pszNtfsPathname ); pSearchDirName = new WCHAR[ sFileName + 8 ]; pSearchDirName[sFileName] = '*'; pSearchDirName[sFileName + 1] = '\0'; // Find the first entry in the directory. hFileEnum = FindFirstFileW( m_pSearchDirName, &FileInfo ); dwIndex = 0; fSuccess = TRUE; while ( TRUE ) { // TODO: Determine whether you have reached the end // of the directory items. If so, break. // If the directory item is empty or '.' or '..' or // a hidden file, skip it, grab the next file and // start the loop again. if( ( '\0' == FileInfo.cFileName[0] ) || ( ( '.' == FileInfo.cFileName[0] ) && ('\0' == FileInfo.cFileName[1] ) ) || ( ( '.' == FileInfo.cFileName[0] ) && ( '.' == FileInfo.cFileName[1] ) && ( '\0' == FileInfo.cFileName[2] ) ) || ( FileInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) ) { fSuccess = FindNextFileW( hFileEnum, &FileInfo ); continue; } // TODO: Retrieve information about each file, such as // the name and size, and save it in a linked list of // user-defined CDirectoryInfo objects. // In this example, the CDirectoryInfo class contains // four data members that save information about a file: // CDirectoryInfo() // { // m_cRef = 1; // Reference count. // m_pszwName = NULL; // File name. // m_qwSize = 0; // File size. // m_pNext = NULL; // Pointer to next CDirectoryInfo. // } // Increment the index and find the next file. dwIndex++; fSuccess = FindNextFileW( hFileEnum, &FileInfo ); } // Callback to the server. hr = pCallback->OnOpenDirectory( hr, this, qwContext ); // Because errors are passed through the callback, return S_OK. return( S_OK ); }
Requirements
Header: datacontainer.h.
Library: WMSServerTypeLib.dll.
Platform: Windows Server 2003, Enterprise Edition; Windows Server 2003, Datacenter Edition; Windows Server 2008.
See Also
Previous | Next |