File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / dev_tunnelled.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:32:16 2012 UTC (12 years, 3 months ago) by misho
Branches: smartmontools, elwix, MAIN
CVS tags: v6_2, v6_1p0, v6_1, v5_43, v5_42, HEAD
smartmontools

    1: /*
    2:  * dev_tunnelled.h
    3:  *
    4:  * Home page of code is: http://smartmontools.sourceforge.net
    5:  *
    6:  * Copyright (C) 2008 Christian Franke <smartmontools-support@lists.sourceforge.net>
    7:  *
    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, or (at your option)
   11:  * any later version.
   12:  *
   13:  * You should have received a copy of the GNU General Public License
   14:  * (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
   15:  *
   16:  */
   17: 
   18: #ifndef DEV_TUNNELLED_H
   19: #define DEV_TUNNELLED_H
   20: 
   21: #define DEV_TUNNELLED_H_CVSID "$Id: dev_tunnelled.h,v 1.1.1.1 2012/02/21 16:32:16 misho Exp $\n"
   22: 
   23: #include "dev_interface.h"
   24: 
   25: /////////////////////////////////////////////////////////////////////////////
   26: // tunnelled_device_base
   27: 
   28: /// Common functionality for all tunnelled_device classes.
   29: 
   30: class tunnelled_device_base
   31: : virtual public /*implements*/ smart_device
   32: {
   33: protected:
   34:   explicit tunnelled_device_base(smart_device * tunnel_dev);
   35: 
   36: public:
   37:   virtual ~tunnelled_device_base() throw();
   38: 
   39:   virtual bool is_open() const;
   40: 
   41:   virtual bool open();
   42: 
   43:   virtual bool close();
   44: 
   45:   virtual bool owns(const smart_device * dev) const;
   46: 
   47:   virtual void release(const smart_device * dev);
   48: 
   49: private:
   50:   smart_device * m_tunnel_base_dev;
   51: };
   52: 
   53: 
   54: /////////////////////////////////////////////////////////////////////////////
   55: // tunnelled_device
   56: 
   57: /// Implement a device by tunneling through another device
   58: 
   59: template <class BaseDev, class TunnelDev>
   60: class tunnelled_device
   61: : public BaseDev,
   62:   public tunnelled_device_base
   63: {
   64: public:
   65:   typedef TunnelDev tunnel_device_type;
   66: 
   67: protected:
   68:   explicit tunnelled_device(tunnel_device_type * tunnel_dev)
   69:     : smart_device(smart_device::never_called),
   70:       tunnelled_device_base(tunnel_dev),
   71:       m_tunnel_dev(tunnel_dev)
   72:     { }
   73: 
   74: public:
   75:   virtual void release(const smart_device * dev)
   76:     {
   77:       if (m_tunnel_dev == dev)
   78:         m_tunnel_dev = 0;
   79:       tunnelled_device_base::release(dev);
   80:     }
   81: 
   82:   tunnel_device_type * get_tunnel_dev()
   83:     { return m_tunnel_dev; }
   84: 
   85:   const tunnel_device_type * get_tunnel_dev() const
   86:     { return m_tunnel_dev; }
   87: 
   88: private:
   89:   tunnel_device_type * m_tunnel_dev;
   90: };
   91: 
   92: #endif // DEV_TUNNELLED_H

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>