/********* Attention : Programme trŠs int‚ressant!...           ****************/

/* ----------- INTERFACE - Messages -------------------------------------------*/

#define KOBOLD_JOB 0x2F10          /* d‚marrage job m‚moire                    */
#define KOBOLD_JOB_NO_WINDOW 0x2F11/* Dito, sans boite de dialogue             */

#define KOBOLD_ANSWER 0x2F12       /* R‚ponse de Kobold avec Status dans mot 3 */
                                   /* et Ligne dans mot 4                      */

#define KOBOLD_CONFIG 0x2F13       /* Demande la configuration. il faut placer */
                                   /* un pointeur dans les mots 3&4 pour la    */
                                   /* structure KOBOLD_KONFIGURATION.          */

#define KOBOLD_FIRST_SLCT 0x2F14   /* Demande la s‚lection actuelle dans la    */
#define KOBOLD_NEXT_SLCT 0x2F15    /* fenetre source.FIRST..contient le 1er    */
                                   /* objet, avec ..NEXT.. on a les autres.    */
                                   /* Les mots 3&4 contiennent un pointeur de  */
                                   /* 128 Bytes pour le passage m‚moire (sous  */
                                   /* MultiTos comme 'Allou‚ en global'),      */
                                   /* qui contient le chemin entier.           */
                                   /* La r‚ponse contenue dans KOBOLD_ANSWER   */
                                   /* est dans le mot 3 :                      */
                                   /*      -1: Aucun objet suivant             */
                                   /*       0: Objet est un fichier            */
                                   /*       1: Objet est un dossier            */

#define KOBOLD_CLOSE 0x2F16        /* Provient explicitement de la fermeture   */
                                   /* KOBOLD, = FINISHED                       */

#define KOBOLD_FREE_DRIVES 0x2F17   /* LibŠre les lecteurs occup‚s et efface    */
                                    /* les fichiers/dossiers lus.               */

/*-----------------------------------------------------------------------------*/
/* Un pointeur de la structure suivante doit etre indiqu‚ … Kobold par le code
KOBOLD_CONFIG dans les mots 3&4. La structure m‚moire n‚cessaire sous MultiTos
doit etre d‚crite comme 'Globale' en regard des autres process en cours
(Mxalloc(size,0x1mode)). Kobold remplit ensuite les donn‚es et renvoie le
message dans KOBOLD_ANSWER.
*/

typedef struct
{
    unsigned int
        version,                    /* Version, ex : 0x205 pour version 2.05    */
        min_buffer,                 /* M‚moire allou‚e (en Ko)                  */
        max_buffer,
        min_administration,
        max_administration,

        administration_percentage,  /* Pourcentage de la m‚moire d'organisation */

        buffer_in_fast_ram,         /* Type de la m‚moire                       */
        administration_in_fast_ram, /* 0 = ST-Ram, 1 = Fast-Ram                 */

        administration, /* M‚moire d'organisation disponible                    */
        buffer,         /* M‚moire fichier disponible                           */

        kobold_active,  /* 1 = KOBOLD actif, 0 = KOBOLD inactif                 */
        kobold_dialog,  /* 0 = Pas de fenetre, 1 = Ouvrir fenetre principale    */

        no_of_files,    /* Nombre de fichiers s‚lectionn‚s en source            */
        no_of_folders,  /* Nombre de dossiers s‚lectionn‚s en source            */
        total_kb,       /* Nombre de Ko s‚lectionn‚s                            */
        source_drive,   /* Unit‚ source, -1 = Aucune                            */
        dest_drive;     /* Unit‚ dest. , -1 = Aucune                            */

    unsigned long
        gemdos_mode;    /* Bitvector: Bit 0: Unit‚  A , etc...                  */
                        /* Bit activ‚ = Mode GEMDOS                             */
} KOBOLD_CONFIGURATION;

/* -----------------  Codes d'erreur dans r‚ponse  ---------------------------- */

#define FINISHED            -1   /* KOBOLD est termin‚ */
#define OK                  0    /* Job termin‚ mais 
                                    KOBOLD est actif */
#define ERROR               1
#define NO_MEMORY           2
#define USER_BREAK          3
#define INVALID_POINTER     4
#define LOW_BUFFER          5
#define WRONG_DRIVE         6
#define WRONG_PARAMETER     7
#define UNEXPECTED_COMMAND  8
#define INVALID_MEMSIZE     9
#define NO_SUCH_OBJECT      10
#define NO_DRIVE_SELECTED   11
#define NO_FOLDER_CREATION  12
#define WRITE_PROTECTION    13
#define LOW_SPACE           14
#define LOW_ROOT            15
#define INVALID_PATH        16
#define BUFFER_IN_USE       17
#define BAD_BPB             18
#define BAD_READ            19
#define BAD_WRITE           20
#define UNKNOWN_COMMAND     21
#define NO_WINDOW           22
#define TOO_MANY_GOSUBS     23
#define TOO_MANY_RETURNS    24
#define LABEL_NOT_FOUND     25
#define NO_SUCH_FOLDER      26
#define REORGANIZED_MEMORY  27
#define NO_SELECTION_MODE   28

/* ---------------  Commandes Job  -------------------------------------------*/

#define _SRC_SELECT         0
#define _DST_SELECT         1
#define _DIALOG_LEVEL       2
#define _KEEP_FLAGS         3
#define _IGNORE_WP          4
#define _ALERT              5
#define _PAUSE              6
#define _NEW_FOLDER         7
#define _CHOOSE             8
#define _RESET_STATUS       9
#define _READ_INTO_BUFFER   10
#define _WRITE_BUFFER       11
#define _COPY               12
#define _MOVE               13
#define _DELETE             14
#define _QUIT               15
#define _GOTO               16
#define _GOSUB              17
#define _RETURN             18
#define _PERMANENT          19
#define _MEMORY             20
#define _VERIFY             21
#define _DATE               22
#define _ARCHIVE_TREATMENT  23
#define _GEMDOS_MODE        24
#define _FORMAT_PARAMETER   25
#define _FORMAT             26
#define _SOFT_FORMAT        27
#define _OFF                28
#define _ON                 29
#define _EVER_OFF           30
#define _EVER_ON            31
#define _CONSIDER_PATHS     32
#define _ON_LEVEL           33
#define _EXTENSIONS         34
#define _ARCHIVE            35
#define _FILE               36
#define _KEEP_SEQUENCE      37
#define _RESET_ARCHIVES     38
#define _OPEN_FOLDERS       39
#define _CURRENT            40
#define _KEEP               41
#define _SET                42
#define _CLEAR              43
#define _CLEARED            44
#define _SI					45
#define _SE					46
#define _DI					47
#define _DE					48
#define _ST                 49
#define _TT                 50
#define _CLEAR_BUFFER       51
#define _SOURCE_TREATMENT   52
#define _DIALOG_WINDOWS     53
#define _RENAME             54

/*-----------------------------------------------------------------------------*/

int kobold_nr,sendbuf[8],status,zeile;

char kobold_id[] = {"KOBOLD_2"},
     job[] = {"src_select c:\  ... etc.  "},
                /* Ou plus simple {"#0 c:\ ... etc. "}  */
     *job_package;

          .
          .
          .
appl_id = appl_init();

if (appl_id != -1)
{
  if (_GemParBlk.global[0] >= 0x400)
    multiTos = TRUE;
  else
    multiTos = FALSE;


           .
           .
           .

if (multiTos)
    job_package = Mxalloc(strlen(job) + 1,0x42);
     /* Under Memory-Protection: ST-preferred (z.B.), readable */
else
    job_package = Malloc(strlen(job) + 1);


kobold_nr = appl_find(kobold_id);     /* get Acc-Nr.      */

if ((kobold_nr >= 0) && job_package)  /* accepter Acc &  */
                                      /* reserve m‚moire */
{
  sendbuf[0] = KOBOLD_JOB_NO_WINDOW;  /* Message: copie   */
                                      /* sans fenetre     */
  sendbuf[1] = appl_id;               /* ID sp‚cifique    */
  sendbuf[2] = 0;                     /* sans d‚passement */

/* Copy the job into the area that is readable for other processes under multitos */
  strcpy(job_package,job);   /* Copier le job dans une zone */
                             /* qui est lisible pour les autres */
                             /* process sous Multitos. */

  *((char **) &sendbuf[3]) = job_package;/* Pointeur de Job */

  appl_write(kobold_nr,16,sendbuf);   /* Envoyer          */


/* Attention! A partir de maintenant : ne pas bloquer par */
/* "Wind_uptade"                                          */

  do      /*           Attendre la fin de copie          */
  {
      evnt_mesag(sendbuf);

  } while(sendbuf[0] != KOBOLD_ANSWER);

  Mfree(job_package);

  status = sendbuf[3];                /* Statut fermeture */
  zeile = sendbuf[4];                 /* derniŠre ligne   */

  if (status != FINISHED)   /* KOBOLD est encore actif */
  {
    sendbuf[0] = KOBOLD_CLOSE;  /* Message: Quitter */
    sendbuf[1] = appl_id;       /* ID propre        */
    sendbuf[2] = 0;             /* Pas de d‚passement */

    appl_write(kobold_nr,16,sendbuf);   /* Envoyer          */

    do          /* ...Lib‚ration de m‚moire et du lecteur   */
    {          
        evnt_mesag(sendbuf);

    } while(sendbuf[0] != KOBOLD_ANSWER);

  }

          .
          .  /* Gestion des Erreurs */
          .

}
/* =========================================================================== */

