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

Diff of /linuxsampler/trunk/src/network/lscpserver.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1135 by iliev, Thu Mar 29 09:40:45 2007 UTC revision 1161 by iliev, Mon Apr 16 15:51:18 2007 UTC
# Line 24  Line 24 
24  #include "lscpserver.h"  #include "lscpserver.h"
25  #include "lscpresultset.h"  #include "lscpresultset.h"
26  #include "lscpevent.h"  #include "lscpevent.h"
 #include "../common/global.h"  
27    
28  #include <fcntl.h>  #include <fcntl.h>
29    
30  #if HAVE_SQLITE3  #if ! HAVE_SQLITE3
31  # include "sqlite3.h"  #define DOESNT_HAVE_SQLITE3 "No database support. SQLITE3 was not installed when linuxsampler was built."
32  #endif  #endif
33    
34  #include "../engines/EngineFactory.h"  #include "../engines/EngineFactory.h"
# Line 81  LSCPServer::LSCPServer(Sampler* pSampler Line 80  LSCPServer::LSCPServer(Sampler* pSampler
80      LSCPEvent::RegisterEvent(LSCPEvent::event_midi_instr_map_info, "MIDI_INSTRUMENT_MAP_INFO");      LSCPEvent::RegisterEvent(LSCPEvent::event_midi_instr_map_info, "MIDI_INSTRUMENT_MAP_INFO");
81      LSCPEvent::RegisterEvent(LSCPEvent::event_midi_instr_count, "MIDI_INSTRUMENT_COUNT");      LSCPEvent::RegisterEvent(LSCPEvent::event_midi_instr_count, "MIDI_INSTRUMENT_COUNT");
82      LSCPEvent::RegisterEvent(LSCPEvent::event_midi_instr_info, "MIDI_INSTRUMENT_INFO");      LSCPEvent::RegisterEvent(LSCPEvent::event_midi_instr_info, "MIDI_INSTRUMENT_INFO");
83        LSCPEvent::RegisterEvent(LSCPEvent::event_db_instr_dir_count, "DB_INSTRUMENT_DIRECTORY_COUNT");
84        LSCPEvent::RegisterEvent(LSCPEvent::event_db_instr_dir_info, "DB_INSTRUMENT_DIRECTORY_INFO");
85        LSCPEvent::RegisterEvent(LSCPEvent::event_db_instr_count, "DB_INSTRUMENT_COUNT");
86        LSCPEvent::RegisterEvent(LSCPEvent::event_db_instr_info, "DB_INSTRUMENT_INFO");
87      LSCPEvent::RegisterEvent(LSCPEvent::event_misc, "MISCELLANEOUS");      LSCPEvent::RegisterEvent(LSCPEvent::event_misc, "MISCELLANEOUS");
88      LSCPEvent::RegisterEvent(LSCPEvent::event_total_voice_count, "TOTAL_VOICE_COUNT");      LSCPEvent::RegisterEvent(LSCPEvent::event_total_voice_count, "TOTAL_VOICE_COUNT");
89      LSCPEvent::RegisterEvent(LSCPEvent::event_global_info, "GLOBAL_INFO");      LSCPEvent::RegisterEvent(LSCPEvent::event_global_info, "GLOBAL_INFO");
# Line 139  void LSCPServer::EventHandler::TotalVoic Line 142  void LSCPServer::EventHandler::TotalVoic
142      LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_total_voice_count, NewCount));      LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_total_voice_count, NewCount));
143  }  }
144    
145    #if HAVE_SQLITE3
146    void LSCPServer::DbInstrumentsEventHandler::DirectoryCountChanged(String Dir) {
147        LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_db_instr_dir_count, Dir));
148    }
149    
150    void LSCPServer::DbInstrumentsEventHandler::DirectoryInfoChanged(String Dir) {
151        LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_db_instr_dir_info, Dir));
152    }
153    
154    void LSCPServer::DbInstrumentsEventHandler::DirectoryNameChanged(String Dir, String NewName) {
155        Dir = "'" + Dir + "'";
156        NewName = "'" + NewName + "'";
157        LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_db_instr_dir_info, "NAME", Dir, NewName));
158    }
159    
160    void LSCPServer::DbInstrumentsEventHandler::InstrumentCountChanged(String Dir) {
161        LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_db_instr_count, Dir));
162    }
163    
164    void LSCPServer::DbInstrumentsEventHandler::InstrumentInfoChanged(String Instr) {
165        LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_db_instr_info, Instr));
166    }
167    void LSCPServer::DbInstrumentsEventHandler::InstrumentNameChanged(String Instr, String NewName) {
168        Instr = "'" + Instr + "'";
169        NewName = "'" + NewName + "'";
170        LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_db_instr_info, "NAME", Instr, NewName));
171    }
172    #endif // HAVE_SQLITE3
173    
174    
175  /**  /**
176   * Blocks the calling thread until the LSCP Server is initialized and   * Blocks the calling thread until the LSCP Server is initialized and
# Line 194  int LSCPServer::Main() { Line 226  int LSCPServer::Main() {
226      MidiInstrumentMapper::AddMidiInstrumentInfoListener(&eventHandler);      MidiInstrumentMapper::AddMidiInstrumentInfoListener(&eventHandler);
227      MidiInstrumentMapper::AddMidiInstrumentMapCountListener(&eventHandler);      MidiInstrumentMapper::AddMidiInstrumentMapCountListener(&eventHandler);
228      MidiInstrumentMapper::AddMidiInstrumentMapInfoListener(&eventHandler);      MidiInstrumentMapper::AddMidiInstrumentMapInfoListener(&eventHandler);
229    #if HAVE_SQLITE3
230        InstrumentsDb::GetInstrumentsDb()->AddInstrumentsDbListener(&dbInstrumentsEventHandler);
231    #endif
232      // now wait for client connections and handle their requests      // now wait for client connections and handle their requests
233      sockaddr_in client;      sockaddr_in client;
234      int length = sizeof(client);      int length = sizeof(client);
# Line 2157  String LSCPServer::GetServerInfo() { Line 2191  String LSCPServer::GetServerInfo() {
2191      result.Add("DESCRIPTION", "LinuxSampler - modular, streaming capable sampler");      result.Add("DESCRIPTION", "LinuxSampler - modular, streaming capable sampler");
2192      result.Add("VERSION", VERSION);      result.Add("VERSION", VERSION);
2193      result.Add("PROTOCOL_VERSION", ToString(LSCP_RELEASE_MAJOR) + "." + ToString(LSCP_RELEASE_MINOR));      result.Add("PROTOCOL_VERSION", ToString(LSCP_RELEASE_MAJOR) + "." + ToString(LSCP_RELEASE_MINOR));
2194    #if HAVE_SQLITE3
2195        result.Add("INSTRUMENTS_DB_SUPPORT", "yes");
2196    #else
2197        result.Add("INSTRUMENTS_DB_SUPPORT", "no");
2198    #endif
2199        
2200      return result.Produce();      return result.Produce();
2201  }  }
2202    
# Line 2224  String LSCPServer::UnsubscribeNotificati Line 2264  String LSCPServer::UnsubscribeNotificati
2264      return result.Produce();      return result.Produce();
2265  }  }
2266    
2267  static int select_callback(void * lscpResultSet, int argc,  String LSCPServer::AddDbInstrumentDirectory(String Dir) {
2268                          char **argv, char **azColName)      dmsg(2,("LSCPServer: AddDbInstrumentDirectory(Dir=%s)\n", Dir.c_str()));
2269  {      LSCPResultSet result;
2270      LSCPResultSet* resultSet = (LSCPResultSet*) lscpResultSet;  #if HAVE_SQLITE3
2271      resultSet->Add(argc, argv);      try {
2272      return 0;          InstrumentsDb::GetInstrumentsDb()->AddDirectory(Dir);
2273        } catch (Exception e) {
2274             result.Error(e);
2275        }
2276    #else
2277        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2278    #endif
2279        return result.Produce();
2280    }
2281    
2282    String LSCPServer::RemoveDbInstrumentDirectory(String Dir, bool Force) {
2283        dmsg(2,("LSCPServer: RemoveDbInstrumentDirectory(Dir=%s,Force=%d)\n", Dir.c_str(), Force));
2284        LSCPResultSet result;
2285    #if HAVE_SQLITE3
2286        try {
2287            InstrumentsDb::GetInstrumentsDb()->RemoveDirectory(Dir, Force);
2288        } catch (Exception e) {
2289             result.Error(e);
2290        }
2291    #else
2292        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2293    #endif
2294        return result.Produce();
2295    }
2296    
2297    String LSCPServer::GetDbInstrumentDirectoryCount(String Dir) {
2298        dmsg(2,("LSCPServer: GetDbInstrumentDirectoryCount(Dir=%s)\n", Dir.c_str()));
2299        LSCPResultSet result;
2300    #if HAVE_SQLITE3
2301        try {
2302            result.Add(InstrumentsDb::GetInstrumentsDb()->GetDirectoryCount(Dir));
2303        } catch (Exception e) {
2304             result.Error(e);
2305        }
2306    #else
2307        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2308    #endif
2309        return result.Produce();
2310    }
2311    
2312    String LSCPServer::GetDbInstrumentDirectories(String Dir) {
2313        dmsg(2,("LSCPServer: GetDbInstrumentDirectories(Dir=%s)\n", Dir.c_str()));
2314        LSCPResultSet result;
2315    #if HAVE_SQLITE3
2316        try {
2317            String list;
2318            StringListPtr dirs = InstrumentsDb::GetInstrumentsDb()->GetDirectories(Dir);
2319    
2320            for (int i = 0; i < dirs->size(); i++) {
2321                if (list != "") list += ",";
2322                list += "'" + dirs->at(i) + "'";
2323            }
2324    
2325            result.Add(list);
2326        } catch (Exception e) {
2327             result.Error(e);
2328        }
2329    #else
2330        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2331    #endif
2332        return result.Produce();
2333    }
2334    
2335    String LSCPServer::GetDbInstrumentDirectoryInfo(String Dir) {
2336        dmsg(2,("LSCPServer: GetDbInstrumentDirectoryInfo(Dir=%s)\n", Dir.c_str()));
2337        LSCPResultSet result;
2338    #if HAVE_SQLITE3
2339        try {
2340            DbDirectory info = InstrumentsDb::GetInstrumentsDb()->GetDirectoryInfo(Dir);
2341    
2342            result.Add("DESCRIPTION", info.Description);
2343            result.Add("CREATED", info.Created);
2344            result.Add("MODIFIED", info.Modified);
2345        } catch (Exception e) {
2346             result.Error(e);
2347        }
2348    #else
2349        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2350    #endif
2351        return result.Produce();
2352    }
2353    
2354    String LSCPServer::SetDbInstrumentDirectoryName(String Dir, String Name) {
2355        dmsg(2,("LSCPServer: SetDbInstrumentDirectoryName(Dir=%s,Name=%s)\n", Dir.c_str(), Name.c_str()));
2356        LSCPResultSet result;
2357    #if HAVE_SQLITE3
2358        try {
2359            InstrumentsDb::GetInstrumentsDb()->RenameDirectory(Dir, Name);
2360        } catch (Exception e) {
2361             result.Error(e);
2362        }
2363    #else
2364        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2365    #endif
2366        return result.Produce();
2367    }
2368    
2369    String LSCPServer::MoveDbInstrumentDirectory(String Dir, String Dst) {
2370        dmsg(2,("LSCPServer: MoveDbInstrumentDirectory(Dir=%s,Dst=%s)\n", Dir.c_str(), Dst.c_str()));
2371        LSCPResultSet result;
2372    #if HAVE_SQLITE3
2373        try {
2374            InstrumentsDb::GetInstrumentsDb()->MoveDirectory(Dir, Dst);
2375        } catch (Exception e) {
2376             result.Error(e);
2377        }
2378    #else
2379        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2380    #endif
2381        return result.Produce();
2382    }
2383    
2384    String LSCPServer::SetDbInstrumentDirectoryDescription(String Dir, String Desc) {
2385        dmsg(2,("LSCPServer: SetDbInstrumentDirectoryDescription(Dir=%s,Desc=%s)\n", Dir.c_str(), Desc.c_str()));
2386        LSCPResultSet result;
2387    #if HAVE_SQLITE3
2388        try {
2389            InstrumentsDb::GetInstrumentsDb()->SetDirectoryDescription(Dir, Desc);
2390        } catch (Exception e) {
2391             result.Error(e);
2392        }
2393    #else
2394        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2395    #endif
2396        return result.Produce();
2397    }
2398    
2399    String LSCPServer::AddDbInstruments(String DbDir, String FilePath, int Index) {
2400        dmsg(2,("LSCPServer: AddDbInstruments(DbDir=%s,FilePath=%s,Index=%d)\n", DbDir.c_str(), FilePath.c_str(), Index));
2401        LSCPResultSet result;
2402    #if HAVE_SQLITE3
2403        try {
2404            InstrumentsDb::GetInstrumentsDb()->AddInstruments(DbDir, FilePath, Index);
2405        } catch (Exception e) {
2406             result.Error(e);
2407        }
2408    #else
2409        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2410    #endif
2411        return result.Produce();
2412    }
2413    
2414    String LSCPServer::AddDbInstrumentsFlat(String DbDir, String FsDir) {
2415        dmsg(2,("LSCPServer: AddDbInstrumentsFlat(DbDir=%s,FilePath=%s)\n", DbDir.c_str(), FsDir.c_str()));
2416        LSCPResultSet result;
2417    #if HAVE_SQLITE3
2418        try {
2419            InstrumentsDb::GetInstrumentsDb()->AddInstrumentsRecursive(DbDir, FsDir, true);
2420        } catch (Exception e) {
2421             result.Error(e);
2422        }
2423    #else
2424        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2425    #endif
2426        return result.Produce();
2427    }
2428    
2429    String LSCPServer::AddDbInstrumentsNonrecursive(String DbDir, String FsDir) {
2430        dmsg(2,("LSCPServer: AddDbInstrumentsNonrecursive(DbDir=%s,FilePath=%s)\n", DbDir.c_str(), FsDir.c_str()));
2431        LSCPResultSet result;
2432    #if HAVE_SQLITE3
2433        try {
2434            InstrumentsDb::GetInstrumentsDb()->AddInstrumentsNonrecursive(DbDir, FsDir);
2435        } catch (Exception e) {
2436             result.Error(e);
2437        }
2438    #else
2439        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2440    #endif
2441        return result.Produce();
2442    }
2443    
2444    String LSCPServer::RemoveDbInstrument(String Instr) {
2445        dmsg(2,("LSCPServer: RemoveDbInstrument(Instr=%s)\n", Instr.c_str()));
2446        LSCPResultSet result;
2447    #if HAVE_SQLITE3
2448        try {
2449            InstrumentsDb::GetInstrumentsDb()->RemoveInstrument(Instr);
2450        } catch (Exception e) {
2451             result.Error(e);
2452        }
2453    #else
2454        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2455    #endif
2456        return result.Produce();
2457    }
2458    
2459    String LSCPServer::GetDbInstrumentCount(String Dir) {
2460        dmsg(2,("LSCPServer: GetDbInstrumentCount(Dir=%s)\n", Dir.c_str()));
2461        LSCPResultSet result;
2462    #if HAVE_SQLITE3
2463        try {
2464            result.Add(InstrumentsDb::GetInstrumentsDb()->GetInstrumentCount(Dir));
2465        } catch (Exception e) {
2466             result.Error(e);
2467        }
2468    #else
2469        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2470    #endif
2471        return result.Produce();
2472  }  }
2473    
2474  String LSCPServer::QueryDatabase(String query) {  String LSCPServer::GetDbInstruments(String Dir) {
2475        dmsg(2,("LSCPServer: GetDbInstruments(Dir=%s)\n", Dir.c_str()));
2476      LSCPResultSet result;      LSCPResultSet result;
2477  #if HAVE_SQLITE3  #if HAVE_SQLITE3
2478      char* zErrMsg = NULL;      try {
2479      sqlite3 *db;          String list;
2480      String selectStr = "SELECT " + query;          StringListPtr instrs = InstrumentsDb::GetInstrumentsDb()->GetInstruments(Dir);
2481    
2482            for (int i = 0; i < instrs->size(); i++) {
2483                if (list != "") list += ",";
2484                list += "'" + instrs->at(i) + "'";
2485            }
2486    
2487            result.Add(list);
2488        } catch (Exception e) {
2489             result.Error(e);
2490        }
2491    #else
2492        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2493    #endif
2494        return result.Produce();
2495    }
2496    
2497    String LSCPServer::GetDbInstrumentInfo(String Instr) {
2498        dmsg(2,("LSCPServer: GetDbInstrumentInfo(Instr=%s)\n", Instr.c_str()));
2499        LSCPResultSet result;
2500    #if HAVE_SQLITE3
2501        try {
2502            DbInstrument info = InstrumentsDb::GetInstrumentsDb()->GetInstrumentInfo(Instr);
2503    
2504            result.Add("INSTRUMENT_FILE", info.InstrFile);
2505            result.Add("INSTRUMENT_NR", info.InstrNr);
2506            result.Add("FORMAT_FAMILY", info.FormatFamily);
2507            result.Add("FORMAT_VERSION", info.FormatVersion);
2508            result.Add("SIZE", (int)info.Size);
2509            result.Add("CREATED", info.Created);
2510            result.Add("MODIFIED", info.Modified);
2511            result.Add("DESCRIPTION", FilterEndlines(info.Description));
2512            result.Add("IS_DRUM", info.IsDrum);
2513            result.Add("PRODUCT", FilterEndlines(info.Product));
2514            result.Add("ARTISTS", FilterEndlines(info.Artists));
2515            result.Add("KEYWORDS", FilterEndlines(info.Keywords));
2516        } catch (Exception e) {
2517             result.Error(e);
2518        }
2519    #else
2520        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2521    #endif
2522        return result.Produce();
2523    }
2524    
2525    String LSCPServer::SetDbInstrumentName(String Instr, String Name) {
2526        dmsg(2,("LSCPServer: SetDbInstrumentName(Instr=%s,Name=%s)\n", Instr.c_str(), Name.c_str()));
2527        LSCPResultSet result;
2528    #if HAVE_SQLITE3
2529        try {
2530            InstrumentsDb::GetInstrumentsDb()->RenameInstrument(Instr, Name);
2531        } catch (Exception e) {
2532             result.Error(e);
2533        }
2534    #else
2535        result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2536    #endif
2537        return result.Produce();
2538    }
2539    
2540      int rc = sqlite3_open("linuxsampler.db", &db);  String LSCPServer::MoveDbInstrument(String Instr, String Dst) {
2541      if (rc == SQLITE_OK)      dmsg(2,("LSCPServer: MoveDbInstrument(Instr=%s,Dst=%s)\n", Instr.c_str(), Dst.c_str()));
2542      {      LSCPResultSet result;
2543              rc = sqlite3_exec(db, selectStr.c_str(), select_callback, &result, &zErrMsg);  #if HAVE_SQLITE3
2544        try {
2545            InstrumentsDb::GetInstrumentsDb()->MoveInstrument(Instr, Dst);
2546        } catch (Exception e) {
2547             result.Error(e);
2548      }      }
2549      if ( rc != SQLITE_OK )  #else
2550      {      result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2551              result.Error(String(zErrMsg), rc);  #endif
2552        return result.Produce();
2553    }
2554    
2555    String LSCPServer::SetDbInstrumentDescription(String Instr, String Desc) {
2556        dmsg(2,("LSCPServer: SetDbInstrumentDescription(Instr=%s,Desc=%s)\n", Instr.c_str(), Desc.c_str()));
2557        LSCPResultSet result;
2558    #if HAVE_SQLITE3
2559        try {
2560            InstrumentsDb::GetInstrumentsDb()->SetInstrumentDescription(Instr, Desc);
2561        } catch (Exception e) {
2562             result.Error(e);
2563      }      }
     sqlite3_close(db);  
2564  #else  #else
2565      result.Error(String("SQLITE3 was not installed when linuxsampler was built. SELECT statement is not available."), 0);      result.Error(String(DOESNT_HAVE_SQLITE3), 0);
2566  #endif  #endif
2567      return result.Produce();      return result.Produce();
2568  }  }
2569    
2570    
2571  /**  /**
2572   * Will be called by the parser to enable or disable echo mode; if echo   * Will be called by the parser to enable or disable echo mode; if echo
2573   * mode is enabled, all commands from the client will (immediately) be   * mode is enabled, all commands from the client will (immediately) be
# Line 2273  String LSCPServer::SetEcho(yyparse_param Line 2586  String LSCPServer::SetEcho(yyparse_param
2586      }      }
2587      return result.Produce();      return result.Produce();
2588  }  }
2589    
2590    String LSCPServer::FilterEndlines(String s) {
2591        String s2 = s;
2592        for (int i = 0; i < s2.length(); i++) {
2593            if (s2.at(i) == '\r') s2.at(i) = ' ';
2594            else if (s2.at(i) == '\n') s2.at(i) = ' ';
2595        }
2596        
2597        return s2;
2598    }

Legend:
Removed from v.1135  
changed lines
  Added in v.1161

  ViewVC Help
Powered by ViewVC