/* ** This function will consume form values and stuff them into an appointment. */ extern Boolean dssw_form_to_todo(DSSW *dssw, Dtcm_appointment *a, char *name, Tick t) { time_t start_tick, stop_tick; char ampm_buf[BUFSIZ], buf[BUFSIZ]; Props *p = (Props *)dssw->cal->properties; Props_pu *pu = (Props_pu *)dssw->cal->properties_pu; DisplayType dt = get_int_prop(p, CP_DEFAULTDISP); get_dssw_vals(dssw, t); /* * Todo does not have end time. So to distinguish between this * and the editor, zero this out. */ sprintf(dssw->stop_val.val, "\0"); if (blank_buf(dssw->date_val)) { editor_err_msg(dssw->parent, name, MISSING_DATE, pu->xm_error_pixmap); return False; } if (!blank_buf(dssw->start_val.val)) { if (!valid_time(p, dssw->start_val.val)) { editor_err_msg(dssw->parent, name, INVALID_TIME, pu->xm_error_pixmap); return False; } if (dt == HOUR12) { if (dssw->start_val.block == TIME_AM) sprintf(ampm_buf, "am"); else sprintf(ampm_buf, "pm"); } else ampm_buf[0] = '\0'; sprintf(buf, "%s %s%s", dssw->date_val, dssw->start_val.val, ampm_buf); /* * No check here for stop time. */ } else { editor_err_msg(dssw->parent, name, MISSING_TIME, pu->xm_error_pixmap); return False; } start_tick = cm_getdate(buf, NULL); if(start_tick < 0) { editor_err_msg(dssw->parent, name, INVALID_DATE, pu->xm_error_pixmap); return False; } a->time->value->item.date_time_value = (char *) malloc(BUFSIZ); _csa_tick_to_iso8601(start_tick, a->time->value->item.date_time_value); a->what->value->item.string_value = (char *)cm_strdup(dssw->what_val); a->show_time->value->item.sint32_value = True; free(a->end_time->value); a->end_time->value = NULL; return True; }
static CSA_return_code _DtCmsCreateCallog(char *user, cms_create_args *args, _DtCmsCalendar **newcal) { CSA_return_code stat; _DtCmsCalendar *cal; int i, index; char datestr[80]; char *calname; char *log; char *username; cms_attribute_value val; cms_access_entry aentry; int nidx = 0, oidx = 0; char *name, *owner; /* * if calendar name is a user name, make sure that * it's the same as the sender. */ calname = _DtCmGetPrefix(args->cal, '@'); username = _DtCmGetPrefix(user, '@'); if (_DtCmIsUserName(calname) && strcmp(calname, username)) { free(calname); free(username); return (CSA_E_NO_AUTHORITY); } log = _DtCmsGetLogFN(calname); free(calname); free(username); /* create internal calendar data structure */ if ((cal = _DtCmsMakeCalendar(user, args->cal)) == NULL) { free(log); return (CSA_E_INSUFFICIENT_MEMORY); } /* fill in information */ _csa_tick_to_iso8601(time(0), datestr); if ((stat = _DtCm_set_string_attrval(datestr, &cal->attrs[CSA_CAL_ATTR_DATE_CREATED_I].value, CSA_VALUE_DATE_TIME)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } /* initialize access list to be "WORLD", VIEW_PUBLIC */ aentry.user = WORLD; aentry.rights = CSA_VIEW_PUBLIC_ENTRIES; aentry.next = NULL; val.item.access_list_value = &aentry; val.type = CSA_VALUE_ACCESS_LIST; if ((stat = _DtCmUpdateAccessListAttrVal(&val, &cal->attrs[CSA_CAL_ATTR_ACCESS_LIST_I].value)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } /* set product identifier */ if ((stat = _DtCm_set_string_attrval(_DtCM_PRODUCT_IDENTIFIER, &cal->attrs[CSA_CAL_ATTR_PRODUCT_IDENTIFIER_I].value, CSA_VALUE_STRING)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } /* set CSA version */ if ((stat = _DtCm_set_string_attrval(_DtCM_SPEC_VERSION_SUPPORTED, &cal->attrs[CSA_CAL_ATTR_VERSION_I].value, CSA_VALUE_STRING)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } /* we dont use the values specified by client */ for (i = 0; i < args->num_attrs; i++) { if (strcmp(args->attrs[i].name.name, CSA_CAL_ATTR_CALENDAR_NAME) == 0) { nidx = i; name = args->attrs[i].name.name; args->attrs[i].name.name = NULL; } else if (strcmp(args->attrs[i].name.name, CSA_CAL_ATTR_CALENDAR_OWNER) == 0) { oidx = i; owner = args->attrs[i].name.name; args->attrs[i].name.name = NULL; } } /* initialize calendar attribute with info provided by caller */ if ((stat = _DtCmUpdateAttributes(args->num_attrs, args->attrs, &cal->num_attrs, &cal->attrs, &cal->cal_tbl, B_TRUE, NULL, B_FALSE)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } if (nidx) args->attrs[nidx].name.name = name; if (oidx) args->attrs[oidx].name.name = owner; /* use passed in char set if client does not supply one */ if (cal->attrs[CSA_CAL_ATTR_CHARACTER_SET_I].value == NULL && args->char_set && *args->char_set != NULL) { if ((stat = _DtCm_set_string_attrval(args->char_set, &cal->attrs[CSA_CAL_ATTR_CHARACTER_SET_I].value, CSA_VALUE_STRING)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } } /* create file */ if ((stat = _DtCmsCreateLogV2(user, log)) != CSA_SUCCESS) { _DtCmsFreeCalendar(cal); free(log); return (stat); } /* dump file */ if ((stat = _DtCmsAppendCalAttrsByFN(log, cal->num_attrs, cal->attrs)) != CSA_SUCCESS) { free(log); unlink(log); _DtCmsFreeCalendar(cal); return (stat); } free(log); _DtCmsPutInCalList(cal); *newcal = cal; return (stat); }
extern Boolean dssw_form_flags_to_appt(DSSW *dssw, Dtcm_appointment *a, char *name, Tick t, int *flagsP) { time_t start_tick, stop_tick; char ampm_buf[BUFSIZ], buf[BUFSIZ]; Props *p = (Props *)dssw->cal->properties; Props_pu *pu = (Props_pu *)dssw->cal->properties_pu; DisplayType dt = get_int_prop(p, CP_DEFAULTDISP); int flags = 0; if (flagsP == (int *)NULL) flagsP = &flags; /* ** If neither start nor end times exist, then the start time is set ** to 3:41am (magic time) and the end time to 3:41 plus one minute. */ get_dssw_vals(dssw, t); if (blank_buf(dssw->date_val)) { editor_err_msg(dssw->parent, name, MISSING_DATE, pu->xm_error_pixmap); return False; } if (!blank_buf(dssw->start_val.val)) { if (!valid_time(p, dssw->start_val.val)) { if (a->type->value->item.sint32_value == CSA_TYPE_TODO) editor_err_msg(dssw->parent, name, INVALID_TIME_DUE, pu->xm_error_pixmap); else editor_err_msg(dssw->parent, name, INVALID_START, pu->xm_error_pixmap); return False; } if (dt == HOUR12) { /* am and pm should not be translated. They are only * used in the date parsing code and never shown to * the user. */ if (dssw->start_val.block == TIME_AM) sprintf(ampm_buf, "am"); else sprintf(ampm_buf, "pm"); } else ampm_buf[0] = '\0'; sprintf(buf, "%s %s%s", dssw->date_val, dssw->start_val.val, ampm_buf); if (!blank_buf(dssw->stop_val.val) && !valid_time(p, dssw->stop_val.val)) { editor_err_msg(dssw->parent, name, INVALID_STOP, pu->xm_error_pixmap); return False; } } else if (!blank_buf(dssw->stop_val.val)) { editor_err_msg(dssw->parent, name, MISSING_START, pu->xm_error_pixmap); return False; } else sprintf(buf, "%s 3:41am", dssw->date_val); start_tick = cm_getdate(buf, NULL); if(start_tick < 0) { editor_err_msg(dssw->parent, name, INVALID_DATE, pu->xm_error_pixmap); return False; } if (blank_buf(dssw->what_val) && blank_buf(dssw->start_val.val) && blank_buf(dssw->stop_val.val)) { editor_err_msg(dssw->parent, name, INVALID_NOTIME_APPT, pu->xm_error_pixmap); return False; } a->time->value->item.date_time_value = (char *) malloc(BUFSIZ); _csa_tick_to_iso8601(start_tick, a->time->value->item.date_time_value); a->what->value->item.string_value = (char *)cm_strdup(dssw->what_val); a->show_time->value->item.sint32_value = True; if (!blank_buf(dssw->stop_val.val)) { if (dt == HOUR12) { /* am and pm should not be translated. They are only * used in the date parsing code and never shown to * the user. */ if (dssw->stop_val.block == TIME_AM) sprintf(ampm_buf, "am"); else sprintf(ampm_buf, "pm"); } else ampm_buf[0] = '\0'; sprintf(buf, "%s %s%s", dssw->date_val, dssw->stop_val.val, ampm_buf); if ((stop_tick = cm_getdate(buf, NULL)) <= 0) { editor_err_msg(dssw->parent, name, INVALID_DATE, pu->xm_error_pixmap); return False; } if (stop_tick < start_tick) { if (*flagsP == 0) { char *title = XtNewString(catgets(calendar->DT_catd, 1, 248, "Calendar : Schedule Appointment")); char *ident1 = XtNewString(catgets(calendar->DT_catd, 1, 923, "Cancel")); char *ident2 = XtNewString(catgets(calendar->DT_catd, 1, 250, "Next Day")); sprintf(buf, "%s", catgets(calendar->DT_catd, 1, 247, "This appointment has an end time earlier than\nits begin time. Do you want to\nschedule it into the next day?")); *flagsP = dialog_popup(dssw->parent, DIALOG_TITLE, title, DIALOG_TEXT, buf, BUTTON_IDENT, -1, ident1, BUTTON_IDENT, DSSW_NEXT_DAY, ident2, DIALOG_IMAGE, pu->xm_question_pixmap, NULL); XtFree(ident2); XtFree(ident1); XtFree(title); } switch (*flagsP) { case DSSW_NEXT_DAY: stop_tick += daysec; break; default: *flagsP = 0; return False; } } a->end_time->value->item.date_time_value = (char *) malloc(BUFSIZ); _csa_tick_to_iso8601(stop_tick, a->end_time->value->item.date_time_value); } else if (blank_buf(dssw->start_val.val)) { a->end_time->value->item.date_time_value = (char *) malloc(BUFSIZ); _csa_tick_to_iso8601(start_tick + minsec, a->end_time->value->item.date_time_value); a->show_time->value->item.sint32_value = False; } else { free(a->end_time->value); a->end_time->value = NULL; } return True; }
/* * This routine looks up events of a repeating sequence. * The caller either specifies entry and elist_r or * id and key. * If entry is specified, events are converted to cms_entry structures * and returned in elist_r, otherwise; the caller is interested only * in the key of the first entry which will be returned in the cms_key * structure pointed to by key. */ extern CSA_return_code _DtCm_table_lookup_key_range( Calendar *cal, _DtCm_libentry *entry, long id, time_t start, time_t end, cms_key *key, _DtCm_libentry **elist_r) { CSA_return_code stat = CSA_SUCCESS; Table_Res_4 *res=NULL; _DtCm_Connection *conn; Keyrange_4 keyrange; Abb_Appt_4 *abbs; _DtCm_libentry *head, *prev, *eptr; DP(("table.c: _DtCm_table_lookup_key_range\n")); if (cal == NULL || (entry == NULL && key == NULL) || (entry && elist_r == NULL)) return (CSA_E_INVALID_PARAMETER); keyrange.next = NULL; keyrange.key = (entry ? entry->e->key.id : id); keyrange.tick1 = start; keyrange.tick2 = end; conn = &cal->conn; conn->retry = B_TRUE; switch(conn->ci->vers_out) { Table_Args_3 a3; Table_Args_4 a4; Table_Res_3 *res3; case TABLEVERS_2: return (CSA_E_NOT_SUPPORTED); case TABLEVERS_3: a3.target = cal->name; a3.args.tag = KEYRANGE_3; a3.args.Args_3_u.keyrange = _DtCm_keyrange4_to_keyrange3(&keyrange); a3.pid = getpid(); res3 = _DtCm_rtable_abbreviated_lookup_key_range_3(&a3, conn); res = _DtCm_tableres3_to_tableres4(res3); if (a3.args.Args_3_u.keyrange != NULL) free(a3.args.Args_3_u.keyrange); if (res3 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3); break; case TABLEVERS_4: a4.target = cal->name; a4.args.tag = KEYRANGE_4; a4.args.Args_4_u.keyrange = &keyrange; a4.pid = getpid(); res = _DtCm_rtable_abbreviated_lookup_key_range_4(&a4, conn); break; default: return (CSA_E_FAILURE); } if (res != NULL) { switch(res->status) { case access_ok_4: case access_failed_4: abbs = res->res.Table_Res_List_4_u.b; if (entry == NULL) { /* caller is only interested in the first key */ if (abbs != NULL) { key->id = abbs->appt_id.key; key->time = abbs->appt_id.tick; } else key->id = 0; break; } /* we just copy the time from the returned data */ head = prev = NULL; while (abbs != NULL) { if ((stat = _DtCm_make_libentry(entry->e, &eptr)) != CSA_SUCCESS) break; /* change time to the time of the instance */ eptr->e->key.time = abbs->appt_id.tick; _csa_tick_to_iso8601(eptr->e->key.time, eptr->e->\ attrs[CSA_ENTRY_ATTR_START_DATE_I].\ value->item.string_value); if (head == NULL) head = eptr; else { prev->next = eptr; eptr->prev = prev; } prev = eptr; abbs = abbs->next; } if (stat == CSA_SUCCESS) *elist_r = head; else if (head != NULL) _DtCm_free_libentries(head); break; case access_other_4: stat = CSA_E_FAILURE; break; case access_notable_4: stat = CSA_E_CALENDAR_NOT_EXIST; break; default: /* remote system error */ DP((errfmt, "_DtCm_table_lookup_key_range", res->status)); stat = CSA_E_FAILURE; break; } xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res); } else { stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE : _DtCm_clntstat_to_csastat(conn->stat); } return(stat); }