IWMSDataSourcePluginCallback::OnOpenDirectory

banner art

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