~ubuntu-branches/ubuntu/jaunty/imms/jaunty

« back to all changes in this revision

Viewing changes to server.cc

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Veber
  • Date: 2005-04-13 23:43:11 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050413234311-kzr68z9l7z5mv551
Tags: 2.0.3-2
Build depend on xmms-dev (>= 1.2.10+cvs20050209)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <unistd.h>
2
 
 
3
 
#include "server.h"
4
 
 
5
 
#include "strmanip.h"
6
 
 
7
 
ImmsServer::ImmsServer()
8
 
    : SocketServer(string(getenv("HOME")).append("/.imms/socket"))
9
 
{
10
 
    conn = 0;
11
 
}
12
 
 
13
 
string consume(list<string> &l)
14
 
{
15
 
    string res;
16
 
    while (!l.empty())
17
 
    {
18
 
        res += l.front() + " ";
19
 
        l.pop_front();
20
 
    }
21
 
    return res;
22
 
}
23
 
 
24
 
string getnum(list<string> &l)
25
 
{
26
 
    int size = l.size();
27
 
    if (size < 1 || l.size() > 2)
28
 
        return "";
29
 
 
30
 
    string sign, num;
31
 
    if (size == 2)
32
 
    {
33
 
        sign = l.front();
34
 
        l.pop_front();
35
 
        num = l.front();
36
 
        l.pop_front();
37
 
    }
38
 
    else
39
 
    {
40
 
        sign = l.front().substr(0, 1);
41
 
        num = l.front().substr(1);
42
 
        l.pop_front();
43
 
    }
44
 
 
45
 
    if (sign != ">" && sign != "<" && sign != "=")
46
 
        return "";
47
 
 
48
 
    if (!atoi(num.c_str()))
49
 
        return "";
50
 
 
51
 
    return sign + " '" + num + "'";
52
 
}
53
 
 
54
 
void ImmsServer::do_events()
55
 
{
56
 
    int fd = accept();
57
 
    if (fd > 0)
58
 
    {
59
 
        delete conn;
60
 
        conn = new Socket(fd);
61
 
        *conn << "Welcome to " << PACKAGE_STRING << "\n";
62
 
        *conn << "This feature is highly experimental, "
63
 
            "so quit complaining" << "\n";
64
 
        *conn << "Say 'help' if you are lost and hungry" << "\n";
65
 
    }
66
 
 
67
 
    if (conn && !conn->isok())
68
 
    {
69
 
        delete conn;
70
 
        conn = 0;
71
 
    }
72
 
 
73
 
    if (!conn)
74
 
        return;
75
 
 
76
 
    string command = conn->read();
77
 
    command = string_tolower(string_delete(command, "\n"));
78
 
    if (command == "")
79
 
        return;
80
 
 
81
 
    string predicate = "";
82
 
    list<string> parsed;
83
 
    string_split(parsed, command, " ");
84
 
 
85
 
    while (1)
86
 
    {
87
 
        string str = parsed.front();
88
 
        parsed.pop_front();
89
 
 
90
 
        if (str == "or" || str == "and")
91
 
        {
92
 
            predicate = str;
93
 
            continue;
94
 
        }
95
 
 
96
 
        if (str == "help")
97
 
        {
98
 
            *conn << "known commands:" << "\n";
99
 
            *conn << "  show" << "\n";
100
 
            *conn << "  clear" << "\n";
101
 
            *conn << "  [or|and] artist <str>" << "\n";
102
 
            *conn << "  [or|and] rating =|>|< <int>" << "\n";
103
 
            *conn << "  [or|and] bpm =|>|< <int>" << "\n";
104
 
            *conn << "  sql <str>" << "\n";
105
 
 
106
 
            break;
107
 
        }
108
 
        if (str == "show" || str == "ls" || str == "filter")
109
 
        {
110
 
            *conn << "filter: " << filter << "\n";
111
 
            break;
112
 
        }
113
 
        if (str == "clear" || str == "reset")
114
 
        {
115
 
            filter = "";
116
 
            immsdb.install_filter(filter);
117
 
            reset_selection();
118
 
            break;
119
 
        }
120
 
        if (str == "artist" || str == "sql" || str == "rating" || str == "bpm")
121
 
        {
122
 
            string params;
123
 
            if (str == "artist" || str == "sql")
124
 
            {
125
 
                if (parsed.front() == "=")
126
 
                    parsed.pop_front();
127
 
                params = consume(parsed);
128
 
            }
129
 
            else
130
 
                params = getnum(parsed);
131
 
 
132
 
            if (params == "")
133
 
            {
134
 
                *conn << str << ": parse error" << "\n";
135
 
                return;
136
 
            }
137
 
 
138
 
            if (predicate == "")
139
 
                filter = "";
140
 
            if (filter != "" && predicate == "and")
141
 
                filter = "(" + filter + ") AND ";
142
 
            else if (filter != "" && predicate == "or")
143
 
                filter += "OR ";
144
 
 
145
 
            if (str == "sql")
146
 
                filter = params;
147
 
            else if (str == "artist")
148
 
                filter += "similar(Info.artist, '"
149
 
                    + string_normalize(params) + "') ";
150
 
            else if (str == "rating")
151
 
                filter += "Rating.rating " + params + " ";
152
 
            else if (str == "bpm")
153
 
                filter += "Acoustic.bpm " + params + " ";
154
 
            reset_selection();
155
 
 
156
 
            int n = immsdb.install_filter(filter);
157
 
            *conn << itos(n) << " hits" << "\n";
158
 
            break;
159
 
        }
160
 
 
161
 
        *conn << "parse error at " << str << "\n";
162
 
        return;
163
 
    }
164
 
 
165
 
    if (parsed.size())
166
 
        *conn << "warning: ignored after " << parsed.front() << "\n";
167
 
}
168
 
 
169
 
ImmsServer::~ImmsServer()
170
 
{
171
 
    delete conn;
172
 
    close();
173
 
    unlink(string(getenv("HOME")).append("/.imms/socket").c_str());
174
 
}