|  | /*
Copyright (C) 2004-2006 Grame  
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; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __JackGlobals__
#define __JackGlobals__
#include "JackError.h"
namespace Jack
{
class JackSynchro;
class JackServerNotifyChannelInterface;
class JackClientChannelInterface;
class JackNotifyChannelInterface;
class JackServerChannelInterface;
class JackSyncInterface;
class JackThread;
class JackDriverClientInterface;
class JackRunnableInterface;
class JackEngine;
/*!
\brief Factory description
 
\totdo possibly use in a dynamic way to test different communication/synchro implementations.
*/
class JackFactoryImpl
{
    public:
        JackFactoryImpl()
        {}
        virtual ~JackFactoryImpl()
        {}
        virtual JackSynchro* MakeSynchro() = 0;
        virtual JackServerNotifyChannelInterface* MakeServerNotifyChannel() = 0;
        virtual JackClientChannelInterface* MakeClientChannel() = 0;
        virtual JackNotifyChannelInterface* MakeNotifyChannel() = 0;
        virtual JackServerChannelInterface* MakeServerChannel() = 0;
        virtual JackSyncInterface* MakeInterProcessSync() = 0;
        virtual JackThread* MakeThread(JackRunnableInterface* runnable) = 0;
};
#ifdef __linux__
class JackFactoryLinuxServer : public JackFactoryImpl
{
    public:
        JackFactoryLinuxServer()
        {}
        virtual ~JackFactoryLinuxServer()
        {}
        JackSynchro* MakeSynchro();
        JackServerNotifyChannelInterface* MakeServerNotifyChannel();
        JackClientChannelInterface* MakeClientChannel();
        JackNotifyChannelInterface* MakeNotifyChannel();
        JackServerChannelInterface* MakeServerChannel();
        JackSyncInterface* MakeInterProcessSync();
        JackThread* MakeThread(JackRunnableInterface* runnable);
};
class JackFactoryLinuxClient : public JackFactoryImpl
{
    public:
        JackFactoryLinuxClient()
        {}
        virtual ~JackFactoryLinuxClient()
        {}
        JackSynchro* MakeSynchro();
        JackServerNotifyChannelInterface* MakeServerNotifyChannel();
        JackClientChannelInterface* MakeClientChannel();
        JackNotifyChannelInterface* MakeNotifyChannel();
        JackServerChannelInterface* MakeServerChannel();
        JackSyncInterface* MakeInterProcessSync();
        JackThread* MakeThread(JackRunnableInterface* runnable);
};
#endif
#ifdef WIN32
class JackFactoryWindowsServer : public JackFactoryImpl
{
    public:
        JackFactoryWindowsServer()
        {}
        virtual ~JackFactoryWindowsServer()
        {}
        JackSynchro* MakeSynchro();
        JackServerNotifyChannelInterface* MakeServerNotifyChannel();
        JackClientChannelInterface* MakeClientChannel();
        JackNotifyChannelInterface* MakeNotifyChannel();
        JackServerChannelInterface* MakeServerChannel();
        JackSyncInterface* MakeInterProcessSync();
        JackThread* MakeThread(JackRunnableInterface* runnable);
};
class JackFactoryWindowsClient : public JackFactoryImpl
{
    public:
        JackFactoryWindowsClient()
        {}
        virtual ~JackFactoryWindowsClient()
        {}
        JackSynchro* MakeSynchro();
        JackServerNotifyChannelInterface* MakeServerNotifyChannel();
        JackClientChannelInterface* MakeClientChannel();
        JackNotifyChannelInterface* MakeNotifyChannel();
        JackServerChannelInterface* MakeServerChannel();
        JackSyncInterface* MakeInterProcessSync();
        JackThread* MakeThread(JackRunnableInterface* runnable);
};
#endif
#if defined(__APPLE__)
class JackFactoryOSXServer : public JackFactoryImpl
{
    public:
        JackFactoryOSXServer()
        {}
        virtual ~JackFactoryOSXServer()
        {}
        JackSynchro* MakeSynchro();
        JackServerNotifyChannelInterface* MakeServerNotifyChannel();
        JackClientChannelInterface* MakeClientChannel();
        JackNotifyChannelInterface* MakeNotifyChannel();
        JackServerChannelInterface* MakeServerChannel();
        JackSyncInterface* MakeInterProcessSync();
        JackThread* MakeThread(JackRunnableInterface* runnable);
};
class JackFactoryOSXClient : public JackFactoryImpl
{
    public:
        JackFactoryOSXClient()
        {}
        virtual ~JackFactoryOSXClient()
        {}
        JackSynchro* MakeSynchro();
        JackServerNotifyChannelInterface* MakeServerNotifyChannel();
        JackClientChannelInterface* MakeClientChannel();
        JackNotifyChannelInterface* MakeNotifyChannel();
        JackServerChannelInterface* MakeServerChannel();
        JackSyncInterface* MakeInterProcessSync();
        JackThread* MakeThread(JackRunnableInterface* runnable);
};
#endif
/*!
\brief Factory for OS specific ressources.
*/
class JackGlobals
{
    private:
        static JackFactoryImpl* fInstance;
    public:
        JackGlobals()
        {}
        virtual ~JackGlobals()
        {}
        static JackSynchro* MakeSynchro()
        {
            return fInstance->MakeSynchro();
        }
        static JackServerNotifyChannelInterface* MakeServerNotifyChannel()
        {
            return fInstance->MakeServerNotifyChannel();
        }
        static JackClientChannelInterface* MakeClientChannel()
        {
            return fInstance->MakeClientChannel();
        }
        static JackNotifyChannelInterface* MakeNotifyChannel()
        {
            return fInstance->MakeNotifyChannel();
        }
        static JackServerChannelInterface* MakeServerChannel()
        {
            return fInstance->MakeServerChannel();
        }
        static JackSyncInterface* MakeInterProcessSync()
        {
            return fInstance->MakeInterProcessSync();
        }
        static JackThread* MakeThread(JackRunnableInterface* runnable)
        {
            return fInstance->MakeThread(runnable);
        }
        static void InitServer()
        {
            JackLog("JackGlobals InitServer\n");
            if (!fInstance) {
			
		#ifdef __APPLE__
                fInstance = new JackFactoryOSXServer();
		#endif
		#ifdef WIN32
               fInstance = new JackFactoryWindowsServer();
		#endif
		#ifdef __linux__
               fInstance = new JackFactoryLinuxServer();
		#endif
            }
        }
        static void InitClient()
        {
            JackLog("JackGlobals InitClient\n");
            if (!fInstance) {
			
		#ifdef __APPLE__
                fInstance = new JackFactoryOSXClient();
		#endif
		#ifdef WIN32
                fInstance = new JackFactoryWindowsClient();
		#endif
		#ifdef __linux__
                fInstance = new JackFactoryLinuxClient();
		#endif
            }
        }
        static void Destroy()
        {
            JackLog("JackGlobals Destroy\n");
            if (fInstance) {
                delete fInstance;
                fInstance = NULL;
            }
        }
};
} // end of namespace
#endif
 |