Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/tbarcfg/src/tbarcfg.c

    rb1397ab r84d29a2  
    4141#include "../private/tbarcfg.h"
    4242
     43/** Create taskbar configuration.
     44 *
     45 * @param repopath Pathname of the new menu repository
     46 * @param rtbcfg Place to store pointer to taskbar configuration
     47 * @return EOK on success or an error code
     48 */
     49errno_t tbarcfg_create(const char *repopath, tbarcfg_t **rtbcfg)
     50{
     51        tbarcfg_t *tbcfg;
     52        sif_sess_t *repo = NULL;
     53        sif_node_t *rnode;
     54        errno_t rc;
     55        sif_trans_t *trans = NULL;
     56
     57        tbcfg = calloc(1, sizeof(tbarcfg_t));
     58        if (tbcfg == NULL) {
     59                rc = ENOMEM;
     60                goto error;
     61        }
     62
     63        list_initialize(&tbcfg->entries);
     64
     65        rc = sif_create(repopath, &repo);
     66        if (rc != EOK)
     67                goto error;
     68
     69        tbcfg->repo = repo;
     70
     71        rnode = sif_get_root(repo);
     72
     73        rc = sif_trans_begin(repo, &trans);
     74        if (rc != EOK)
     75                goto error;
     76
     77        rc = sif_node_append_child(trans, rnode, "entries", &tbcfg->nentries);
     78        if (rc != EOK)
     79                goto error;
     80
     81        rc = sif_trans_end(trans);
     82        if (rc != EOK)
     83                goto error;
     84
     85        *rtbcfg = tbcfg;
     86        return EOK;
     87error:
     88        if (trans != NULL)
     89                sif_trans_abort(trans);
     90        if (repo != NULL)
     91                sif_close(repo);
     92        if (tbcfg != NULL)
     93                free(tbcfg);
     94        return rc;
     95}
     96
    4397/** Open taskbar configuration.
    4498 *
     
    52106        sif_sess_t *repo = NULL;
    53107        sif_node_t *rnode;
    54         sif_node_t *nentries;
    55108        sif_node_t *nentry;
    56109        const char *ntype;
     
    74127
    75128        rnode = sif_get_root(repo);
    76         nentries = sif_node_first_child(rnode);
    77         ntype = sif_node_get_type(nentries);
     129        tbcfg->nentries = sif_node_first_child(rnode);
     130        ntype = sif_node_get_type(tbcfg->nentries);
    78131        if (str_cmp(ntype, "entries") != 0) {
    79132                rc = EIO;
     
    81134        }
    82135
    83         nentry = sif_node_first_child(nentries);
     136        nentry = sif_node_first_child(tbcfg->nentries);
    84137        while (nentry != NULL) {
    85138                ntype = sif_node_get_type(nentry);
     
    101154                }
    102155
    103                 rc = smenu_entry_create(tbcfg, nentry, caption, cmd);
     156                rc = smenu_entry_new(tbcfg, nentry, caption, cmd);
    104157                if (rc != EOK)
    105158                        goto error;
     
    124177void tbarcfg_close(tbarcfg_t *tbcfg)
    125178{
     179        smenu_entry_t *entry;
     180
     181        entry = tbarcfg_smenu_first(tbcfg);
     182        while (entry != NULL) {
     183                smenu_entry_delete(entry);
     184                entry = tbarcfg_smenu_first(tbcfg);
     185        }
     186
    126187        (void)sif_close(tbcfg->repo);
     188        free(tbcfg);
    127189}
    128190
     
    229291errno_t smenu_entry_save(smenu_entry_t *entry)
    230292{
    231         sif_trans_t *trans;
     293        sif_trans_t *trans = NULL;
    232294        errno_t rc;
    233295
     
    255317}
    256318
    257 /** Create a start menu entry and append it to the start menu (internal).
     319/** Allocate a start menu entry and append it to the start menu (internal).
    258320 *
    259321 * This only creates the entry in memory, but does not update the repository.
     
    264326 * @param cmd Command to run
    265327 */
    266 errno_t smenu_entry_create(tbarcfg_t *smenu, sif_node_t *nentry,
     328errno_t smenu_entry_new(tbarcfg_t *smenu, sif_node_t *nentry,
    267329    const char *caption, const char *cmd)
    268330{
     
    305367}
    306368
     369/** Delete start menu entry.
     370 *
     371 * This only deletes the entry from, but does not update the
     372 * repository.
     373 *
     374 * @param entry Start menu entry
     375 */
     376void smenu_entry_delete(smenu_entry_t *entry)
     377{
     378        list_remove(&entry->lentries);
     379        free(entry->caption);
     380        free(entry->cmd);
     381        free(entry);
     382}
     383
     384/** Create new start menu entry.
     385 *
     386 * @param smenu Start menu
     387 * @param nentry Backing SIF node
     388 * @param caption Caption
     389 * @param cmd Command to run
     390 */
     391errno_t smenu_entry_create(tbarcfg_t *smenu, const char *caption,
     392    const char *cmd)
     393{
     394        sif_node_t *nentry;
     395        errno_t rc;
     396        sif_trans_t *trans = NULL;
     397
     398        rc = sif_trans_begin(smenu->repo, &trans);
     399        if (rc != EOK)
     400                goto error;
     401
     402        rc = sif_node_append_child(trans, smenu->nentries, "entry",
     403            &nentry);
     404        if (rc != EOK)
     405                goto error;
     406
     407        rc = smenu_entry_new(smenu, nentry, caption, cmd);
     408        if (rc != EOK)
     409                goto error;
     410
     411        rc = sif_trans_end(trans);
     412        if (rc != EOK)
     413                goto error;
     414
     415        return EOK;
     416error:
     417        if (trans != NULL)
     418                sif_trans_abort(trans);
     419        return rc;
     420}
     421
     422/** Destroy start menu entry..
     423 *
     424 * @param entry Start menu entry
     425 * @return EOK on success or an error code
     426 */
     427errno_t smenu_entry_destroy(smenu_entry_t *entry)
     428{
     429        errno_t rc;
     430        sif_trans_t *trans = NULL;
     431
     432        rc = sif_trans_begin(entry->smenu->repo, &trans);
     433        if (rc != EOK)
     434                goto error;
     435
     436        sif_node_destroy(trans, entry->nentry);
     437
     438        rc = sif_trans_end(trans);
     439        if (rc != EOK)
     440                goto error;
     441
     442        smenu_entry_delete(entry);
     443error:
     444        if (trans != NULL)
     445                sif_trans_abort(trans);
     446        return rc;
     447}
     448
    307449/** @}
    308450 */
Note: See TracChangeset for help on using the changeset viewer.