#include "manhat-lib/shared_course_request_xml.h"
#include "manhat-lib/shared_file_util.h"
#include "manhat-lib/shared_util.h"
#include "manhat-lib/shared_wnec_roster_log.h"
char end_tag[15] = "\n";
void read_parameters(char *key, char *div)
{
cs_get_required_parameter("id", key, MAX_KEY);
cs_get_required_parameter("division", div, MAX_PATH);
}
REQUEST_COURSE *get_one_request(char *courseinfo, SESSION *user)
{
REQUEST_COURSE *ptr;
char *se_char1, *se_char2;
char course[strlen(courseinfo) +1];
ptr = (REQUEST_COURSE *)malloc(sizeof(REQUEST_COURSE));
if(!ptr)
cs_critical_error(ERR_MALLOC_FAILED, "get_one_request()");
strncpy(ptr->realname, user->realname, MAX_NAME +1);
strncpy(ptr->username, user->username, MAX_USERNAME +1);
strcpy(course,courseinfo);
se_char1 = strchr(course, ':');
if(se_char1)
{
*se_char1 = '\0';
strncpy(ptr->sis_id, course, MAX_COURSE_ID +1);
strncpy(ptr->new_id, course, MAX_COURSE_ID +1);
se_char1++;
}
else
cs_critical_error(ERR_PARAM_FORMAT, "admin_add_courses()");
se_char2 = strchr(se_char1, ':');
if(se_char2)
{
*se_char2 = '\0';
strncpy(ptr->subdir, se_char1, MAX_COURSE_SUBDIR +1);
se_char2++;
}
else
cs_critical_error(ERR_PARAM_FORMAT, "admin_add_courses()");
se_char1 = strchr(se_char2, ':');
if(se_char1)
{
*se_char1 = '\0';
strncpy(ptr->course_title, se_char2, MAX_COURSE_TITLE +1);
se_char1++;
}
else
cs_critical_error(ERR_PARAM_FORMAT, "admin_add_courses()");
se_char2 = strchr(se_char1, ':');
if(se_char2)
{
*se_char2 = '\0';
strncpy(ptr->course_code, se_char1, MAX_COURSE_NO +1);
se_char2++;
}
else
cs_critical_error(ERR_PARAM_FORMAT, "admin_add_courses()");
strncpy(ptr->course_semester, se_char2, MAX_SEMESTER +1);
ptr->next = 0;
return ptr;
}
REQUEST_COURSE *get_request_list(SESSION *user)
{
REQUEST_COURSE *head = 0, *current = 0, *ptr;
HDF *obj;
char *str;
str = hdf_get_value(global_cgi->hdf, "Query.course_list.0", 0);
if(str)
{
obj = hdf_get_child(global_cgi->hdf, "Query.course_list");
while(obj)
{
str = obj->value;
if(str)
{
ptr = get_one_request(str, user);
if(!head)
head = ptr;
else
current->next = ptr;
current = ptr;
}
obj = obj->next;
}
}
else
{
str = hdf_get_value(global_cgi->hdf, "Query.course_list", 0);
if(!str)
cs_critical_error(ERR_PARAM_MISSING, "get_request_list()");
head = get_one_request(str,user);
}
return head;
}
void write_one_request(REQUEST_COURSE *one, FILE *fp, const char *time_string)
{
char str[MAX_PATH +1];
fprintf(fp, "\n");
fprintf(fp, " %s\n", one->realname);
fprintf(fp, " %s\n", one->username);
fprintf(fp, " %s\n", one->sis_id);
fprintf(fp, " %s\n", one->subdir);
fprintf(fp, " %s\n", one->new_id);
fprintf(fp, " %s\n", one->course_code);
fprintf(fp, " %s\n", one->course_title);
fprintf(fp, " %s\n", one->course_semester);
fprintf(fp, " \n", time_string);
fprintf(fp, "\n");
snprintf(str, MAX_PATH +1, "%s %s", one->username, one->realname);
update_roster_log(ROSTER_REQUEST_COURSE, "", one->course_code, one->course_title, -1, -1, str); /* shared_wnec_roster_log.h */
}
void write_data(REQUEST_COURSE *head, const char *file)
{
FILE *fp;
REQUEST_COURSE *ptr;
char time_string[MAX_TIMESTRING +1];
time_t now;
now = time (NULL);
strftime (time_string, MAX_TIMESTRING, DOW_DATE_TIME_FORMAT,
localtime (&now));
fp = fopen(file, "w");
if(!fp)
cs_critical_error(ERR_FOPEN_WRITE_FAILED, file);
get_exclusive_lock(fileno(fp),1);
fprintf(fp, "\n");
fprintf(fp, "\n");
fprintf(fp, "\n");
for(ptr = head; ptr; ptr = ptr->next)
write_one_request(ptr, fp, time_string);
fprintf(fp, end_tag);
release_lock(fileno(fp));
fclose(fp);
}
int find_this_request(REQUEST_COURSE *this_course, REQUEST_COURSE_LIST *list)
{
for(list->current = list->head; list->current; list->current = list->current->next)
{
if( !strcmp(list->current->sis_id, this_course->sis_id) &&
!strcmp(list->current->subdir, this_course->subdir))
return 1;
}
return 0;
}
void append_data(REQUEST_COURSE *head, char *file)
{
FILE *fp;
REQUEST_COURSE *ptr;
char time_string[MAX_TIMESTRING +1];
time_t now;
REQUEST_COURSE_LIST *list;
list = xml_request_course_parser(file);
now = time (NULL);
strftime (time_string, MAX_TIMESTRING, DOW_DATE_TIME_FORMAT,
localtime (&now));
fp = fopen(file, "r+");
if(!fp)
cs_critical_error(ERR_FOPEN_WRITE_FAILED, file);
get_exclusive_lock(fileno(fp),1);
if(fseek(fp, -strlen(end_tag), SEEK_END))
cs_critical_error( ERR_FSEEK_FAILED, file);
for(ptr = head; ptr; ptr = ptr->next)
{
if(!find_this_request(ptr, list))
{
write_one_request(ptr, fp, time_string);
}
}
fprintf(fp, end_tag);
release_lock(fileno(fp));
fclose(fp);
free_request_list(list);
}
void
save_requests(REQUEST_COURSE *head, char *div)
{
char file[MAX_PATH +1];
snprintf(file, MAX_PATH +1, "../auto_update/request");
mkdir(file, 0777);
get_request_list_filename(div, file); /* shared_course_request_xml.h */
update_roster_log(ROSTER_REQUEST_COURSE, file, "", "", -1, -1, "Start request");
if(file_exists(file))
append_data(head, file);
else
write_data(head, file);
update_roster_log(ROSTER_REQUEST_COURSE, file, "", "", -1, -1, "End request");
}
void set_data(REQUEST_COURSE *head)
{
REQUEST_COURSE *ptr;
char name[MAX_PATH];
int i = 0;
for(ptr = head; ptr; ptr = ptr->next)
{
snprintf(name, MAX_PATH, "course.%d.course_title", i);
cs_set_value(name, ptr->course_title);
snprintf(name, MAX_PATH, "course.%d.course_code", i);
cs_set_value(name, ptr->course_code);
snprintf(name, MAX_PATH, "course.%d.course_semester", i);
cs_set_value(name, ptr->course_semester);
i++;
}
}
void do_action(SESSION *user, char *div)
{
REQUEST_COURSE *head;
head = get_request_list(user);
save_requests(head, div);
set_data(head);
free_request_head(head);
}
int main()
{
char key[MAX_KEY +1];
SESSION user;
char division[MAX_PATH +1];
cs_cgi_init();
read_parameters(key, division);
validate_server_key(key, &user);
cs_set_value("instructor", user.realname);
do_action(&user, division);
cs_cgi_display("admin_add_courses", 1);
cs_cgi_destroy();
return 0;
}