3 import java
.util
.ArrayList
;
4 import java
.util
.Iterator
;
7 import interfaces
.Constants
;
13 public class Databases
extends Response
{
15 private final List
<Database
> databases
;
17 public static Databases
read(Reader reader
) {
19 List
<Database
> databases
= new ArrayList
<Database
>();
21 for (Constants code
: reader
) {
22 if (code
== Constants
.dmap_listing
) {
23 Reader list
= reader
.nextComposite(code
);
25 for (Constants itemCode
: list
) {
26 if (itemCode
== Constants
.dmap_listingitem
) {
27 Reader item
= list
.nextComposite(itemCode
);
29 Database database
= Database
.read(item
);
30 databases
.add(database
);
36 return new Databases(databases
);
39 public Databases(int id
, long persistentId
, String name
, int tracks
, int containers
) {
40 super(Constants
.daap_serverdatabases
, Response
.OK
);
42 databases
= new ArrayList
<Database
>();
43 databases
.add(new Database(id
, persistentId
, name
, tracks
, containers
, 3));
46 private Databases(List
<Database
> databases
) {
47 super(Constants
.daap_serverdatabases
, Response
.OK
);
49 this.databases
= databases
;
52 public void write(Writer writer
) {
54 writer
.appendList(Constants
.dmap_listing
, (byte)0, databases
);
58 public Iterator
<Database
> databases() {
59 return databases
.iterator();
63 return databases
.size();
66 public static class Database
implements Node
{
69 private final long persistentId
;
70 private final String name
;
71 private final int tracks
;
72 private final int containers
;
73 private final int editStatus
;
75 public static Database
read(Reader reader
) {
77 long persistentId
= 0;
83 for (Constants node
: reader
) {
85 case dmap_itemid
: id
= reader
.nextInteger(node
); break;
86 case dmap_persistentid
: persistentId
= reader
.nextLong(node
); break;
87 case dmap_itemname
: name
= reader
.nextString(node
); break;
88 case dmap_itemcount
: tracks
= reader
.nextInteger(node
); break;
89 case dmap_containercount
: containers
= reader
.nextInteger(node
); break;
90 case dmap_editstatus
: editStatus
= reader
.nextInteger(node
); break;
94 return new Database(id
, persistentId
, name
, tracks
, containers
, editStatus
);
97 public Database(int id
, long persistentId
, String name
, int tracks
, int containers
, int editStatus
) {
99 this.persistentId
= persistentId
;
101 this.tracks
= tracks
;
102 this.containers
= containers
;
103 this.editStatus
= editStatus
;
106 public Constants
type() {
107 return Constants
.dmap_listingitem
;
110 public void write(Writer writer
) {
111 writer
.appendInteger(Constants
.dmap_itemid
, id
);
112 writer
.appendLong(Constants
.dmap_persistentid
, persistentId
);
113 writer
.appendString(Constants
.dmap_itemname
, name
);
114 writer
.appendInteger(Constants
.dmap_itemcount
, tracks
);
115 writer
.appendInteger(Constants
.dmap_containercount
, containers
);
116 writer
.appendInteger(Constants
.dmap_editstatus
, editStatus
);
119 public boolean equals(Object o
) {
120 if (o
== this) return true;
121 if (!(o
instanceof Database
)) return false;
123 Database that
= (Database
)o
;
125 return this.id
== that
.id
126 && this.persistentId
== that
.persistentId
;
133 public long persistentId() {
137 public String
name() {
141 public int tracks() {
145 public int containers() {
149 public int editStatus() {
156 public static Node buildDatabaseResponse(int items, int containers) throws UnsupportedEncodingException {
158 Composite response = createResponse(DACPConstants.avdb);
160 Composite list = createList(response, DACPConstants.mlcl, 0, 1);
162 Composite item = new Composite(DACPConstants.mlit);
165 item.append(new IntegerNode(DACPConstants.miid, 1));
166 item.append(new LongNode(DACPConstants.mper, 0xf35226b7c8ee14d3l)); //this id matches the id in the mdns broadcast
167 item.append(new StringNode(DACPConstants.minm, "Memphis Stereo"));
168 item.append(new IntegerNode(DACPConstants.mimc, items)); //item count
169 item.append(new IntegerNode(DACPConstants.mctc, containers)); //container count