Listing 3

struct CFileInfo {
    CString     FileName;
    short       Quality;
};
struct CSongInfo {
    CString     SongTitle;
    CString     AlbumTitle;
    float       Duration;
    CFileInfo   MP3Info;
};
typedef CArray<CSongInfo, CSongInfo> CSongInfoArray;
   public __value struct FileInfo {
      FileInfo() {}
      // Init-FROM constructor for MFC->.NET conversion
      FileInfo(const CFileInfo& fileInfo)
      {
         FileName = fileInfo.FileName;
         Quality = fileInfo.Quality;
      }
    String*  FileName;
    short    Quality;
   };
   // "CONVERT-TO operator" for .NET->MFC conversion
   CFileInfo ToCFileInfo(FileInfo myFileInfo)
   {
      CFileInfo FileInfo;
      FileInfo.FileName = myFileInfo.FileName;
      FileInfo.Quality = myFileInfo.Quality;
      return FileInfo;
   }
   public __value struct SongInfo {
      SongInfo() {}
      // Init-FROM constructor for MFC->.NET conversion
      SongInfo(const CSongInfo& songInfo)
      {
         SongTitle = songInfo.SongTitle;
         AlbumTitle = songInfo.AlbumTitle;
         Duration = songInfo.Duration;
         MP3Info = songInfo.MP3Info;
      }
      String*  SongTitle;
      String*  AlbumTitle;
      float    Duration;
      FileInfo MP3Info;
   };
   // "CONVERT-TO operator" for .NET->MFC conversion
   CSongInfo ToCSongInfo(SongInfo mySongInfo)
   {
      CSongInfo SongInfo;
      SongInfo.SongTitle = mySongInfo.SongTitle;
      SongInfo.AlbumTitle = mySongInfo.AlbumTitle;
      SongInfo.Duration = mySongInfo.Duration;
      SongInfo.MP3Info = ToCFileInfo(mySongInfo.MP3Info);
      return SongInfo;
   }