/[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 1424 - (hide annotations) (download)
Sun Oct 14 22:00:17 2007 UTC (16 years, 7 months ago) by schoenebeck
File size: 6554 byte(s)
* code cleanup:
- global.h now only covers global definitions that are needed for the C++
  API header files, all implementation internal global definitions are now
  in global_private.h
- atomic.h is not exposed to the C++ API anymore (replaced the references
  in SynchronizedConfig.h for this with local definitions)
- no need to include config.h anymore for using LS's API header files
- DB instruments classes are not exposed to the C++ API
- POSIX callback functions of Thread.h are hidden
- the (optional) gig Engine benchmark compiles again
- updated Doxyfile.in
- fixed warnings in API doc generation
* preparations for release 0.5.0

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

  ViewVC Help
Powered by ViewVC