diff options
Diffstat (limited to 'src/LYSession.c')
-rw-r--r-- | src/LYSession.c | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/src/LYSession.c b/src/LYSession.c new file mode 100644 index 0000000..a4438bd --- /dev/null +++ b/src/LYSession.c @@ -0,0 +1,267 @@ +/* $LynxId: LYSession.c,v 1.12 2018/07/08 15:22:44 tom Exp $ */ + +#include <LYSession.h> + +#include <LYLeaks.h> +#include <LYUtils.h> +#include <LYStrings.h> +#include <LYHistory.h> +#include <LYGlobalDefs.h> +#include <LYMainLoop.h> +#include <GridText.h> + +#ifdef USE_SESSIONS + +/* Example of how a session file may look: + */ + +/* # lynx session + * / files + * / hereby + * / reduce + * g file://localhost/COPYRIGHT + * g https://lynx.invisible-island.net + * h 1 -1 file://localhost/COPYRIGHT Entry into main screen + * h 1 0 LYNXCACHE:/ Cache Jar + * h 1 16 file://localhost/usr/local/share/lynx_help/Lynx_users_guide.html#Cache Lynx Users Guide v2.8.6 + * h 1 -1 file://localhost/COPYRIGHT Entry into main screen + * h 1 2 file://localhost/tmp/lynxmSefvcbXes/L12110-6407TMP.html#current Visited Links Page + * h 1 -1 file://localhost/COPYRIGHT Entry into main screen + * h 1 -1 LYNXMESSAGES:/ Your recent statusline messages + * V 0 file://localhost/COPYRIGHT Entry into main screen + * V 3 file://localhost/usr/local/share/lynx_help/Lynx_users_guide.html#Bookmarks Lynx Users Guide v2.8.6 + */ + +static char *get_filename(char *given_name) +{ + char *actual_filename = given_name; + + /* + * If the specific "-sessionin" or "-sessionout" value is not given, + * try the "-session" value (if the AUTO_SESSION configuration is set). + * Finally try the SESSION_FILE configuration value. + */ + if (isEmpty(actual_filename)) { + actual_filename = session_file; + if (isEmpty(actual_filename)) { + if (LYAutoSession) { + actual_filename = LYSessionFile; + } + } + } + + return actual_filename; +} + +/* Restore session from file, pretty slow, but it should be fine + * for everyday, normal use. + */ +void RestoreSession(void) +{ + char *my_filename = get_filename(sessionin_file); + FILE *fp; + char *buffer = 0; + DocInfo doc; + VisitedLink *vl; + int i = 0; + short errors = 10; /* how many syntax errors are allowed in + * session file before aborting. */ + char *value1, *value2, *rsline, *linktext, *rslevel; + + memset(&doc, 0, sizeof(doc)); + + /* + * This should be done only once, here: iff USE_SESSIONS is defined or: + * in mainloop(), otherwise history entries are lost + */ + nhist = 0; + + if (my_filename == NULL) { + /* nothing to do, so exit */ + return; + } + + CTRACE((tfp, "RestoreSession %s\n", my_filename)); + SetDefaultMode(O_TEXT); + if ((fp = fopen(my_filename, TXT_R)) != NULL) { + + /* + * This should be safe, entries are added to lynx until memory is + * exhausted + */ + while (LYSafeGets(&buffer, fp) != 0) { + LYTrimNewline(buffer); + if (*buffer == '/') { +#ifdef SEARCH_OUT_SESSION + if ((value1 = StrChr(buffer, ' ')) == 0) { + continue; + } else { + value1++; + HTAddSearchQuery(value1); + } +#endif /* SEARCH_OUT_SESSION */ + } else if (*buffer == 'g') { +#ifdef GOTOURL_OUT_SESSION + if ((value1 = StrChr(buffer, ' ')) == 0) + continue; + else { + value1++; + HTAddGotoURL(value1); + } +#endif /* GOTOURL_OUT_SESSION */ + } else if (*buffer == 'h') { +#ifdef HISTORY_OUT_SESSION + if ((rsline = StrChr(buffer, ' ')) == 0) + continue; + else { + rsline++; + if ((linktext = StrChr(rsline, ' ')) == 0) + continue; + else + *linktext++ = 0; + if ((value1 = StrChr(linktext, ' ')) == 0) + continue; + else + *value1++ = 0; + if ((value2 = StrChr(value1, '\t')) != 0) { + *value2++ = 0; + doc.line = atoi(rsline); + doc.link = atoi(linktext); + StrAllocCopy(doc.address, value1); + StrAllocCopy(doc.title, value2); + LYpush(&doc, TRUE); + } + } +#endif /* HISTORY_OUT_SESSION */ + } else if (*buffer == 'V') { +#ifdef VLINK_OUT_SESSION + if ((rslevel = StrChr(buffer, ' ')) == 0) + continue; + else { + rslevel++; + if ((value1 = StrChr(rslevel, ' ')) == 0) + continue; + else + *value1++ = 0; + if ((value2 = StrChr(value1, '\t')) != 0) { + *value2++ = 0; + StrAllocCopy(doc.address, value1); + StrAllocCopy(doc.title, value2); + LYAddVisitedLink(&doc); + vl = (VisitedLink *) + HTList_objectAt(Visited_Links, i); + if (vl != NULL) { + vl->level = atoi(rslevel); + i++; + } + } + } +#endif /* VLINK_OUT_SESSION */ + } else if (*buffer == '#') { + /* This is comment; ignore it */ + continue; + } else if (errors-- < 0) { + FREE(buffer); + break; + } else + continue; + } + + LYCloseOutput(fp); + } + SetDefaultMode(O_BINARY); +} + +/* + * Save session to file, overwriting one. + */ +void SaveSession(void) +{ + char *my_filename = get_filename(sessionout_file); + FILE *fp; + VisitedLink *vl; + int i, j, k; + + if (my_filename == NULL) { + /* nothing to do, so exit */ + return; + } + + CTRACE((tfp, "SaveSession %s\n", my_filename)); + + SetDefaultMode(O_TEXT); + if ((fp = fopen(my_filename, TXT_W)) != NULL) { + + fprintf(fp, "# lynx session\n"); /* @@@ simple for now */ + + /* Note use of session_limit, the most recent entries in list, + * from the end of list, are saved. + */ + +#ifdef SEARCH_IN_SESSION + k = HTList_count(search_queries); + if (k > session_limit) + j = k - session_limit; + else + j = 0; + for (i = j; i < k; i++) { + fprintf(fp, "/ "); + fputs((char *) HTList_objectAt(search_queries, i), fp); + fprintf(fp, "\n"); + } +#endif /* SEARCH_IN_SESSION */ + +#ifdef GOTOURL_IN_SESSION + k = HTList_count(Goto_URLs); + if (k > session_limit) + j = k - session_limit; + else + j = 0; + for (i = j; i < k; i++) { + fprintf(fp, "g "); + fputs((char *) HTList_objectAt(Goto_URLs, i), fp); + fprintf(fp, "\n"); + } +#endif /* GOTOURL_IN_SESSION */ + +#ifdef HISTORY_IN_SESSION + k = nhist + nhist_extra; + if (k > session_limit) + j = k - session_limit; + else + j = 0; + + for (i = j; i < k; i++) { + fprintf(fp, "h %d %d ", HDOC(i).line, HDOC(i).link); + fputs(HDOC(i).address, fp); + fprintf(fp, "\t"); + fputs(HDOC(i).title, fp); + fprintf(fp, "\n"); + } +#endif /* HISTORY_IN_SESSION */ + +#ifdef VLINK_IN_SESSION + k = HTList_count(Visited_Links); + if (k > session_limit) + j = k - session_limit; + else + j = 0; + + for (i = j; i < k; i++) { + vl = (VisitedLink *) HTList_objectAt(Visited_Links, i); + if (vl != NULL) { + fprintf(fp, "V %d ", vl->level); + fputs(vl->address, fp); + fprintf(fp, "\t"); + fputs(vl->title, fp); + fprintf(fp, "\n"); + } + } +#endif /* VLINK_IN_SESSION */ + + LYCloseOutput(fp); + } + SetDefaultMode(O_BINARY); +} + +#endif /* USE_SESSIONS */ |