/* burndirnotify.cpp 
   Copyright (c) 2006 James Thorniley
   Part of konqburn - CD Burner Sidebar for Konqueror

   This is a modified version of 
   svn://anonsvn.kde.org/home/kde/branches/KDE/3.5/kdebase/
                         kioslave/home/kdedmodule/homedirnotify.cpp

   Original copyright notice follows

   This file is part of the KDE Project
   Copyright (c) 2005 K�vin Ottens <ervin ipsquad net>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License version 2 as published by the Free Software Foundation.

   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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/

#include "burndirnotify.h"

#include <kdebug.h>
#include <kstandarddirs.h>

#include <kdirnotify_stub.h>

#define MINIMUM_UID 500

BurnDirNotify::BurnDirNotify()
: mInited( false )
{
}

void BurnDirNotify::init()
{
  if( mInited )
    return;
  mInited = true;

  m_dataDir = new KURL( "file://" + locateLocal( "data", "kio_burn/data" ) );
}

KURL BurnDirNotify::toBurnURL(const KURL &url)
{
  //kdDebug() << "BurnDirNotify::toHomeURL(" << url << ")" << endl;

  init();

  if( m_dataDir->isParentOf( url ) )
  {
    QString path = KURL::relativePath( m_dataDir->path(), url.path() );
    KURL result("burn:/"+path);
    result.cleanPath();
    return result;
  }
  return KURL();
}

KURL::List BurnDirNotify::toBurnURLList(const KURL::List &list)
{
  init();
  KURL::List new_list;

  KURL::List::const_iterator it = list.begin();
  KURL::List::const_iterator end = list.end();

  for (; it!=end; ++it)
  {
    KURL url = toBurnURL(*it);

    if (url.isValid())
    {
      new_list.append(url);
    }
  }

  return new_list;
}

ASYNC BurnDirNotify::FilesAdded(const KURL &directory)
{
  //kdDebug() << "BurnDirNotify::FilesAdded" << endl;

  KURL new_dir = toBurnURL(directory);

  if (new_dir.isValid())
  {
    KDirNotify_stub notifier("*", "*");
    notifier.FilesAdded( new_dir );
  }
}

// This hack is required because of the way we manage .desktop files with
// Forwarding Slaves, their URL is out of the ioslave (some home:/ files
// have a file:/ based UDS_URL so that they are executed correctly.
// Hence, FilesRemoved and FilesChanged does nothing... We're forced to use
// FilesAdded to re-list the modified directory.
inline void evil_hack(const KURL::List &list)
{
  KDirNotify_stub notifier("*", "*");

  KURL::List notified;

  KURL::List::const_iterator it = list.begin();
  KURL::List::const_iterator end = list.end();

  for (; it!=end; ++it)
  {
    KURL url = (*it).upURL();

    if (!notified.contains(url))
    {
      notifier.FilesAdded(url);
      notified.append(url);
    }
  }
}


ASYNC BurnDirNotify::FilesRemoved(const KURL::List &fileList)
{
  //kdDebug() << "BurnDirNotify::FilesRemoved" << endl;

  KURL::List new_list = toBurnURLList(fileList);

  if (!new_list.isEmpty())
  {
    //KDirNotify_stub notifier("*", "*");
    //notifier.FilesRemoved( new_list );
    evil_hack(new_list);
  }
}

ASYNC BurnDirNotify::FilesChanged(const KURL::List &fileList)
{
  //kdDebug() << "BurnDirNotify::FilesChanged" << endl;

  KURL::List new_list = toBurnURLList(fileList);

  if (!new_list.isEmpty())
  {
    //KDirNotify_stub notifier("*", "*");
    //notifier.FilesChanged( new_list );
    evil_hack(new_list);
  }
}
