 /*
  This file is or will be part of KDE desktop environment

  Copyright 1999 Matt Koss <koss@miesto.sk>

  It is licensed under GPL version 2.

  If it is part of KDE libraries than this file is licensed under
  LGPL version 2.
 */

import org.kde.qt.*;
import org.kde.koala.*;
import java.io.ByteArrayOutputStream;

class KioslaveTest  extends KMainWindow {

  static final int List = 0;
  static final int ListRecursive = 1;
  static final int Stat = 2;
  static final int Get = 3;
  static final int Put = 4;
  static final int Copy = 5;
  static final int Move = 6;
  static final int Delete = 7;
  static final int Shred = 8;
  static final int Mkdir = 9;
  static final int Mimetype = 10;

  static final int ProgressNone = 0;
  static final int ProgressDefault = 1;
  static final int ProgressStatus = 2;

  // info stuff
  QLabel lb_from;
  QLineEdit le_source;

  QLabel lb_to;
  QLineEdit le_dest;

  // operation stuff
  QButtonGroup opButtons;

  QRadioButton rbList;
  QRadioButton rbListRecursive;
  QRadioButton rbStat;
  QRadioButton rbGet;
  QRadioButton rbPut;
  QRadioButton rbCopy;
  QRadioButton rbMove;
  QRadioButton rbDelete;
  QRadioButton rbShred;
  QRadioButton rbMkdir;
  QRadioButton rbMimetype;

  // progress stuff
  QButtonGroup progressButtons;

  QRadioButton rbProgressNone;
  QRadioButton rbProgressDefault;
  QRadioButton rbProgressStatus;

  QPushButton pbStart;
  QPushButton pbStop;

  QPushButton close;


private  Job job;
private  QWidget main_widget;

private  StatusbarProgress statusProgress;

private  int selectedOperation;
private  int progressMode;
private  int putBuffer;
private  Slave slave;

 /*
  This file is or will be part of KDE desktop environment

  Copyright 1999 Matt Koss <koss@miesto.sk>

  It is licensed under GPL version 2.

  If it is part of KDE libraries than this file is licensed under
  LGPL version 2.
 */





KioslaveTest( String src, String dest, int op, int pr )
{
  super(null, "");
  job = null;

  main_widget = new QWidget( this, "");
  QBoxLayout topLayout = new QVBoxLayout( main_widget, 10, 5 );

  QGridLayout grid = new QGridLayout( 2, 2, 10 );
  topLayout.addLayout( grid );

  grid.setRowStretch(0,1);
  grid.setRowStretch(1,1);

  grid.setColStretch(0,1);
  grid.setColStretch(1,100);

  lb_from = new QLabel( "From :", main_widget );
  grid.addWidget( lb_from, 0, 0 );

  le_source = new QLineEdit( main_widget );
  grid.addWidget( le_source, 0, 1 );
  le_source.setText( src );

  lb_to = new QLabel( "To :", main_widget );
  grid.addWidget( lb_to, 1, 0 );

  le_dest = new QLineEdit( main_widget );
  grid.addWidget( le_dest, 1, 1 );
  le_dest.setText( dest );

  // Operation groupbox & buttons
  opButtons = new QButtonGroup( "Operation", main_widget );
  topLayout.addWidget( opButtons, 10 );
  connect( opButtons, SIGNAL("clicked(int)"), SLOT("changeOperation(int)") );

  QBoxLayout hbLayout = new QHBoxLayout( opButtons, 15 );

  rbList = new QRadioButton( "List", opButtons );
  opButtons.insert( rbList, List );
  hbLayout.addWidget( rbList, 5 );

  rbListRecursive = new QRadioButton( "ListRecursive", opButtons );
  opButtons.insert( rbListRecursive, ListRecursive );
  hbLayout.addWidget( rbListRecursive, 5 );

  rbStat = new QRadioButton( "Stat", opButtons );
  opButtons.insert( rbStat, Stat );
  hbLayout.addWidget( rbStat, 5 );

  rbGet = new QRadioButton( "Get", opButtons );
  opButtons.insert( rbGet, Get );
  hbLayout.addWidget( rbGet, 5 );

  rbPut = new QRadioButton( "Put", opButtons );
  opButtons.insert( rbPut, Put );
  hbLayout.addWidget( rbPut, 5 );

  rbCopy = new QRadioButton( "Copy", opButtons );
  opButtons.insert( rbCopy, Copy );
  hbLayout.addWidget( rbCopy, 5 );

  rbMove = new QRadioButton( "Move", opButtons );
  opButtons.insert( rbMove, Move );
  hbLayout.addWidget( rbMove, 5 );

  rbDelete = new QRadioButton( "Delete", opButtons );
  opButtons.insert( rbDelete, Delete );
  hbLayout.addWidget( rbDelete, 5 );

  rbShred = new QRadioButton( "Shred", opButtons );
  opButtons.insert( rbShred, Shred );
  hbLayout.addWidget( rbShred, 5 );

  rbMkdir = new QRadioButton( "Mkdir", opButtons );
  opButtons.insert( rbMkdir, Mkdir );
  hbLayout.addWidget( rbMkdir, 5 );

  rbMimetype = new QRadioButton( "Mimetype", opButtons );
  opButtons.insert( rbMimetype, Mimetype );
  hbLayout.addWidget( rbMimetype, 5 );

  opButtons.setButton( op );
  changeOperation( op );

  // Progress groupbox & buttons
  progressButtons = new QButtonGroup( "Progress dialog mode", main_widget );
  topLayout.addWidget( progressButtons, 10 );
  connect( progressButtons, SIGNAL("clicked(int)"), SLOT("changeProgressMode(int)") );

  hbLayout = new QHBoxLayout( progressButtons, 15 );

  rbProgressNone = new QRadioButton( "None", progressButtons );
  progressButtons.insert( rbProgressNone, ProgressNone );
  hbLayout.addWidget( rbProgressNone, 5 );

  rbProgressDefault = new QRadioButton( "Default", progressButtons );
  progressButtons.insert( rbProgressDefault, ProgressDefault );
  hbLayout.addWidget( rbProgressDefault, 5 );

  rbProgressStatus = new QRadioButton( "Status", progressButtons );
  progressButtons.insert( rbProgressStatus, ProgressStatus );
  hbLayout.addWidget( rbProgressStatus, 5 );

  progressButtons.setButton( pr );
  changeProgressMode( pr );

  // statusbar progress widget
  statusProgress = new StatusbarProgress( statusBar() );
  statusBar().addWidget( statusProgress, 0, true );

  // run & stop butons
  hbLayout = new QHBoxLayout( topLayout, 15 );

  pbStart = new QPushButton( "&Start", main_widget );
  pbStart.setFixedSize( pbStart.sizeHint() );
  connect( pbStart, SIGNAL("clicked()"), SLOT("startJob()") );
  hbLayout.addWidget( pbStart, 5 );

  pbStop = new QPushButton( "Sto&p", main_widget );
  pbStop.setFixedSize( pbStop.sizeHint() );
  pbStop.setEnabled( false );
  connect( pbStop, SIGNAL("clicked()"), SLOT("stopJob()") );
  hbLayout.addWidget( pbStop, 5 );

  // close button
  close = new QPushButton( "&Close", main_widget );
  close.setFixedSize( close.sizeHint() );
  connect(close, SIGNAL("clicked()"), this, SLOT("slotQuit()"));

  topLayout.addWidget( close, 5 );

  main_widget.setMinimumSize( main_widget.sizeHint() );
  setCentralWidget( main_widget );

  slave = null;
//  slave = Scheduler.getConnectedSlave(new KURL("ftp://ftp.kde.org"));
  Scheduler.connect(SIGNAL("slaveConnected(Slave)"),
	this, SLOT("slotSlaveConnected()"));
  Scheduler.connect(SIGNAL("slaveError(Slave,int,String)"),
	this, SLOT("slotSlaveError()"));
}


protected void closeEvent( QCloseEvent e ){
  slotQuit();
}


void slotQuit(){
  if ( job != null ) {
    job.kill( true );  // kill the job quietly
  }
  if (slave != null )
    Scheduler.disconnectSlave(slave);
  KApplication.kApplication().quit();
}


void changeOperation( int id ) {
  // only two urls for copy and move
  boolean enab = rbCopy.isChecked() || rbMove.isChecked();

  le_dest.setEnabled( enab );

  selectedOperation = id;
}


void changeProgressMode( int id ) {
  progressMode = id;

  if ( progressMode == ProgressStatus ) {
    statusBar().show();
  } else {
    statusBar().hide();
  }
}


void startJob() {
 String sCurrent = QDir.currentDirPath()+"/";
  KURL.encode_string(sCurrent);
  String sSrc = le_source.text();
  KURL src = new KURL( new KURL(sCurrent), sSrc );

  if ( src.isMalformed() ) {
    QMessageBox.critical(this, "Kioslave Error Message", "Source URL is malformed" );
    return;
  }

  String sDest = le_dest.text();
  KURL dest = new KURL( new KURL(sCurrent), sDest );

  if ( dest.isMalformed() &&
       ( selectedOperation == Copy || selectedOperation == Move ) ) {
    QMessageBox.critical(this, "Kioslave Error Message",
                       "Destination URL is malformed" );
    return;
  }

  pbStart.setEnabled( false );

  boolean observe = true;
  if (progressMode != ProgressDefault) {
    observe = false;
  }

  SimpleJob myJob = null;

  switch ( selectedOperation ) {
  case List:
    myJob = KIO.listDir( src );
//    connect(myJob, SIGNAL(" entries( Job, const KIO.UDSEntryList&)"),
//            SLOT(" slotEntries( KIO.Job, const KIO.UDSEntryList&)"));
    break;

  case ListRecursive:
    myJob = KIO.listRecursive( src );
//    connect(myJob, SIGNAL(" entries( KIO.Job, const KIO.UDSEntryList&)"),
 //           SLOT(" slotEntries( KIO.Job, const KIO.UDSEntryList&)"));
    break;

  case Stat:
    myJob = KIO.stat( src );
    break;

  case Get:
    myJob = KIO.get( src, true );
     connect(myJob, SIGNAL("data( Job, byte[])"),
            SLOT("slotData( Job, byte[])"));
   break;

  case Put:
    putBuffer = 0;
    myJob = KIO.put( src, -1, true, false);
    connect(myJob, SIGNAL("dataReq( Job, ByteArrayOutputStream)"),
            SLOT("slotDataReq( Job, ByteArrayOutputStream)"));
    break;

  case Copy:
    job = KIO.copy( src, dest, observe );
    break;

  case Move:
    job = KIO.move( src, dest, observe );
    break;

  case Delete:
    job = KIO.del( src, false, observe );
    break;

  case Shred:
    job = KIO.del(src, true, observe);
    break;

  case Mkdir:
    myJob = KIO.mkdir( src );
    break;

  case Mimetype:
    myJob = KIO.mimetype( src );
    break;
  }
  if (myJob != null)
  {
    if (slave != null)
      Scheduler.assignJobToSlave(slave, myJob);
    job = myJob;
  }

  connect( job, SIGNAL(" result( Job  )"),
           SLOT(" slotResult( Job  )") );

  connect( job, SIGNAL(" canceled( Job  )"),
           SLOT(" slotResult( Job  )") );

  if (progressMode == ProgressStatus) {
    statusProgress.setJob( job );
  }

  pbStop.setEnabled( true );
}


void slotResult(Job  _job )
{
  if ( _job.error() != 0 )
  {
    _job.showErrorDialog();
  }
  else if ( selectedOperation == Stat )
  {
//      UDSEntry entry = ((KIO.StatJob)_job).statResult();
//      printUDSEntry( entry );
  }
  else if ( selectedOperation == Mimetype )
  {
      System.out.println("mimetype is " + ((MimetypeJob)_job).mimetype());
  }

  if (job == _job)
     job = null;
  pbStart.setEnabled( true );
  pbStop.setEnabled( false );
}

void slotSlaveConnected()
{
     System.out.println("Slave connected.");
}

void slotSlaveError()
{
     System.out.println("Error connected.");
   slave = null;
}

/*
void UDSEntry & entry )
{
    KIO.UDSEntry.ConstIterator it = entry.begin();
    for( ; it != entry.end(); it++ ) {
        switch ((it).m_uds) {
            case KIO.UDS_FILE_TYPE:
                kdDebug() << "File Type : " << (mode_t)((it).m_long) << endl;
                if ( S_ISDIR( (mode_t)((it).m_long) ) )
                {
                    kdDebug() << "is a dir" << endl;
                }
                break;
            case KIO.UDS_ACCESS:
                kdDebug() << "Access permissions : " << (mode_t)((it).m_long) << endl;
                break;
            case KIO.UDS_USER:
                kdDebug() << "User : " << ((it).m_str.ascii() ) << endl;
                break;
            case KIO.UDS_GROUP:
                kdDebug() << "Group : " << ((it).m_str.ascii() ) << endl;
                break;
            case KIO.UDS_NAME:
                kdDebug() << "Name : " << ((it).m_str.ascii() ) << endl;
                //m_strText = decodeFileName( (it).m_str );
                break;
            case KIO.UDS_URL:
                kdDebug() << "URL : " << ((it).m_str.ascii() ) << endl;
                break;
            case KIO.UDS_MIME_TYPE:
                kdDebug() << "MimeType : " << ((it).m_str.ascii() ) << endl;
                break;
            case KIO.UDS_LINK_DEST:
                kdDebug() << "LinkDest : " << ((it).m_str.ascii() ) << endl;
                break;
        }
    }
}

void UDSEntryList& list) {

    UDSEntryListConstIterator it=list.begin();
    for (; it != list.end(); ++it) {
        UDSEntry.ConstIterator it2 = (it).begin();
        for( ; it2 != (it).end(); it2++ ) {
            if ((it2).m_uds == UDS_NAME)
                kdDebug() << "" << ( it2 ).m_str << endl;
        }
    }
}
*/

void slotData(Job job, byte[] data)
{
    if (data.length == 0)
    {
       System.out.println("Data: <End>");
    }
    else
    {
       String myString = new String(data);
       System.out.println("Data: \"" + myString + "\"");
    }
}

void slotDataReq(Job job, ByteArrayOutputStream data)
{
    String[] fileDataArray =
       {
         "Hello world\n",
         "This is a test file\n",
         "You can safely delete it.\n",
		 null
       };
    String fileData = fileDataArray[putBuffer++];

    if (fileData == null)
    {
       System.out.println("DataReq: <End>");
       return;
    }
	
	try {
		data.write(fileData.getBytes());
	} catch (java.io.IOException e) {
		;
	}

	System.out.println("DataReq: \"" + fileData + "\"");
}

void stopJob() {
  System.out.println("KioslaveTest.stopJob()");
  job.kill();
  job = null;

  pbStop.setEnabled( false );
  pbStart.setEnabled( true );
}

static String version = "v0.0.0 0000";   // :-)
static String description = "Test for kioslaves";
static String[][] options =
{
 { "s", null, null },
 { "src <src>", "Source URL", "" },
 { "d", null, null },
 { "dest <dest>", "Destination URL", "" },
 { "o", null, null },
 { "operation <operation>", "Operation (list,listrecursive,stat,get,copy,move,del,shred,mkdir)", "copy" },
 { "p", null, null },
 { "progress <progress>", "Progress Type (none,default,status)", "default" }
};

static void main(String[] argv) {
  KCmdLineArgs.init( argv, "kioslavetest", description, version );
  KCmdLineArgs.addCmdLineOptions( options );
  KApplication app = new KApplication();

  KCmdLineArgs args = KCmdLineArgs.parsedArgs();

  String src = args.getOption("src");
  String dest = args.getOption("dest");

  int op = 0;
  int pr = 0;

  String tmps;

  tmps = args.getOption("operation");
  if ( tmps.equals("list")) {
    op = KioslaveTest.List;
  } else if ( tmps.equals("listrecursive")) {
    op = KioslaveTest.ListRecursive;
  } else if ( tmps.equals("stat")) {
    op = KioslaveTest.Stat;
  } else if ( tmps.equals("get")) {
    op = KioslaveTest.Get;
  } else if ( tmps.equals("copy")) {
    op = KioslaveTest.Copy;
  } else if ( tmps.equals("move")) {
    op = KioslaveTest.Move;
  } else if ( tmps.equals("del")) {
    op = KioslaveTest.Delete;
  } else if ( tmps.equals("shred")) {
    op = KioslaveTest.Shred;
  } else if ( tmps.equals("mkdir")) {
    op = KioslaveTest.Mkdir;
  } else KCmdLineArgs.usage("unknown operation");

  tmps = args.getOption("progress");
  if ( tmps.equals("none")) {
    pr = KioslaveTest.ProgressNone;
  } else if ( tmps.equals("default")) {
    pr = KioslaveTest.ProgressDefault;
  } else if ( tmps.equals("status")) {
    pr = KioslaveTest.ProgressStatus;
  } else KCmdLineArgs.usage("unknown progress mode");

  args.clear(); // Free up memory

  KioslaveTest test = new KioslaveTest( src, dest, op, pr );
  test.show();
  // Bug in KTMW / Qt / layouts ?
  test.resize( test.sizeHint() );

  app.setMainWidget(test);
  app.exec();
  return;
}

	static {
		qtjava.initialize();
		kdejava.initialize();
	}
}


