예제 #1
0
pdf_mbox *
pdf_get_mbox(PDF *p, pdc_vtr *mboxes, const char *name, int number,
             int *o_count)
{
    pdf_mbox *o_mbox = NULL;
    int count = 0;

    if (mboxes == NULL)
        mboxes = p->curr_ppt->mboxes;

    if (mboxes != NULL)
    {
        if (name == NULL && number <= 0)
        {
            count = pdc_vtr_size(mboxes);
        }
        else
        {
            int i, n = pdc_vtr_size(mboxes);

            for (i = 0; i < n; i++)
            {
                pdf_mbox *mbox = (pdf_mbox *) &pdc_vtr_at(mboxes, i, pdf_mbox);

                if (name == NULL || !pdc_strcmp(name, mbox->name))
                {
                    count++;
                    if (o_count == NULL && count == number)
                    {
                        o_mbox = mbox;
                        break;
                    }
                }
            }
        }
    }

    if (o_count != NULL)
        *o_count = count;

    return o_mbox;
}
예제 #2
0
파일: p_actions.c 프로젝트: LuaDist/cd
pdc_bool
pdf_parse_and_write_actionlist(PDF *p, pdf_event_object eventobj,
                     pdc_id *act_idlist, const char *optlist)
{
    const pdc_defopt *defopttable = NULL;
    const pdc_keyconn *keyconntable = NULL;
    pdc_resopt *resopts = NULL;
    pdc_clientdata data;
    pdc_id ret_id = PDC_BAD_ID;
    pdf_action *action = NULL;
    pdc_bool calcevent = pdc_false;
    const char *keyword, *type;
    char **strlist;
    int *actlist;
    int i, code, nsact, beginjava = 0;

    switch(eventobj)
    {

        case event_annotation:
        defopttable = pdf_annotevent_options;
        keyconntable = pdf_annotevent_keylist;
        beginjava = pdf_annotevent_beginjava;
        break;

        case event_bookmark:
        defopttable = pdf_bookmarkevent_options;
        keyconntable = pdf_bookmarkevent_keylist;
        beginjava = pdf_bookmarkevent_beginjava;
        break;

        case event_document:
        defopttable = pdf_documentevent_options;
        keyconntable = pdf_documentevent_keylist;
        beginjava = pdf_documentevent_beginjava;
        break;

        case event_page:
        defopttable = pdf_pageevent_options;
        keyconntable = pdf_pageevent_keylist;
        beginjava = pdf_pageevent_beginjava;
        break;

        default:
        break;
    }

    /* parsing option list */
    pdf_set_clientdata(p, &data);
    resopts = pdc_parse_optionlist(p->pdc, optlist, defopttable,
                                   &data, pdc_true);

    /* write actions and saving action ids */
    for (code = 0; ; code++)
    {
        keyword = pdc_get_keyword(code, keyconntable);
        if (keyword)
        {
            nsact = pdc_get_optvalues(keyword, resopts, NULL, &strlist);
            actlist = (int *) strlist;

            /* Not activate event */
            if (code && nsact)
            {
                /* additional action type check */
                for (i = 0; i < nsact; i++)
                {
                    action = (pdf_action *) &pdc_vtr_at(p->actions, actlist[i],
                                                        pdf_action);
                    if (code >= beginjava && action->atype != pdf_javascript)
                    {
                        type = pdc_get_keyword(action->atype,
                                               pdf_action_pdfkeylist);
                        pdc_error(p->pdc, PDF_E_ACT_BADACTTYPE,
                                  type, keyword, 0, 0);
                    }
                }

                /* saving calculation event */
                if (!strcmp(keyword, "calculate"))
                    calcevent = pdc_true;
            }

            /* write action objects */
            if (act_idlist != NULL)
            {
                ret_id = PDC_BAD_ID;
                if (nsact == 1)
                {
                    action = (pdf_action *) &pdc_vtr_at(p->actions, actlist[0],
                                                        pdf_action);
                    if (action->obj_id == PDC_BAD_ID)
                        ret_id = pdf_write_action(p, action, ret_id);
                    else
                        ret_id = action->obj_id;
                }
                else if (nsact > 1)
                {
                    for (i = nsact-1; i >= 0; i--)
                    {
                        action = (pdf_action *) &pdc_vtr_at(p->actions,
                                                        actlist[i], pdf_action);
                        ret_id = pdf_write_action(p, action, ret_id);
                    }
                }
                act_idlist[code] = ret_id;
            }
        }
        else
            break;
    }

    return calcevent;
}