diff lisp/efs/efs-coke.el @ 22:8fc7fe29b841 r19-15b94

Import from CVS: tag r19-15b94
author cvs
date Mon, 13 Aug 2007 08:50:29 +0200
parents
children 8b8b7f3559a2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/efs/efs-coke.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,176 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:         efs-coke.el
+;; Release:      $efs release: 1.15 $
+;; Version:      $Revision: 1.1 $
+;; RCS:          
+;; Description:  Coke Machine support for efs
+;; Author:       Sandy Rutherford <sandy@imb550.sissa.it>
+;; Created:      Fri Oct 14 23:55:04 1994 by sandy on ibm550
+;; Modified:     Sun Nov 27 12:16:47 1994 by sandy on gandalf
+;; Language:     Emacs-Lisp
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This file is part of efs. See efs.el for copyright
+;;; (it's copylefted) and warrranty (there isn't one) information.
+
+(provide 'efs-coke)
+(require 'efs)
+
+(defconst efs-coke-version
+  (concat (substring "$efs release: 1.15 $" 14 -2)
+	  "/"
+	  (substring "$Revision: 1.1 $" 11 -2)))
+
+;;;; ------------------------------------------------------------
+;;;; Coke Machine support
+;;;; ------------------------------------------------------------
+;;;
+;;;  Works for the MIT vending machine FTP server.
+;;;  Hopefully, a vending machine RFC is on its way, so we won't
+;;;  need to support a wide variation of vending machine protocols.
+
+(efs-defun efs-send-pwd coke (host user &optional xpwd)
+  ;; Directories on vending machines?
+  "/")
+
+(efs-defun efs-fix-path coke (path &optional reverse)
+  (if (= ?/ (aref path 0))
+      (if reverse path (substring path 1))
+    (if reverse (concat "/" path) path)))
+
+(efs-defun efs-fix-dir-path coke (dir-path)
+  ;; Make a beverage path for a dir listing.
+  (if (or (string-equal dir-path "/") (string-equal dir-path "/."))
+      "*"
+    dir-path))
+
+(efs-defun efs-parse-listing coke
+  (host user dir path &optional switches)
+  ;; Parse the current buffer which is assumed to be in coke machine
+  ;; ftp dir format.
+  ;; HOST = remote host name
+  ;; USER = remote user name
+  ;; DIR = remote directory as a remote full path
+  ;; PATH = directory as an efs full path
+  ;; SWITCHES are never used here, but they
+  ;; must be specified in the argument list for compatibility
+  ;; with the unix version of this function.
+  (let ((tbl (efs-make-hashtable)))
+    (goto-char (point-min))
+    (efs-save-match-data
+      (while (re-search-forward "^\\(SOLD OUT \\)?\\[[0-9]+\\] +\\([^:\n]+\\)"
+				nil t)
+	(efs-put-hash-entry (buffer-substring (match-beginning 2)
+					      (match-end 2))
+			    (list nil) tbl)
+	(forward-line 1)))
+    ;; Don't need to bother with ..
+    (efs-put-hash-entry "." '(t) tbl)
+    tbl))
+
+(efs-defun efs-allow-child-lookup coke (host user dir file)
+  ;; Returns t if FILE in directory DIR could possibly be a subdir
+  ;; according to its file-name syntax, and therefore a child listing should
+  ;; be attempted.
+
+  ;; Coke machine file system is flat.  Hopefully not the coke.
+  (and (string-equal "/" dir) (string-equal "." file)))
+
+(defun efs-coke-insert-beverage-contents (buffer file line)
+  ;; Inserts the contents of a beverage (determined by the FTP server
+  ;; response LINE) into BUFFER, and then drinks it.
+  ;; FILE is the name of the file.
+  (efs-save-buffer-excursion
+    (set-buffer buffer)
+    (if (zerop (buffer-size))
+	(progn
+	  (insert "\n\n\n\n      " (substring line 4) "\n")
+	  (set-buffer-modified-p nil)
+	  (set-process-sentinel
+	   (start-process "efs-coke-gulp-buffer" (current-buffer) "sleep" "3")
+	   (function
+	    (lambda (proc str)
+	      (efs-save-buffer-excursion
+		(let ((buff (process-buffer proc)))
+		  (and buff (get-buffer buff)
+		       (progn
+			 (set-buffer buff)
+			 (erase-buffer)
+			 (insert "\n\n\n\n          GULP!!!\n")
+			 (sit-for 1)
+			 (set-buffer-modified-p nil)
+			 (kill-buffer (current-buffer)))))))))
+	  (if (featurep 'dired)
+	      (dired-fun-in-all-buffers
+	       (file-name-directory file) 'dired-revert)))
+      (message "You haven't finished your last drink in buffer %s!"
+	       (current-buffer))
+      (ding)
+      (sit-for 1))))
+
+;;; Dired support
+
+(efs-defun efs-dired-manual-move-to-filename coke
+  (&optional raise-error bol eol)
+  ;; In dired, move to first char of filename on this line.
+  ;; Returns position (point) or nil if no filename on this line.
+  ;; This is the COKE version.
+  (or eol (setq eol (save-excursion (skip-chars-forward "^\n\r") (point))))
+  (if bol
+      (goto-char bol)
+    (skip-chars-backward "^\n\r")
+    (setq bol (point)))
+  (if (looking-at "\\(. \\)?\\(SOLD OUT \\)?\\[[0-9]+\\] +\\([^:\n]+\\): ")
+      (goto-char (match-beginning 3))
+    (and raise-error (error "No file on this line"))))
+
+(efs-defun efs-dired-manual-move-to-end-of-filename coke
+  (&optional no-error bol eol)
+  ;; Assumes point is at beginning of filename.
+  ;; So, it should be called only after (dired-move-to-filename t).
+  ;; On failure, signals an error or returns nil.
+  ;; This is the COKE version.
+  (let ((opoint (point)))
+    (and selective-display
+	 (null no-error)
+	 (eq (char-after
+	      (1- (or bol (save-excursion
+			    (skip-chars-backward "^\r\n")
+			    (point)))))
+	     ?\r)
+	 ;; File is hidden or omitted.
+	 (cond
+	  ((dired-subdir-hidden-p (dired-current-directory))
+	   (error
+	    (substitute-command-keys
+	     "File line is hidden. Type \\[dired-hide-subdir] to unhide.")))
+	  ((error
+	    (substitute-command-keys
+	     "File line is omitted. Type \\[dired-omit-toggle] to un-omit."
+	     )))))
+    (if (search-forward ": " eol t)
+	(goto-char (- (match-end 0) 2))
+      (if no-error
+	  nil
+	(error "No file on this line"))
+      (point))))
+
+(efs-defun efs-dired-insert-headerline coke (dir)
+  (let* ((parsed (efs-ftp-path dir))
+	 (host (car parsed))
+	 (user (nth 1 parsed))
+	 (accounting
+	  (efs-send-cmd
+	   host user '(quote pwd)
+	   (format "Getting accounting data for %s@%s user host" user host))))
+    (insert "  " user "@" host "\n    "
+	    (if (car accounting)
+		"Account status unavailable"
+	      (substring (nth 1 accounting) 4)))
+    (delete-region (point) (progn (skip-chars-backward ":.,;") (point)))
+    (insert ":\n \n")))
+
+;;; end of efs-coke.el