/*******************************************************************************/ /* Copyright (C) 2012 Jonathan Moore Liles */ /* */ /* This program is free software; you can redistribute it and/or modify it */ /* under the terms of the GNU General Public License as published by the */ /* Free Software Foundation; either version 2 of the License, or (at your */ /* option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ /* more details. */ /* */ /* You should have received a copy of the GNU General Public License along */ /* with This program; see the file COPYING. If not,write to the Free Software */ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ #pragma once #include namespace NSM { class Client { private: const char *nsm_url; lo_server _server; lo_server_thread _st; lo_address nsm_addr; bool nsm_is_active; char *_nsm_client_id; char *_session_manager_name; char *_nsm_client_path; public: enum { ERR_OK = 0, ERR_GENERAL = -1, ERR_INCOMPATIBLE_API = -2, ERR_BLACKLISTED = -3, ERR_LAUNCH_FAILED = -4, ERR_NO_SUCH_FILE = -5, ERR_NO_SESSION_OPEN = -6, ERR_UNSAVED_CHANGES = -7, ERR_NOT_NOW = -8 }; Client (); virtual ~Client (); bool is_active (void) { return nsm_is_active; } const char *session_manager_name (void) { return _session_manager_name; } const char *client_id (void) { return _nsm_client_id; } const char *client_path (void) { return _nsm_client_path; } /* Client->Server methods */ void is_dirty (void); void is_clean (void); void progress (float f); void message (int priority, const char *msg); void announce (const char *appliction_name, const char *capabilities, const char *process_name); void broadcast (lo_message msg); /* init without threading */ int init (const char *nsm_url); /* init with threading */ int init_thread (const char *nsm_url); /* call this periodically to check for new messages */ void check (int timeout = 0); /* or call these to start and stop a thread (must do your own locking in handler!) */ void start (void); void stop (void); protected: /* Server->Client methods */ virtual int command_open (const char *name, const char *display_name, const char *client_id, char **out_msg) = 0; virtual int command_save (char **out_msg) = 0; virtual void command_active (bool) {} virtual void command_session_is_loaded (void) {} /* invoked when an unrecognized message is received. Should return 0 if you handled it, -1 otherwise. */ virtual int command_broadcast (const char *, lo_message) { return -1; } private: /* osc handlers */ static int osc_open (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data); static int osc_save (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data); static int osc_announce_reply (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data); static int osc_error (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data); static int osc_session_is_loaded (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data); static int osc_broadcast (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data); }; };