(gnus-agent-retrieve-headers): Erase buffer.
[gnus] / lisp / nnweb.el
index 64821e3..fe32198 100644 (file)
@@ -24,8 +24,7 @@
 
 ;;; Commentary:
 
-;; Note: You need to have `url' and `w3' installed for this
-;; backend to work.
+;; Note: You need to have `w3' installed for some functions to work.
 
 ;;; Code:
 
 (require 'gnus)
 (require 'nnmail)
 (require 'mm-util)
-(eval-when-compile
-  (ignore-errors
-    (require 'w3)
-    (require 'url)
-    (require 'w3-forms)))
-
-;; Report failure to find w3 at load time if appropriate.
-(unless noninteractive
-  (eval '(progn
-          (require 'w3)
-          (require 'url)
-          (require 'w3-forms))))
+(require 'mm-url)
+(autoload 'w3-parse-buffer "w3-parse")
 
 (nnoo-declare nnweb)
 
 (defvoo nnweb-directory (nnheader-concat gnus-directory "nnweb/")
   "Where nnweb will save its files.")
 
-(defvoo nnweb-type 'dejanews
+(defvoo nnweb-type 'google
   "What search engine type is being used.
-Valid types include `dejanews', `dejanewsold', `reference',
+Valid types include `google', `dejanews', `dejanewsold', `reference',
 and `altavista'.")
 
 (defvar nnweb-type-definition
   '(
-    (dejanews ;; bought by google.com
-     (article . nnweb-google-wash-article)
-     (id . "http://groups.google.com/groups?as_umsgid=%s")
-     (reference . nnweb-google-reference)
+    (google
+     ;;(article . nnweb-google-wash-article)
+     ;;(id . "http://groups.google.com/groups?as_umsgid=%s")
+     (article . ignore)
+     (id . "http://groups.google.com/groups?selm=%s&output=gplain")
+     ;;(reference . nnweb-google-reference)
+     (reference . identity)
+     (map . nnweb-google-create-mapping)
+     (search . nnweb-google-search)
+     (address . "http://groups.google.com/groups")
+     (identifier . nnweb-google-identity))
+    (dejanews ;; alias of google
+     ;;(article . nnweb-google-wash-article)
+     ;;(id . "http://groups.google.com/groups?as_umsgid=%s")
+     (article . ignore)
+     (id . "http://groups.google.com/groups?selm=%s&output=gplain")
+     ;;(reference . nnweb-google-reference)
+     (reference . identity)
      (map . nnweb-google-create-mapping)
      (search . nnweb-google-search)
      (address . "http://groups.google.com/groups")
@@ -133,6 +136,8 @@ and `altavista'.")
 
 (deffoo nnweb-request-scan (&optional group server)
   (nnweb-possibly-change-server group server)
+  (if nnweb-ephemeral-p
+      (setq nnweb-hashtb (gnus-make-hashtable 4095)))
   (funcall (nnweb-definition 'map))
   (unless nnweb-ephemeral-p
     (nnweb-write-active)
@@ -143,7 +148,8 @@ and `altavista'.")
   (when (and group
             (not (equal group nnweb-group))
             (not nnweb-ephemeral-p))
-    (setq nnweb-group group)
+    (setq nnweb-group group
+         nnweb-articles nil)
     (let ((info (assoc group nnweb-group-alist)))
       (when info
        (setq nnweb-type (nth 2 info))
@@ -180,7 +186,7 @@ and `altavista'.")
           (url (and header (mail-header-xref header))))
       (when (or (and url
                     (mm-with-unibyte-current-buffer
-                      (nnweb-fetch-url url)))
+                      (mm-url-insert url)))
                (and (stringp article)
                     (nnweb-definition 'id t)
                     (let ((fetch (nnweb-definition 'id))
@@ -188,16 +194,15 @@ and `altavista'.")
                       (when (string-match "^<\\(.*\\)>$" article)
                         (setq art (match-string 1 article)))
                       (when (and fetch art)
-                        (setq url (format fetch article))
+                        (setq url (format fetch art))
                         (mm-with-unibyte-current-buffer
-                          (nnweb-fetch-url url))
+                          (mm-url-insert url))
                         (if (nnweb-definition 'reference t)
                             (setq article
-                                  (funcall (nnweb-definition 
+                                  (funcall (nnweb-definition
                                             'reference) article)))))))
        (unless nnheader-callback-function
-         (funcall (nnweb-definition 'article))
-         (nnweb-decode-entities))
+         (funcall (nnweb-definition 'article)))
        (nnheader-report 'nnweb "Fetched article %s" article)
        (cons group (and (numberp article) article))))))
 
@@ -302,10 +307,11 @@ and `altavista'.")
       (nnweb-open-server server)))
   (unless nnweb-group-alist
     (nnweb-read-active))
+  (unless nnweb-hashtb
+    (setq nnweb-hashtb (gnus-make-hashtable 4095)))
   (when group
     (when (and (not nnweb-ephemeral-p)
-              (not (equal group nnweb-group)))
-      (setq nnweb-hashtb (gnus-make-hashtable 4095))
+              (equal group nnweb-group))
       (nnweb-request-group group nil t))))
 
 (defun nnweb-init (server)
@@ -319,55 +325,55 @@ and `altavista'.")
                       nnweb-type nnweb-search server))
              (current-buffer))))))
 
-(defun nnweb-fetch-url (url)
-  (let (buf)
-    (save-excursion
-      (if (not nnheader-callback-function)
-         (progn
-           (with-temp-buffer
-             (mm-enable-multibyte)
-             (let ((coding-system-for-read 'binary)
-                   (coding-system-for-write 'binary)
-                   (default-process-coding-system 'binary))
-               (nnweb-insert url))
-             (setq buf (buffer-string)))
-           (erase-buffer)
-           (insert buf)
-           t)
-       (nnweb-url-retrieve-asynch
-        url 'nnweb-callback (current-buffer) nnheader-callback-function)
-       t))))
-
-(defun nnweb-callback (buffer callback)
-  (when (gnus-buffer-live-p url-working-buffer)
-    (save-excursion
-      (set-buffer url-working-buffer)
-      (funcall (nnweb-definition 'article))
-      (nnweb-decode-entities)
-      (set-buffer buffer)
-      (goto-char (point-max))
-      (insert-buffer-substring url-working-buffer))
-    (funcall callback t)
-    (gnus-kill-buffer url-working-buffer)))
-
-(defun nnweb-url-retrieve-asynch (url callback &rest data)
-  (let ((url-request-method "GET")
-       (old-asynch url-be-asynchronous)
-       (url-request-data nil)
-       (url-request-extra-headers nil)
-       (url-working-buffer (generate-new-buffer-name " *nnweb*")))
-    (setq-default url-be-asynchronous t)
-    (save-excursion
-      (set-buffer (get-buffer-create url-working-buffer))
-      (setq url-current-callback-data data
-           url-be-asynchronous t
-           url-current-callback-func callback)
-      (url-retrieve url nil))
-    (setq-default url-be-asynchronous old-asynch)))
-
-(if (fboundp 'url-retrieve-synchronously)
-    (defun nnweb-url-retrieve-asynch (url callback &rest data)
-      (url-retrieve url callback data)))
+;; (defun nnweb-fetch-url (url)
+;;   (let (buf)
+;;     (save-excursion
+;;       (if (not nnheader-callback-function)
+;;       (progn
+;;         (with-temp-buffer
+;;           (mm-enable-multibyte)
+;;           (let ((coding-system-for-read 'binary)
+;;                 (coding-system-for-write 'binary)
+;;                 (default-process-coding-system 'binary))
+;;             (nnweb-insert url))
+;;           (setq buf (buffer-string)))
+;;         (erase-buffer)
+;;         (insert buf)
+;;         t)
+;;     (nnweb-url-retrieve-asynch
+;;      url 'nnweb-callback (current-buffer) nnheader-callback-function)
+;;     t))))
+
+;; (defun nnweb-callback (buffer callback)
+;;   (when (gnus-buffer-live-p url-working-buffer)
+;;     (save-excursion
+;;       (set-buffer url-working-buffer)
+;;       (funcall (nnweb-definition 'article))
+;;       (nnweb-decode-entities)
+;;       (set-buffer buffer)
+;;       (goto-char (point-max))
+;;       (insert-buffer-substring url-working-buffer))
+;;     (funcall callback t)
+;;     (gnus-kill-buffer url-working-buffer)))
+
+;; (defun nnweb-url-retrieve-asynch (url callback &rest data)
+;;   (let ((url-request-method "GET")
+;;     (old-asynch url-be-asynchronous)
+;;     (url-request-data nil)
+;;     (url-request-extra-headers nil)
+;;     (url-working-buffer (generate-new-buffer-name " *nnweb*")))
+;;     (setq-default url-be-asynchronous t)
+;;     (save-excursion
+;;       (set-buffer (get-buffer-create url-working-buffer))
+;;       (setq url-current-callback-data data
+;;         url-be-asynchronous t
+;;         url-current-callback-func callback)
+;;       (url-retrieve url nil))
+;;     (setq-default url-be-asynchronous old-asynch)))
+
+;; (if (fboundp 'url-retrieve-synchronously)
+;;     (defun nnweb-url-retrieve-asynch (url callback &rest data)
+;;       (url-retrieve url callback data)))
 
 ;;;
 ;;; DejaNews functions.
@@ -431,17 +437,17 @@ and `altavista'.")
            ;; Yup -- fetch it.
            (setq more (match-string 1))
            (erase-buffer)
-           (url-insert-file-contents more)))
+           (mm-url-insert more)))
        ;; Return the articles in the right order.
        (setq nnweb-articles
              (sort (nconc nnweb-articles map) 'car-less-than-car))))))
 
 (defun nnweb-dejanews-search (search)
-  (nnweb-insert
+  (mm-url-insert
    (concat
     (nnweb-definition 'address)
     "?"
-    (nnweb-encode-www-form-urlencoded
+    (mm-url-encode-www-form-urlencoded
      `(("ST" . "PS")
        ("svcclass" . "dnyr")
        ("QRY" . ,search)
@@ -457,19 +463,19 @@ and `altavista'.")
        ("ageweight" . "1")))))
   t)
 
-(defun nnweb-dejanewsold-search (search)
-  (nnweb-fetch-form
-   (nnweb-definition 'address)
-   `(("query" . ,search)
-     ("defaultOp" . "AND")
-     ("svcclass" . "dnold")
-     ("maxhits" . "100")
-     ("format" . "verbose2")
-     ("threaded" . "0")
-     ("showsort" . "date")
-     ("agesign" . "1")
-     ("ageweight" . "1")))
-  t)
+;; (defun nnweb-dejanewsold-search (search)
+;;   (nnweb-fetch-form
+;;    (nnweb-definition 'address)
+;;    `(("query" . ,search)
+;;      ("defaultOp" . "AND")
+;;      ("svcclass" . "dnold")
+;;      ("maxhits" . "100")
+;;      ("format" . "verbose2")
+;;      ("threaded" . "0")
+;;      ("showsort" . "date")
+;;      ("agesign" . "1")
+;;      ("ageweight" . "1")))
+;;   t)
 
 (defun nnweb-dejanews-identity (url)
   "Return an unique identifier based on URL."
@@ -509,7 +515,7 @@ and `altavista'.")
            (goto-char (point-min))
            (when (looking-at ".*href=\"\\([^\"]+\\)\"")
              (setq url (match-string 1)))
-