added small static content replay (channels will follow)
authorpk910 <philipp@zoelle1.de>
Thu, 10 May 2012 12:01:18 +0000 (14:01 +0200)
committerpk910 <philipp@zoelle1.de>
Thu, 10 May 2012 23:33:59 +0000 (01:33 +0200)
src/IRCClient.c
src/IRCClient.h
src/UserClient.c

index 46e030ea45ff47600042dbf9d21dc9a76ed2ae7a..eb91bafdbf684f3e6671269bb03c2dcbdfd6c61f 100644 (file)
@@ -53,6 +53,12 @@ void ircclient_close(struct IRCClient *client) {
     client->session->irc = NULL;
     iohandler_printf(client->iofd, "QUIT :[TransparentIRC] Quit");
     iohandler_close(client->iofd);
     client->session->irc = NULL;
     iohandler_printf(client->iofd, "QUIT :[TransparentIRC] Quit");
     iohandler_close(client->iofd);
+    struct IRCLine *recover_line, *next_line;
+    for(recover_line = client->recover_header; recover_line; recover_line = next_line) {
+        next_line = recover_line->next;
+        free(recover_line->line);
+        free(recover_line);
+    }
     free(client);
 }
 
     free(client);
 }
 
@@ -85,7 +91,29 @@ static void ircclient_recv(struct IRCClient *client, char *line) {
             pass_to_client = 0;
         }
     } else {
             pass_to_client = 0;
         }
     } else {
-        
+        if(!stricmp(argv[1], "001") ||
+            !stricmp(argv[1], "002") ||
+            !stricmp(argv[1], "003") ||
+            !stricmp(argv[1], "004") ||
+            !stricmp(argv[1], "005") ||
+            !stricmp(argv[1], "375") ||
+            !stricmp(argv[1], "372") ||
+            !stricmp(argv[1], "376")
+          ) {
+            //save these raw's for recovering the connection later
+            struct IRCLine *recover_line = NULL, *new_line;
+            if(client->recover_header)
+                for(recover_line = client->recover_header; recover_line->next; recover_line = recover_line->next) {};
+            new_line = malloc(sizeof(*new_line));
+            if(new_line) {
+                new_line->line = strdup(line);
+                new_line->next = NULL;
+                if(recover_line)
+                    recover_line->next = new_line;
+                else
+                    client->recover_header = new_line;
+            }
+        }
     }
     if(pass_to_client)
         usersession_client_raw(session, line);
     }
     if(pass_to_client)
         usersession_client_raw(session, line);
@@ -114,3 +142,13 @@ static void ircclient_callback(struct IOEvent *event) {
 void ircclient_send(struct IRCClient *client, char *line) {
     iohandler_printf(client->iofd, "%s", line);
 }
 void ircclient_send(struct IRCClient *client, char *line) {
     iohandler_printf(client->iofd, "%s", line);
 }
+
+void ircclient_recover_session(struct UserSession *session) {
+    struct IRCClient *client = session->irc;
+    //replay header
+    struct IRCLine *recover_line;
+    for(recover_line = client->recover_header; recover_line; recover_line = recover_line->next) {
+        usersession_client_raw(session, recover_line->line);
+    }
+    
+}
index a6b2f4c5a2a584e4f7a36969965a982b4241be5a..00c3180f9cc38c4215c68d37115c23fa0417a8b0 100644 (file)
@@ -25,16 +25,22 @@ struct UserLogin;
 
 struct IRCClient {
     struct IODescriptor *iofd;
 
 struct IRCClient {
     struct IODescriptor *iofd;
-    
     struct UserSession *session;
     
     int auth_confirmed : 1;
     struct UserSession *session;
     
     int auth_confirmed : 1;
+    struct IRCLine *recover_header;
     
     struct IRCClient *next, *prev;
 };
 
     
     struct IRCClient *next, *prev;
 };
 
+struct IRCLine {
+    char *line;
+    struct IRCLine *next;
+};
+
 void ircclient_initialize(struct UserSession *session, struct UserLogin *login);
 void ircclient_close(struct IRCClient *client);
 void ircclient_send(struct IRCClient *client, char *line);
 void ircclient_initialize(struct UserSession *session, struct UserLogin *login);
 void ircclient_close(struct IRCClient *client);
 void ircclient_send(struct IRCClient *client, char *line);
+void ircclient_recover_session(struct UserSession *session);
 
 #endif
 
 #endif
index d6c0ca564f0c14dd58b63e296f127880221b867f..bb43793981b87fa6fdadf84f9d64aa5670fd2085 100644 (file)
@@ -176,8 +176,7 @@ void userclient_login_successful(struct UserLogin *login, struct UserSession *se
     client->flags |= USERCLIENT_LOGGED_IN;
     if(recover) {
         iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] Recovering previous link (Nick: %s).", session->nick);
     client->flags |= USERCLIENT_LOGGED_IN;
     if(recover) {
         iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] Recovering previous link (Nick: %s).", session->nick);
-        
-        
+        ircclient_recover_session(session);
     }
 }
 
     }
 }