[fractal/fractal-next] verification: Rename IdentityVerification property mode to state



commit 5a7fc6ae92f0e6ffbe2703cb0c1fc15867d69835
Author: Julian Sparber <julian sparber net>
Date:   Fri Jan 7 20:19:51 2022 +0100

    verification: Rename IdentityVerification property mode to state

 src/session/content/mod.rs                         |   2 +-
 .../content/room_history/verification_info_bar.rs  |  12 +--
 .../verification/identity_verification_widget.rs   |  24 ++---
 .../content/verification/session_verification.rs   |  26 ++---
 src/session/mod.rs                                 |   6 +-
 src/session/verification/identity_verification.rs  | 113 +++++++++++----------
 src/session/verification/mod.rs                    |   2 +-
 src/session/verification/verification_list.rs      |   2 +-
 8 files changed, 96 insertions(+), 91 deletions(-)
---
diff --git a/src/session/content/mod.rs b/src/session/content/mod.rs
index b8f6f4f6..2f57005a 100644
--- a/src/session/content/mod.rs
+++ b/src/session/content/mod.rs
@@ -220,7 +220,7 @@ impl Content {
 
             if item.is::<IdentityVerification>() {
                 let handler_id = item.connect_notify_local(
-                    Some("mode"),
+                    Some("state"),
                     clone!(@weak self as obj => move |request, _| {
                         let request = request.downcast_ref::<IdentityVerification>().unwrap();
                         if request.is_finished() {
diff --git a/src/session/content/room_history/verification_info_bar.rs 
b/src/session/content/room_history/verification_info_bar.rs
index 212ddd36..10b06ceb 100644
--- a/src/session/content/room_history/verification_info_bar.rs
+++ b/src/session/content/room_history/verification_info_bar.rs
@@ -2,7 +2,7 @@ use adw::subclass::prelude::*;
 use gtk::{glib, glib::clone, prelude::*, subclass::prelude::*, CompositeTemplate};
 
 use crate::session::user::UserExt;
-use crate::session::verification::{IdentityVerification, VerificationMode};
+use crate::session::verification::{IdentityVerification, VerificationState};
 use gettextrs::gettext;
 mod imp {
     use super::*;
@@ -20,7 +20,7 @@ mod imp {
         #[template_child]
         pub button: TemplateChild<gtk::Button>,
         pub request: RefCell<Option<IdentityVerification>>,
-        pub mode_handler: RefCell<Option<SignalHandlerId>>,
+        pub state_handler: RefCell<Option<SignalHandlerId>>,
         pub user_handler: RefCell<Option<SignalHandlerId>>,
     }
 
@@ -115,7 +115,7 @@ impl VerificationInfoBar {
                 return;
             }
 
-            if let Some(handler) = priv_.mode_handler.take() {
+            if let Some(handler) = priv_.state_handler.take() {
                 old_request.disconnect(handler);
             }
 
@@ -126,13 +126,13 @@ impl VerificationInfoBar {
 
         if let Some(ref request) = request {
             let handler = request.connect_notify_local(
-                Some("mode"),
+                Some("state"),
                 clone!(@weak self as obj => move |_, _| {
                     obj.update_view();
                 }),
             );
 
-            priv_.mode_handler.replace(Some(handler));
+            priv_.state_handler.replace(Some(handler));
 
             let handler = request.user().connect_notify_local(
                 Some("display-name"),
@@ -155,7 +155,7 @@ impl VerificationInfoBar {
         let visible = if let Some(request) = self.request() {
             if request.is_finished() {
                 false
-            } else if matches!(request.mode(), VerificationMode::Requested) {
+            } else if matches!(request.state(), VerificationState::Requested) {
                 // Translators: The value is the display name of the user who wants to be verified
                 priv_.label.set_markup(&gettext!(
                     "<b>{}</b> wants to be verified",
diff --git a/src/session/content/verification/identity_verification_widget.rs 
b/src/session/content/verification/identity_verification_widget.rs
index f7fc86f4..01d9b134 100644
--- a/src/session/content/verification/identity_verification_widget.rs
+++ b/src/session/content/verification/identity_verification_widget.rs
@@ -8,7 +8,7 @@ use crate::contrib::screenshot;
 use crate::contrib::QRCode;
 use crate::contrib::QRCodeExt;
 use crate::contrib::QrCodeScanner;
-use crate::session::verification::{IdentityVerification, SasData, VerificationMode};
+use crate::session::verification::{IdentityVerification, SasData, VerificationState};
 use crate::spawn;
 use gettextrs::gettext;
 use matrix_sdk::encryption::verification::QrVerificationData;
@@ -55,7 +55,7 @@ mod imp {
         pub qr_code_scanner: TemplateChild<QrCodeScanner>,
         #[template_child]
         pub done_btn: TemplateChild<gtk::Button>,
-        pub mode_handler: RefCell<Option<SignalHandlerId>>,
+        pub state_handler: RefCell<Option<SignalHandlerId>>,
     }
 
     #[glib::object_subclass]
@@ -224,7 +224,7 @@ mod imp {
 
         fn dispose(&self, obj: &Self::Type) {
             if let Some(request) = obj.request() {
-                if let Some(handler) = self.mode_handler.take() {
+                if let Some(handler) = self.state_handler.take() {
                     request.disconnect(handler);
                 }
             }
@@ -267,21 +267,21 @@ impl IdentityVerificationWidget {
         self.reset();
 
         if let Some(previous_request) = previous_request {
-            if let Some(handler) = priv_.mode_handler.take() {
+            if let Some(handler) = priv_.state_handler.take() {
                 previous_request.disconnect(handler);
             }
         }
 
         if let Some(ref request) = request {
             let handler = request.connect_notify_local(
-                Some("mode"),
+                Some("state"),
                 clone!(@weak self as obj => move |_, _| {
                     obj.update_view();
                 }),
             );
             self.update_view();
 
-            priv_.mode_handler.replace(Some(handler));
+            priv_.state_handler.replace(Some(handler));
         }
 
         priv_.request.replace(request);
@@ -340,11 +340,11 @@ impl IdentityVerificationWidget {
     fn update_view(&self) {
         let priv_ = imp::IdentityVerificationWidget::from_instance(self);
         if let Some(request) = self.request() {
-            match request.mode() {
-                VerificationMode::Requested => {
+            match request.state() {
+                VerificationState::Requested => {
                     priv_.main_stack.set_visible_child_name("accept-request");
                 }
-                VerificationMode::QrV1Show => {
+                VerificationState::QrV1Show => {
                     if let Some(qrcode) = request.qr_code() {
                         priv_.qrcode.set_qrcode(qrcode.clone());
                         priv_.main_stack.set_visible_child_name("qrcode");
@@ -353,10 +353,10 @@ impl IdentityVerificationWidget {
                         request.start_sas();
                     }
                 }
-                VerificationMode::QrV1Scan => {
+                VerificationState::QrV1Scan => {
                     self.start_scanning();
                 }
-                VerificationMode::SasV1 => {
+                VerificationState::SasV1 => {
                     self.clean_emoji();
                     match request.sas_data().unwrap() {
                         SasData::Emoji(emoji) => {
@@ -381,7 +381,7 @@ impl IdentityVerificationWidget {
                     }
                     priv_.main_stack.set_visible_child_name("emoji");
                 }
-                VerificationMode::Completed => {
+                VerificationState::Completed => {
                     priv_.main_stack.set_visible_child_name("completed");
                 }
                 _ => {}
diff --git a/src/session/content/verification/session_verification.rs 
b/src/session/content/verification/session_verification.rs
index b1d927ef..254f184b 100644
--- a/src/session/content/verification/session_verification.rs
+++ b/src/session/content/verification/session_verification.rs
@@ -9,7 +9,7 @@ use crate::contrib::screenshot;
 use crate::contrib::QRCode;
 use crate::contrib::QRCodeExt;
 use crate::contrib::QrCodeScanner;
-use crate::session::verification::{IdentityVerification, SasData, VerificationMode};
+use crate::session::verification::{IdentityVerification, SasData, VerificationState};
 use crate::spawn;
 use crate::Error;
 use crate::Window;
@@ -51,7 +51,7 @@ mod imp {
         pub main_stack: TemplateChild<gtk::Stack>,
         #[template_child]
         pub qr_code_scanner: TemplateChild<QrCodeScanner>,
-        pub mode_handler: RefCell<Option<SignalHandlerId>>,
+        pub state_handler: RefCell<Option<SignalHandlerId>>,
     }
 
     #[glib::object_subclass]
@@ -217,19 +217,19 @@ impl SessionVerification {
 
             self.reset();
 
-            if let Some(handler) = priv_.mode_handler.take() {
+            if let Some(handler) = priv_.state_handler.take() {
                 old_request.disconnect(handler);
             }
         }
 
         let handler = request.connect_notify_local(
-            Some("mode"),
+            Some("state"),
             clone!(@weak self as obj => move |_, _| {
                 obj.update_view();
             }),
         );
 
-        priv_.mode_handler.replace(Some(handler));
+        priv_.state_handler.replace(Some(handler));
 
         priv_.request.replace(Some(request));
     }
@@ -269,7 +269,7 @@ impl SessionVerification {
     fn silent_cancel(&self) {
         let priv_ = imp::SessionVerification::from_instance(self);
 
-        if let Some(handler) = priv_.mode_handler.take() {
+        if let Some(handler) = priv_.state_handler.take() {
             self.request().disconnect(handler);
         }
 
@@ -281,15 +281,15 @@ impl SessionVerification {
     fn update_view(&self) {
         let priv_ = imp::SessionVerification::from_instance(self);
         let request = self.request();
-        match request.mode() {
+        match request.state() {
             // FIXME: we bootstrap on all errors
-            VerificationMode::Error => {
+            VerificationState::Error => {
                 priv_.main_stack.set_visible_child_name("bootstrap");
             }
-            VerificationMode::Requested | VerificationMode::RequestSend => {
+            VerificationState::Requested | VerificationState::RequestSend => {
                 priv_.main_stack.set_visible_child_name("wait-for-device");
             }
-            VerificationMode::QrV1Show => {
+            VerificationState::QrV1Show => {
                 if let Some(qrcode) = request.qr_code() {
                     priv_.qrcode.set_qrcode(qrcode.clone());
                     priv_.main_stack.set_visible_child_name("qrcode");
@@ -298,10 +298,10 @@ impl SessionVerification {
                     request.start_sas();
                 }
             }
-            VerificationMode::QrV1Scan => {
+            VerificationState::QrV1Scan => {
                 self.start_scanning();
             }
-            VerificationMode::SasV1 => {
+            VerificationState::SasV1 => {
                 match request.sas_data().unwrap() {
                     SasData::Emoji(emoji) => {
                         for (index, emoji) in emoji.iter().enumerate() {
@@ -326,7 +326,7 @@ impl SessionVerification {
 
                 priv_.main_stack.set_visible_child_name("emoji");
             }
-            VerificationMode::Completed => {
+            VerificationState::Completed => {
                 priv_.main_stack.set_visible_child_name("completed");
             }
             _ => {
diff --git a/src/session/mod.rs b/src/session/mod.rs
index 9c848b8e..3f055174 100644
--- a/src/session/mod.rs
+++ b/src/session/mod.rs
@@ -20,7 +20,7 @@ pub use self::room_creation::RoomCreation;
 use self::room_list::RoomList;
 use self::sidebar::Sidebar;
 pub use self::user::{User, UserExt};
-use self::verification::{IdentityVerification, VerificationList, VerificationMode};
+use self::verification::{IdentityVerification, VerificationList, VerificationState};
 use crate::session::sidebar::ItemList;
 
 use crate::secret;
@@ -506,9 +506,9 @@ impl Session {
         }
 
         request.connect_notify_local(
-            Some("mode"),
+            Some("state"),
             clone!(@weak self as obj => move |request, _| {
-                if request.is_finished() && request.mode() !=  VerificationMode::Completed {
+                if request.is_finished() && request.state() !=  VerificationState::Completed {
                     spawn!(async move {
                         obj.create_session_verification().await;
                     });
diff --git a/src/session/verification/identity_verification.rs 
b/src/session/verification/identity_verification.rs
index 091c81df..f6ca8738 100644
--- a/src/session/verification/identity_verification.rs
+++ b/src/session/verification/identity_verification.rs
@@ -29,8 +29,8 @@ use tokio::sync::mpsc;
 
 #[derive(Debug, Eq, PartialEq, Clone, Copy, glib::GEnum)]
 #[repr(u32)]
-#[genum(type_name = "VerificationMode")]
-pub enum Mode {
+#[genum(type_name = "VerificationState")]
+pub enum State {
     Requested,
     RequestSend,
     SasV1,
@@ -43,7 +43,7 @@ pub enum Mode {
     Error,
 }
 
-impl Default for Mode {
+impl Default for State {
     fn default() -> Self {
         Self::Requested
     }
@@ -95,7 +95,7 @@ pub enum MainMessage {
     SasData(SasData),
     SupportedMethods(SupportedMethods),
     CancelInfo(CancelInfo),
-    Mode(Mode),
+    State(State),
 }
 
 #[derive(Debug)]
@@ -114,7 +114,7 @@ mod imp {
     pub struct IdentityVerification {
         pub user: OnceCell<User>,
         pub session: OnceCell<WeakRef<Session>>,
-        pub mode: Cell<Mode>,
+        pub state: Cell<State>,
         pub supported_methods: Cell<SupportedMethods>,
         pub sync_sender: RefCell<Option<mpsc::Sender<Message>>>,
         pub main_sender: RefCell<Option<glib::SyncSender<MainMessage>>>,
@@ -152,11 +152,11 @@ mod imp {
                         glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY,
                     ),
                     glib::ParamSpec::new_enum(
-                        "mode",
-                        "Mode",
-                        "The verification mode used",
-                        Mode::static_type(),
-                        Mode::default() as i32,
+                        "state",
+                        "State",
+                        "The current state of this verification",
+                        State::static_type(),
+                        State::default() as i32,
                         glib::ParamFlags::READABLE | glib::ParamFlags::EXPLICIT_NOTIFY,
                     ),
                     glib::ParamSpec::new_flags(
@@ -221,7 +221,7 @@ mod imp {
             match pspec.name() {
                 "user" => obj.user().to_value(),
                 "session" => obj.session().to_value(),
-                "mode" => obj.mode().to_value(),
+                "state" => obj.state().to_value(),
                 "display-name" => obj.display_name().to_value(),
                 "flow-id" => obj.flow_id().to_value(),
                 "supported-methods" => obj.supported_methods().to_value(),
@@ -246,7 +246,7 @@ mod imp {
                         MainMessage::CancelInfo(data) => priv_.cancel_info.set(data).unwrap(),
                         MainMessage::SasData(data) => priv_.sas_data.set(data).unwrap(),
                         MainMessage::SupportedMethods(flags) => priv_.supported_methods.set(flags),
-                        MainMessage::Mode(mode) => obj.set_mode(mode),
+                        MainMessage::State(state) => obj.set_state(state),
                     }
 
                     glib::Continue(true)
@@ -283,9 +283,14 @@ glib::wrapper! {
 }
 
 impl IdentityVerification {
-    fn for_mode(mode: Mode, session: &Session, user: &User, start_time: &glib::DateTime) -> Self {
+    fn for_state(
+        state: State,
+        session: &Session,
+        user: &User,
+        start_time: &glib::DateTime,
+    ) -> Self {
         glib::Object::new(&[
-            ("mode", &mode),
+            ("state", &state),
             ("session", session),
             ("user", user),
             ("start-time", start_time),
@@ -332,7 +337,7 @@ impl IdentityVerification {
                         &glib::DateTime::new_now_local().unwrap(),
                     );
 
-                    obj.set_mode(Mode::RequestSend);
+                    obj.set_state(State::RequestSend);
                     return obj;
                 }
                 Err(error) => {
@@ -343,8 +348,8 @@ impl IdentityVerification {
             error!("Starting a verification failed: Crypto identity wasn't found");
         }
 
-        Self::for_mode(
-            Mode::Error,
+        Self::for_state(
+            State::Error,
             session,
             user,
             &glib::DateTime::new_now_local().unwrap(),
@@ -374,7 +379,7 @@ impl IdentityVerification {
             {
                 context.start().await
             } else {
-                Ok(Mode::Error)
+                Ok(State::Error)
             }
         });
 
@@ -384,11 +389,11 @@ impl IdentityVerification {
             if let Some(obj) = weak_obj.upgrade() {
                 let priv_ = imp::IdentityVerification::from_instance(&obj);
                 match result {
-                    Ok(result) => obj.set_mode(result),
+                    Ok(result) => obj.set_state(result),
                     Err(error) => {
                         // FIXME: report error to the user
                         error!("Verification failed: {}", error);
-                        obj.set_mode(Mode::Error);
+                        obj.set_state(State::Error);
                     }
                 }
                 priv_.sync_sender.take();
@@ -495,32 +500,32 @@ impl IdentityVerification {
         }
     }
 
-    pub fn mode(&self) -> Mode {
+    pub fn state(&self) -> State {
         let priv_ = imp::IdentityVerification::from_instance(self);
-        priv_.mode.get()
+        priv_.state.get()
     }
 
-    fn set_mode(&self, mode: Mode) {
+    fn set_state(&self, state: State) {
         let priv_ = imp::IdentityVerification::from_instance(self);
 
-        if self.mode() == mode {
+        if self.state() == state {
             return;
         }
 
-        match mode {
-            Mode::Cancelled | Mode::Error => self.show_error(),
+        match state {
+            State::Cancelled | State::Error => self.show_error(),
             _ => {}
         }
 
-        priv_.mode.set(mode);
-        self.notify("mode");
+        priv_.state.set(state);
+        self.notify("state");
     }
 
     /// Whether this request is finished
     pub fn is_finished(&self) -> bool {
         matches!(
-            self.mode(),
-            Mode::Error | Mode::Cancelled | Mode::Dismissed | Mode::Completed | Mode::Passive
+            self.state(),
+            State::Error | State::Cancelled | State::Dismissed | State::Completed | State::Passive
         )
     }
 
@@ -649,7 +654,7 @@ impl IdentityVerification {
     }
 
     pub fn dismiss(&self) {
-        self.set_mode(Mode::Dismissed);
+        self.set_state(State::Dismissed);
     }
 
     /// Get information about why the request was cancelled
@@ -688,7 +693,7 @@ macro_rules! wait {
                 }
 
                 if $this.request.is_passive() {
-                    return Ok(Mode::Passive);
+                    return Ok(State::Passive);
                 }
 
                 $(
@@ -702,7 +707,7 @@ macro_rules! wait {
                         if let Some(info) = $this.request.cancel_info() {
                             $this.send_cancel_info(info);
                         }
-                        return Ok(Mode::Cancelled);
+                        return Ok(State::Cancelled);
                     },
                     Message::UserAction(UserAction::Cancel) | Message::UserAction(UserAction::NotMatch) => {
                         return Ok($this.cancel_request().await?);
@@ -719,7 +724,7 @@ macro_rules! wait {
                     },
                     Message::UserAction(UserAction::Match) => {
                         if $this.request.is_passive() {
-                            return Ok(Mode::Passive);
+                            return Ok(State::Passive);
                         }
 
                         // Break only if we are in the expected state
@@ -746,7 +751,7 @@ macro_rules! wait_without_scanning_sas {
         {
             loop {
                 if $this.request.is_passive() {
-                    return Ok(Mode::Passive);
+                    return Ok(State::Passive);
                 }
 
                 $(
@@ -760,7 +765,7 @@ macro_rules! wait_without_scanning_sas {
                         if let Some(info) = $this.request.cancel_info() {
                             $this.send_cancel_info(info);
                         }
-                        return Ok(Mode::Cancelled);
+                        return Ok(State::Cancelled);
                     },
                     Message::UserAction(UserAction::Cancel) => {
                         return Ok($this.cancel_request().await?);
@@ -775,7 +780,7 @@ macro_rules! wait_without_scanning_sas {
                     },
                     Message::UserAction(UserAction::Match) => {
                         if $this.request.is_passive() {
-                            return Ok(Mode::Passive);
+                            return Ok(State::Passive);
                         }
 
                         // Break only if we are in the expected state
@@ -811,8 +816,8 @@ impl Context {
         })
     }
 
-    fn send_mode(&self, mode: Mode) {
-        self.main_sender.send(MainMessage::Mode(mode)).unwrap();
+    fn send_state(&self, state: State) {
+        self.main_sender.send(MainMessage::State(state)).unwrap();
     }
 
     fn send_qr_code(&self, qr_code: QrCode) {
@@ -835,13 +840,13 @@ impl Context {
             .unwrap();
     }
 
-    async fn start(mut self) -> Result<Mode, RequestVerificationError> {
+    async fn start(mut self) -> Result<State, RequestVerificationError> {
         if self.request.we_started() {
             wait![self, self.request.is_ready()];
         } else {
             // Check if it was started by somebody else already
             if self.request.is_passive() {
-                return Ok(Mode::Passive);
+                return Ok(State::Passive);
             }
 
             // Wait for the user to accept or cancel the request
@@ -878,14 +883,14 @@ impl Context {
             if let Ok(qr_code) = request.to_qr_code() {
                 self.send_qr_code(qr_code);
             } else {
-                return Ok(Mode::Error);
+                return Ok(State::Error);
             }
 
-            self.send_mode(Mode::QrV1Show);
+            self.send_state(State::QrV1Show);
 
             request
         } else if supported_methods.contains(SupportedMethods::QR_SCAN) {
-            self.send_mode(Mode::QrV1Scan);
+            self.send_state(State::QrV1Scan);
 
             // Wait for scanned data
             wait![self];
@@ -900,13 +905,13 @@ impl Context {
 
         wait![self, request.is_done()];
 
-        Ok(Mode::Completed)
+        Ok(State::Completed)
     }
 
     async fn finish_scanning(
         mut self,
         data: QrVerificationData,
-    ) -> Result<Mode, RequestVerificationError> {
+    ) -> Result<State, RequestVerificationError> {
         let request = self
             .request
             .scan_qr_code(data)
@@ -918,10 +923,10 @@ impl Context {
 
         wait_without_scanning_sas![self, request.is_done()];
 
-        Ok(Mode::Completed)
+        Ok(State::Completed)
     }
 
-    async fn start_sas(self) -> Result<Mode, RequestVerificationError> {
+    async fn start_sas(self) -> Result<State, RequestVerificationError> {
         let request = self
             .request
             .start_sas()
@@ -935,7 +940,7 @@ impl Context {
     async fn continue_sas(
         mut self,
         request: SasVerification,
-    ) -> Result<Mode, RequestVerificationError> {
+    ) -> Result<State, RequestVerificationError> {
         request.accept().await?;
 
         wait_without_scanning_sas![self, request.can_be_presented()];
@@ -945,11 +950,11 @@ impl Context {
         } else if let Some(decimal) = request.decimals() {
             SasData::Decimal(decimal)
         } else {
-            return Ok(Mode::Error);
+            return Ok(State::Error);
         };
 
         self.send_sas_data(sas_data);
-        self.send_mode(Mode::SasV1);
+        self.send_state(State::SasV1);
 
         // Wait for match user action
         wait_without_scanning_sas![self];
@@ -958,16 +963,16 @@ impl Context {
 
         wait_without_scanning_sas![self, request.is_done()];
 
-        Ok(Mode::Completed)
+        Ok(State::Completed)
     }
 
-    async fn cancel_request(self) -> Result<Mode, RequestVerificationError> {
+    async fn cancel_request(self) -> Result<State, RequestVerificationError> {
         self.request.cancel().await?;
 
         if let Some(info) = self.request.cancel_info() {
             self.send_cancel_info(info);
         }
 
-        Ok(Mode::Cancelled)
+        Ok(State::Cancelled)
     }
 }
diff --git a/src/session/verification/mod.rs b/src/session/verification/mod.rs
index aa355ff5..39a1b57f 100644
--- a/src/session/verification/mod.rs
+++ b/src/session/verification/mod.rs
@@ -1,7 +1,7 @@
 mod identity_verification;
 mod verification_list;
 
-pub use self::identity_verification::{IdentityVerification, Mode as VerificationMode, SasData};
+pub use self::identity_verification::{IdentityVerification, SasData, State as VerificationState};
 pub use self::verification_list::{FlowId, VerificationList};
 
 use std::time::Duration;
diff --git a/src/session/verification/verification_list.rs b/src/session/verification/verification_list.rs
index 8363fb4d..d3f9830e 100644
--- a/src/session/verification/verification_list.rs
+++ b/src/session/verification/verification_list.rs
@@ -207,7 +207,7 @@ impl VerificationList {
             let mut list = priv_.list.borrow_mut();
             let length = list.len();
             request.connect_notify_local(
-                Some("mode"),
+                Some("state"),
                 clone!(@weak self as obj => move |request, _| {
                     if request.is_finished() {
                         obj.remove(request);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]