chiark / gitweb /
@image expansion
[disorder] / server / lookup.c
1 /*
2  * This file is part of DisOrder.
3  * Copyright (C) 2004-2008 Richard Kettlewell
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18  * USA
19  */
20 /** @file server/lookup.c
21  * @brief Server lookups
22  *
23  * To improve performance many server lookups are cached.
24  */
25
26 #include "disorder-cgi.h"
27
28 /** @brief Cached data */
29 static unsigned flags;
30
31 /** @brief Map of hashes to queud data */
32 static hash *queuemap;
33
34 struct queue_entry *dcgi_queue;
35 struct queue_entry *dcgi_playing;
36 struct queue_entry *dcgi_recent;
37
38 int dcgi_volume_left;
39 int dcgi_volume_right;
40
41 char **dcgi_new;
42 int dcgi_nnew;
43
44 rights_type dcgi_rights;
45
46 int dcgi_enabled;
47 int dcgi_random_enabled;
48
49 static void queuemap_add(struct queue_entry *q) {
50   if(!queuemap)
51     queuemap = hash_new(sizeof (struct queue_entry *));
52   for(; q; q = q->next)
53     hash_add(queuemap, q->id, &q, HASH_INSERT_OR_REPLACE);
54 }
55
56 /** @brief Fetch cachable data */
57 void dcgi_lookup(unsigned want) {
58   unsigned need = want ^ (flags & want);
59   struct queue_entry *r, *rnext;
60 #if 0
61   const char *dir, *re;
62 #endif
63   char *rs;
64
65   if(!dcgi_client || !need)
66     return;
67   if(need & DCGI_QUEUE) {
68     disorder_queue(dcgi_client, &dcgi_queue);
69     queuemap_add(dcgi_queue);
70   }
71   if(need & DCGI_PLAYING) {
72     disorder_playing(dcgi_client, &dcgi_playing);
73     queuemap_add(dcgi_playing);
74   }
75   if(need & DCGI_NEW)
76     disorder_new_tracks(dcgi_client, &dcgi_new, &dcgi_nnew, 0);
77   if(need & DCGI_RECENT) {
78     /* we need to reverse the order of the list */
79     disorder_recent(dcgi_client, &r);
80     while(r) {
81       rnext = r->next;
82       r->next = dcgi_recent;
83       dcgi_recent = r;
84       r = rnext;
85     }
86     queuemap_add(dcgi_recent);
87   }
88   if(need & DCGI_VOLUME)
89     disorder_get_volume(dcgi_client,
90                         &dcgi_volume_left, &dcgi_volume_right);
91 #if 0
92   /* DCGI_FILES and DCGI_DIRS are looking obsolete now */
93   if(need & (DCGI_FILES|DCGI_DIRS)) {
94     if(!(dir = cgi_get("directory")))
95       dir = "";
96     re = cgi_get("regexp");
97     if(need & DCGI_DIRS)
98       if(disorder_directories(dcgi_client, dir, re,
99                               &dirs, &ndirs))
100         ndirs = 0;
101     if(need & DCGI_FILES)
102       if(disorder_files(dcgi_client, dir, re,
103                         &files, &nfiles))
104         nfiles = 0;
105   }
106 #endif
107   if(need & DCGI_RIGHTS) {
108     dcgi_rights = RIGHT_READ;   /* fail-safe */
109     if(!disorder_userinfo(dcgi_client, disorder_user(dcgi_client),
110                           "rights", &rs))
111       parse_rights(rs, &dcgi_rights, 1);
112   }
113   if(need & DCGI_ENABLED)
114     disorder_enabled(dcgi_client, &dcgi_enabled);
115   if(need & DCGI_RANDOM_ENABLED)
116     disorder_random_enabled(dcgi_client, &dcgi_random_enabled);
117   flags |= need;
118 }
119
120 /** @brief Locate a track by ID */
121 struct queue_entry *dcgi_findtrack(const char *id) {
122   struct queue_entry **qq;
123
124   if(queuemap && (qq = hash_find(queuemap, id)))
125     return *qq;
126   dcgi_lookup(DCGI_PLAYING);
127   if(queuemap && (qq = hash_find(queuemap, id)))
128     return *qq;
129   dcgi_lookup(DCGI_QUEUE);
130   if(queuemap && (qq = hash_find(queuemap, id)))
131     return *qq;
132   dcgi_lookup(DCGI_RECENT);
133   if(queuemap && (qq = hash_find(queuemap, id)))
134     return *qq;
135   return NULL;
136 }
137
138 void dcgi_lookup_reset(void) {
139   /* Forget everything we knew */
140   flags = 0;
141   queuemap = 0;
142   dcgi_recent = 0;
143   dcgi_queue = 0;
144   dcgi_playing = 0;
145   dcgi_rights = 0;
146   dcgi_new = 0;
147   dcgi_nnew = 0;
148   dcgi_enabled = 0;
149   dcgi_random_enabled = 0;
150   dcgi_volume_left = dcgi_volume_right = 0;
151 }
152
153
154 /*
155 Local Variables:
156 c-basic-offset:2
157 comment-column:40
158 fill-column:79
159 indent-tabs-mode:nil
160 End:
161 */