/[svn]/linuxsampler/trunk/src/network/lscpresultset.cpp
ViewVC logotype

Annotation of /linuxsampler/trunk/src/network/lscpresultset.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 397 - (hide annotations) (download)
Mon Feb 21 04:28:50 2005 UTC (19 years, 2 months ago) by senkov
File size: 6342 byte(s)
* Added first cut of instrument database query support.

1 senkov 113 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5     * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6     * *
7     * This program is free software; you can redistribute it and/or modify *
8     * it under the terms of the GNU General Public License as published by *
9     * the Free Software Foundation; either version 2 of the License, or *
10     * (at your option) any later version. *
11     * *
12     * This program is distributed in the hope that it will be useful, *
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15     * GNU General Public License for more details. *
16     * *
17     * You should have received a copy of the GNU General Public License *
18     * along with this program; if not, write to the Free Software *
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20     * MA 02111-1307 USA *
21     ***************************************************************************/
22    
23 senkov 116 /*********************************************************
24     * This class helps to constuct valid resultsets per
25     * LSCP protocol specification
26     *
27     * Valid results include:
28     * OK - to ack the request
29     * Single line to ack the requests and give status
30     * Several lines of information in the following format:
31     * LABEL0: VALUE0
32     * LABEL1: VALUE1
33     * VALELx: VALUEx
34     * .
35     *
36     * ******************************************************/
37    
38 senkov 113 #include "lscpresultset.h"
39    
40 senkov 116 //Construct an empty resultset
41 senkov 120 //Default index is -1 meaning the resultset doesn't have an index
42     LSCPResultSet::LSCPResultSet(int index) {
43     result_index = index;
44 senkov 113 count = 0;
45     storage = "";
46 senkov 120 result_type = result_type_success;
47 senkov 113 }
48    
49 senkov 116 //Construct a resultset with a single line
50 senkov 120 //Default index is -1 meaning the resultset doesn't have an index
51     LSCPResultSet::LSCPResultSet(String Value, int index) {
52     result_index = index;
53 senkov 113 count = 1;
54     storage = Value + "\r\n";
55 senkov 120 result_type = result_type_success;
56 senkov 113 }
57    
58 senkov 116 //Add a label/value pair to the resultset
59     //Values could be of different types for now supports String, int and float.
60 senkov 113 void LSCPResultSet::Add(String Label, String Value) {
61     if (count == -1)
62     throw LinuxSamplerException("Attempting to change already produced resultset");
63 senkov 120 if (result_type != result_type_success)
64     throw LinuxSamplerException("Attempting to create illegal resultset");
65 senkov 113 storage = storage + Label + ": " + Value + "\r\n";
66     count++;
67     }
68    
69 schoenebeck 225 void LSCPResultSet::Add(String Label, const char* pValue) {
70     Add(Label, String(pValue));
71     }
72    
73 senkov 397 //Add SQL resultset row
74     void LSCPResultSet::Add(int columns, char** argv) {
75     for (int i = 0; i < columns; i++)
76     {
77     storage += argv[i];
78     if ((i+1) < columns)
79     storage += "|";
80     }
81     storage += "\r\n";
82     count = 2; //This result is always multiline.
83     }
84    
85 senkov 120 void LSCPResultSet::Add(int Value) {
86     Add(ToString(Value));
87     }
88    
89 senkov 113 void LSCPResultSet::Add(String Label, int Value) {
90 senkov 120 Add(Label, ToString(Value));
91 senkov 113 }
92    
93     void LSCPResultSet::Add(String Label, float Value) {
94 schoenebeck 225 char s[1024];
95     snprintf(s, 1023, "%.3f", Value);
96     Add(Label, String(s));
97 senkov 113 }
98    
99 schoenebeck 223 void LSCPResultSet::Add(String Label, bool Value) {
100     String s = (Value) ? "true" : "false";
101     Add(Label, s);
102     }
103    
104 senkov 116 //Add a single string to the resultset
105 senkov 113 void LSCPResultSet::Add(String Value) {
106 senkov 120 if (result_type != result_type_success)
107     throw LinuxSamplerException("Attempting to create illegal resultset");
108 senkov 113 if (count == -1)
109     throw LinuxSamplerException("Attempting to change already produced resultset");
110     if (count != 0)
111     throw LinuxSamplerException("Attempting to create illegal resultset");
112     storage = Value + "\r\n";
113     count = 1;
114     }
115    
116 senkov 120 //Generate an error result set from an exception.
117     //Per LSCP spec, error result is a sinle line in the following format:
118     //ERR:<CODE>:Message text\r\n
119     //This method will be used to generate unknown errors only (code 0)
120     //To generate errors with other codes as well as warnings use other methods (below).
121     //Because this is an unknown error, this method will also print message to the stderr.
122     void LSCPResultSet::Error(LinuxSamplerException e) {
123     e.PrintMessage();
124     Error(e.Message());
125     }
126    
127     //This will construct an error with a string and error code
128     //code has a default of 0
129     //String has a default of "Undefined Error"
130     void LSCPResultSet::Error (String message, int code) {
131     //Even though this is must be a single line resultset we won't throw
132     //anything here because this is already part of exception handling.
133     //We'll just 'forget' all previous results (if any) from this resultset.
134     result_type = result_type_error;
135     storage = "ERR:" + ToString(code) + ":" + message + "\r\n";
136     count = 1;
137     }
138    
139     //This will construct a warning with a string and error code
140     //code has a default of 0
141     //String has a default of "Undefined Error"
142     void LSCPResultSet::Warning (String message, int code) {
143     //FIXME: DO we want warnings as part of the resultset or
144     //do we want them to work like errors??? For now, make them work like errors.
145     result_type = result_type_warning;
146     if (result_index == -1)
147     storage = "WRN:" + ToString(code) + ":" + message + "\r\n";
148     else
149     storage = "WRN[" + ToString(result_index) + "]:" + ToString(code) + ":" + message + "\r\n";
150     count = 1;
151     }
152    
153 senkov 116 //Produce resultset
154 senkov 113 String LSCPResultSet::Produce(void) {
155 senkov 120 //FIXME: I'm assuming that only a sinle like "OK" can have index
156 senkov 116 if (count == 0) //When there is nothing in the resultset we just send "OK" to ack the request
157 senkov 120 if (result_index == -1)
158     return "OK\r\n";
159     else
160     return "OK[" + ToString(result_index) + "]\r\n";
161 senkov 116 if (count == 1) //Single line results are just that, single line
162 senkov 113 return storage;
163 senkov 116 //Multiline results MUST end with a line with a single dot
164 senkov 113 return storage + ".\r\n";
165     }

  ViewVC Help
Powered by ViewVC