summaryrefslogtreecommitdiffstats
path: root/src/LYSession.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/LYSession.c')
-rw-r--r--src/LYSession.c267
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 */