2025-11-28 00:35:46 +09:00

1240 lines
45 KiB
C#

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Text;
using WMPLib;
// Set assembly attributes.
[assembly: System.Runtime.InteropServices.ComVisible(false)]
[assembly: CLSCompliant(true)]
namespace SchemaReader
{
/// <summary>
/// Form for SchemaReader sample.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
string strOutFile;
bool bShowVals; // Show values in output.
bool bShowReadOnly; // Show Read-only or Read/Write status.
IWMPCdrom CD; // Reference to the current CD/DVD.
IWMPPlaylistCollection PLCollection;
IWMPMediaCollection MediaCollection;
IWMPCdromCollection CDCollection;
IWMPLibraryServices LibSvcs;
enum ReportType
{
none,
AllSchemas,
CDTOC,
CDTrack,
DVDTOC,
DVDTitleChap,
PlaylistCollection,
CurrentMedia,
CurrentPlaylist
};
enum AttributeSource
{
None,
Audio, //Schema
Video, //Schema
Radio, //Schema
Playlist, //Schema
Other, //Schema
Photo, //Schema
CurrentMedia,
CurrentPlaylist,
CDPlaylist,
CDTrack,
DVDToc,
PlaylistCollection
}
ReportType rtLast = ReportType.none;
private AxWMPLib.AxWindowsMediaPlayer Player;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem5;
private System.Windows.Forms.MenuItem mnuLibraryAttributesByType;
private System.Windows.Forms.MenuItem mnuCDTOC;
private System.Windows.Forms.MenuItem mnuDVDTitleChapter;
private System.Windows.Forms.MenuItem mnuCDTrack;
private System.Windows.Forms.MenuItem mnuPlaylistCollection;
private System.Windows.Forms.Button btnTop;
private System.Windows.Forms.Button btnTitle;
private System.Windows.Forms.ComboBox cmbDrives;
private System.Windows.Forms.MenuItem menuItem3;
private System.Windows.Forms.MenuItem menuItem6;
private System.Windows.Forms.MenuItem mnuSaveAs;
private System.Windows.Forms.CheckBox chkVals;
private System.Windows.Forms.CheckBox chkReadOnly;
private System.Windows.Forms.MenuItem mnuDVDTOC;
private System.Windows.Forms.MenuItem mnuSave;
private System.Windows.Forms.MenuItem mnuOpenMedia;
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader colSchema;
private System.Windows.Forms.ColumnHeader colAttribute;
private System.Windows.Forms.ColumnHeader colWritable;
private System.Windows.Forms.ColumnHeader colValue;
private System.Windows.Forms.Label lblStatus;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private CheckBox chkLegacyMC;
private GroupBox groupBox3;
private GroupBox groupBox4;
private MenuItem mnuCurrentMedia;
private MenuItem mnuCurrentPlaylist;
private IContainer components;
public Form1()
{
UseWaitCursor = true;
//
// Required for Windows Form Designer support
//
InitializeComponent();
// Initialize global variables
PLCollection = Player.playlistCollection;
GetMediaCollection();
CDCollection = Player.cdromCollection;
LibSvcs = (IWMPLibraryServices)Player.GetOcx();
// Fill in the combo boxes.
enumerateCDDrives();
// Show library attributes listing by default.
mnuLibraryAttributes_Click(this, null);
UseWaitCursor = false;
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
this.menuItem3 = new System.Windows.Forms.MenuItem();
this.mnuSave = new System.Windows.Forms.MenuItem();
this.mnuSaveAs = new System.Windows.Forms.MenuItem();
this.mnuOpenMedia = new System.Windows.Forms.MenuItem();
this.menuItem5 = new System.Windows.Forms.MenuItem();
this.mnuLibraryAttributesByType = new System.Windows.Forms.MenuItem();
this.mnuCDTOC = new System.Windows.Forms.MenuItem();
this.mnuCDTrack = new System.Windows.Forms.MenuItem();
this.mnuDVDTOC = new System.Windows.Forms.MenuItem();
this.mnuDVDTitleChapter = new System.Windows.Forms.MenuItem();
this.mnuPlaylistCollection = new System.Windows.Forms.MenuItem();
this.mnuCurrentMedia = new System.Windows.Forms.MenuItem();
this.mnuCurrentPlaylist = new System.Windows.Forms.MenuItem();
this.menuItem6 = new System.Windows.Forms.MenuItem();
this.btnTop = new System.Windows.Forms.Button();
this.btnTitle = new System.Windows.Forms.Button();
this.cmbDrives = new System.Windows.Forms.ComboBox();
this.chkVals = new System.Windows.Forms.CheckBox();
this.chkReadOnly = new System.Windows.Forms.CheckBox();
this.listView1 = new System.Windows.Forms.ListView();
this.colSchema = new System.Windows.Forms.ColumnHeader();
this.colAttribute = new System.Windows.Forms.ColumnHeader();
this.colValue = new System.Windows.Forms.ColumnHeader();
this.colWritable = new System.Windows.Forms.ColumnHeader();
this.lblStatus = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.chkLegacyMC = new System.Windows.Forms.CheckBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.Player = new AxWMPLib.AxWindowsMediaPlayer();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.Player)).BeginInit();
this.SuspendLayout();
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem3,
this.menuItem5,
this.menuItem6});
//
// menuItem3
//
this.menuItem3.Index = 0;
this.menuItem3.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuSave,
this.mnuSaveAs,
this.mnuOpenMedia});
this.menuItem3.Text = "File";
//
// mnuSave
//
this.mnuSave.Index = 0;
this.mnuSave.Text = "Save";
this.mnuSave.Click += new System.EventHandler(this.mnuSave_Click);
//
// mnuSaveAs
//
this.mnuSaveAs.Index = 1;
this.mnuSaveAs.Text = "Save as...";
this.mnuSaveAs.Click += new System.EventHandler(this.mnuSaveAs_Click);
//
// mnuOpenMedia
//
this.mnuOpenMedia.Index = 2;
this.mnuOpenMedia.Text = "Open media";
this.mnuOpenMedia.Click += new System.EventHandler(this.mnuOpenMedia_Click);
//
// menuItem5
//
this.menuItem5.Index = 1;
this.menuItem5.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuLibraryAttributesByType,
this.mnuCDTOC,
this.mnuCDTrack,
this.mnuDVDTOC,
this.mnuDVDTitleChapter,
this.mnuPlaylistCollection,
this.mnuCurrentMedia,
this.mnuCurrentPlaylist});
this.menuItem5.Text = "Capture";
//
// mnuLibraryAttributesByType
//
this.mnuLibraryAttributesByType.Index = 0;
this.mnuLibraryAttributesByType.Text = "Library Attributes by Media Type";
this.mnuLibraryAttributesByType.Click += new System.EventHandler(this.mnuLibraryAttributes_Click);
//
// mnuCDTOC
//
this.mnuCDTOC.Index = 1;
this.mnuCDTOC.Text = "CD TOC Attributes";
this.mnuCDTOC.Click += new System.EventHandler(this.mnuCDTOC_Click);
//
// mnuCDTrack
//
this.mnuCDTrack.Index = 2;
this.mnuCDTrack.Text = "CD Track Attributes";
this.mnuCDTrack.Click += new System.EventHandler(this.mnuCDTrack_Click);
//
// mnuDVDTOC
//
this.mnuDVDTOC.Index = 3;
this.mnuDVDTOC.Text = "DVD TOC Attributes";
this.mnuDVDTOC.Click += new System.EventHandler(this.mnuDVDTOC_Click);
//
// mnuDVDTitleChapter
//
this.mnuDVDTitleChapter.Index = 4;
this.mnuDVDTitleChapter.Text = "DVD Title/Chapter Attributes";
this.mnuDVDTitleChapter.Click += new System.EventHandler(this.mnuDVDTitleChapter_Click);
//
// mnuPlaylistCollection
//
this.mnuPlaylistCollection.Index = 5;
this.mnuPlaylistCollection.Text = "PlaylistCollection Attributes";
this.mnuPlaylistCollection.Click += new System.EventHandler(this.mnuPlaylistCollection_Click);
//
// mnuCurrentMedia
//
this.mnuCurrentMedia.Index = 6;
this.mnuCurrentMedia.Text = "Current Media Attributes";
this.mnuCurrentMedia.Click += new System.EventHandler(this.mnuCurrentMedia_Click);
//
// mnuCurrentPlaylist
//
this.mnuCurrentPlaylist.Index = 7;
this.mnuCurrentPlaylist.Text = "Current Playlist Attributes";
this.mnuCurrentPlaylist.Click += new System.EventHandler(this.mnuCurrentPlaylist_Click);
//
// menuItem6
//
this.menuItem6.Index = 2;
this.menuItem6.Text = "";
//
// btnTop
//
this.btnTop.Location = new System.Drawing.Point(40, 24);
this.btnTop.Name = "btnTop";
this.btnTop.Size = new System.Drawing.Size(75, 23);
this.btnTop.TabIndex = 2;
this.btnTop.Text = "Top Menu";
this.btnTop.Click += new System.EventHandler(this.btnTop_Click);
//
// btnTitle
//
this.btnTitle.Location = new System.Drawing.Point(40, 56);
this.btnTitle.Name = "btnTitle";
this.btnTitle.Size = new System.Drawing.Size(75, 23);
this.btnTitle.TabIndex = 3;
this.btnTitle.Text = "Title Menu";
this.btnTitle.Click += new System.EventHandler(this.btnTitle_Click);
//
// cmbDrives
//
this.cmbDrives.Location = new System.Drawing.Point(34, 38);
this.cmbDrives.Name = "cmbDrives";
this.cmbDrives.Size = new System.Drawing.Size(64, 21);
this.cmbDrives.TabIndex = 4;
this.cmbDrives.SelectedIndexChanged += new System.EventHandler(this.cmbDrives_SelectedIndexChanged);
//
// chkVals
//
this.chkVals.Location = new System.Drawing.Point(16, 56);
this.chkVals.Name = "chkVals";
this.chkVals.Size = new System.Drawing.Size(104, 24);
this.chkVals.TabIndex = 5;
this.chkVals.Text = "Values";
this.chkVals.CheckedChanged += new System.EventHandler(this.chkVals_CheckedChanged);
//
// chkReadOnly
//
this.chkReadOnly.Location = new System.Drawing.Point(16, 32);
this.chkReadOnly.Name = "chkReadOnly";
this.chkReadOnly.Size = new System.Drawing.Size(104, 24);
this.chkReadOnly.TabIndex = 6;
this.chkReadOnly.Text = "R/O Status";
this.chkReadOnly.CheckedChanged += new System.EventHandler(this.chkReadOnly_CheckedChanged);
//
// listView1
//
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.colSchema,
this.colAttribute,
this.colValue,
this.colWritable});
this.listView1.GridLines = true;
this.listView1.Location = new System.Drawing.Point(8, 216);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(640, 272);
this.listView1.TabIndex = 8;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
//
// colSchema
//
this.colSchema.Text = "Schema";
this.colSchema.Width = 80;
//
// colAttribute
//
this.colAttribute.Text = "Attribute";
this.colAttribute.Width = 150;
//
// colValue
//
this.colValue.Text = "Value";
this.colValue.Width = 330;
//
// colWritable
//
this.colWritable.Text = "ReadOnly";
//
// lblStatus
//
this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.lblStatus.Location = new System.Drawing.Point(8, 496);
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(640, 24);
this.lblStatus.TabIndex = 9;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.btnTop);
this.groupBox1.Controls.Add(this.btnTitle);
this.groupBox1.Location = new System.Drawing.Point(176, 8);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(160, 104);
this.groupBox1.TabIndex = 10;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "DVD Menus";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.chkVals);
this.groupBox2.Controls.Add(this.chkReadOnly);
this.groupBox2.Location = new System.Drawing.Point(16, 8);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(144, 104);
this.groupBox2.TabIndex = 11;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Log options";
//
// chkLegacyMC
//
this.chkLegacyMC.AutoSize = true;
this.chkLegacyMC.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkLegacyMC.Location = new System.Drawing.Point(10, 41);
this.chkLegacyMC.Name = "chkLegacyMC";
this.chkLegacyMC.Size = new System.Drawing.Size(150, 17);
this.chkLegacyMC.TabIndex = 14;
this.chkLegacyMC.Text = "Use IWMPLibraryServices";
this.chkLegacyMC.UseVisualStyleBackColor = true;
this.chkLegacyMC.CheckedChanged += new System.EventHandler(this.chkLegacyMC_CheckedChanged);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.chkLegacyMC);
this.groupBox3.Location = new System.Drawing.Point(16, 118);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(178, 90);
this.groupBox3.TabIndex = 15;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Library";
//
// groupBox4
//
this.groupBox4.Controls.Add(this.cmbDrives);
this.groupBox4.Location = new System.Drawing.Point(200, 118);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(133, 90);
this.groupBox4.TabIndex = 16;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "CD/DVD Drive";
//
// Player
//
this.Player.Enabled = true;
this.Player.Location = new System.Drawing.Point(352, 8);
this.Player.Name = "Player";
this.Player.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("Player.OcxState")));
this.Player.Size = new System.Drawing.Size(288, 200);
this.Player.TabIndex = 0;
this.Player.OpenPlaylistSwitch += new AxWMPLib._WMPOCXEvents_OpenPlaylistSwitchEventHandler(this.Player_OpenPlaylistSwitch);
this.Player.OpenStateChange += new AxWMPLib._WMPOCXEvents_OpenStateChangeEventHandler(this.Player_OpenStateChange);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(664, 528);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.lblStatus);
this.Controls.Add(this.listView1);
this.Controls.Add(this.Player);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Schema and Attribute Viewer";
this.groupBox1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox4.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.Player)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
/// <summary>
/// Open a digital media file for playback.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuOpenMedia_Click(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.RestoreDirectory = true;
dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
try
{
dlg.Filter = "Windows Media Audio(.wma)|*.wma|" + "Windows Media Video(.wmv)|*.wmv|" + "Video Track(.IFO)|*.IFO|" + "Windows Media Playlist(.wpl)|*.wpl|" + "Windows Media Metafile(.asx)|*.asx|" + "MP3 File(.mp3)|*.mp3";
if (dlg.ShowDialog() == DialogResult.OK)
{
Player.URL = dlg.FileName;
}
}
catch (COMException ex)
{
lblStatus.Text = "Failed to set player URL: " + ex.Message.ToString();
}
catch
{
lblStatus.Text = "Failed to set player URL.";
throw;
}
}
/// <summary>
/// Capture attributes for each type.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuLibraryAttributes_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "Library attributes by media type";
getMetadataFromMedia(AttributeSource.Audio);
// The mediaCollection will return non-audio attributes
// when using the legacy object model only.
if (chkLegacyMC.Checked == false)
{
getMetadataFromMedia(AttributeSource.Video);
getMetadataFromMedia(AttributeSource.Playlist);
getMetadataFromMedia(AttributeSource.Other);
getMetadataFromMedia(AttributeSource.Photo);
}
else
{
lblStatus.Text = "MediaCollection object only supports Audio attributes.";
}
rtLast = ReportType.AllSchemas;
UseWaitCursor = false;
}
/// <summary>
/// Capture CD TOC attributes.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuCDTOC_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "CD TOC Attributes";
getMetadataFromPlaylist(AttributeSource.CDPlaylist);
rtLast = ReportType.CDTOC;
UseWaitCursor = false;
}
/// <summary>
/// Capture DVD attributes.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuDVDTitleChapter_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
// To see the implementation for enumerating DVD title and chapter attributes,
// view the OpenPlaylistSwitch event handler.
lblStatus.Text = "Wait for OpenPlaylistSwitch event...";
if(Player.dvd.get_isAvailable("dvdDecoder") == true)
{
// This will trigger the OpenPlaylistSwitch event.
// The CDCollection object is used for both CD and DVD drives.
// The TOC of a DVD is contained in an IWMPPlaylist.
Player.currentPlaylist = CDCollection.Item(cmbDrives.SelectedIndex).Playlist;
}
else
{
lblStatus.Text = "No DVD decoder installed.";
}
rtLast = ReportType.DVDTitleChap;
UseWaitCursor = false;
}
/// <summary>
/// Used to log the DVD attributes.
/// DVD organization can vary.
/// Usually, when you open the DVD for playback, you'll see data for titles,
/// when you play a title, you'll see chapters.
/// Title 0 is special - it's the table of contents.
/// Usually, you can click the Top Menu button to go back to the root title.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Player_OpenPlaylistSwitch(object sender, AxWMPLib._WMPOCXEvents_OpenPlaylistSwitchEvent e)
{
UseWaitCursor = true;
listView1.Items.Clear();
// Set the button states for the Top Menu and Title Menu buttons.
SetDVDButtonStates();
// Get the title playlist.
IWMPPlaylist pTitle = (IWMPPlaylist)e.pItem;
IWMPMedia TitleOrChapter = null;
// Get the chapter as IWMPMedia.
TitleOrChapter = pTitle.get_Item(1);
//Get the attribute count from the chapter and loop through the attributes.
int iAttCount = TitleOrChapter.attributeCount;
for (int j = 0; j < iAttCount; j++)
{
ListViewItem item = new ListViewItem("DVD Title/Ch");
String name = TitleOrChapter.getAttributeName(j);
item.SubItems.Add(name);
item.SubItems.Add(TitleOrChapter.getItemInfo(name));
// Tell the user about DVD navigation options.
if ("chapterNum" == name)
{
lblStatus.Text = "DVD Chapter Attributes. To view title attributes, change titles.";
}
else if ("titleNum" == name)
{
lblStatus.Text = "DVD Title Attributes. To view chapter attributes, change chapters.";
}
bool bRO = TitleOrChapter.isReadOnlyItem(name);
item.SubItems.Add(bRO.ToString());
listView1.Items.Add(item);
}
ListViewItem item2 = new ListViewItem("");
listView1.Items.Add(item2);
UseWaitCursor = false;
}
/// <summary>
/// Capture CD track attributes.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuCDTrack_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "CD Track Attributes";
getMetadataFromMedia(AttributeSource.CDTrack);
rtLast = ReportType.CDTrack;
UseWaitCursor = false;
}
/// <summary>
/// Capture PlaylistCollection attributes.
/// Unlike the playlist attributes that can be retrieved by calling
/// MediaCollection.getByAttribute("Media Type", "playlist"), the
/// playlist collection attributes should be retrieved by calling
/// PlaylistCollection.getAll.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuPlaylistCollection_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "PlaylistCollection Attributes";
getMetadataFromPlaylist(AttributeSource.PlaylistCollection);
rtLast = ReportType.PlaylistCollection;
UseWaitCursor = false;
}
/// <summary>
/// Set a value for the MediaCollection variable based on user settings.
/// </summary>
private void GetMediaCollection()
{
if (chkLegacyMC.CheckState != CheckState.Checked)
{
MediaCollection = Player.mediaCollection;
}
else
{
IWMPLibrary library = LibSvcs.getLibraryByType(WMPLibraryType.wmpltLocal, 0);
MediaCollection = library.mediaCollection;
}
runCurrentReport();
}
/// <summary>
/// Writes a string to a text file.
/// </summary>
/// <param name="str">String to write to text file.</param>
/// <param name="mode">File open mode.</param>
private void writeToFile(String str, FileMode mode)
{
// Create a StreamWriter object to write
// the output to a file.
FileStream sb = new FileStream(strOutFile, mode);
StreamWriter sw = new StreamWriter(sb);
sw.Write(str);
sw.Close();
}
/// <summary>
/// Builds the output string from the ListView control.
/// </summary>
/// <param name="showValues">Log values?</param>
/// <param name="showRO">Log writability?</param>
/// <returns></returns>
private string logStringFromTable(bool showValues, bool showRO)
{
ListView.ListViewItemCollection lvic = listView1.Items;
int cItems = lvic.Count;
StringBuilder output = new StringBuilder();
for(int row = 0; row < cItems; row++)
{
ListViewItem item = lvic[row];
ListViewItem.ListViewSubItemCollection lvsic = item.SubItems;
int cSubItems = lvsic.Count;
// The ListView columns in each row are subitems.
for(int column = 0; column < cSubItems; column++)
{
ListViewItem.ListViewSubItem subItem = lvsic[column];
// Obey the checkboxes.
// Don't log empty rows.
if((2 == column && false == showValues) ||
(3 == column && false == showRO) ||
(0 == column && String.IsNullOrEmpty(subItem.Text)))
{
continue;
}
switch (column)
{
case 0:
output.Append("Schema: ");
break;
case 1:
output.Append("Name: ");
break;
case 2:
output.Append("Value: ");
break;
case 3:
output.Append("Read-only: ");
break;
}
output.Append(subItem.Text);
output.Append("\r\n");
}
output.Append("\r\n");
}
return output.ToString();
}
/// <summary>
/// Open DVD top menu, if available.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnTop_Click(object sender, System.EventArgs e)
{
Player.dvd.topMenu();
}
/// <summary>
/// Open DVD title menu, if available.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnTitle_Click(object sender, System.EventArgs e)
{
Player.dvd.titleMenu();
}
/// <summary>
/// Displays the attribute information for a given media-based attribute source.
/// </summary>
/// <param name="Source">An AttributeSource specifying the schema to inspect.</param>
/// <returns>void</returns>
private void getMetadataFromMedia(AttributeSource Source)
{
IWMPPlaylist playlist = null;
IWMPMedia media = null;
string name = "";
try
{
switch (Source)
{
case AttributeSource.CDTrack:
playlist = CD.Playlist;
break;
case AttributeSource.CurrentMedia:
playlist = Player.currentPlaylist;
break;
default:
// Get a playlist filled with media for the specified schema.
playlist = MediaCollection.getByAttribute("MediaType", Source.ToString());
break;
}
if (0 != playlist.count)
{
// Get the first item from the playlist.
media = playlist.get_Item(0);
}
else
{
throw new EmptyPlaylistException();
}
int cAttributes = media.attributeCount;
// Log the attribute name, value, and writability.
for (int i = 0; i < cAttributes; i++)
{
name = media.getAttributeName(i);
ListViewItem item = new ListViewItem(Source.ToString());
item.SubItems.Add(name);
item.SubItems.Add(media.getItemInfo(name));
bool bRO = media.isReadOnlyItem(name);
item.SubItems.Add(bRO.ToString());
listView1.Items.Add(item);
}
}
catch (EmptyPlaylistException)
{
ListViewItem item3 = new ListViewItem(Source.ToString());
item3.SubItems.Add("EmptyPlaylistException");
item3.SubItems.Add("Does your library contain media for this type or source?");
listView1.Items.Add(item3);
}
catch (COMException exc)
{
lblStatus.Text = "Exception in getMetadata: " + exc.Message;
}
catch
{
lblStatus.Text = "Exception in getMetadata.";
throw;
}
// Insert an empty line in the listview.
ListViewItem item2 = new ListViewItem("");
listView1.Items.Add(item2);
}
/// <summary>
/// Retrieves the attribute names for a given playlist-based attribute source.
/// </summary>
/// <param name="Source">An AttributeSource specifying the type of media to inspect</param>
/// <returns>void</returns>
private void getMetadataFromPlaylist(AttributeSource Source)
{
IWMPPlaylist playlist = null;
string name = "";
try
{
switch (Source)
{
// DVDs and CDs use the same CD object.
case AttributeSource.DVDToc:
case AttributeSource.CDPlaylist:
playlist = CD.Playlist;
break;
case AttributeSource.PlaylistCollection:
// Retrieve a playlist from the PlaylistCollection.
playlist = PLCollection.getAll().Item(0);
break;
case AttributeSource.CurrentPlaylist:
playlist = Player.currentPlaylist;
break;
default:
// This is strictly for debugging, it should never happen.
// If it does, we need a new case here or to fix the calling function.
throw new ArgumentOutOfRangeException("Source");
}
int cAttributes = playlist.attributeCount;
// Log the attribute name and writability.
for (int i = 0; i < cAttributes; i++)
{
name = playlist.get_attributeName(i);
ListViewItem item = new ListViewItem(Source.ToString());
item.SubItems.Add(name);
item.SubItems.Add(playlist.getItemInfo(name));
// We'll assume it's read-only.
// If we can actually write it, we'll flip the bool.
// We do this because there is no IsReadOnlyItem property
// available on the playlist object.
bool bRO = true;
try
{
// Cache the value.
string temp = playlist.getItemInfo(name);
// Try to write something.
playlist.setItemInfo(name, "random");
// Write back the cached value.
playlist.setItemInfo(name, temp);
bRO = false;
}
catch (COMException)
{
// Writing the test value failed.
// bRO is true by default, so nothing to do here.
}
item.SubItems.Add(bRO.ToString());
listView1.Items.Add(item);
}
}
catch (NullReferenceException)
{
ListViewItem item2 = new ListViewItem(Source.ToString());
item2.SubItems.Add("NullReferenceException");
item2.SubItems.Add("Does your library contain a playlist?");
listView1.Items.Add(item2);
}
catch (ArgumentOutOfRangeException exc)
{
lblStatus.Text = "Invalid parameter in getMetadataFromPlaylist: " + exc.Message;
}
catch (COMException exc)
{
lblStatus.Text = "Exception in getMetadata: " + exc.Message;
}
catch
{
lblStatus.Text = "Exception in getMetadata.";
throw;
}
}
/// <summary>
/// Run the current report. Refreshes the log display when needed,
/// such as when the user switches libraries.
/// </summary>
private void runCurrentReport()
{
switch (rtLast)
{
case ReportType.AllSchemas:
mnuLibraryAttributes_Click(this, null);
break;
case ReportType.CDTOC:
mnuCDTOC_Click(this, null);
break;
case ReportType.CDTrack:
mnuCDTrack_Click(this, null);
break;
case ReportType.DVDTitleChap:
mnuDVDTitleChapter_Click(this, null);
break;
case ReportType.DVDTOC:
mnuDVDTOC_Click(this, null);
break;
case ReportType.PlaylistCollection:
mnuPlaylistCollection_Click(this, null);
break;
case ReportType.CurrentMedia:
mnuCurrentMedia_Click(this, null);
break;
default:
break;
}
}
/// <summary>
/// Fills the combo box with CD drive letters.
/// </summary>
private void enumerateCDDrives()
{
UseWaitCursor = true;
cmbDrives.Items.Clear();
int count = CDCollection.count;
for(int i = 0; i < count; i++)
{
cmbDrives.Items.Add(CDCollection.Item(i).driveSpecifier);
}
cmbDrives.SelectedIndex = 0;
UseWaitCursor = false;
}
/// <summary>
/// Get the current CD object.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbDrives_SelectedIndexChanged(object sender, System.EventArgs e)
{
CD = Player.cdromCollection.Item(cmbDrives.SelectedIndex);
}
/// <summary>
/// Save output to text file.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuSaveAs_Click(object sender, System.EventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
try
{
dlg.Filter = "Text files(.txt)|*.txt";
dlg.RestoreDirectory = true;
dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (dlg.ShowDialog() == DialogResult.OK)
{
strOutFile = dlg.FileName;
string retval = logStringFromTable(bShowVals, bShowReadOnly);
writeToFile(retval, FileMode.Create);
}
}
catch (FileNotFoundException ex)
{
lblStatus.Text = "File not found exception: " + ex.Message.ToString();
}
catch
{
lblStatus.Text = "Error when opening file for saving.";
throw;
}
}
/// <summary>
/// Cache the values checkbox state.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkVals_CheckedChanged(object sender, System.EventArgs e)
{
bShowVals = chkReadOnly.Checked;
}
/// <summary>
/// Cache the writability checkbox state.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkReadOnly_CheckedChanged(object sender, System.EventArgs e)
{
bShowReadOnly = chkReadOnly.Checked;
}
/// <summary>
/// Get the DVD Title 0 attributes.
/// This is essentially the same as a CD TOC capture.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuDVDTOC_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "DVD TOC Attributes";
if(Player.dvd.get_isAvailable("dvdDecoder") == true)
{
getMetadataFromPlaylist(AttributeSource.DVDToc);
}
else
{
lblStatus.Text = "No DVD decoder installed.";
};
rtLast = ReportType.DVDTOC;
UseWaitCursor = false;
}
/// <summary>
/// Save using current filename.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuSave_Click(object sender, System.EventArgs e)
{
UseWaitCursor = true;
// Save should behave like Save as if the output file path
// is undefined.
if(String.IsNullOrEmpty(strOutFile))
{
mnuSaveAs_Click(this, null);
return;
}
string retval = logStringFromTable(bShowVals, bShowReadOnly);
writeToFile(retval, FileMode.Create);
UseWaitCursor = false;
}
/// <summary>
/// Capture attributes for current media item.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuCurrentMedia_Click(object sender, EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "Current Media Attributes";
getMetadataFromMedia(AttributeSource.CurrentMedia);
rtLast = ReportType.CurrentMedia;
UseWaitCursor = false;
}
/// <summary>
/// Capture attributes for the current playlist.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuCurrentPlaylist_Click(object sender, EventArgs e)
{
UseWaitCursor = true;
listView1.Items.Clear();
lblStatus.Text = "Current Playlist Attributes";
getMetadataFromPlaylist(AttributeSource.CurrentPlaylist);
rtLast = ReportType.CurrentPlaylist;
UseWaitCursor = false;
}
/// <summary>
/// Respond to user checkbox selection.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkLegacyMC_CheckedChanged(object sender, EventArgs e)
{
GetMediaCollection();
}
/// <summary>
/// Player OpenStateChange event handler.
/// Show current media metadata when the user opens a media file.
/// </summary>
/// <param name="sender"></param>
/// <param name="e">e.NewState contains the WMPOpenState value for the event.</param>
private void Player_OpenStateChange(object sender, AxWMPLib._WMPOCXEvents_OpenStateChangeEvent e)
{
if ((WMPOpenState)e.newState == WMPOpenState.wmposMediaOpen)
{
mnuCurrentMedia_Click(this, null);
SetDVDButtonStates();
}
}
/// <summary>
/// Manage the DVD menu button states.
/// </summary>
private void SetDVDButtonStates()
{
btnTop.Enabled = Player.dvd.get_isAvailable("topMenu");
btnTitle.Enabled = Player.dvd.get_isAvailable("titleMenu");
}
}
/// <summary>
/// Custom exception for dealing with an empty playlist.
/// We'll raise this exception if we expect a playlist to contain media items,
/// but it does not.
/// </summary>
[Serializable]
public class EmptyPlaylistException: System.Exception, ISerializable
{
public EmptyPlaylistException()
{
}
public EmptyPlaylistException(String message) : base(message)
{
}
public EmptyPlaylistException(String message, Exception innerException):
base(message, innerException)
{
}
protected EmptyPlaylistException(SerializationInfo info,
StreamingContext context) : base(info, context)
{
}
}
}