X-Git-Url: http://git.pond.sub.org/?p=eow;a=blobdiff_plain;f=empire.lisp;h=edb8316846ed5ede51dadfbd2b9eac86c7a77118;hp=9f28084bbf82bc8dad8939a1adb2cf911069ba96;hb=96d5b46f8a408652757fb21a801c005697dc45f7;hpb=f1b2e494b43de565e0f4029e51d86dc6882f460c diff --git a/empire.lisp b/empire.lisp index 9f28084..edb8316 100644 --- a/empire.lisp +++ b/empire.lisp @@ -208,7 +208,7 @@ (cons (let ((message (car next-event)) (mode (cdr next-event))) (send-message-one c message) - (set-new-mode c mode)))))) + (set-new-mode (connection-mode c) mode)))))) (defun read-no-eval (stream) (let ((*read-eval* nil)) @@ -302,8 +302,52 @@ (and (> (length line) 0) (char= +special-command-char+ (aref line 0)))) +(defclass xdump-mode (play-mode) + ((parser :initform (xdump:make-parser)) + (phase :initform :meta-meta) + (dump-queue :initform nil) + (dump-index :initform 0))) + +(defmethod handle-data ((m xdump-mode) message) + (with-slots (connection parser phase dump-queue dump-index) m + (if (xdump:parse-line parser message) + ;;XXX consider something like a 'pop-mode function + (ccase phase + (:meta-meta + (setf phase :meta-table + parser (xdump:make-parser)) + (send-message connection "xdump meta table")) + (:meta-table + (setf phase :table-table + parser (xdump:make-parser)) + (send-message connection "xdump table *")) + (:table-table + (setf phase :tables-meta + dump-queue (xdump::table-entries (xdump::get-table "table")) + dump-index 0 + parser (xdump:make-parser)) + (send-message connection (format nil "xdump meta ~a" (xdump-data::table-name (aref dump-queue 0))))) + (:tables-meta + (setf phase :tables-content + parser (xdump:make-parser)) + (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 + parser (xdump:make-parser)) + (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)) - t) + (send-message c "xdump meta meta" :next-mode 'xdump-mode)) (defmethod special-command ((c connection) line) (cond ((string= line "xup") (special-xup c))