diff --git a/java/src/com/dt/iTunesController/ITArtwork.java b/java/src/com/dt/iTunesController/ITArtwork.java
new file mode 100644
index 0000000..53846c9
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITArtwork.java
@@ -0,0 +1,55 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a artwork.
+ *
+ * Defines a single piece of artwork.
+ *
+ * Artwork is always associated with an individual track.
+ * To add a piece of artwork to a track, use IITTrack::AddArtworkFromFile().
+ * The IITTrack::Artwork property
+ *
+ * To get a collection of artwork associated with a track call
+ * ITTrack.getArtwork().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITArtwork extends ITObject {
+
+ public ITArtwork (Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Delete this object.
+ */
+ public void delete() {
+ Dispatch.call(object, "Delete");
+ }
+
+ /**
+ * Returns the kind of the object.
+ * @return Returns the kind of the object.
+ */
+ public ITArtworkFormat getFormat() {
+ return ITArtworkFormat.values()[Dispatch.get(object, "Format").getInt()];
+ }
+
+ // TODO: Comments
+
+ public boolean getIsDownloadedArtwork() {
+ return Dispatch.get(object, "IsDownloadedArtwork").getBoolean();
+ }
+
+ public String getDescription() {
+ return Dispatch.get(object, "Description").getString();
+
+ }
+
+ public void SaveArtworkToFile(String filePath) {
+ Dispatch.call(object, "SaveArtworkToFile",filePath);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITArtworkCollection.java b/java/src/com/dt/iTunesController/ITArtworkCollection.java
new file mode 100644
index 0000000..c1d8afa
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITArtworkCollection.java
@@ -0,0 +1,55 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a collection of Artwork objects.
+ *
+ * Note that collection indices are always 1-based.
+ *
+ * You can retrieve all the Artworks defined for a source using
+ * ITSource.getArtwork().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITArtworkCollection {
+
+ protected Dispatch object;
+
+ public ITArtworkCollection(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the number of playlists in the collection.
+ * @return Returns the number of playlists in the collection.
+ */
+ public int getCount() {
+ return Dispatch.get(object, "Count").getInt();
+ }
+
+ /**
+ * Returns an ITArtwork object corresponding to the given index (1-based).
+ * @param index Index of the playlist to retrieve, must be less than or
+ * equal to ITArtworkCollection.getCount().
+ * @return Returns an ITArtwork object corresponding to the given index.
+ * Will be set to NULL if no playlist could be retrieved.
+ */
+ public ITArtwork getItem (int index) {
+ Dispatch item = Dispatch.call(object, "Item", index).toDispatch();
+ return new ITArtwork(item);
+ }
+
+ /**
+ * Returns an ITArtwork object with the specified persistent ID. See the
+ * documentation on ITObject for more information on persistent IDs.
+ * @param highID The high 32 bits of the 64-bit persistent ID.
+ * @param lowID The low 32 bits of the 64-bit persistent ID.
+ * @return Returns an ITArtwork object with the specified persistent ID.
+ * Will be set to NULL if no playlist could be retrieved.
+ */
+ public ITArtwork getItemByPersistentID (int highID, int lowID) {
+ Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch();
+ return new ITArtwork(item);
+ }
+}
diff --git a/java/src/com/dt/iTunesController/ITArtworkFormat.java b/java/src/com/dt/iTunesController/ITArtworkFormat.java
new file mode 100644
index 0000000..ed4b61e
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITArtworkFormat.java
@@ -0,0 +1,13 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the Artwork kind.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITArtworkFormat {
+ ITArtworkFormatUnknown,
+ ITArtworkFormatJPEG,
+ ITArtworkFormatPNG,
+ ITArtworkFormatBMP;
+}
diff --git a/java/src/com/dt/iTunesController/ITAudioCDPlaylist.java b/java/src/com/dt/iTunesController/ITAudioCDPlaylist.java
new file mode 100644
index 0000000..bc12943
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITAudioCDPlaylist.java
@@ -0,0 +1,76 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents an audio CD playlist.
+ *
+ * An audio CD playlist is always associated with an IITSource of kind
+ * ITSourceKindAudioCD.
+ *
+ * You can retrieve all the playlists defined for a source using
+ * ITSource.getPlaylists().
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITAudioCDPlaylist extends ITPlaylist {
+
+ public ITAudioCDPlaylist(Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Returns the audio CD's artist.
+ * @return Returns the audio CD's artist.
+ */
+ public String getArtist() {
+ return Dispatch.get(object, "Artist").getString();
+ }
+
+ /**
+ * Returns true if this audio CD is a compilation album.
+ * @return Returns true if this audio CD is a compilation album.
+ */
+ public boolean isCompilation() {
+ return Dispatch.get(object, "Compilation").getBoolean();
+ }
+
+ /**
+ * Returns the audio CD's composer.
+ * @return Returns the audio CD's composer.
+ */
+ public String getComposer() {
+ return Dispatch.get(object, "Composer").getString();
+ }
+
+ /**
+ * Returns the total number of discs in this CD's album.
+ * @return Returns the total number of discs in this CD's album.
+ */
+ public long getDiscCount() {
+ return Dispatch.get(object, "DiscCount").getLong();
+ }
+
+ /**
+ * Returns the index of the CD disc in the source album.
+ * @return Returns the index of the CD disc in the source album.
+ */
+ public long getDiscNumber() {
+ return Dispatch.get(object, "DiscNumber").getLong();
+ }
+
+ /**
+ * Returns the audio CD's genre.
+ * @return Returns the audio CD's genre.
+ */
+ public String getGenre() {
+ return Dispatch.get(object, "Genre").getString();
+ }
+
+ /**
+ * Reveals the CD playlist in the main browser window.
+ */
+ public void reveal() {
+ Dispatch.call(object, "Reveal");
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITBrowserWindow.java b/java/src/com/dt/iTunesController/ITBrowserWindow.java
new file mode 100644
index 0000000..16dc6cf
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITBrowserWindow.java
@@ -0,0 +1,45 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents the main browser window.
+ *
+ * You can retrieve the main browser window using
+ * iTunes.BrowserWindow().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+
+public class ITBrowserWindow extends ITWindow {
+
+ public ITBrowserWindow (Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Returns the kind of the object.
+ * @return Returns the kind of the object.
+ */
+ public boolean getMiniPlayer() {
+ return Dispatch.get(object, "MiniPlayer").getBoolean();
+ }
+
+ // TODO: Comments
+
+ public ITTrackCollection getSelectedTracks() {
+ Dispatch collection = Dispatch.call(object, "SelectedTracks").getDispatch();
+ return new ITTrackCollection(collection);
+ }
+
+ public ITPlaylist getSelectedPlaylist() {
+ Dispatch playlist = Dispatch.get(object, "SelectedPlaylist").toDispatch();
+ return new ITPlaylist(playlist);
+ }
+
+ public void setSelectedPlaylist(ITPlaylist playlist) {
+ Dispatch dispatchRef = playlist.fetchDispatch();
+ Dispatch.put(object, "SelectedPlaylist", dispatchRef);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITCOMDisabledReason.java b/java/src/com/dt/iTunesController/ITCOMDisabledReason.java
new file mode 100644
index 0000000..500280c
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITCOMDisabledReason.java
@@ -0,0 +1,12 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the reason the COM interface is being disabled.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITCOMDisabledReason {
+ ITCOMDisabledReasonOther,
+ ITCOMDisabledReasonDialog,
+ ITCOMDisabledReasonQuitting;
+}
diff --git a/java/src/com/dt/iTunesController/ITEQPreset.java b/java/src/com/dt/iTunesController/ITEQPreset.java
new file mode 100644
index 0000000..1d00cfb
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITEQPreset.java
@@ -0,0 +1,236 @@
+package com.dt.iTunesController;
+
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents an equalizer preset.
+ * You can retrieve or set the currently selected EQ preset using the
+ * iTunes.getCurrentEQPreset() method.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITEQPreset {
+
+ protected Dispatch object;
+
+ public ITEQPreset(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the name of the EQ Preset (e.g. "Acoustic").
+ * @return Returns the name of the EQ Preset (e.g. "Acoustic").
+ */
+ public String getName() {
+ return Dispatch.get(object, "Name").getString();
+ }
+
+ /**
+ * Returns true if the EQ preset can be modified.
+ * @return True if the EQ preset can be modified.
+ */
+ public boolean getModifiable() {
+ return Dispatch.get(object, "Modifiable").getBoolean();
+ }
+
+ /**
+ * Set the equalizer preamp level (-12.0 db to +12.0 db).
+ * @param level The new equalizer preamp level (-12.0 db to +12.0 db).
+ */
+ public void setPreamp(double level) {
+ Dispatch.put(object, "Preamp", level);
+ }
+
+ /**
+ * Returns the equalizer preamp level (-12.0db to +12.0db).
+ * @return Returns the equalizer preamp level (-12.0db to +12.0db).
+ */
+ public double getPreamp() {
+ return Dispatch.get(object, "Preamp").getDouble();
+ }
+
+ /**
+ * Set the equalizer 32Hz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 32Hz level (-12.0 db to +12.0db).
+ */
+ public void setBand1(double level) {
+ Dispatch.put(object, "Band1", level);
+ }
+
+ /**
+ * Returns the equalizer 32Hz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 32Hz level (-12.0 db to +12.0 db).
+ */
+ public double getBand1() {
+ return Dispatch.get(object, "Band1").getDouble();
+ }
+
+ /**
+ * Set the equalizer 64Hz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 64Hz level (-12.0 db to +12.0db).
+ */
+ public void setBand2(double level) {
+ Dispatch.put(object, "Band2", level);
+ }
+
+ /**
+ * Returns the equalizer 64Hz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 64Hz level (-12.0 db to +12.0 db).
+ */
+ public double getBand2() {
+ return Dispatch.get(object, "Band2").getDouble();
+ }
+
+ /**
+ * Set the equalizer 125Hz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 125Hz level (-12.0 db to +12.0db).
+ */
+ public void setBand3(double level) {
+ Dispatch.put(object, "Band3", level);
+ }
+
+ /**
+ * Returns the equalizer 125Hz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 125Hz level (-12.0 db to +12.0 db).
+ */
+ public double getBand3() {
+ return Dispatch.get(object, "Band3").getDouble();
+ }
+
+ /**
+ * Set the equalizer 250Hz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 250Hz level (-12.0 db to +12.0db).
+ */
+ public void setBand4(double level) {
+ Dispatch.put(object, "Band4", level);
+ }
+
+ /**
+ * Returns the equalizer 250Hz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 250Hz level (-12.0 db to +12.0 db).
+ */
+ public double getBand4() {
+ return Dispatch.get(object, "Band4").getDouble();
+ }
+
+ /**
+ * Set the equalizer 500Hz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 500Hz level (-12.0 db to +12.0db).
+ */
+ public void setBand5(double level) {
+ Dispatch.put(object, "Band5", level);
+ }
+
+ /**
+ * Returns the equalizer 500Hz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 500Hz level (-12.0 db to +12.0 db).
+ */
+ public double getBand5() {
+ return Dispatch.get(object, "Band5").getDouble();
+ }
+
+ /**
+ * Set the equalizer 1KHz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 1KHz level (-12.0 db to +12.0db).
+ */
+ public void setBand6(double level) {
+ Dispatch.put(object, "Band6", level);
+ }
+
+ /**
+ * Returns the equalizer 1KHz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 1KHz level (-12.0 db to +12.0 db).
+ */
+ public double getBand6() {
+ return Dispatch.get(object, "Band6").getDouble();
+ }
+
+ /**
+ * Set the equalizer 2KHz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 2KHz level (-12.0 db to +12.0db).
+ */
+ public void setBand7(double level) {
+ Dispatch.put(object, "Band7", level);
+ }
+
+ /**
+ * Returns the equalizer 2KHz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 2KHz level (-12.0 db to +12.0 db).
+ */
+ public double getBand7() {
+ return Dispatch.get(object, "Band7").getDouble();
+ }
+
+ /**
+ * Set the equalizer 4KHz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 4KHz level (-12.0 db to +12.0db).
+ */
+ public void setBand8(double level) {
+ Dispatch.put(object, "Band8", level);
+ }
+
+ /**
+ * Returns the equalizer 4KHz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 4KHz level (-12.0 db to +12.0 db).
+ */
+ public double getBand8() {
+ return Dispatch.get(object, "Band8").getDouble();
+ }
+
+ /**
+ * Set the equalizer 8KHz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 8KHz level (-12.0 db to +12.0db).
+ */
+ public void setBand9(double level) {
+ Dispatch.put(object, "Band9", level);
+ }
+
+ /**
+ * Returns the equalizer 8KHz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 8KHz level (-12.0 db to +12.0 db).
+ */
+ public double getBand9() {
+ return Dispatch.get(object, "Band9").getDouble();
+ }
+
+ /**
+ * Set the equalizer 16KHz level (-12.0 db to +12.0 db).
+ * @param level The new equalizer 16KHz level (-12.0 db to +12.0db).
+ */
+ public void setBand10(double level) {
+ Dispatch.put(object, "Band10", level);
+ }
+
+ /**
+ * Returns the equalizer 16KHz level (-12.0 db to +12.0 db).
+ * @return Returns the equalizer 16KHz level (-12.0 db to +12.0 db).
+ */
+ public double getBand10() {
+ return Dispatch.get(object, "Band10").getDouble();
+ }
+
+ /**
+ * Delete this EQ Preset.
+ * Any EQ preset can be deleted, including built-in presets, except for the
+ * Manual preset.
+ * @param updateAllTracks If true, any tracks that use this EQ preet will be
+ * set to have no assigned EQ preset.
+ */
+ public void delete(boolean updateAllTracks) {
+ Dispatch.call(object, "Delete", updateAllTracks);
+ }
+
+ /**
+ * Rename this EQ Preset.
+ * The name of any EQ preset can be changed, including built-in presets,
+ * except for the Manual preset.
+ * EQ preset names cannot start with leading spaces. If you specify a name
+ * that starts with leading spaces they will be stripped out.
+ * @param updateAllTracks If true, any tracks that use this EQ preet will be
+ * updated with the new preset name.
+ */
+ public void rename(String newName, boolean updateAllTracks) {
+ Dispatch.call(object, "Rename", newName, updateAllTracks);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITFileOrCDTrack.java b/java/src/com/dt/iTunesController/ITFileOrCDTrack.java
new file mode 100644
index 0000000..570896c
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITFileOrCDTrack.java
@@ -0,0 +1,39 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a file or CD track.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITFileOrCDTrack extends ITTrack {
+
+ public ITFileOrCDTrack (Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Reveals the track in the main browser window.
+ */
+ public void reveal() {
+ Dispatch.call(object, "Reveal");
+ }
+
+ public ITVideoKind getVideoKind() {
+ return ITVideoKind.values()[Dispatch.get(object, "VideoKind").getInt()];
+ }
+
+ public ITRatingKind getRatingKind() {
+ return ITRatingKind.values()[Dispatch.get(object, "RatingKind").getInt()];
+ }
+
+ public String getLocation() {
+ return Dispatch.get(object, "Location").getString();
+ }
+
+ public ITArtworkCollection getArtworks() {
+ Dispatch artworks = Dispatch.get(object, "Artwork").toDispatch();
+ return new ITArtworkCollection(artworks);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITLibraryPlaylist.java b/java/src/com/dt/iTunesController/ITLibraryPlaylist.java
new file mode 100644
index 0000000..c19cba8
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITLibraryPlaylist.java
@@ -0,0 +1,20 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a library playlist.
+ *
+ * A library playlist consists of all the tracks in a user's library.
+ *
+ * For convenience, you can retrieve the main library playlist using
+ * iTunes.getLibraryPlaylist().
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITLibraryPlaylist extends ITPlaylist {
+
+ public ITLibraryPlaylist(Dispatch d) {
+ super(d);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITObject.java b/java/src/com/dt/iTunesController/ITObject.java
new file mode 100644
index 0000000..27475fd
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITObject.java
@@ -0,0 +1,112 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Defines a source, playlist or track.
+ *
+ * An ITObject uniquely identifies a source, playlist, or track in iTunes using
+ * four separate IDs. These are runtime IDs, they are only valid while the
+ * current instance of iTunes is running.
+ *
+ * As of iTunes 7.7, you can also identify an ITObject using a 64-bit persistent
+ * ID, which is valid across multiple invocations of iTunes.
+ *
+ * The main use of the ITObject interface is to allow clients to track iTunes
+ * database changes using
+ * iTunesEventsInterface.onDatabaseChangedEvent().
+ *
+ * You can retrieve an ITObject with a specified runtime ID using
+ * iTunes.getITObjectByID().
+ *
+ * An ITObject will always have a valid, non-zero source ID.
+ *
+ * An ITObject corresponding to a playlist or track will always have a valid
+ * playlist ID. The playlist ID will be zero for a source.
+ *
+ * An ITObject corresponding to a track will always have a valid track and
+ * track database ID. These IDs will be zero for a source or playlist.
+ *
+ * A track ID is unique within the track's playlist. A track database ID is
+ * unique across all playlists. For example, if the same music file is in two
+ * different playlists, each of the tracks could have different track IDs, but
+ * they will have the same track database ID.
+ *
+ * An ITObject also has a 64-bit persistent ID which can be used to identify
+ * the ITObject across multiple invocations of iTunes.
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITObject {
+
+ protected Dispatch object;
+
+ public ITObject(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the JACOB Dispatch object for this object.
+ * @return Returns the JACOB Dispatch object for this object.
+ */
+ public Dispatch fetchDispatch() {
+ return object;
+ }
+
+ /**
+ * Set the name of the object.
+ * @param name The new name of the object.
+ */
+ public void setName (String name) {
+ Dispatch.put(object, "Name", name);
+ }
+
+ /**
+ * Returns the name of the object.
+ * @return Returns the name of the object.
+ */
+ public String getName() {
+ return Dispatch.get(object, "Name").getString();
+ }
+
+ /**
+ * Returns the index of the object in internal application order.
+ * @return The index of the object in internal application order.
+ */
+ public int getIndex() {
+ return Dispatch.get(object, "Index").getInt();
+ }
+
+ /**
+ * Returns the ID that identifies the source.
+ * @return Returns the ID that identifies the source.
+ */
+ public int getSourceID() {
+ return Dispatch.get(object, "SourceID").getInt();
+ }
+
+ /**
+ * Returns the ID that identifies the playlist.
+ * @return Returns the ID that identifies the playlist.
+ */
+ public int getPlaylistID() {
+ return Dispatch.get(object, "PlaylistID").getInt();
+ }
+
+ /**
+ * Returns the ID that identifies the track within the playlist.
+ * @return Returns the ID that identifies the track within the playlist.
+ */
+ public int getTrackID() {
+ return Dispatch.get(object, "TrackID").getInt();
+ }
+
+ /**
+ * Returns the ID that identifies the track, independent of its playlist.
+ * @return Returns the ID that identifies the track, independent of its playlist.
+ */
+ public int getTrackDatabaseID() {
+ return Dispatch.get(object, "TrackDatabaseID").getInt();
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITObjectPersistentID.java b/java/src/com/dt/iTunesController/ITObjectPersistentID.java
new file mode 100644
index 0000000..748816f
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITObjectPersistentID.java
@@ -0,0 +1,53 @@
+package com.dt.iTunesController;
+
+/**
+ * Simple utility wrapper class to represent the persistent object identity
+ * ID numbers. Use the getHigh() and getLow() methods individually to get
+ * each ID, or the combined hex string through toString().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITObjectPersistentID {
+
+ private long High;
+ private long Low;
+ private String hexString;
+
+ /**
+ * Create the ITObjectPersistentID. This class is not intended to be created
+ * manually, and this function should only be used by classes implementing
+ * this utility.
+ * @param high The High Persistent ID
+ * @param low The Low Persistent ID
+ */
+ public ITObjectPersistentID(long high, long low) {
+ this.High=high;
+ this.Low=low;
+ this.hexString = String.format("%8s%8s",Long.toHexString(this.High),Long.toHexString(this.Low)).toUpperCase().replace(' ','0');
+ }
+
+ /**
+ * Returns the high persistent ID.
+ * @return The high persistent ID.
+ */
+ public long getHigh() {
+ return this.High;
+ }
+
+ /**
+ * Returns the low persistent ID.
+ * @return The low persistent ID.
+ */
+ public long getLow() {
+ return this.Low;
+ }
+
+ /**
+ * Return a string representation (in hex) of the persistent IDs.
+ * @return String representation of the persistent IDs.
+ */
+ public String toString() {
+ return this.hexString;
+ }
+}
diff --git a/java/src/com/dt/iTunesController/ITOperationStatus.java b/java/src/com/dt/iTunesController/ITOperationStatus.java
new file mode 100644
index 0000000..cf764aa
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITOperationStatus.java
@@ -0,0 +1,62 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents the status of an asynchronous add or convert operation.
+ *
+ * When a track is added using TLibraryPlaylist.addFile(),
+ * ITLibraryPlaylist.AddFiles(), IITUserPlaylist.addFile(), or
+ * ITUserPlaylist.addFiles(), the add may not complete immediately if iTunes
+ * needs to make a copy of the file.
+ *
+ * Similarly, when converting or importing a file or track using
+ * iTunes.convertFile(), iTunes.convertFiles(),
+ * iTunes.convertTrack() or iTunes.convertTracks(),
+ * the conversion will never complete immediately.
+ *
+ * These methods return an ITOperationStatus object, which can be
+ * polled todetermine when the operation is done. This object will also return
+ * the collection of newly added or converted tracks.
+ *
+ * As of version 1.1 of the iTunes type library, you should use
+ * iTunes.convertFile2(), iTunes.convertFiles2(),
+ * iTunes.convertTrack2() or iTunes.convertTracks2()
+ * instead of the original convert methods. These new methods return an
+ * ITConvertOperationStatus object to allow clients to retrieve
+ * additional conversion progress information.
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITOperationStatus {
+
+ protected Dispatch object;
+
+ public ITOperationStatus(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns true if the operation is still in progress.
+ * You cannot retrieve the ITOperationStatus.getTracks()
+ * property until the operation completes.
+ * @return Returns true if the operation is still in progress.
+ */
+ public boolean getInProgress() {
+ return Dispatch.get(object, "InProgress").getBoolean();
+ }
+
+ /**
+ * Returns a collection containing the tracks that were generated by the
+ * operation.
+ * You cannot retrieve this property until
+ * ITOperationStatus.getInProgress() returns false
+ * @return Returns a collection containing the tracks that were generated by
+ * the operation.
+ */
+ public ITTrackCollection getTracks() {
+ Dispatch tracks = Dispatch.get(object, "Tracks").toDispatch();
+ return new ITTrackCollection(tracks);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITPlayerState.java b/java/src/com/dt/iTunesController/ITPlayerState.java
new file mode 100644
index 0000000..4be2a70
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlayerState.java
@@ -0,0 +1,13 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the state of the player.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITPlayerState {
+ ITPlayerStateStopped,
+ ITPlayerStatePlaying,
+ ITPlayerStateFastForward,
+ ITPlayerStateRewind;
+}
diff --git a/java/src/com/dt/iTunesController/ITPlaylist.java b/java/src/com/dt/iTunesController/ITPlaylist.java
new file mode 100644
index 0000000..23bf2b9
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlaylist.java
@@ -0,0 +1,154 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a playlist.
+ *
+ * A playlist is always associated with an ITSource.
+ *
+ * You can retrieve all the playlists defined for a source using
+ * ITSource.getPlaylists().
+ *
+ * For convenience, you can retrieve the main library playlist using
+ * iTunes.getLibraryPlaylist().
+ *
+ * You can create a new playlist using iTunes.createPlaylist().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITPlaylist extends ITObject {
+
+ public ITPlaylist (Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Delete this object.
+ */
+ public void delete() {
+ Dispatch.call(object, "Delete");
+ }
+
+ /**
+ * Start playing the first track in this object.
+ */
+ public void playFirstTrack() {
+ Dispatch.call(object, "PlayFirstTrack");
+ }
+
+ /**
+ * Print this object.
+ * @param showPrintDialog If true, display the print dialog.
+ * @param printKind The printout kind.
+ * @param theme The name of the theme to use. This corresponds to the name
+ * of a Theme combo box item in the print dialog for the specified printKind
+ * (e.g. "Track length"). This string cannot be longer than 255 characters,
+ * but it may be empty.
+ */
+ public void print(boolean showPrintDialog, ITPlaylistPrintKind printKind, String theme) {
+ Dispatch.call(object, "Print", showPrintDialog, printKind.ordinal(), theme);
+ }
+
+ /**
+ * Returns a collection containing the tracks with the specified text.
+ * @param searchText The text to search for. This string cannot be longer
+ * than 255 chracters.
+ * @param searchFields Specifies which fields of each track should be
+ * searched for searchText.
+ * @return Collection of IITTrack objects. This will be NULL if no tracks
+ * meet the search criteria.
+ */
+ public ITTrackCollection search (String searchText, ITPlaylistSearchField searchFields) {
+ Dispatch collection = Dispatch.call(object, "Search", searchText, searchFields.ordinal()).getDispatch();
+ return new ITTrackCollection(collection);
+ }
+
+ /**
+ * Returns the kind of the object.
+ * @return Returns the kind of the object.
+ */
+ public ITPlaylistKind getKind() {
+ return ITPlaylistKind.values()[Dispatch.get(object, "Kind").getInt()];
+ }
+
+ /**
+ * Returns an ITSource object corresponding to the source that contains the
+ * object.
+ * @return Returns an ITSource object corresponding to the source that
+ * contains the object.
+ */
+ public ITSource getSource() {
+ Dispatch source = Dispatch.get(object, "Source").toDispatch();
+ return new ITSource(source);
+ }
+
+ /**
+ * Returns the total length of all songs in the object (in seconds).
+ * @return Returns the total length of all songs in the object (in
+ * seconds).
+ */
+ public int getDuration() {
+ return Dispatch.get(object, "Duration").getInt();
+ }
+
+ /**
+ * Set whether songs in the object should be played in random order.
+ * @param shouldShuffle True if songs in the object should be played in
+ * random order.
+ */
+ public void setShuffle(boolean shouldShuffle) {
+ Dispatch.put(object, "Shuffle", shouldShuffle);
+ }
+
+ /**
+ * Returns the total size of all songs in the object (in bytes).
+ * @return Returns the total size of all songs in the object (in bytes).
+ */
+ public double getSize() {
+ return Dispatch.get(object, "Size").getDouble();
+ }
+
+ /**
+ * Sets the playback repeat mode.
+ * @param repeatMode The new playback repeat mode.
+ */
+ public void setSongRepeat(ITPlaylistRepeatMode repeatMode) {
+ Dispatch.put(object, "SongRepeat", repeatMode.ordinal());
+ }
+
+ /**
+ * Returns the playback repeat mode.
+ * @return Returns the playback repeat mode.
+ */
+ public ITPlaylistRepeatMode getSongRepeat() {
+ return ITPlaylistRepeatMode.values()[Dispatch.get(object, "SongRepeat").getInt()];
+ }
+
+ /**
+ * Returns the total length of all songs in the object (in MM:SS format).
+ * @return Returns the total length of all songs in the object (in
+ * MM:SS format).
+ */
+ public String getTime() {
+ return Dispatch.get(object, "Time").getString();
+ }
+
+ /**
+ * Returns true if the object is visible in the sources list.
+ * @return True if the object is visible in the sources list.
+ */
+ public boolean getVisible() {
+ return Dispatch.get(object, "Visible").getBoolean();
+ }
+
+ /**
+ * Returns a collection containing the tracks in this object.
+ * @return Collection of ITTrack objects.
+ */
+ public ITTrackCollection getTracks() {
+ Dispatch tracks = Dispatch.get(object, "Tracks").toDispatch();
+ return new ITTrackCollection(tracks);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITPlaylistCollection.java b/java/src/com/dt/iTunesController/ITPlaylistCollection.java
new file mode 100644
index 0000000..3717735
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlaylistCollection.java
@@ -0,0 +1,67 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a collection of playlist objects.
+ *
+ * Note that collection indices are always 1-based.
+ *
+ * You can retrieve all the playlists defined for a source using
+ * ITSource.getPlaylists().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITPlaylistCollection {
+
+ protected Dispatch object;
+
+ public ITPlaylistCollection(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the number of playlists in the collection.
+ * @return Returns the number of playlists in the collection.
+ */
+ public int getCount() {
+ return Dispatch.get(object, "Count").getInt();
+ }
+
+ /**
+ * Returns an ITPlaylist object corresponding to the given index (1-based).
+ * @param index Index of the playlist to retrieve, must be less than or
+ * equal to ITPlaylistCollection.getCount().
+ * @return Returns an ITPlaylist object corresponding to the given index.
+ * Will be set to NULL if no playlist could be retrieved.
+ */
+ public ITPlaylist getItem (int index) {
+ Dispatch item = Dispatch.call(object, "Item", index).toDispatch();
+ return new ITPlaylist(item);
+ }
+
+ /**
+ * Returns an ITPlaylist object withthe specified name.
+ * @param name The name of the playlist to retrieve.
+ * @return Returns an ITPlaylist object corresponding to the given index.
+ * Will be set to NULL if no playlist could be retrieved.
+ */
+ public ITPlaylist ItemByName (String name) {
+ Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch();
+ return new ITPlaylist(item);
+ }
+
+ /**
+ * Returns an ITPlaylist object with the specified persistent ID. See the
+ * documentation on ITObject for more information on persistent IDs.
+ * @param highID The high 32 bits of the 64-bit persistent ID.
+ * @param lowID The low 32 bits of the 64-bit persistent ID.
+ * @return Returns an ITPlaylist object with the specified persistent ID.
+ * Will be set to NULL if no playlist could be retrieved.
+ */
+ public ITPlaylist getItemByPersistentID (int highID, int lowID) {
+ Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch();
+ return new ITPlaylist(item);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITPlaylistKind.java b/java/src/com/dt/iTunesController/ITPlaylistKind.java
new file mode 100644
index 0000000..e6f685f
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlaylistKind.java
@@ -0,0 +1,15 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the playlist kind.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITPlaylistKind {
+ ITPlaylistKindUnknown,
+ ITPlaylistKindLibrary,
+ ITPlaylistKindUser,
+ ITPlaylistKindCD,
+ ITPlaylistKindDevice,
+ ITPlaylistKindRadioTuner;
+}
diff --git a/java/src/com/dt/iTunesController/ITPlaylistPrintKind.java b/java/src/com/dt/iTunesController/ITPlaylistPrintKind.java
new file mode 100644
index 0000000..6fc8ef8
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlaylistPrintKind.java
@@ -0,0 +1,14 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the kind of playlist printout.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITPlaylistPrintKind {
+
+ ITPlaylistPrintKindPlaylist,
+ ITPlaylistPrintKindAlbumlist,
+ ITPlaylistPrintKindInsert;
+
+}
diff --git a/java/src/com/dt/iTunesController/ITPlaylistRepeatMode.java b/java/src/com/dt/iTunesController/ITPlaylistRepeatMode.java
new file mode 100644
index 0000000..4b6fc16
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlaylistRepeatMode.java
@@ -0,0 +1,14 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the playlist playback repeat mode.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITPlaylistRepeatMode {
+
+ ITPlaylistRepeatModeOff,
+ ITPlaylistRepeatModeOne,
+ ITPlaylistRepeatModeAll;
+
+}
diff --git a/java/src/com/dt/iTunesController/ITPlaylistSearchField.java b/java/src/com/dt/iTunesController/ITPlaylistSearchField.java
new file mode 100644
index 0000000..420b305
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITPlaylistSearchField.java
@@ -0,0 +1,16 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the fields in each track that will be searched by
+ * ITPlaylist.search().
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITPlaylistSearchField {
+ ITPlaylistSearchFieldAll,
+ ITPlaylistSearchFieldVisible,
+ ITPlaylistSearchFieldArtists,
+ ITPlaylistSearchFieldAlbums,
+ ITPlaylistSearchFieldComposers,
+ ITPlaylistSearchFieldSongNames;
+}
diff --git a/java/src/com/dt/iTunesController/ITRatingKind.java b/java/src/com/dt/iTunesController/ITRatingKind.java
new file mode 100644
index 0000000..7d1cb22
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITRatingKind.java
@@ -0,0 +1,11 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the rating kind.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITRatingKind {
+ ITRatingKindUser,
+ ITRatingKindComputed;
+}
diff --git a/java/src/com/dt/iTunesController/ITSource.java b/java/src/com/dt/iTunesController/ITSource.java
new file mode 100644
index 0000000..b0d93fc
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITSource.java
@@ -0,0 +1,51 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents an entry in the Source list (music library, CD, device, etc.).
+ * You can retrieve all the sources using iTunes.getSources().
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITSource extends ITObject {
+
+ public ITSource(Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Returns the kind of the source.
+ * @return Returns the kind of the source.
+ */
+ public ITSourceKind getKind() {
+ return ITSourceKind.values()[Dispatch.get(object, "Kind").getInt()];
+ }
+
+ /**
+ * Returns the total size of the source, if it has a fixed size.
+ * @return Returns the total size of the source, if it has a fixed size.
+ */
+ public double getCapacity() {
+ return Dispatch.get(object, "Capacity").getDouble();
+ }
+
+ /**
+ * Returns the free space on the source, if it has a fixed size.
+ * @return Returns the free space on the source, if it has a fixed size.
+ */
+ public double getFreespace() {
+ return Dispatch.get(object, "Freespace").getDouble();
+ }
+
+ /**
+ * Returns a collection containing the playlists in this source.
+ * The source's primary playlist is always the first playlist in the
+ * collection.
+ * @return Collection of IITPlaylist objects.
+ */
+ public ITPlaylistCollection getPlaylists() {
+ Dispatch playlists = Dispatch.get(object, "Playlists").toDispatch();
+ return new ITPlaylistCollection(playlists);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITSourceCollection.java b/java/src/com/dt/iTunesController/ITSourceCollection.java
new file mode 100644
index 0000000..357bdec
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITSourceCollection.java
@@ -0,0 +1,66 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a collection of source objects.
+ *
+ * Note that collection indices are always 1-based.
+ *
+ * You can retrieve all the sources using ITSource.getSources().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITSourceCollection {
+
+ protected Dispatch object;
+
+ public ITSourceCollection(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the number of sources in the collection.
+ * @return Returns the number of sources in the collection.
+ */
+ public int getCount() {
+ return Dispatch.get(object, "Count").getInt();
+ }
+
+ /**
+ * Returns an ITSource object corresponding to the given index (1-based).
+ * @param index Index of the source to retrieve, must be less than or
+ * equal to ITSourceCollection.getCount().
+ * @return Returns an ITSource object corresponding to the given index.
+ * Will be set to NULL if no source could be retrieved.
+ */
+ public ITSource getItem (int index) {
+ Dispatch item = Dispatch.call(object, "Item", index).toDispatch();
+ return new ITSource(item);
+ }
+
+ /**
+ * Returns an ITSource object withthe specified name.
+ * @param name The name of the source to retrieve.
+ * @return Returns an ITSource object corresponding to the given index.
+ * Will be set to NULL if no source could be retrieved.
+ */
+ public ITSource getItemByName (String name) {
+ Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch();
+ return new ITSource(item);
+ }
+
+ /**
+ * Returns an ITSource object with the specified persistent ID. See the
+ * documentation on ITObject for more information on persistent IDs.
+ * @param highID The high 32 bits of the 64-bit persistent ID.
+ * @param lowID The low 32 bits of the 64-bit persistent ID.
+ * @return Returns an ITSource object with the specified persistent ID.
+ * Will be set to NULL if no source could be retrieved.
+ */
+ public ITSource getItemByPersistentID (int highID, int lowID) {
+ Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch();
+ return new ITSource(item);
+ }
+
+}
\ No newline at end of file
diff --git a/java/src/com/dt/iTunesController/ITSourceKind.java b/java/src/com/dt/iTunesController/ITSourceKind.java
new file mode 100644
index 0000000..f332249
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITSourceKind.java
@@ -0,0 +1,17 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the source kind.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITSourceKind {
+ ITSourceKindUnknown,
+ ITSourceKindLibrary,
+ ITSourceKindIPod,
+ ITSourceKindAudioCD,
+ ITSourceKindMP3CD,
+ ITSourceKindDevice,
+ ITSourceKindRadioTuner,
+ ITSourceKindSharedLibrary;
+}
diff --git a/java/src/com/dt/iTunesController/ITTrack.java b/java/src/com/dt/iTunesController/ITTrack.java
new file mode 100644
index 0000000..0046c7e
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITTrack.java
@@ -0,0 +1,492 @@
+package com.dt.iTunesController;
+import com.jacob.com.*;
+import java.util.Date;
+
+/**
+ * Represents a track.
+ *
+ * A track represents a song in a single playlist. A song may be in more than
+ * one playlist, in which case it would be represented by multiple tracks.
+ *
+ * You can retrieve the currently targeted (playing) track using
+ * iTunes.getCurrentTrack().
+ *
+ * Typically, an ITrack is accessed through an ITTrackCollection.
+ *
+ * You can retrieve all the tracks defined for a playlist using
+ * ITPlaylist.getTracks().
+ *
+ * You can retrieve the currently selected track or tracks using
+ * iTunes.getSelectedTracks().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITTrack extends ITObject {
+
+ public ITTrack (Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Delete this object.
+ */
+ public void delete() {
+ Dispatch.call(object, "Delete");
+ }
+
+ /**
+ * Start playing this object.
+ */
+ public void play() {
+ Dispatch.call(object, "Play");
+ }
+
+ /**
+ * Set the name of the album containing the object.;
+ * @param album The new name of the album containing the object.
+ */
+ public void setAlbum(String album) {
+ Dispatch.put(object, "Album", album);
+ }
+
+ /**
+ * Returns the name of the album containing the object.
+ * @return Returns the name of the album containing the object.
+ */
+ public String getAlbum() {
+ return Dispatch.get(object, "Album").getString();
+ }
+
+ /**
+ * Set the name of the artist/source of the object.
+ * @param artist The new artist/source of the object.
+ */
+ public void setArtist(String artist) {
+ Dispatch.put(object, "Artist", artist);
+ }
+
+ /**
+ * Returns the name of the artist/source of the object.
+ * @return Returns the name of the artist/source of the object.
+ */
+ public String getArtist() {
+ return Dispatch.get(object, "Artist").getString();
+ }
+
+ /**
+ * Returns the bit rate of the object (in kbps).
+ * @return Returns the bit rate of the object (in kbps).
+ */
+ public int getBitRate() {
+ return Dispatch.get(object, "BitRate").getInt();
+ }
+
+ /**
+ * Set the tempo of the object (in beats per minute).
+ * @param beatsPerMinute The new tempo of the object (in beats per minute).
+ */
+ public void setBPM(int beatsPerMinute) {
+ Dispatch.put(object, "BPM", beatsPerMinute);
+ }
+
+ /**
+ * Returns the tempo of the object (in beats per minute).
+ * @return Returns the tempo of the object (in beats per minute).
+ */
+ public int getBPM() {
+ return Dispatch.get(object, "BPM").getInt();
+ }
+
+ /**
+ * Set freeform notes about the object.
+ * @param comment The new freeform notes about the object.
+ */
+ public void setComment(String comment) {
+ Dispatch.put(object, "Comment", comment);
+ }
+
+ /**
+ * Returns freeform notes about the object.
+ * @return Returns freeform notes about the object.
+ */
+ public String getComment() {
+ return Dispatch.get(object, "Comment").getString();
+ }
+
+ /**
+ * Set whether this object is from a compilation album.
+ * @param isCompilation True if this object should be from a compilation album.
+ */
+ public void setCompilation(boolean isCompilation) {
+ Dispatch.put(object, "Compilation", isCompilation);
+ }
+
+ /**
+ * Returns true if this object is from a compilation album.
+ * @return Returns true if this object is from a compilation album.
+ */
+ public boolean getCompilation() {
+ return Dispatch.get(object, "Compilation").getBoolean();
+ }
+
+ /**
+ * Set the composer of the object.
+ * @param composer The new composer of the object.
+ */
+ public void setComposer (String composer) {
+ Dispatch.put(object, "Composer", composer);
+ }
+
+ /**
+ * Returns the composer of the object.
+ * @return Returns the composer of the object.
+ */
+ public String getComposer() {
+ return Dispatch.get(object, "Composer").getString();
+ }
+
+ /**
+ * Returns the date the object was added to the playlist.
+ * @return Returns the date the object was added to the playlist.
+ */
+ public Date getDateAdded() {
+ return Dispatch.get(object, "DateAdded").getJavaDate();
+ }
+
+ /**
+ * Set the total number of discs in the source album.
+ * @param discCount The new total number of discs in the source album.
+ */
+ public void setDiscCount (int discCount) {
+ Dispatch.put(object, "DiscCount", discCount);
+ }
+
+ /**
+ * Returns the total number of discs in the source album.
+ * @return Returns the total number of discs in the source album.
+ */
+ public int getDiscCount() {
+ return Dispatch.get(object, "DiscCount").getInt();
+ }
+
+ /**
+ * Set the index of the disc containing the object on the source album.
+ * @param discNumber The new index of the disc containing the object on the
+ * source album.
+ */
+ public void setDiscNumber (int discNumber) {
+ Dispatch.put(object, "DiscNumber", discNumber);
+ }
+
+ /**
+ * Returns the index of the disc containing the object on the source album.
+ * @return Returns the index of the disc containing the object on the source
+ * album.
+ */
+ public int getDiscNumber() {
+ return Dispatch.get(object, "DiscNumber").getInt();
+ }
+
+ /**
+ * Returns the length of the object (in seconds).
+ * @return Returns the length of the object (in seconds).
+ */
+ public int getDuration() {
+ return Dispatch.get(object, "Duration").getInt();
+ }
+
+ /**
+ * Set whether this object is checked for playback.
+ * @param shouldBeEnabled True if the object should be checked for playback.
+ */
+ public void setEnabled (boolean shouldBeEnabled) {
+ Dispatch.put(object, "Enabled", shouldBeEnabled);
+ }
+
+ /**
+ * Returns true if the object is checked for playback.
+ * @return Returns true if the object is checked for playback.
+ */
+ public boolean getEnabled() {
+ return Dispatch.get(object, "Enabled").getBoolean();
+ }
+
+ /**
+ * Set the name of the EQ preset of the object.
+ * @param eq The new name of the EQ preset of the object.
+ */
+ public void setEQ (String eq) {
+ Dispatch.put(object, "EQ", eq);
+ }
+
+ /**
+ * Returns the name of the EQ preset of the object.
+ * @return Returns the name of the EQ preset of the object.
+ */
+ public String getEQ() {
+ return Dispatch.get(object, "EQ").getString();
+ }
+
+ /**
+ * Set the stop time of the object (in seconds).
+ * @param finish The new stop time of the object (in seconds).
+ */
+ public void setFinish(int finish) {
+ Dispatch.put(object, "Finish", finish);
+ }
+
+ /**
+ * Returns the stop time of the object (in seconds).
+ * @return Returns the stop time of the object (in seconds).
+ */
+ public int getFinish() {
+ return Dispatch.get(object, "Finish").getInt();
+ }
+
+ /**
+ * Returns the music/audio genre (category) of the object.
+ * @param genre Returns the music/audio genre (category) of the object.
+ */
+ public void setGenre(String genre) {
+ Dispatch.put(object, "Genre", genre);
+ }
+
+ /**
+ * Set the music/audio genre (category) of the object.
+ * @return The new music/audio genre (category) of the object.
+ */
+ public String getGenre() {
+ return Dispatch.get(object, "Genre").getString();
+ }
+
+ /**
+ * Set the grouping (piece) of the object.
+ * Generally used to denote movements within classical work.
+ * @param grouping The new grouping (piece) of the object.
+ */
+ public void setGrouping (String grouping) {
+ Dispatch.put(object, "Grouping", grouping);
+ }
+
+ /**
+ * Returns the grouping (piece) of the object.
+ * Generally used to denote movements within classical work.
+ * @return Returns the grouping (piece) of the object.
+ */
+ public String getGrouping() {
+ return Dispatch.get(object, "Grouping").getString();
+ }
+
+ public ITTrackKind getKind() {
+ return ITTrackKind.values()[Dispatch.get(object, "Kind").getInt()];
+ }
+
+ /**
+ * Returns the text description of the object (e.g. "AAC audio file").
+ * @return Returns the text description of the object (e.g. "AAC audio file").
+ */
+ public String getKindAsString() {
+ return Dispatch.get(object, "KindAsString").getString();
+ }
+
+ /**
+ * Returns the modification date of the content of the object.
+ * @return Returns the modification date of the content of the object.
+ */
+ public Date getModificationDate() {
+ return Dispatch.get(object, "ModificationDate").getJavaDate();
+ }
+
+ /**
+ * Set the number of times the object has been played. This property cannot
+ * be set if the object is not playable (e.g. a PDF file).
+ * @param playedCount The new number of times the object has been played.
+ */
+ public void setPlayedCount (int playedCount) {
+ Dispatch.put(object, "PlayedCount", playedCount);
+ }
+
+ /**
+ * Returns the number of times the object has been played.
+ * @return Returns the number of times the object has been played.
+ */
+ public int getPlayedCount() {
+ return Dispatch.get(object, "PlayedCount").getInt();
+ }
+
+ /**
+ * Set the date and time the object was last played. This property cannot be
+ * set if the object is not playable (e.g. a PDF file).
+ * A value of zero means no played date.
+ * @param playedDate The new date and time the object was last played.
+ */
+ public void setPlayedDate (Date playedDate) {
+ Dispatch.put(object, "PlayedDate", playedDate);
+ }
+
+ /**
+ * Returns the date and time the object was last played.
+ * A value of zero means no played date.
+ * @return Returns the date and time the object was last played.
+ */
+ public Date getPlayedDate() {
+ return Dispatch.get(object, "PlayedDate").getJavaDate();
+ }
+
+ /**
+ * Returns an ITPlaylist object corresponding to the playlist that contains
+ * the object. Use ITFileOrCDTrack::Playlists() or IITURLTrack::Playlists()
+ * to get the collection of all playlists that contain the song this object
+ * represents.
+ * @return Returns an ITPlaylist object corresponding to the playlist that
+ * contains the object.
+ */
+ public ITPlaylist getPlaylist() {
+ Dispatch playlist = Dispatch.get(object, "Playlist").toDispatch();
+ return new ITPlaylist(playlist);
+ }
+
+ /**
+ * Returns the play order index of the object in the owner playlist
+ * (1-based).
+ * You can pass this index to IITTrackCollection::ItemByPlayOrder() for the
+ * collection returned by ITPlaylist::Tracks() to retrieve an ITTrack
+ * object corresponding to this object.
+ * @return Returns the play order index of the object in the owner playlist.
+ */
+ public int getPlayOrderIndex() {
+ return Dispatch.get(object, "PlayOrderIndex").getInt();
+ }
+
+ /**
+ * Set the rating of the object (0 to 100). If the object rating is set to 0,
+ * it will be computed based on the album rating.
+ * @param rating The new rating of the object (0 to 100).
+ */
+ public void setRating (int rating) {
+ Dispatch.put(object, "Rating", rating);
+ }
+
+ /**
+ * Returns the rating of the object (0 to 100). If the object rating has never
+ * been set, or has been set to 0, it will be computed based on the album
+ * rating.
+ * @return Returns the rating of the object (0 to 100).
+ */
+ public int getRating() {
+ return Dispatch.get(object, "Rating").getInt();
+ }
+
+ /**
+ * Returns the sample rate of the object (in Hz).
+ * @return Returns the sample rate of the object (in Hz).
+ */
+ public int getSampleRate() {
+ return Dispatch.get(object, "SampleRate").getInt();
+ }
+
+ /**
+ * Returns the size of the object (in bytes).
+ * @return Returns the size of the object (in bytes).
+ */
+ public int getSize() {
+ return Dispatch.get(object, "Size").getInt();
+ }
+
+ /**
+ * Set the start time of the object (in seconds).
+ * @param start The new start time of the object (in seconds).
+ */
+ public void setStart (int start) {
+ Dispatch.put(object, "Start", start);
+ }
+
+ /**
+ * Returns the start time of the object (in seconds).
+ * @return Returns the start time of the object (in seconds).
+ */
+ public int getStart() {
+ return Dispatch.get(object, "Start").getInt();
+ }
+
+ /**
+ * Returns the length of the object (in MM:SS format).
+ * @return Returns the length of the object (in MM:SS format).
+ */
+ public String getTime() {
+ return Dispatch.get(object, "Time").getString();
+ }
+
+ /**
+ * Set the total number of tracks on the source album.
+ * @param trackCount The new total number of tracks on the source album.
+ */
+ public void setTrackCount (int trackCount) {
+ Dispatch.put(object, "TrackCount", trackCount);
+ }
+
+ /**
+ * Returns the total number of tracks on the source album.
+ * @return Returns the total number of tracks on the source album.
+ */
+ public int getTrackCount() {
+ return Dispatch.get(object, "TrackCount").getInt();
+ }
+
+ /**
+ * Set the index of the object on the source album.
+ * @param trackNumber The new index of the object on the source album.
+ */
+ public void setTrackNumber (int trackNumber) {
+ Dispatch.put(object, "TrackNumber", trackNumber);
+ }
+
+ /**
+ * Returns the index of the object on the source album.
+ * @return Returns the index of the object on the source album.
+ */
+ public int getTrackNumber() {
+ return Dispatch.get(object, "TrackNumebr").getInt();
+ }
+
+ /**
+ * Set the relative volume adjustment of the object (-100% to 100%).
+ * @param volumeAdjustment Set the relative volume adjustment of the object
+ * (-100% to 100%).
+ */
+ public void setVolumeAdjustment (int volumeAdjustment) {
+ Dispatch.put(object, "VolumeAdjustment", volumeAdjustment);
+ }
+
+ /**
+ * Returns the relative volume adjustment of the object (-100% to 100%).
+ * @return Returns the relative volume adjustment of the object (-100% to 100%).
+ */
+ public int getVolumeAdjustment() {
+ return Dispatch.get(object, "VolumeAdjustment").getInt();
+ }
+
+ /**
+ * Set the year the object was recorded/released.
+ * @param year The new year the object was recorded/released.
+ */
+ public void setYear (int year) {
+ Dispatch.put(object, "Year", year);
+ }
+
+ /**
+ * Returns the year the object was recorded/released.
+ * @return Returns the year the object was recorded/released.
+ */
+ public int getYear() {
+ return Dispatch.get(object, "Year").getInt();
+ }
+
+ public ITArtworkCollection getArtwork() {
+ Dispatch art = Dispatch.get(object, "Artwork").toDispatch();
+ return new ITArtworkCollection(art);
+
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITTrackCollection.java b/java/src/com/dt/iTunesController/ITTrackCollection.java
new file mode 100644
index 0000000..b87208f
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITTrackCollection.java
@@ -0,0 +1,91 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a collection of track objects.
+ *
+ * Note that collection indices are always 1-based.
+ *
+ * You can retrieve all the tracks defined for a playlist using
+ * ITPlaylist.getTracks().
+ *
+ * You can retrieve the currently selected track or tracks using
+ * iTunes.getSelectedTracks().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITTrackCollection {
+
+ protected Dispatch object;
+
+ public ITTrackCollection(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the number of tracks in the collection.
+ * @return Returns the number of tracks in the collection.
+ */
+ public int getCount() {
+ return Dispatch.get(object, "Count").getInt();
+ }
+
+ /**
+ * Returns an ITTrack object corresponding to the given index (1-based).
+ * @param index Index of the track to retrieve, must be less than or
+ * equal to ITTrackCollection.getCount().
+ * @return Returns an ITTrack object corresponding to the given index.
+ * Will be set to NULL if no track could be retrieved.
+ */
+ public ITTrack getItem (int index) {
+ Dispatch item = Dispatch.call(object, "Item", index).toDispatch();
+ ITTrack track = new ITTrack(item);
+ if (track.getKind()==ITTrackKind.ITTrackKindFile) {
+ return new ITFileOrCDTrack(item);
+ } else if (track.getKind()==ITTrackKind.ITTrackKindCD) {
+ return new ITFileOrCDTrack(item);
+ } else if (track.getKind()==ITTrackKind.ITTrackKindURL ) {
+ return new ITURLTrack(item);
+ } else {
+ return track;
+ }
+ }
+
+ /**
+ * Returns an ITTrack object corresponding to the given index (1-based).
+ * @param index Index of the track to retrieve, must be less than or
+ * equal to ITTrackCollection.getCount().
+ * @return Returns an ITTrack object corresponding to the given index.
+ * Will be set to NULL if no track could be retrieved.
+ */
+ public ITTrack getItemByPlayOrder(int index) {
+ Dispatch item = Dispatch.call(object, "ItemByPlayOrder", index).toDispatch();
+ return new ITTrack(item);
+ }
+
+ /**
+ * Returns an ITTrack object withthe specified name.
+ * @param name The name of the track to retrieve.
+ * @return Returns an ITTrack object corresponding to the given index.
+ * Will be set to NULL if no track could be retrieved.
+ */
+ public ITTrack ItemByName (String name) {
+ Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch();
+ return new ITTrack(item);
+ }
+
+ /**
+ * Returns an ITTrack object with the specified persistent ID. See the
+ * documentation on ITObject for more information on persistent IDs.
+ * @param highID The high 32 bits of the 64-bit persistent ID.
+ * @param lowID The low 32 bits of the 64-bit persistent ID.
+ * @return Returns an ITTrack object with the specified persistent ID.
+ * Will be set to NULL if no track could be retrieved.
+ */
+ public ITTrack getItemByPersistentID (int highID, int lowID) {
+ Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch();
+ return new ITTrack(item);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITTrackKind.java b/java/src/com/dt/iTunesController/ITTrackKind.java
new file mode 100644
index 0000000..ec233a1
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITTrackKind.java
@@ -0,0 +1,15 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the track kind.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITTrackKind {
+ ITTrackKindUnknown,
+ ITTrackKindFile,
+ ITTrackKindCD,
+ ITTrackKindURL,
+ ITTrackKindDevice,
+ ITTrackKindSharedLibrary;
+}
diff --git a/java/src/com/dt/iTunesController/ITURLTrack.java b/java/src/com/dt/iTunesController/ITURLTrack.java
new file mode 100644
index 0000000..9829190
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITURLTrack.java
@@ -0,0 +1,175 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a URL track.
+ *
+ * A URL track references a network audio stream.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITURLTrack extends ITTrack {
+
+ public ITURLTrack (Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Returns the URL of the stream represented by this track.
+ * @return The URL of the stream represented by this track.
+ */
+ public String getURL () {
+ return Dispatch.get(object, "URL").getString();
+ }
+
+ /**
+ * Set the URL of the stream represented by this track.
+ * @param url The URL of the stream represented by this track.
+ */
+ public void setURL (String url) {
+ Dispatch.call(object, "URL", url);
+ }
+
+ /**
+ * Returns true if this track is a podcast track. If a podcast track is an
+ * IITURLTrack, the podcast episode has not been downloaded.
+ * @return Returns true if this track is a podcast track.
+ */
+ public boolean isPodcast () {
+ return Dispatch.get(object, "Podcast").getBoolean();
+ }
+
+ /**
+ * Returns the category for the track.
+ * @return Returns the category for the track.
+ */
+ public String getCategory () {
+ return Dispatch.get(object, "Category").getString();
+ }
+
+ /**
+ * Sets the category for the track.
+ * @param category Sets the category for the track.
+ */
+ public void setCategory (String category) {
+ Dispatch.call(object, "Category", category);
+ }
+
+ /**
+ * Returns the description for the track.
+ * @return Returns the description for the track.
+ */
+ public String getDescription () {
+ return Dispatch.get(object, "Description").getString();
+ }
+
+ /**
+ * Sets the description for the track.
+ * @param description The new description for the track.
+ */
+ public void setDescription (String description) {
+ Dispatch.call(object, "Description", description);
+ }
+
+ /**
+ * Returns the long description for the track.
+ * @return Returns the description for the track.
+ */
+ public String getLongDescription () {
+ return Dispatch.get(object, "LongDescription").getString();
+ }
+
+ /**
+ * Sets the long description for the track.
+ * @param longDescription The new long description for the track.
+ */
+ public void setLongDescription (String longDescription) {
+ Dispatch.call(object, "LongDescription", longDescription);
+ }
+
+ /**
+ * Returns the user or computed rating of the album that this track belongs
+ * to (0 to 100). If the album rating has never been set, or has been set to
+ * 0, it will be computed based on the ratings of tracks in the album.
+ * @return Returns the album rating of the album that this track belongs to (0 to 100).
+ */
+ public long getAlbumRating () {
+ return Dispatch.get(object, "AlbumRating").getLong();
+ }
+
+ /**
+ * Set the album rating of the album that this track belongs to (0 to 100).
+ * If the album rating is set to 0, it will be computed based on the ratings
+ * of tracks in the album.
+ * @param albumRating The new album rating of the album that this track
+ * belongs to (0 to 100). If rating is outside this range, it will be
+ * pinned.
+ */
+ public void setAlbumRating (long albumRating) {
+ Dispatch.call(object, "AlbumRating", albumRating);
+ }
+
+ /**
+ * Returns the album rating kind. If the album rating has never been set, or
+ * has been set to 0, the kind is ITRatingKindComputed. Otherwise, the kind
+ * is ITRatingKindUser.
+ * @return Returns the album rating kind.
+ */
+ public ITRatingKind getAlbumRatingKind () {
+ return ITRatingKind.values()[Dispatch.get(object, "AlbumRatingKind").getInt()];
+ }
+
+ /**
+ * Returns the track rating kind. If the track rating has never been set, or
+ * has been set to 0, the kind is ITRatingKindComputed. Otherwise, the kind
+ * is ITRatingKindUser.
+ * @return Returns the track rating kind.
+ */
+ public ITRatingKind getRatingKind () {
+ return ITRatingKind.values()[Dispatch.get(object, "RatingKind").getInt()];
+ }
+
+ /**
+ * Returns a collection of playlists that contain the song that this track
+ * represents.
+ *
+ * This is the same collection of playlists that are shown in the "Show in
+ * Playlist" contextual menu for a track, plus the specific playlist that
+ * contains this track.
+ *
+ * A track represents a song in a single playlist, use
+ * ITTrack.getPlaylist() to get the specific playlist that
+ * contains this track.
+ * @return Collection of ITPlaylist objects.
+ */
+ public ITPlaylistCollection getPlaylists () {
+ Dispatch playlists = Dispatch.get(object, "Playlists").toDispatch();
+ return new ITPlaylistCollection(playlists);
+ }
+
+ /**
+ * Update the podcast feed for this track. This is equivalent to the user
+ * choosing Update Podcast from the contextual menu for the podcast feed
+ * that contains this track.
+ */
+ public void updatePodcastFeed () {
+ Dispatch.call(object, "UpdatePodcastFeed");
+ }
+
+ /**
+ * Start downloading the podcast episode that corresponds to this track.
+ * This is equivalent to the user clicking the Get button next to this
+ * track.
+ */
+ public void downloadPodcastEpisode () {
+ Dispatch.call(object, "DownloadPodcastEpisode");
+ }
+
+ /**
+ * Reveals the track in the main browser window.
+ */
+ public void reveal() {
+ Dispatch.call(object, "Reveal");
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITUserPlaylist.java b/java/src/com/dt/iTunesController/ITUserPlaylist.java
new file mode 100644
index 0000000..b4025cf
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITUserPlaylist.java
@@ -0,0 +1,60 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a user-defined playlist.
+ *
+ * A user playlist includes both smart and manual user-defined playlists.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITUserPlaylist extends ITPlaylist {
+
+ public ITUserPlaylist(Dispatch d) {
+ super(d);
+ }
+
+ /**
+ * Add a file or files inside a folder to the playlist.
+ * You cannot use this method to add a file that requires conversion to be
+ * added (e.g. a CD track), use iTunes.convertFile() or
+ * iTunes.convertFile2() instead. If you add a folder that
+ * contains files that require conversion, they will be skipped.
+ * @param filePath The full path to the file or folder to add.
+ * @return Returns an ITOperationStatus object corresponding to the
+ * asynchronous operation. If an error occurs, or no files were added, this
+ * will be set to NULL.
+ */
+ public ITOperationStatus addFile (String filePath) {
+ Dispatch status = Dispatch.call(object, "AddFile", filePath).toDispatch();
+ return new ITOperationStatus(status);
+ }
+
+ /**
+ * Add a streaming audio URL to the playlist.
+ * @param url The URL to add. The length of the URL can be 255 characters or
+ * less.
+ * @return Returns an ITURLTrack object corresponding to the new track.
+ */
+ public ITURLTrack addURL (String url) {
+ Dispatch URLTrack = Dispatch.call(object, "AddURL", url).toDispatch();
+ return new ITURLTrack(URLTrack);
+ }
+
+ /**
+ * Add an existing track to the playlist.
+ * You cannot use this method to add a CD track (ITTrackKindCD) to another
+ * playlist, use iTunes.convertTrack() or
+ * iTunes.convertTrack2() instead.
+ * You cannot add a shared library track (ITTrackKindSharedLibrary) to
+ * another playlist.
+ * @param track The track to add.
+ * @return Returns an IITTrack object corresponding to the new track.
+ */
+ public ITTrack addTrack (ITTrack track) {
+ Dispatch trackToAdd = track.fetchDispatch();
+ Dispatch addedTrack = Dispatch.call(object, "AddTrack", trackToAdd).toDispatch();
+ return new ITTrack(addedTrack);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITVideoKind.java b/java/src/com/dt/iTunesController/ITVideoKind.java
new file mode 100644
index 0000000..d318724
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITVideoKind.java
@@ -0,0 +1,13 @@
+package com.dt.iTunesController;
+
+/**
+ * Specifies the Video kind.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public enum ITVideoKind {
+ ITVideoKindNone,
+ ITVideoKindMovie,
+ ITVideoKindMusicVideo,
+ ITVideoKindTVShow;
+}
diff --git a/java/src/com/dt/iTunesController/ITWindow.java b/java/src/com/dt/iTunesController/ITWindow.java
new file mode 100644
index 0000000..4af825f
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITWindow.java
@@ -0,0 +1,32 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents an iTunes window.
+ */
+
+public class ITWindow {
+
+ protected Dispatch object;
+
+ public ITWindow(Dispatch d) {
+ object = d;
+ }
+
+ /**
+ * Returns the JACOB Dispatch object for this object.
+ * @return Returns the JACOB Dispatch object for this object.
+ */
+ public Dispatch fetchDispatch() {
+ return object;
+ }
+
+ /**
+ * Returns the name of the object.
+ * @return Returns the name of the object.
+ */
+ public String getName() {
+ return Dispatch.get(object, "Name").getString();
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/ITWindowCollection.java b/java/src/com/dt/iTunesController/ITWindowCollection.java
new file mode 100644
index 0000000..df1f3cf
--- /dev/null
+++ b/java/src/com/dt/iTunesController/ITWindowCollection.java
@@ -0,0 +1,55 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+
+/**
+ * Represents a collection of window objects.
+ *
+ * Note that collection indices are always 1-based.
+ *
+ * You can retrieve all the windows using
+ * iTunes.getWindows().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class ITWindowCollection {
+
+ protected Dispatch object;
+
+ public ITWindowCollection(Dispatch d) {
+ object = d;
+ }
+
+ // TODO: iTunes.getWindows()
+
+ /**
+ * Returns the number of playlists in the collection.
+ * @return Returns the number of playlists in the collection.
+ */
+ public int getCount() {
+ return Dispatch.get(object, "Count").getInt();
+ }
+
+ /**
+ * Returns an ITWindow object corresponding to the given index (1-based).
+ * @param index Index of the playlist to retrieve, must be less than or
+ * equal to ITWindowCollection.getCount().
+ * @return Returns an ITWindow object corresponding to the given index.
+ * Will be set to NULL if no playlist could be retrieved.
+ */
+ public ITWindow getItem (int index) {
+ Dispatch item = Dispatch.call(object, "Item", index).toDispatch();
+ return new ITWindow(item);
+ }
+ /**
+ * Returns an ITWindow object with the specified name.
+ * @param name The name of the window to retrieve.
+ * @return Returns an ITWindow object corresponding to the given index.
+ * Will be set to NULL if no ITWindow could be retrieved.
+ */
+ public ITWindow ItemByName (String name) {
+ Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch();
+ return new ITWindow(item);
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/iTunes.java b/java/src/com/dt/iTunesController/iTunes.java
new file mode 100644
index 0000000..150ae7a
--- /dev/null
+++ b/java/src/com/dt/iTunesController/iTunes.java
@@ -0,0 +1,488 @@
+package com.dt.iTunesController;
+import com.jacob.activeX.*;
+import com.jacob.com.Dispatch;
+import com.jacob.com.DispatchEvents;
+import com.jacob.com.Variant;
+
+/**
+ * Defines the top-level iTunes application object.
+ *
+ * This interface defines the top-level iTunes application object. All other
+ * iTunes interfaces are accessed through this object.
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class iTunes {
+
+ ActiveXComponent iTunes;
+ iTunesEvents iTunesEvents;
+ DispatchEvents dispatchEvents;
+
+ /**
+ * Initiate iTunes Controller.
+ */
+ public iTunes() {
+ iTunes = new ActiveXComponent("iTunes.Application");
+ }
+
+ /**
+ * Add an event handler to the iTunes controller.
+ * @param itef The class that will handle the iTunes events.
+ */
+ public void addEventHandler(iTunesEventsInterface itef) {
+ iTunesEvents = new iTunesEvents(itef);
+ dispatchEvents = new DispatchEvents(iTunes, iTunesEvents);
+ System.out.println("New event handler added.");
+ }
+
+ /**
+ * Reposition to the beginning of the current track or go to the previous
+ * track if already at start of current track.
+ */
+ public void backTrack() {
+ iTunes.invoke("BackTrack");
+ }
+
+ /**
+ * Skip forward in a playing track.
+ */
+ public void fastForward() {
+ iTunes.invoke("FastForward");
+ }
+
+ /**
+ * Advance to the next track in the current playlist.
+ */
+ public void nextTrack() {
+ iTunes.invoke("NextTrack");
+ }
+
+ /**
+ * Pause playback.
+ */
+ public void pause() {
+ iTunes.invoke("Pause");
+ }
+
+ /**
+ * Play the currently targeted track.
+ */
+ public void play() {
+ Variant s = iTunes.invoke("ASDSDPlay");
+ }
+
+ /**
+ * Play the specified file path, adding it to the library if not already
+ * present.
+ */
+ public void playFile(String filePath) {
+ iTunes.invoke("PlayFile", filePath);
+ }
+
+ /**
+ * Toggle the playing/paused state of the current track.
+ */
+ public void playPause() {
+ iTunes.invoke("PlayPause");
+ }
+
+ /**
+ * Return to the previous track in the current playlist.
+ */
+ public void previousTrack() {
+ iTunes.invoke("PreviousTrack");
+ }
+
+ /**
+ * Disable fast forward/rewind and resume playback, if playing.
+ */
+ public void resume() {
+ iTunes.invoke("Resume");
+ }
+
+ /**
+ * Skip backwards in a playing track.
+ */
+ public void rewind() {
+ iTunes.invoke("Rewind");
+ }
+
+ /**
+ * Stop playback.
+ */
+ public void stop() {
+ iTunes.invoke("Stop");
+ }
+
+ /**
+ * Retrieves the current state of the player buttons in the window
+ * containing the currently targeted track. If there is no currently
+ * targeted track, returns the current state of the player buttons
+ * in the main browser window.
+ */
+ public void getPlayerButtonsState(boolean previousEnabled,
+ String playPause, boolean nextEnabled) {
+
+ }
+
+ /**
+ * Returns true if this version of the iTunes type library is compatible
+ * with the specified version.
+ * @param majorVersion Major version of iTunes interface.
+ * @param minorVersion Minor version of iTunes interface.
+ * @return Returns true if this version is compatible with the indicated
+ * interface version.
+ */
+ public boolean getCheckVersion (int majorVersion, int minorVersion) {
+ return iTunes.invoke("CheckVersion", majorVersion, minorVersion).getBoolean();
+ }
+
+ /**
+ * Returns an IITObject corresponding to the specified IDs.
+ * The object may be a source, playlist, or track.
+ * @param sourceID The ID that identifies the source. Valid for a source,
+ * playlist, or track.
+ * @param playlistID The ID that identifies the playlist. Valid for a
+ * playlist or track. Must be zero for a source.
+ * @param trackID The ID that identifies the track within the playlist.
+ * Valid for a track. Must be zero for a source or playlist.
+ * @param databaseID The ID that identifies the track, independent of its
+ * playlist. Valid for a track. Must be zero for a source or playlist.
+ * @return Returns an IITObject object corresponding to the specified IDs.
+ * Will be set to NULL if no object could be retrieved.
+ */
+ public ITObject getITObjectByID(int sourceID, int playlistID, int trackID, int databaseID) {
+ Dispatch object = Dispatch.call(iTunes, "GetITObjectByID", sourceID, playlistID, trackID, databaseID).toDispatch();
+ return new ITObject(object);
+ }
+
+ /**
+ * Creates a new playlist in the main library.
+ * @param playlistName The name of the new playlist (may be empty).
+ * @return Returns an ITPlaylist object corresponding to the new playlist.
+ */
+ public ITPlaylist createPlaylist(String playlistName) {
+ Dispatch cplaylist = Dispatch.call(iTunes, "CreatePlaylist", playlistName).toDispatch();
+ ITPlaylist playlist = new ITPlaylist(cplaylist);
+ ITPlaylistKind playlistKind = playlist.getKind();
+ if (playlistKind == ITPlaylistKind.ITPlaylistKindCD)
+ return new ITAudioCDPlaylist(cplaylist);
+ else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindLibrary)
+ return new ITLibraryPlaylist(cplaylist);
+ else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindUser)
+ return new ITUserPlaylist(cplaylist);
+ else
+ return playlist;
+ }
+
+ /**
+ * Open the specified iTunes Store or streaming audio URL.
+ * @param url The URL to open. The length of the URL cannot exceed 512
+ * characters. iTunes Store URLs start with itms:// or itmss://. Streaming
+ * audio URLs start with http://.
+ */
+ public void openURL (String url) {
+ iTunes.invoke("OpenURL", url);
+ }
+
+ /**
+ * Go to the iTunes Store home page.
+ */
+ public void gotoMusicStoreHomePage() {
+ iTunes.invoke("GoToMusicStoreHomePage");
+ }
+
+ /**
+ * Update the contents of the iPod.
+ */
+ public void updateIPod() {
+ iTunes.invoke("UpdateIPod");
+ }
+
+ /**
+ * Exits the iTunes application.
+ */
+ public void quit() {
+ iTunes.invoke("Quit");
+ }
+
+ /**
+ * Creates a new EQ preset.
+ * The EQ preset will be created "flat", i.e. the preamp and all band levels
+ * will be set to 0.
+ * EQ preset names cannot start with leading spaces. If you specify a name
+ * that starts with leading spaces they will be stripped out.
+ * If eqPresetName is empty, the EQ preset will be created with
+ * a default name.
+ * @param eqPresetName The name of the new EQ Preset (may be empty)
+ * @return Returns an ITEQPreset object corresponding to the new EQ Preset.
+ */
+ public ITEQPreset createEQPreset(String eqPresetName) {
+ Dispatch eqPreset = Dispatch.call(iTunes, "CreateEQPreset", eqPresetName).toDispatch();
+ return new ITEQPreset(eqPreset);
+ }
+
+ /**
+ * Creates a new playlist in an existing source.
+ * You may not be able to create a playlist in every source. For example,
+ * you cannot create a playlist in an audio CD source, or in an iPod source
+ * if it is in auto update mode.
+ * If playlistName is empty, the playlist will be created with
+ * a default name.
+ * @param playlistName The name of the new playlist (may be empty).
+ * @param source The source that will contain the new playlist.
+ * @return Returns an ITPlaylist object corresponding to the new playlist.
+ */
+ public ITPlaylist createPlaylistInSource(String playlistName, ITSource source) {
+ Dispatch cplaylist = Dispatch.call(iTunes, "CreatePlaylistInSource", playlistName, source.fetchDispatch()).toDispatch();
+ ITPlaylist playlist = new ITPlaylist(cplaylist);
+ ITPlaylistKind playlistKind = playlist.getKind();
+ if (playlistKind == ITPlaylistKind.ITPlaylistKindCD)
+ return new ITAudioCDPlaylist(cplaylist);
+ else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindLibrary)
+ return new ITLibraryPlaylist(cplaylist);
+ else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindUser)
+ return new ITUserPlaylist(cplaylist);
+ else
+ return playlist;
+ }
+
+ /**
+ * Subscribes to the specified podcast feed URL. Any "unsafe" characters in
+ * the URL should already be converted into their corresponding escape
+ * sequences, iTunes will not do this.
+ * @param url The URL to subscribe to.
+ */
+ public void subscribeToPodcast(String url) {
+ iTunes.invoke("SubscribeToPodcast", url);
+ }
+
+ /**
+ * Updates all podcast feeds. This is equivalent to the user pressing the
+ * Update button when Podcasts is selected in the Source list.
+ */
+ public void updatePodcastFeeds() {
+ iTunes.invoke("UpdatePodcastFeeds");
+ }
+
+ /**
+ * Creates a new folder in the main library.
+ * If folderName is empty, the folder will be created with a
+ * default name.
+ * @param folderName The name of the new folder (may be empty).
+ * @return Returns an ITPlaylist object corresponding to the new folder.
+ */
+ public ITUserPlaylist createFolder(String folderName) {
+ Dispatch folder = Dispatch.call(iTunes, "CreateFolder", folderName).toDispatch();
+ return new ITUserPlaylist(folder);
+ }
+
+ /**
+ * Creates a new folder in an existing source.
+ * You may not be able to create a folder in every source. For example, you
+ * cannot create a folder in an audio CD source, or in an iPod source if it
+ * is in auto update mode.
+ * If folderName is empty, the folder will be created with a
+ * default name.
+ * @param folderName The name of the new folder (may be empty)
+ * @param iSource The source that will contain the new folder.
+ * @return Returns an ITPlaylist object corresponding to the new folder.
+ */
+ public ITUserPlaylist createFolderInSource(String folderName, ITSource iSource) {
+ Dispatch folder = Dispatch.call(iTunes, "CreateFolderInSource", folderName, iSource.fetchDispatch()).toDispatch();
+ return new ITUserPlaylist(folder);
+ }
+
+ /**
+ * Returns a collection of music sources (music library, CD, device, etc.).
+ * @return Collection of ITSource objects.
+ */
+ public ITSourceCollection getSources() {
+ Dispatch sources = Dispatch.call(iTunes, "Sources").toDispatch();
+ return new ITSourceCollection(sources);
+ }
+
+ /**
+ * Sets the sound output volume (0=minimum, 100=maximum).
+ * @param volume New sound output volume
+ */
+ public void setSoundVolume(int volume) {
+ iTunes.setProperty("SoundVolume", volume);
+ }
+
+ /**
+ * Returns the sound output volume (0=minimum, 100=maximum).
+ * @return Current sound output volume
+ */
+ public int getSoundVolume() {
+ return iTunes.getPropertyAsInt("SoundVolume");
+ }
+
+ /**
+ * Sets sound output mute state.
+ * @param shouldMute If true, sound output will be muted.
+ */
+ public void setMute(boolean shouldMute) {
+ iTunes.setProperty("Mute", shouldMute);
+ }
+
+ /**
+ * Returns true if the sound output is muted.
+ * @return True if sound output is muted.
+ */
+ public boolean getMute() {
+ return iTunes.getPropertyAsBoolean("Mute");
+ }
+
+ /**
+ * Returns the current player state.
+ * @return Returns the current player state.
+ */
+ public ITPlayerState getPlayerState() {
+ return ITPlayerState.values()[Dispatch.get(iTunes, "PlayerState").getInt()];
+ }
+
+ /**
+ * Sets the player's position within the currently playing track in
+ * seconds.
+ * If playerPos specifies a position before the beginning of the track,
+ * the position will be set to the beginning. If playerPos specifies a
+ * position after the end of the track, the position will be set to the
+ * end.
+ * @param playerPos The player's position within the currently playing
+ * track in seconds.
+ */
+ public void setPlayerPosition(int playerPos) {
+ iTunes.setProperty("playerPosition", playerPos);
+ }
+
+ /**
+ * Returns the player's position within the currently playing track in
+ * seconds.
+ * @return The player's position within the currently playing track in
+ * seconds.
+ */
+ public int getPlayerPosition() {
+ return iTunes.getPropertyAsInt("playerPosition");
+ }
+
+ /**
+ * Returns the source that represents the main library.
+ * You can also find the main library source by iterating over
+ * iTunes.getSources() and looking for an ITSource
+ * of kind ITSourceKindLibrary.
+ * @return Returns the source that represents the main library.
+ */
+ public ITSource getLibrarySource() {
+ Dispatch lsource = iTunes.getProperty("LibrarySource").toDispatch();
+ return new ITSource(lsource);
+ }
+
+ /**
+ * Returns the main library playlist in the main library source.
+ * @return An IITLibraryPlaylist object corresponding to the main library
+ * playlist.
+ */
+ public ITLibraryPlaylist getLibraryPlaylist() {
+ Dispatch lplaylist = iTunes.getProperty("LibraryPlaylist").toDispatch();
+ return new ITLibraryPlaylist(lplaylist);
+ }
+
+ /**
+ * Returns the currently targetd track.
+ * @return An ITTrack object corresponding to the currently targeted track.
+ * Will be set to NULL if there is no currently targeted track.
+ */
+ public ITTrack getCurrentTrack() {
+ Dispatch item = iTunes.getProperty("CurrentTrack").toDispatch();
+ ITTrack track = new ITTrack(item);
+ if (track.getKind()==ITTrackKind.ITTrackKindFile) {
+ return new ITFileOrCDTrack(item);
+ } else if (track.getKind()==ITTrackKind.ITTrackKindCD) {
+ return new ITFileOrCDTrack(item);
+ } else if (track.getKind()==ITTrackKind.ITTrackKindURL ) {
+ return new ITURLTrack(item);
+ } else {
+ return track;
+ }
+ }
+
+ /**
+ * Returns the playlist containing the currently targeted track.
+ * @return An ITPlaylist object corresponding to the playlist containing the
+ * currently targeted track.
+ * Will be set to NULL if there is no currently targeted playlist.
+ */
+ public ITPlaylist getCurrentPlaylist() {
+ Dispatch cplaylist = iTunes.getProperty("CurrentPlaylist").toDispatch();
+ ITPlaylist playlist = new ITPlaylist(cplaylist);
+ ITPlaylistKind playlistKind = playlist.getKind();
+ if (playlistKind == ITPlaylistKind.ITPlaylistKindCD)
+ return new ITAudioCDPlaylist(cplaylist);
+ else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindLibrary)
+ return new ITLibraryPlaylist(cplaylist);
+ else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindUser)
+ return new ITUserPlaylist(cplaylist);
+ else
+ return playlist;
+ }
+
+ /**
+ * Returns a collection containing the currently selected track or tracks.
+ * The frontmost visible window in iTunes must be a browser or playlist
+ * window. If there is no frontmost visible window (e.g. iTunes is minimized
+ * to the system tray), the main browser window is used.
+ * @return Collection of ITrack objects.
+ * Will be set to NULL if there is no current selection.
+ */
+ public ITTrackCollection getSelectedTracks() {
+ Dispatch stracks = iTunes.getProperty("SelectedTracks").toDispatch();
+ return new ITTrackCollection(stracks);
+ }
+
+ /**
+ * Returns the version of the iTunes application.
+ * @return
+ */
+ public String getVersion() {
+ return iTunes.getPropertyAsString("Version");
+ }
+
+ /**
+ * Returns the high 32 bits of the persistent ID of the specified IITObject.
+ * See the documentation on IITObject for more information on persistent
+ * IDs.
+ *
+ * The object may be a source, playlist, or track.
+ * @param iObject The object to fetch the High Persistent ID.
+ * @return The high 32 bits of the 64-bit persistent ID.
+ */
+ public long getITObjectPersistentIDHigh (ITObject iObject) {
+ Dispatch object = iObject.fetchDispatch();
+ return Dispatch.call(object, "GetObjectPersistentIDHigh", object).getLong();
+ }
+
+ /**
+ * Returns the low 32 bits of the persistent ID of the specified IITObject.
+ * See the documentation on IITObject for more information on persistent
+ * IDs.
+ *
+ * The object may be a source, playlist, or track.
+ * @param iObject The object to fetch the Low Persistent ID.
+ * @return The low 32 bits of the 64-bit persistent ID.
+ */
+ public long getITObjectPersistentIDLow (ITObject iObject) {
+ Dispatch object = iObject.fetchDispatch();
+ return Dispatch.call(object, "GetObjectPersistentIDLow", object).getLong();
+ }
+
+ public ITObjectPersistentID getObjectPersistentIDs(ITObject iObject){
+ return new ITObjectPersistentID(getITObjectPersistentIDHigh(iObject),getITObjectPersistentIDLow(iObject));
+ }
+
+ public ITBrowserWindow getBrowserWindow(){
+ Dispatch window = iTunes.getProperty("BrowserWindow").toDispatch();
+ return new ITBrowserWindow(window);
+ }
+}
diff --git a/java/src/com/dt/iTunesController/iTunesEvents.java b/java/src/com/dt/iTunesController/iTunesEvents.java
new file mode 100644
index 0000000..ddbee23
--- /dev/null
+++ b/java/src/com/dt/iTunesController/iTunesEvents.java
@@ -0,0 +1,62 @@
+package com.dt.iTunesController;
+import com.jacob.com.Dispatch;
+import com.jacob.com.Variant;
+
+/**
+ * This class is used to forward all iTunes COM Events to a class that
+ * implements iTunesEventsInterface. To receive events, create
+ * a class that implements the interface, and then use
+ * iTunes.addEventHandler().
+ *
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public class iTunesEvents {
+
+ private iTunesEventsInterface eventHandler;
+
+ public iTunesEvents (iTunesEventsInterface itef) {
+ eventHandler = itef;
+ }
+
+ public void OnDatabaseChangedEvent(Variant[] args) {
+ // Not currently implemented
+ }
+
+ public void OnPlayerPlayEvent(Variant[] args) {
+ ITTrack itt = new ITTrack((Dispatch)args[0].getDispatch());
+ eventHandler.onPlayerPlayEvent(itt);
+ }
+
+ public void OnPlayerStopEvent(Variant[] args) {
+ ITTrack itt = new ITTrack((Dispatch)args[0].getDispatch());
+ eventHandler.onPlayerStopEvent(itt);
+ }
+
+ public void OnPlayerPlayingTrackChangedEvent(Variant[] args) {
+ ITTrack itt = new ITTrack((Dispatch)args[0].getDispatch());
+ eventHandler.onPlayerPlayingTrackChangedEvent(itt);
+ }
+
+ public void OnCOMCallsDisabledEvent(Variant[] args) {
+ ITCOMDisabledReason reason = ITCOMDisabledReason.values()[args[0].getInt()];
+ eventHandler.onCOMCallsDisabledEvent(reason);
+ }
+
+ public void OnCOMCallsEnabledEvent(Variant[] args) {
+ eventHandler.onCOMCallsEnabledEvent();
+ }
+
+ public void OnQuittingEvent(Variant[] args) {
+ eventHandler.onQuittingEvent();
+ }
+
+ public void OnAboutToPromptUserToQuitEvent(Variant[] args) {
+ eventHandler.onAboutToPromptUserToQuitEvent();
+ }
+
+ public void OnSoundVolumeChangedEvent(Variant[] args) {
+ eventHandler.onSoundVolumeChangedEvent(args[0].getInt());
+ }
+
+}
diff --git a/java/src/com/dt/iTunesController/iTunesEventsInterface.java b/java/src/com/dt/iTunesController/iTunesEventsInterface.java
new file mode 100644
index 0000000..3d8f17e
--- /dev/null
+++ b/java/src/com/dt/iTunesController/iTunesEventsInterface.java
@@ -0,0 +1,115 @@
+package com.dt.iTunesController;
+
+/**
+ * Interface for receiving iTunes events.
+ * @author Steve Eyre
+ * @version 0.2
+ */
+public interface iTunesEventsInterface {
+
+ /**
+ * Not currently implemented.
+ *
+ * The ITEventDatabaseChanged event is fired when the iTunes database is
+ * changed.
+ *
+ * Each parameter is a two-dimensional array of integers. The first
+ * dimension is the number of objects. The second dimension is always 4 and
+ * specifies each of the 4 ITObject IDs, where index 0 is the source ID,
+ * index 1 is the playlist ID, index 2 is the track ID, and index 3 is the
+ * track database ID. For more information on object IDs, see
+ * ITObject.
+ *
+ * Note that you can use iTunes.getITObjectByID() to retrieve
+ * changed ITObject, but not for deleted objects (since they no longer
+ * exist).
+ *
+ * @param deletedObjectIDs
+ * @param changedObjectIDs
+ */
+ public void onDatabaseChangedEvent(int[][] deletedObjectIDs, int[][] changedObjectIDs);
+
+ /**
+ * The ITEventPlayerPlay event is fired when a track begins playing.
+ * @param iTrack An ITTrack object corresponding to the track that has
+ * started playing.
+ */
+ public void onPlayerPlayEvent (ITTrack iTrack);
+
+ /**
+ * The ITEventPlayerStop event is fired when a track stops playing.
+ * @param iTrack An ITTrack object corresponding to the track that has
+ * stopped playing.
+ */
+ public void onPlayerStopEvent (ITTrack iTrack);
+
+ /**
+ * The ITEventPlayerPlayingTrackChanged event is fired when information
+ * about the currently playing track has changed.
+ * This event is fired when the user changes information about the currently
+ * playing track (e.g. the name of the track).
+ * This event is also fired when iTunes plays the next joined CD track in a
+ * CD playlist, since joined CD tracks are treated as a single track.
+ * @param iTrack An ITTrack object corresponding to the track that is now
+ * playing.
+ */
+ public void onPlayerPlayingTrackChangedEvent(ITTrack iTrack);
+
+ /**
+ * The ITEventCOMCallsDisabled event is fired when calls to the iTunes COM
+ * interface will be deferred.
+ * Typically, iTunes will defer COM calls when any modal dialog is being
+ * displayed. When the user dismisses the last modal dialog, COM calls will
+ * be enabled again, and any deferred COM calls will be executed. You can
+ * use this event to avoid making a COM call which will be deferred.
+ * @param reason The reason the COM interface is being disabled. This is
+ * typically ITCOMDisabledReasonDialog.
+ */
+ public void onCOMCallsDisabledEvent(ITCOMDisabledReason reason);
+
+ /**
+ * The ITEventCOMCallsEnabled event is fired when calls to the iTunes COM
+ * interface will no longer be deferred.
+ * Typically, iTunes will defer COM calls when any modal dialog is being
+ * displayed. When the user dismisses the last modal dialog, COM calls will
+ * be enabled again, and any deferred COM calls will be executed.
+ */
+ public void onCOMCallsEnabledEvent();
+
+ /**
+ * The ITEventQuitting event is fired when iTunes is about to quit.
+ * If the user attempts to quit iTunes while a client still has outstanding
+ * iTunes COM objects instantiated, iTunes will display a warning dialog.
+ * The user can still choose to quit iTunes anyway, in which case this event
+ * will be fired. After this event is fired, any existing iTunes COM objects
+ * will no longer be valid.
+ * This event is only used to notify clients that iTunes is quitting,
+ * clients cannot prevent this from happening.
+ */
+ public void onQuittingEvent();
+
+ /**
+ * The ITEventAboutToPromptUserToQuit event is fired when iTunes is about
+ * prompt the user to quit.
+ * This event gives clients the opportunity to prevent the warning dialog
+ * prompt from occurring.
+ * If the user attempts to quit iTunes while a client still has outstanding
+ * iTunes COM objects instantiated, iTunes will display a warning dialog.
+ * This event is fired just before the warning dialog is shown. iTunes will
+ * then wait up to 5 seconds for clients to release any outstanding iTunes
+ * COM objects. If all objects are released during this time, the warning
+ * dialog will not be shown and iTunes will quit immediately.
+ * Otherwise, the warning dialog will be shown. If the user chooses to quit
+ * iTunes anyway, the ITEventQuitting event is fired. See
+ * iTunesEventsInterface.onQuittingEvent() for more details.
+ */
+ public void onAboutToPromptUserToQuitEvent();
+
+ /**
+ * The ITEventSoundVolumeChanged event is fired when the sound output volume
+ * has changed.
+ * @param newVolume The new sound output volume (0 = minimum, 100 = maximum).
+ */
+ public void onSoundVolumeChangedEvent(int newVolume);
+
+}