static int make_file_list (void) { const char *datlist = "datalist"; FILE *fp; char line[32]; int err = 0; fp = fopen(datlist, "r"); if (fp == NULL) { fprintf(stderr, "Couldn't open '%s'\n", datlist); return 1; } while (fgets(line, sizeof line, fp)) { tail_strip(line); if (!is_blank(line)) { if (add_file_to_list(line)) { err = 1; break; } } } fclose(fp); return err; }
// Reads a body from a HMDP message // @param buffer the remaining buffer // @return a linked list containing the body of the message csv_record* read_body(char **buffer) { csv_record *list = NULL; // Root of the linked list char *filename; // Filename to be read char *checksum; // Checksum to be read // Continously read more of the message while (1) { filename = strsep(buffer, "\n\0"); // Stop reading if we run out of information if (filename == NULL) { break; } //end if checksum = strsep(buffer, "\n\0"); // Stop reading if we run out of information if (checksum == NULL) { break; } //end if add_file_to_list(&list, strdup(filename), strdup(checksum)); } //end while return list; } //end read_body
// add io file of c into dependencies list // recursive call to add all the file from sub-command to the dependencies list too void add_dependencies(command_t c, command_list_t cmd_list) { if (c->type == SIMPLE_COMMAND) { if(c->input != 0) { add_file_to_list(c->input, cmd_list, IS_READ); //if(cmd_list->file_list == NULL) //printf("NULL in add_dependencies\n"); } if(c->output != 0) { add_file_to_list(c->output, cmd_list, IS_WRITTEN); } int i = 1; while( c->u.word[i]!= NULL) { add_file_to_list(c->u.word[i], cmd_list, IS_READ); i++; } } else if (c->type == SUBSHELL_COMMAND) { if(c->input != 0) { add_file_to_list(c->input, cmd_list, IS_READ); } if(c->output != 0) { add_file_to_list(c->output, cmd_list, IS_WRITTEN); } add_dependencies(c->u.subshell_command, cmd_list); } else if (c->type == AND_COMMAND || c->type == OR_COMMAND || c->type == PIPE_COMMAND || c->type == SEQUENCE_COMMAND) { add_dependencies(c->u.command[0], cmd_list); add_dependencies(c->u.command[1], cmd_list); } else // unregconized command type { error(1, 0, "Error: unregconized command type %d", c->type); } }
int parsing(t_all *infos, char *file) { FILE *fd; int err; if (add_file_to_list(&infos->files, file) == -1) { fprintf(stderr, "%s : file already opened\n", file); return (-1); } if ((fd = fopen(infos->files->name, "r")) == NULL) return (error_function(OPEN, -1, -1)); err = start_parsing(infos, fd, infos->files->name); if (fclose(fd) == -1) return (error_function(CLOSE, -1, -1)); return ((err == -1) ? err : 0); }
void do_screenshot() { #define SS_PREFIX "Save screenshot: " struct stat st; char buf[256]; int i = 1; do { snprintf(buf, sizeof(buf), "%s/%04d%s", g_context.screenshot_dir, i++, SCREENSHOT_FILE_EXT); } while (stat(buf, &st) == 0); GError *err = NULL; GdkPixbuf *pixbuf = gdk_pixbuf_get_from_drawable(NULL, g_view.da->window, NULL, g_view.fglayer.visible.x, g_view.fglayer.visible.y, 0, 0, g_view.fglayer.visible.width, g_view.fglayer.visible.height); if (pixbuf == NULL) { warn_dialog(SS_PREFIX"unable to capture from window"); return; } gboolean ret = gdk_pixbuf_save (pixbuf, buf, SCREENSHOT_FILE_TYPE, &err, "tEXt::Software", "omgps", NULL); gdk_pixbuf_unref(pixbuf); if (ret) { char buf1[128]; snprintf(buf1, sizeof(buf1), SS_PREFIX"saved as: %s", buf); GtkTreeIter iter; gtk_list_store_insert (filelist_store, &iter, 0); add_file_to_list(&iter, buf, &buf[strlen(g_context.screenshot_dir) + 1]); info_dialog(buf1); } else { snprintf(buf, sizeof(buf), SS_PREFIX"unable to save, error=%s", err->message); g_error_free (err); warn_dialog(buf); } }
GtkWidget * scratch_tab_create() { GtkWidget *vbox = gtk_vbox_new(FALSE, 5); /* file list treeview */ filelist_treeview = gtk_tree_view_new (); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (filelist_treeview), TRUE); gtk_tree_view_set_reorderable(GTK_TREE_VIEW (filelist_treeview), FALSE); GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filelist_treeview)); gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE); g_signal_connect (G_OBJECT(filelist_treeview), "cursor-changed", G_CALLBACK (filelist_treeview_row_selected), NULL); filelist_treeview_sw = new_scrolled_window (NULL); gtk_container_add (GTK_CONTAINER (filelist_treeview_sw), filelist_treeview); /* add columns to the tree view */ GtkCellRenderer *renderer; GtkTreeViewColumn *col; int i; int col_count = sizeof (filelist_treeview_col_names) / sizeof (char *); for (i=0; i<col_count; i++) { renderer = gtk_cell_renderer_text_new(); col = gtk_tree_view_column_new_with_attributes (filelist_treeview_col_names[i], renderer, "text", i, NULL); if (i == 0) { gtk_tree_view_column_set_clickable(col, TRUE); gtk_tree_view_column_set_sort_order(col, GTK_SORT_DESCENDING); gtk_tree_view_column_set_sort_column_id(col, 0); gtk_tree_view_column_set_sort_indicator(col, TRUE); } else { gtk_tree_view_column_set_clickable(col, FALSE); } gtk_tree_view_append_column (GTK_TREE_VIEW(filelist_treeview), col); } filelist_store = gtk_list_store_new (col_count, G_TYPE_STRING, G_TYPE_STRING); GtkTreeSortable *sortable = GTK_TREE_SORTABLE(filelist_store); gtk_tree_sortable_set_sort_column_id(sortable, 0, GTK_SORT_DESCENDING); gtk_tree_view_set_model(GTK_TREE_VIEW(filelist_treeview), GTK_TREE_MODEL(filelist_store)); GtkWidget *hbox = gtk_hbox_new(TRUE, 5); GtkWidget *scratch_button = gtk_button_new_with_label("Scratch on map"); g_signal_connect (G_OBJECT (scratch_button), "clicked", G_CALLBACK (scratch_button_clicked), NULL); view_button = gtk_button_new_with_label("View"); g_signal_connect (G_OBJECT(view_button), "clicked", G_CALLBACK (view_button_clicked), NULL); delete_button = gtk_button_new_with_label("Delete"); g_signal_connect (G_OBJECT(delete_button), "clicked", G_CALLBACK (delete_button_clicked), NULL); gtk_container_add(GTK_CONTAINER(hbox), view_button); gtk_container_add(GTK_CONTAINER(hbox), delete_button); gtk_container_add(GTK_CONTAINER(hbox), scratch_button); gtk_box_pack_start(GTK_BOX(vbox), filelist_treeview_sw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); /* populate files into filelist treeview */ GtkTreeIter iter; struct dirent *ep; char buf[256]; char *file_path = NULL; int len, ext_len = strlen(SCREENSHOT_FILE_EXT); char *fname; struct stat st; DIR *dp = opendir (g_context.screenshot_dir); if (dp == NULL) { if (stat(buf, &st) == 0) warn_dialog("unable to list screenshot files"); } else { while ((ep = readdir (dp))) { fname = ep->d_name; len = strlen(fname); if (ep->d_type == DT_REG && len > ext_len && (strncmp(&fname[len-ext_len], SCREENSHOT_FILE_EXT, ext_len) == 0)) { gtk_list_store_prepend (filelist_store, &iter); file_path = get_full_path(buf, sizeof(buf), fname); add_file_to_list(&iter, file_path, fname); } } closedir (dp); } notebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE); GtkWidget *label; label = gtk_label_new("screen shot list"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); GtkWidget *image_box = gtk_vbox_new(FALSE, 0); screenshot_label = gtk_label_new(""); screenshot_image = gtk_image_new(); gtk_box_pack_start(GTK_BOX(image_box), screenshot_label, FALSE, FALSE, 0); GtkWidget *sw = new_scrolled_window (screenshot_image); /* stretch */ gtk_box_pack_start(GTK_BOX(image_box), sw, TRUE, TRUE, 0); label = gtk_label_new("view screen shot"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), image_box, label); return notebook; }
/** * May be called by polling thread or main thread. protected by gdk UI lock. */ int track_save(gboolean all, gboolean _free) { int i, count = 0; if (! tracks || tracks->count == 0) goto END; struct stat st; gboolean empty = (stat(track_file_path, &st) < 0) || st.st_size == 0; /* append, create file if not exists */ FILE *fp = fopen(track_file_path, "a"); if (! fp) { log_warn("can't open track records file: %s", track_file_path); return 0; } if (empty) { fprintf(fp, TRACK_HEAD_LABEL_1"%-10u\n" TRACK_HEAD_LABEL_2"%-10u\n" TRACK_HEAD_LABEL_3"%-10u\n", (U4)tracks->starttime, 0u, 0u); } count = all? tracks->count : tracks->count / 3; for (i=0; i<count; i++) { fprintf(fp, "%f\t%f\t%u\n", tracks->tps[i].wgs84.lat, tracks->tps[i].wgs84.lon, tracks->tps[i].time_offset); } fclose(fp); /* update end time and count */ fp = fopen(track_file_path, "r+"); /* end time: time of last valid record */ time_t endtime = tracks->starttime + tracks->tps[tracks->count - 1].time_offset; int offset = strlen(TRACK_HEAD_LABEL_1) + 11 + strlen(TRACK_HEAD_LABEL_2); fseek(fp, offset, SEEK_SET); fprintf(fp, "%-10u", (U4)endtime); offset += 11 + strlen(TRACK_HEAD_LABEL_3); fseek(fp, offset, SEEK_SET); fprintf(fp, "%-10u", (U4)(tracks->total_count - (tracks->count - count))); fclose(fp); /* add to list */ if (all) { GtkTreeIter iter; gtk_list_store_insert (filelist_store, &iter, 0); add_file_to_list(&iter, track_file_path, track_file_name); } END: if (_free) { free(tracks); tracks = NULL; free(track_file_path); track_file_path = NULL; } return count; }
static GtkWidget * create_replay_pane() { GtkWidget *vbox = gtk_vbox_new(FALSE, 5); /* file list treeview */ filelist_treeview = gtk_tree_view_new (); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (filelist_treeview), TRUE); gtk_tree_view_set_reorderable(GTK_TREE_VIEW (filelist_treeview), FALSE); GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filelist_treeview)); gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE); g_signal_connect (G_OBJECT(filelist_treeview), "cursor-changed", G_CALLBACK (replay_filelist_treeview_row_selected), NULL); filelist_treeview_sw = new_scrolled_window (NULL); gtk_container_add (GTK_CONTAINER (filelist_treeview_sw), filelist_treeview); /* add columns to the tree view */ GtkCellRenderer *renderer; GtkTreeViewColumn *col; int i; int col_count = sizeof (filelist_treeview_col_names) / sizeof (char *); for (i=0; i<col_count; i++) { renderer = gtk_cell_renderer_text_new(); col = gtk_tree_view_column_new_with_attributes (filelist_treeview_col_names[i], renderer, "text", i, NULL); if (i == 0) { gtk_tree_view_column_set_clickable(col, TRUE); gtk_tree_view_column_set_sort_order(col, GTK_SORT_DESCENDING); gtk_tree_view_column_set_sort_column_id(col, 0); gtk_tree_view_column_set_sort_indicator(col, TRUE); } else { gtk_tree_view_column_set_clickable(col, FALSE); } gtk_tree_view_append_column (GTK_TREE_VIEW(filelist_treeview), col); } filelist_store = gtk_list_store_new (col_count, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); GtkTreeSortable *sortable = GTK_TREE_SORTABLE(filelist_store); gtk_tree_sortable_set_sort_column_id(sortable, 0, GTK_SORT_DESCENDING); gtk_tree_view_set_model(GTK_TREE_VIEW(filelist_treeview), GTK_TREE_MODEL(filelist_store)); GtkWidget *hbox = gtk_hbox_new(TRUE, 5); replay_button = gtk_button_new_with_label("Replay"); g_signal_connect (G_OBJECT(replay_button), "clicked", G_CALLBACK (replay_button_clicked), NULL); delete_button = gtk_button_new_with_label("Delete"); g_signal_connect (G_OBJECT(delete_button), "clicked", G_CALLBACK (delete_button_clicked), NULL); export_gpx_button = gtk_button_new_with_label("Export .gpx"); g_signal_connect (G_OBJECT( export_gpx_button), "clicked", G_CALLBACK (export_gpx_button_clicked), NULL); gtk_container_add(GTK_CONTAINER(hbox), replay_button); gtk_container_add(GTK_CONTAINER(hbox), delete_button); gtk_container_add(GTK_CONTAINER(hbox), export_gpx_button); gtk_box_pack_start(GTK_BOX(vbox), filelist_treeview_sw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* populate files into filelist treeview */ GtkTreeIter iter; struct dirent *ep; char buf[256]; char *file_path = NULL; int len, ext_len = strlen(TRACK_FILE_EXT); char *fname; DIR *dp = opendir (g_context.track_dir); if (dp == NULL) { warn_dialog("unable to list track record files"); } else { while ((ep = readdir (dp))) { fname = ep->d_name; len = strlen(fname); if (ep->d_type == DT_REG && len > ext_len && (strncmp(&fname[len-ext_len], TRACK_FILE_EXT, ext_len) == 0)) { gtk_list_store_prepend (filelist_store, &iter); file_path = get_full_path(buf, sizeof(buf), fname); add_file_to_list(&iter, file_path, fname); if (replay_file && strcmp(replay_file, fname) == 0) gtk_tree_selection_select_iter (sel, &iter); } } closedir (dp); } return vbox; }
/** * Reads the list of files from the host IDE runs on, * creates files, fills internal file table */ static int init_files() { trace("Files list initialization\n"); int bufsize = PATH_MAX + 32; char buffer[bufsize]; int success = false; file_elem* list = NULL; file_elem* tail = NULL; start_adding_file_data(); while (1) { if( !fgets(buffer, bufsize, stdin)) { report_error("protocol error while reading file info: unexpected EOF\n"); return false; } if (buffer[0] == '\n') { success = true; break; } trace("\tFile init: %s", buffer); // no trailing LF since it's in the buffer // remove trailing LF char* lf = strchr(buffer, '\n'); if (lf) { *lf = 0; } if (strchr(buffer, '\r')) { report_error("protocol error: unexpected CR: %s\n", buffer); return false; } enum file_state state; int file_size; char *path; struct timeval file_time; file_time.tv_sec = file_time.tv_usec = 0; if (!scan_line(buffer, bufsize, &state, &file_size, &file_time, (const char**) &path)) { report_error("protocol error: %s\n", buffer); break; } trace("\t\tpath=%s size=%d state=%c (0x%x) time=%d.%d\n", path, file_size, (char) state, (char) state, file_time.tv_sec, file_time.tv_usec); if (state == -1) { report_error("protocol error: %s\n", buffer); break; } else if (state == DIRECTORY) { // directory create_dir(path); } else if (state == LINK) { // symbolic link char lnk_src[bufsize]; // it is followed by a line that contains the link source if( !fgets(lnk_src, sizeof lnk_src, stdin)) { report_error("protocol error while reading link info: unexpected EOF\n"); return false; } char* lf = strchr(lnk_src, '\n'); if (lf) { *lf = 0; } if (strchr(buffer, '\r')) { report_error("protocol error: unexpected CR: %s\n", buffer); return false; } create_lnk(path, lnk_src); } else { // plain file int touch = false; if (state == INITIAL) { touch = true; } else if (state == COPIED || state == TOUCHED) { touch = !file_exists(path, file_size); } else if (state == UNCONTROLLED || state == INEXISTENT) { // nothing } else { report_error("protocol error: %s\n", buffer); } enum file_state new_state = state; if (touch) { if (touch_file(path, file_size, &file_time)) { new_state = TOUCHED; } else { new_state = ERROR; } } if (*path == '/') { char real_path [PATH_MAX + 1]; if (state == UNCONTROLLED || state == INEXISTENT) { char *dir = path; char *file = path; // find trailing zero while (*file) { file++; } // we'll find '/' for sure - at least the starting one while(*file != '/') { file--; } if (file == path) { // the file resides in root directory strcpy(real_path, path); } else { // NB: we modify the path! but we'll restore later char *pfile_start = file; // save file start char char file_start = *file; // save file start char *file = 0; // replace the '/' that separates file from dir by zero file++; if (!realpath(dir, real_path)) { report_unresolved_path(dir); break; } char *p = real_path; while (*p) { p++; } *(p++) = '/'; strncpy(p, file, sizeof real_path - (p - real_path)); *pfile_start = file_start; // restore file start char } } else { if (!realpath(path, real_path)) { report_unresolved_path(path); break; } } trace("\t\tadding %s with state '%c' (0x%x) -> %s\n", path, (char) new_state, (char) new_state, real_path); add_file_data(real_path, new_state); // send real path to local controller tail = add_file_to_list(tail, path, new_state, real_path); //trace("\t\tadded to list %s with state '%c' (0x%x) -> %s\n", tail->filename, tail->state, tail->state, tail->real_path); if (list == NULL) { list = tail; } } else { report_error("protocol error: %s is not absoulte\n", path); break; } } } stop_adding_file_data(); trace("Files list initialization done\n"); if (success) { // send info about touched files which were passed as copied files tail = list; while (tail != NULL) { fprintf(stdout, "*%c%s\n%s\n", tail->state, tail->filename, tail->real_path); fflush(stdout); tail = tail->next; } free_file_list(list); // empty line as indication of finished files list fprintf(stdout, "\n"); fflush(stdout); } return success; }