donate  Donate fr  Français
AboutNewsDocumentationDownloadToolsDevelopersContact


   Developers
   Internal format
   Perl PDB tools
   Translation

This page was not translated into English yet...

Format interneFormat interne

Dans Ma Tirelire 2, tous les noms de base commencent par "MaTi-" sauf les bases de comptes qui commencent par "MaTi=".

Cela permet de les repérer rapidement dans la liste de toutes les bases du Palm. Il n'y a rien de plus horrible que de ne pas savoir à quelle application appartient une base rien qu'en lisant son nom.

Il y a en tout 6 types de base différents, le CreatorID est toujours 'MaT2' :

  1. LA base des types : "MaTi-Types"

    Type : 'Type'

    Elle contient toute la hiérarchie des types d'opération.

    Il peut y avoir jusqu'à 255 types d'opération. Chaque type a un identifiant unique sur 8 bits différent de 0xff (TYPE_UNFILED) qui est le type "Non classé" (non présent dans la base).

    Ci-suit la structure C de chaque enregistrement :

    struct s_type
    {
    #define TYPE_RELATIONSHIP_SIZE  sizeof(UInt32)
    #define TYPE_RELATIONSHIP_OFFSET 0
    #define TYPE_UNFILED    (NUM_TYPES - 1)
      UInt32 ui_id:8;               // ID du type
      UInt32 ui_parent_id:8;        // ID du type parent, TYPE_UNFILED si aucun
      UInt32 ui_child_id:8;         // ID du premier fils, TYPE_UNFILED si aucun
      UInt32 ui_brother_id:8;       // ID du prochain frère, TYPE_UNFILED si aucun
    
    #define TYPE_ATTR_SIZE          sizeof(UInt32)
    #define TYPE_ATTR_OFFSET        TYPE_RELATIONSHIP_SIZE
      //#define TYPE_NONE   0       // Undefined
    #define TYPE_DEBIT      1
    #define TYPE_CREDIT     2
    #define TYPE_ALL        3
      UInt32 ui_sign_depend:2;
      UInt32 ui_folded:1;           // Is type folded is types list dialog
      UInt32 ui_reserved:29;        // Reserved for future use
    
      // Account name/wildcard visibility
    #define TYPE_ONLY_IN_ACC_LEN    (23 + 1)
      Char ra_only_in_account[TYPE_ONLY_IN_ACC_LEN];
    
    #define TYPE_NAME_MAX_LEN       (31 + 1)
      Char ra_name[0];              // Type fini par NUL (longueur variable)
    };
    
  2. LA base des modes : "MaTi-Modes"

    Type : 'Mode'

    Elle contient tous les modes de paiement.

    Il peut y avoir jusqu'à 31 modes de paiement. Chaque mode a un identifiant unique sur 5 bits différent de 0x1f (MODE_UNKNOWN) qui est le mode "Inconnu" (non présent dans la base).

    Ci-suit la structure C de chaque enregistrement :

    struct s_mode
    {
    #define MODE_UNKNOWN    (NUM_MODES - 1)
      UInt32 ui_id:5;               // Mode ID
    #define MODE_VAL_DATE_NONE              0
    #define MODE_VAL_DATE_CUR_MONTH         1
    #define MODE_VAL_DATE_NEXT_MONTH        2
    #define MODE_VAL_DATE_PLUS_DAYS         3
    #define MODE_VAL_DATE_MINUS_DAYS        4
      UInt32 ui_value_date:3;       // 0 pas de raccourci sur date de valeur
                                    // 1 => ancien XX=YY
                                    // 2 => ancien XX-YY
                                    // 3 => ancien +ZZ
                                    // 4 => nouveau -ZZ
                                    // 5-7 => réservés (équivalent à 0)
      UInt32 ui_first_val:6;        // XX ou ZZ selon ui_value_date
      UInt32 ui_debit_date:5;       // YY
      UInt32 ui_cheque_auto:1;      // Mode à sélectionner si chèque auto
      UInt32 ui_reserved:12;        // Pour le futur : toujours à 0
    
      // Account name/wildcard visibility
    #define MODE_ONLY_IN_ACC_LEN    (23 + 1)
      Char ra_only_in_account[MODE_ONLY_IN_ACC_LEN];
    
    #define MODE_NAME_MAX_LEN       (31 + 1)
      Char ra_name[0];              // Type fini par NUL (longueur variable)
    };
    
  3. LA base des descriptions/macros : "MaTi-Descriptions"

    Type : 'Desc'

    Elle contient toutes les descriptions/macros.

    Il peut y avoir jusqu'à 256 descriptions. En réalité il n'y a pas de limite, mais comme il en faut une, c'est 256...

    Ci-suit la structure C de chaque enregistrement :

    struct s_desc
    {
    #define DESC_HEADER_OFFSET      0
    #define DESC_HEADER_SIZE        sizeof(UInt32)
      UInt32 ui_sign:2;             // 0 pas de signe, 1 -, 2 +
      UInt32 ui_is_mode:1;          // Le champ ui_mode contient une valeur
      UInt32 ui_mode:5;             // ID du mode à initialiser (si ui_is_mode)
      UInt32 ui_is_type:1;          // Le champ ui_type contient une valeur
      UInt32 ui_type:8;             // ID du type à initialiser (si ui_is_type)
      UInt32 ui_shortcut:8;         // Caractère de raccourci pour la macro
      UInt32 ui_cheque_num:1;       // Numéro de chèque auto à calculer
      UInt32 ui_auto_valid:1;       // Validation automatique après execution
      UInt32 ui_reserved:5;         // Pour le futur : toujours à 0
    
      Char  ra_amount[11 + 1];      // Somme de la macro finie par NUL
                                    // mais toujours 12 octets
      Char  ra_account[dmCategoryLength]; // Nom du compte de la macro fini par NUL
                                    // mais toujours 16 octets (si ui_is_xfer)
      Char  ra_xfer[dmCategoryLength]; // Nom du compte de transfert fini par NUL
                                    // mais toujours 16 octets (si ui_is_xfer)
    
      // Account name/wildcard visibility
    #define DESC_ONLY_IN_ACC_LEN    (23 + 1)
      Char  ra_only_in_account[DESC_ONLY_IN_ACC_LEN];
    
    #define DESC_MAX_LEN    (255 + 1)
      Char  ra_desc[0];             // Description finie par NUL
                                    // (longueur variable)
    };
    
  4. LA base des devises : "MaTi-Currencies"

    Type : 'Curr'

    Elle contient toutes les devises et leur relation par rapport à la devise de référence, elle même dans la base.

    Cette base peut contenir un AppInfoBlock contenant juste un UInt32. Cet UInt32, s'il est présent, contient la date de création de la base externe (5.) qui a servi à la dernière mise à jour. Celà permet de ne faire la mise à jour qu'une seule fois. Voir le point 5. pour les détails sur la base externe.

    Il peut y avoir jusqu'à 256 devises. Chaque devise a un identifiant unique sur 8 bits.

    Ci-suit la structure C de chaque enregistrement :

    struct s_currency
    {
      UInt32 ui_id:8;               // ID de la devise
      UInt32 ui_reference:1;        // C'est LA devise servant de référence
      UInt32 ui_reserved:23;        // Reserved for future use
      double d_reference_amount;    // Somme en monnaie de référence
      double d_currency_amount;     // Équivalent dans cette devise
    #define CURRENCY_ISO4217_LEN    4
      Char ra_iso4217[CURRENCY_ISO4217_LEN]; // Nom ISO-4217
    #define CURRENCY_NAME_MAX_LEN   (4 + 1)
      Char ra_name[0];              // Nom devise fini par NUL (longueur variable)
    };
    

    *** Attention les doubles sont aussi au format big endian sur 8 octets

    En perl, sur une machine big endian, intel, FreeBSD, je fais :
    $double = unpack('d', scalar reverse VALEUR_DOUBLE_PALM);

  5. LA base externe des devises : "MaTi-ExternalCurrencies"

    Type : 'CurX'

    Cette base est facultative et ouverte uniquement en lecture par Ma Tirelire. Elle est fabriquée par un programme qui reçoit tous les jours les cours des devises du jour et qui tourne sur ma-tirelire.net. En important cette base, la base des devises (4.) est mise automatiquement à jour au prochain lancement de Ma Tirelire.

    Cette base n'a pas de limite en nombre d'enregistrements, puisque ce nombre dépend des informations obtenues par le programme de mise à jour.

    Ci-suit la structure C de chaque enregistrement :

    struct s_external_currency
    {
      UInt32 ui_int;                // Partie entière
      UInt32 ui_dec;                // Partie décimale
      UInt32 ui_dec_factor;         // Facteur à appliquer pour la partie décimale
      UInt32 ui_nb_eur;             // Équivalent en euros
      Char   ra_iso4217[0];         // Nom de la monnaie au standard ISO-4217
    };
    

    Le rapprochement/mise à jour de la base des devises se fait grace au code ISO-4217 qui doit être identique.

  6. Les bases de comptes : "MaTi=..."

    Type : 'Acnt'

    Elles contiennent les propriétés de base, les propriétés des comptes et toutes les opérations.

    Alors là ça se complique ;-)

    1. Les propriétés de base

      Les propriétés de base sont stockées dans le AppInfoBlock de la base à la suite des catégories qui servent à la gestion des comptes (comme dans Ma Tirelire 1.0.X).

      Ci-suit la structure C du bloc :

      struct s_db_prefs
      {
        UInt32 ul_access_code;        // Code to access database
      
      #define MATI_DB_PREFS_VERSION   1
        UInt32 ul_version:4;          // Last version is 1
        UInt32 ul_cur_category:4;     // Current category
        UInt32 ul_show_all_cat:1;     // All categories are visible XXX
      #define DM_REMOVE_RECORD        0
      #define DM_DELETE_RECORD        1
        UInt32 ul_remove_type:1;      // DmRemoveRecord or DmDeleteRecord
        UInt32 ul_deny_find:1;        // [Dis]allow global find feature in this DB
      #define SORT_BY_DATE            0
      #define SORT_BY_VALUE_DATE      1
        //#define SORT_BY_XXX         2 -> 7 // Reserved for future use
        UInt32 ul_sort_type:3;        // Sort type : by [value] date
        UInt32 ul_list_date:1;        // 1 if list date is value date, 0 else
        UInt32 ul_check_locked:1;     // Checking and Flagging are locked
        UInt32 ul_auto_repeat:1;      // Compute repeats automaticaly
        UInt32 ul_repeat_days:7;      // Repeat interval
        UInt32 ul_list_type:1;        // 1 if list descritpion is type, 0 else
      #define SPLIT_LABEL_DESC        0
      #define SPLIT_LABEL_TYPE        1
        UInt32 ul_splits_label:1;     // In trans form, splits label: 0=desc, 1=type
      #define SPLIT_SORT_DESC         0
      #define SPLIT_SORT_TYPE         1
      #define SPLIT_SORT_AMOUNT       2
        UInt32 ul_splits_sort:2;      // Trans form, splits sort by: desc/type/amount
        UInt32 ul_reserved1:4;        // Réservé
      
      #define VIEW_ALL                0
      #define VIEW_WORST              1
      #define VIEW_TODAY              2
      #define VIEW_CHECKED            3
      #define VIEW_MARKED             4
      #define VIEW_CHECKNMARKED       5
      #define VIEW_DATE               6
      #define VIEW_TODAY_PLUS         7
      #define VIEW_LAST               VIEW_TODAY_PLUS
      #define VIEW_SELECT_DATES       (VIEW_LAST + 1)
      #define VIEW_SELECT_AT_DATE     (VIEW_LAST + 2)
        //#define VIEW_XXX            8 -> 15 // Reserved for future use
        UInt32 ul_sum_type:4;         // Sum type
        UInt32 ul_sum_date:5;         /* Somme le X du mois */
        UInt32 ul_sum_todayplus:5;    /* Somme aujourd'hui + X jours */
        UInt32 ul_sum_at_date:1;      // cf. s_sum_date field below
      #define ACCOUNTS_SUM_ALL        0
      #define ACCOUNTS_SUM_SELECT     1
      #define ACCOUNTS_SUM_NON_SELECT 2
      #define ACCOUNTS_SUM_XXX        3
        UInt32 ul_accounts_sel_type:2; // Type de sélection dans l'écran des comptes
        UInt32 ul_accounts_currency:8; // Monnaie utilisée dans l'écran des comptes
        UInt32 ul_reserved2:7;        // Réservé
      
        UInt16 uh_selected_accounts;  // Bit a 1 si le compte est
                                      // sélectionné dans l'écran des
                                      // comptes
      
        DateType s_sum_date;          // Sum at a date. Only if ul_sum_at_date
      
      #define DB_PREFS_STATS_NUM      14
        struct s_stats_prefs  rs_stats[DB_PREFS_STATS_NUM]; // Choix dans les stats
      
        Char ra_note[0];              // Note (NUL terminated)...
      };
      

      Seul le tableau rs_stats a été ajouté par rapport au format de la version 0. La définition de la structure C struct s_stats_prefs suit :

      struct s_stats_prefs
      {
        DateType rs_date[2];
      
      #define STATS_MENU_NONE         0
      #define STATS_MENU_CUR_MONTH    1
      #define STATS_MENU_LAST_MONTH   2
      #define STATS_MENU_LAST2_MONTH  3
      #define STATS_MENU_CUR_YEAR     4
      #define STATS_MENU_LAST_YEAR    5
      #define STATS_MENU_ALL          6
        UInt32   ui_menu_choice:3;    // Choix dans le menu, rs_date ne compte pas
      #define STATS_MENU_WEEK_POS     6
        UInt32   ui_week_bounds:1;    // Seulement si ui_menu_choice != NONE
      #define STATS_BY_TYPE           0
      #define STATS_BY_MODE           1
      #define STATS_BY_WEEK           2
      #define STATS_BY_BIWEEK         3
      #define STATS_BY_MONTH          4
      #define STATS_BY_QUARTER        5
      #define STATS_BY_YEAR           6
      #define STATS_BY_MINAVGMAX      7
        UInt32   ui_by:4;             // Par (type, mode, semaine, ...)
        UInt32   ui_type_any:1;
        UInt32   ui_type:8;
        UInt32   ui_mode_any:1;
        UInt32   ui_mode:5;
      #define STATS_ON_ALL            0
      #define STATS_ON_DEBITS         1
      #define STATS_ON_CREDITS        2
      #define STATS_ON_FLAGGED        3
        UInt32   ui_on:2;             // Sur toutes les op, débits, crédits, marqués
        UInt32   ui_val_date:1;       // En fonction de la date de valeur
        UInt32   ui_ignore_nulls:1;   // Ignorer les montants nuls
        UInt32   ui_type_children:1;  // Inclut les fils du type sélectionné
        UInt32   ui_reserved:4;       // Toujours à 0
      
        UInt16   uh_checked_accounts;
      };
      
    2. Le SortInfoBlock de la base est utilisé pour stocker des infos temporaires qui peuvent ne pas être présentes, mais qui peuvent éviter des recherches répétées d'un même résultat.

      Ci-suit la structure C du bloc :

      
      struct s_db_sortinfos
      {
        DateType s_last_repeat_date;  // Date of the last global repeat computation
      };
      
    3. Les enregistrements se divisent en deux avec un header commun. D'une part il y a les propriétés de compte (un enregistrement par compte) et d'autre part, les enregistrement correspondant aux opérations (un enregistrement par opération).

      Toutes les sommes sont en centimes avec le type t_amount :

      typedef Int32 t_amount;
      

      Dans le code C qui suit, la structure struct s_account_prop est la définition d'un compte et la structure struct s_transaction celle d'une opération.

      Un compte a toujours sa date et son heure à 0. Celà permet de trier tous les enregistrements par date et de retrouver systématiquement les propriétés de compte en tête de base.

      #define COMMON_HEADER   \
        DateType      s_date;         /* Date */ \
        TimeType      s_time;         /* Heure */ \
        t_amount      l_amount        /* Somme en centimes */ \
      
      
      union u_acc_flags
      {
        struct
        {
          UInt32 ui_checked:1;        // Always 1, correspond to checked trans.
          UInt32 ui_marked:1;         // Enregistrement marqué
          UInt32 ui_warning:1;        // Warning if overdrawn account
          UInt32 ui_stmt_num:1;       // Gestion des numéros de relevé
          UInt32 ui_currency:8;       // Account currency
          UInt32 ui_cheques_by_cbook:6;// Number of cheques by chequebook
          UInt32 ui_take_last_date:1; // When creating new record, take last date
          UInt32 ui_reserved:13;      // -31 Reserved... */
        } s_bit;
      
      #define ACCOUNT_CHECKED          0x80000000
      #define ACCOUNT_MARKED           0x40000000
      #define ACCOUNT_WARNING          0x20000000
      #define ACCOUNT_STMT_NUM         0x10000000
      #define ACCOUNT_CURRENCY         0x0ff00000
      #define ACCOUNT_CHEQUES_BY_CBOOK 0x000fc000
      #define ACCOUNT_TAKE_LAST_DATE   0x00002000
      #define ACCOUNT_RESERVED         0x00001fff
        UInt32                ui_all;
      };
      
      //
      // For each account, first record has this type
      struct s_account_prop
      {
        COMMON_HEADER;
        
        /* Flags */
        union u_acc_flags u_flags;
      
      #define ui_acc_checked          u_flags.s_bit.ui_checked
      #define ui_acc_marked           u_flags.s_bit.ui_marked
      #define ui_acc_warning          u_flags.s_bit.ui_warning
      #define ui_acc_stmt_num         u_flags.s_bit.ui_stmt_num
      #define ui_acc_currency         u_flags.s_bit.ui_currency
      #define ui_acc_cheques_by_cbook u_flags.s_bit.ui_cheques_by_cbook
      #define ui_acc_take_last_date   u_flags.s_bit.ui_take_last_date
      #define ui_acc_reserved         u_flags.s_bit.ui_reserved
      
      #define ui_acc_flags            u_flags.ui_all
      
        t_amount l_overdraft_thresold;
        t_amount l_non_overdraft_thresold;
      
      #define NUM_CHECK_BOOKS 4
        UInt32 rui_check_books[NUM_CHECK_BOOKS];
      
        Char  ra_number[24];
      
        Char  ra_note[1];             // Pour le \0
      };
      
      // On passe par là car sizeof(struct s_account_prop) donne 62 au lieu
      // de 61 à cause du ra_note[1] de fin
      #define ACCOUNT_PROP_SIZE       (offsetof(struct s_account_prop, ra_note) + 1)
      
      
      union u_rec_flags
      {
        struct
        {
      #ifdef __m68k__
          UInt32      ui_checked:1;   // 0    Opération effectuée
          UInt32      ui_marked:1;    // 1    Enregistrement marqué
          UInt32      ui_alarm:1;     // 2    Alarme positionnée...
          UInt32      ui_mode:5;      // 3-7  Mode de paiement (CB, chèque...)
          UInt32      ui_type:8;      // 8-15 Type d'opération (ski, EDF...)
          UInt32      ui_value_date:1;// 16   Date de valeur présente ou non
          UInt32      ui_check_num:1; // 17   N° de chèque présent ou non
          UInt32      ui_repeat:1;    // 18   Opération avec répétition
          UInt32      ui_xfer:1;      // 19   Si cet enr. est un transfert
          UInt32      ui_xfer_cat:1;  // 20   Contient la cat et pas le uniqueID
          UInt32      ui_stmt_num:1;  // 21   Numéro de relevé ou non
          UInt32      ui_currency:1;  // 22   Une devise est présente
          UInt32      ui_splits:1;    // 23   Ventilation présente ou non
          UInt32      ui_reserved:7;  // 24-30 Réservé... */
          UInt32      ui_internal_flag:1; // 31 usage interne uniquement
      #else
      # error "Little endian not yet supported"
      #endif
        } s_bit;
      
      #ifdef __m68k__
      # define RECORD_CHECKED         0x80000000
      # define RECORD_MARKED          0x40000000
      # define RECORD_ALARM           0x20000000
      # define RECORD_MODE_MASK       0x1f000000
      # define RECORD_MODE_SHIFT      24
      # define RECORD_TYPE_MASK       0x00ff0000
      # define RECORD_TYPE_SHIFT      16
      # define RECORD_VALUE_DATE      0x00008000
      # define RECORD_CHECK_NUM       0x00004000
      # define RECORD_REPEAT          0x00002000
      # define RECORD_XFER            0x00001000
      # define RECORD_XFER_CAT        0x00000800
      # define RECORD_STMT_NUM        0x00000400
      # define RECORD_CURRENCY        0x00000200
      # define RECORD_SPLITS          0x00000100
      # define RECORD_RESERVED        0x000000fe
      # define RECORD_INTERNAL_FLAG   0x00000001
      #else
      # error "Little endian not yet supported"
      #endif
        UInt32        ui_all;
      };
      
      //
      // For each transaction
      struct s_transaction
      {
        COMMON_HEADER;
      
        /* Flags */
        union u_rec_flags u_flags;
      
      #define ui_rec_checked          u_flags.s_bit.ui_checked
      #define ui_rec_marked           u_flags.s_bit.ui_marked
      #define ui_rec_alarm            u_flags.s_bit.ui_alarm
      #define ui_rec_mode             u_flags.s_bit.ui_mode
      #define ui_rec_type             u_flags.s_bit.ui_type
      #define ui_rec_value_date       u_flags.s_bit.ui_value_date
      #define ui_rec_check_num        u_flags.s_bit.ui_check_num
      #define ui_rec_repeat           u_flags.s_bit.ui_repeat
      #define ui_rec_xfer             u_flags.s_bit.ui_xfer
      #define ui_rec_xfer_cat         u_flags.s_bit.ui_xfer_cat
      #define ui_rec_stmt_num         u_flags.s_bit.ui_stmt_num
      #define ui_rec_currency         u_flags.s_bit.ui_currency
      #define ui_rec_splits           u_flags.s_bit.ui_splits
      #define ui_rec_reserved         u_flags.s_bit.ui_reserved
      #define ui_rec_internal_flag    u_flags.s_bit.ui_internal_flag
      
      #define ui_rec_flags            u_flags.ui_all
      
        Char          ra_note[0];     /* Dans l'ordre :
                                       *  - Date de valeur (facultatif)
                                       *  - N° chèque (facultatif)
                                       *  - Répétition (facultatif)
                                       *  - Transfert (facultatif)
                                       *  - N° de relevé (facultatif)
                                       *  - Devise (facultatif)
                                       *  - Sous-opération(s) (facultatif)
                                       *  - Description
                                       */
      };
      

      Une opération peut avoir des options, comme dans Ma Tirelire 1, mais un peu plus. Ces options sont forcément ordonnées et leur présence est conditionnée à un bit dans les flags.

      1. Date de valeur si bit ui_rec_value_date à 1 :

        struct s_rec_value_date
        {
          DateType s_value_date;        // Date de valeur
        };
        
      2. Numéro de chèque chèque si bit ui_rec_check_num à 1 :

        struct s_rec_check_num
        {
          UInt32   ui_check_num;        // Numéro du chèque
        };
        
      3. Répétition si bit ui_rec_repeat à 1 :

        struct s_rec_repeat
        {
          UInt16   uh_repeat_type:2;    /* mois, fin de mois */
        #define REPEAT_MONTHLY          0
        #define REPEAT_MONTHLY_END      1
        #define REPEAT_WEEKLY           2
        #define REPEAT_TYPE_LAST        REPEAT_WEEKLY
          UInt16   uh_repeat_freq:6;    /* Tous les... */
          UInt16   uh_reserved:8;
          DateType s_date_end;          /* 0 si infini */
        };
        
      4. Transfert si bit ui_rec_xfer à 1 :

        struct s_rec_xfer
        {
          UInt32    ul_reserved:8;      // (en tête par compatibilité)
          UInt32    ul_id:24;  // uniqueID OU ID de catégorie (si ui_xfer_cat)
        };
        
      5. Numéro de relevé si bit ui_rec_stmt_num à 1 :

        struct s_rec_stmt_num
        {
          UInt32   ui_stmt_num;         // Numéro du relevé
        };
        
      6. Devise si bit ui_rec_currency à 1 :

        struct s_rec_currency
        {
          Int32    l_currency_amount;   // Montant dans la devise
          UInt32   ui_currency:8;       // ID de la devise
          UInt32   ui_reserved:24;      // Réservé...
        };
        
      7. Sous-opération(s) si bit ui_rec_sub_tr à 1 :

        struct s_rec_sub_transaction
        {
          UInt16   uh_num:8;            // Nombre de sous-opérations à suivre
          UInt16   uh_reserved:8;       // Réservé...
          UInt16   uh_size;             // Taille en octets des sous-opérations
                                        // qui suivent
        };
        
        struct s_rec_one_sub_transaction
        {
          UInt32   ui_type:8;           // Type de la sous-opération
          UInt32   ui_reserved:24;      // Réservé
          t_amount l_amount;            // Somme en centimes (toujours positive)
          Char     ra_desc[0];          // Description
        };
        

        Les sous-opérations sont un cas un peu particulier dans la mesure où leur longueur est variable.

        On a d'abord une structure struct s_rec_sub_transaction puis suivent autant de structures struct s_rec_one_sub_transaction avec leur description que l'indique le champ uh_num de la structure struct s_rec_sub_transaction de base.

        Dans le cas où une description, avec son caractère NUL final, a une longueur impaire, un deuxième caractère NUL suit la description.

      8. Ensuite suit la description toujours terminée par NUL (même si vide).

      Lorsqu'une opération a l'option transfert, les deux opérations liées ont certains champs en commun (identiques) ou dépendants :

      ChampValeur, commentaire
      dateidentique
      heureidentique
      sommeopposée et convertie dans la devise du compte
      checkedindépendant
      markedindépendant
      alarmindépendant
      modeidentique (À VOIR)
      typeidentique (À VOIR)
      value_dateindépendant
      check_numindépendant
      repeatidentique
      xfertoujours présent
      xfer_catprésent si opération absente dans le compte de transfert
      stmt_numindépendant
      currency si les 2 comptes n'ont pas la même monnaie
      devise avec la monnaie du compte de transfert
      sinon
      impossible (car ça n'a pas de sens)
      splitsindépendant, mais la somme des sous-opérations de chacune ne doit pas excéder la somme de l'autre (en plus de la sienne, comme c'est le cas pour une opération sans transfert)

À tout celà il faut ajouter les préférences de Ma Tirelire.

Elles sont stockées avec le CreatorID 'MaT2' et l'id 0.

Ci-suit la structure C des préférences de Ma Tirelire 2 :

struct s_mati_prefs
{
  UInt32 ul_no_beta_alert:1;    // No alert box signaling beta software
  UInt32 ul_db_must_be_corrected:1; // Une BD a au - une opération foireuse
  UInt32 ul_replace_desc:1;     // Description remplacée dans op_form
  UInt32 ul_XXX1:1;             // Free to use...
  UInt32 ul_auto_lock_on_power_off:1; // Lock auto à l'extinction
  UInt32 ul_time_select3:1;     // Boîte de sélection de l'heure OS3
  UInt32 ul_left_handed:1;      // Barre de scroll à gauche
#define PW_TIMEOUT_NONE         0
#define PW_TIMEOUT_30S          1
#define PW_TIMEOUT_60S          2
#define PW_TIMEOUT_120S         3
#define PW_TIMEOUT_300S         4
  UInt32 ul_timeout:3;          // Temps d'inactivité au bout du quel le code
                                // d'accès est redemandé
#define DM_REMOVE_RECORD        0 // Suppression immédiate
#define DM_DELETE_RECORD        1 // Suppression à la prochaine synchro (cond.)
  UInt32 ul_remove_type:1;      // DmRemoveRecord or DmDeleteRecord
                                // for types, modes and desc DB
  UInt32 ul_XXX2:2;             // Free to use...
#define FIRSTNEXT_NOT_CHECKED   0
#define FIRSTNEXT_NOT_FLAGGED   1
#define FIRSTNEXT_NOT_CHK_FLG   2
#define FIRSTNEXT_FLAGGED       3
  UInt32 ul_firstnext_action:2; // Action des icones premier/suivant
#define FIRST_FORM_DBASES       0
#define FIRST_FORM_ACCOUNTS     1
#define FIRST_FORM_TRANS        2
#define FIRST_FORM_XXX          3
  UInt32 ul_first_form:3;       // Formulaire à afficher au lancement
                                // de l'appli
  UInt32 ul_select_focused_num_flds:1; // Sélectionne le contenu des champs
                                       // numériques qui obtiennent le focus
  UInt32 ul_reserved:13;

  UInt32 ul_access_code;        // Code d'accès à l'application

  Char ra_last_db[dmDBNameLength]; // Nom de la dernière base utilisée

  FmFontID      ui_list_font;      // Fonte dans les listes
  FmFontID      ui_list_bold_font; // Version "grasse"

#define COLOR_REPEAT            0
#define COLOR_XFER              1
#define COLOR_CREDIT            2
#define COLOR_DEBIT             3
#define COLOR_CURRENCY          4
#define COLOR_RESERVED2         5
#define COLOR_RESERVED3         6
#define COLOR_RESERVED4         7
  IndexedColorType ra_colors[8];
#define USER_REPEAT_COLOR       0x0001 /* Repeat color user defined */
#define USER_XFER_COLOR         0x0002 /* Xfer color user defined */
#define USER_CREDIT_COLOR       0x0004 /* Credit color user defined */
#define USER_DEBIT_COLOR        0x0008 /* Debit color user defined */
#define USER_CURRENCY_COLOR     0x0010 /* Currency color user defined */
#define USER_RESERVED2_COLOR    0x0020
#define USER_RESERVED3_COLOR    0x0040
#define USER_RESERVED4_COLOR    0x0080
#define USER_XFER_BOLD          0x0100 /* Xfer are in bold face */
#define USER_REPEAT_BOLD        0x0200 /* Repeats are in bold face */
#define USER_CURRENCY_ULINE     0x0400 /* Currency amounts are underlined */
  UInt16 uh_list_flags;
};
Copyright © 2001-2008 Maxime Soulé · Design by Gofre · Powered by FreeBSD · Valid HTML / CSS · Donate