text: /****************************************************************************
  * VLC-Qt - Qt and libvlc connector library
  * Copyright (C) 2012 Tadej Novak <tadej@tano.si>
  *
  * This library is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published
  * by the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
  * This library 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 Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public License
  * along with this library. If not, see <http://www.gnu.org/licenses/>.
  *****************************************************************************/
  
  #ifndef VLCQT_MEDIALIST_H_
  #define VLCQT_MEDIALIST_H_
  
  #include <QtCore/QObject>
  #include <QtCore/QString>
  #include <QtCore/QUrl>
  
  #include "Enums.h"
  #include "SharedExportCore.h"
  
  class VlcInstance;
  class VlcMedia;
  
  struct libvlc_event_t;
  struct libvlc_event_manager_t;
  struct libvlc_media_t;
  struct libvlc_media_list_t;
  
  /*!
      \class VlcMediaList MediaList.h VLCQtCore/MediaList.h
      \ingroup VLCQtCore
      \brief Media list item
  
      VlcMediaList holds multiple VlcMedia items to play in sequence.
  */
  class VLCQT_CORE_EXPORT VlcMediaList : public QObject
  {
      Q_OBJECT
  public:
      /*!
          \brief VlcMediaList constructor.
  
          This constructor creates a new media list instance.
  
          \param instance main libvlc instance
      */
      explicit VlcMediaList(VlcInstance *instance);
  
      /*!
          \brief VlcMediaList destructor
      */
      ~VlcMediaList();
  
      /*!
          \brief libvlc media list item
          \return libvlc media list item (libvlc_media_list_t *)
      */
      libvlc_media_list_t *core();
  
      /*!
          \brief Add media item to the list
          \param media media item
      */
      void addMedia(VlcMedia *media);
  
      /*!
          \brief Get media item at selected index
          \param index item position
          \return media item (VlcMedia)
      */
      VlcMedia *at(int index);
  
      /*!
          \brief libvlc media list item
          \return items count (int)
      */
      int count();
  
      /*!
          \brief Index of media item
          \param media media item
          \return media item index (int)
      */
      int indexOf(VlcMedia *media);
  
      /*!
          \brief Index of media item (core)
          \param media media item
          \return media item index (int)
      */
      int indexOf(libvlc_media_t *media);
  
      /*!
          \brief Insert media item at the specific position of the list.
          \param media media item
          \param index item position
      */
      void insertMedia(VlcMedia *media,
                       int index);
  
      /*!
          \brief Remove media item from the specific position of the list.
          \param index item position
      */
      void removeMedia(int index);
  
  signals:
      /*!
          \brief Signal sent on item added
          \param item item that was added
          \param index index of item
      */
      void itemAdded(libvlc_media_t *item,
                     int index);
  
      /*!
          \brief Signal sent when item will be added
          \param item item that will be added
          \param index index of item
      */
      void willAddItem(libvlc_media_t *item,
                       int index);
  
      /*!
          \brief Signal sent on item deleted
          \param item item that was added
          \param index index of item
      */
      void itemDeleted(libvlc_media_t *item,
                       int index);
  
      /*!
          \brief Signal sent when item will be deleted
          \param item item that will be deleted
          \param index index of item
      */
      void willDeleteItem(libvlc_media_t *item,
                          int index);
  
  private:
      void lock();
      void unlock();
  
      static void libvlc_callback(const libvlc_event_t *event,
                                  void *data);
  
      void createCoreConnections();
      void removeCoreConnections();
  
      libvlc_media_list_t *_vlcMediaList;
      libvlc_event_manager_t *_vlcEvents;
  
      QList<VlcMedia *> _list;
  };
  
  #endif // VLCQT_MEDIALIST_H_
  