J'utilise actuellement Com4j pour parler à iTunes à partir de mon application Java, malheureusement il ne fonctionne pas avec Java 64bit et il semble qu'il ne le fera jamais, donc j'essaie d'utiliser une alternative appelée Jacob à la place.
Les deux bibliothèques fournissent un outil pour générer des classes Java à partir d'une DLL, et les classes résultantes sont très similaires. Il a été facile de modifier la plupart du code, mais je ne sais pas comment trouver les sous-types.
IITPlaylist object = itunes.createFolder(TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = object.queryInterface(IITUserPlaylist.class);
Les deux bibliothèques ont créé les classes IITPlaylist et IITUSerPlaylist mais seul com4j fournit la classe queryInterface, et non IITUserPlaylist n'est pas réellement une sous-classe de IITPlaylist.
De plus, com4j fournit une méthode is, mais pas Jacob.
if (next.is(IITFileOrCDTrack.class))
Quelqu'un sait-il comment résoudre ces problèmes ?
EDIT : J'ai fait quelques progrès mais je n'ai toujours pas réussi à le faire fonctionner, il y a une méthode QueryInterface qui prend le guid de la classe (inclure les crochets), j'ai trouvé le guid en regardant le fichier jacobgenlog.txt qui est créé lorsque vous exécutez jacobgen sur l'exécutable iTunes.
Cela renvoie ensuite un autre objet Dispatch qui est censé se rapporter à la sous-classe, mais le simple cast que j'ai fait est invalide, quelle est l'étape à suivre ?
private static final String USER_PLAYLIST_GUID = "{0A504DED-A0B5-465A-8A94-50E20D7DF692}";
IITPlaylist object = itunes.createFolder(TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = (IITUserPlaylist)object.QueryInterface(USER_PLAYLIST_GUID);
La fonctionnalité is() est remplacée par la vérification du genre
IITTrack next = tracks.getItem(i);
if(next.getKind().equals(ITTrackKind.ITTrackKindFile))
La difficulté réside dans le fait que les méthodes getKind() de Jacobgen ne sont pas valides en Java car elles essaient de renvoyer une nouvelle interface, et bien sûr, on ne peut pas instancier une interface. J'ai donc dû les modifier comme suit
ITPlayListKind passe de
public interface ITPlaylistKind extends __MIDL___MIDL_itf_iTunesCOMInterface_0001_0081_0001 {
}
à
public enum ITPlaylistKind {
ITPlaylistKindUnknown,
ITPlaylistKindLibrary,
ITPlaylistKindUser,
ITPlaylistKindCD,
ITPlaylistKindDevice,
ITPlaylistKindRadioTuner;
}
Dans IITUserPlaylist
public ITPlaylistKind getKind() {
return new ITPlaylistKind(Dispatch.get(this, "Kind").toDispatch());
}
à
public ITPlaylistKind getKind() {
return ITPlaylistKind.values()[Dispatch.get(this, "Kind").getInt()];
}
Ce n'était pas une idée originale de ma part, j'ai eu l'idée de http://dot-totally.co.uk/software/itunescon/ qui semble être une version modifiée des classes iTunes créées par jacobgen, je n'ai pas trouvé que cela ajoutait beaucoup et j'ai décidé de rester avec les classes générées par jacobgen.