X-Git-Url: http://git.pond.sub.org/?p=eow;a=blobdiff_plain;f=empire.lisp;h=8a1689be7899a089754b8eb98127cd2f2b4bab94;hp=c8993e8bb8cb53899befdecc38bc9ef120681ab2;hb=c61f30ca70589a5ea3e532a313722ecb3f109b53;hpb=7964c4eff78de2fcca3c0b79161fa1f4cf626690 diff --git a/empire.lisp b/empire.lisp index c8993e8..8a1689b 100644 --- a/empire.lisp +++ b/empire.lisp @@ -48,7 +48,8 @@ (send-queue :accessor send-queue :initform (locked-queue:create) - :documentation "lines outstanding to be sent at next prompt"))) + :documentation "lines outstanding to be sent at next prompt") + (xdump :accessor xdump :initform (xdump:make-parser)))) (defun make-connection (&key (user nil) (password nil) @@ -303,22 +304,42 @@ (char= +special-command-char+ (aref line 0)))) (defclass xdump-mode (play-mode) - ((parser :initform (xdump:make-parser)) - (phase :initform :meta-meta))) + ((phase :initform :meta-meta) + (dump-queue :initform nil) + (dump-index :initform 0))) (defmethod handle-data ((m xdump-mode) message) - (with-slots (connection parser phase) m - (if (xdump:parse-line parser message) + (with-slots (connection phase dump-queue dump-index) m + (if (xdump:parse-line (xdump connection) message) ;;XXX consider something like a 'pop-mode function - (case phase + (ccase phase (:meta-meta (setf phase :meta-table) - (send-message connection "xdump meta table" :next-mode 'xdump-mode)) + (send-message connection "xdump meta table")) (:meta-table - (setf phase :table) - (send-message connection "xdump table *" :next-mode 'xdump-mode)) - (:table - (set-new-mode (connection-mode connection) 'play-mode)))))) + (setf phase :table-table) + (send-message connection "xdump table *")) + (:table-table + (setf phase :tables-meta + dump-queue (xdump::table-entries (xdump::get-table "table")) + dump-index 0) + (send-message connection (format nil "xdump meta ~a" (xdump-data::table-name (aref dump-queue 0))))) + (:tables-meta + (setf phase :tables-content) + (send-message connection (format nil "xdump ~a *" (xdump-data::table-name (aref dump-queue dump-index))))) + (:tables-content + (if (< dump-index (fill-pointer dump-queue)) + (progn (setf phase :tables-meta) + (incf dump-index) + (loop while (and (< dump-index (fill-pointer dump-queue)) + (let ((dump-queue-entry (aref dump-queue dump-index))) + (or (null dump-queue-entry) + (string= "meta" (xdump-data::table-name dump-queue-entry))))) + do (incf dump-index)) + (if (and (<= dump-index (fill-pointer dump-queue)) + (not (null (aref dump-queue dump-index)))) + (send-message connection (format nil "xdump meta ~a" (xdump-data::table-name (aref dump-queue dump-index)))))) + (set-new-mode (connection-mode connection) 'play-mode))))))) (defmethod special-xup ((c connection)) (send-message c "xdump meta meta" :next-mode 'xdump-mode))