2008-10-01 [colin] 3.5.0cvs142
[claws.git] / src / imap.c
index f7ed27b3cb5426b7896f40ec6b2dbae3c85989d2..6a9245f12cf579a2bbf45083a3520a9f87289a40 100644 (file)
@@ -557,139 +557,140 @@ static gboolean is_fatal(int libetpan_errcode)
 
 static void imap_handle_error(Session *session, int libetpan_errcode)
 {
+       const gchar *session_server = (session ? session->server:"(null)");
        switch(libetpan_errcode) {
        case MAILIMAP_NO_ERROR:
                return;
        case MAILIMAP_NO_ERROR_AUTHENTICATED:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: authenticated\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: authenticated\n"), session_server);
                break;
        case MAILIMAP_NO_ERROR_NON_AUTHENTICATED:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: not authenticated\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: not authenticated\n"), session_server);
                break;
        case MAILIMAP_ERROR_BAD_STATE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: bad state\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: bad state\n"), session_server);
                break;
        case MAILIMAP_ERROR_STREAM:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: stream error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: stream error\n"), session_server);
                break;
        case MAILIMAP_ERROR_PARSE:
                log_warning(LOG_PROTOCOL, _("IMAP error on %s: parse error "
-                                           "(very probably non-RFC compliance from the server)\n"), session->server);
+                                           "(very probably non-RFC compliance from the server)\n"), session_server);
                break;
        case MAILIMAP_ERROR_CONNECTION_REFUSED:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: connection refused\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: connection refused\n"), session_server);
                break;
        case MAILIMAP_ERROR_MEMORY:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: memory error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: memory error\n"), session_server);
                break;
        case MAILIMAP_ERROR_FATAL:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: fatal error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: fatal error\n"), session_server);
                break;
        case MAILIMAP_ERROR_PROTOCOL:
                log_warning(LOG_PROTOCOL, _("IMAP error on %s: protocol error"
-                                           "(very probably non-RFC compliance from the server)\n"), session->server);
+                                           "(very probably non-RFC compliance from the server)\n"), session_server);
                break;
        case MAILIMAP_ERROR_DONT_ACCEPT_CONNECTION:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: connection not accepted\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: connection not accepted\n"), session_server);
                break;
        case MAILIMAP_ERROR_APPEND:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: APPEND error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: APPEND error\n"), session_server);
                break;
        case MAILIMAP_ERROR_NOOP:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: NOOP error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: NOOP error\n"), session_server);
                break;
        case MAILIMAP_ERROR_LOGOUT:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LOGOUT error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LOGOUT error\n"), session_server);
                break;
        case MAILIMAP_ERROR_CAPABILITY:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CAPABILITY error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CAPABILITY error\n"), session_server);
                break;
        case MAILIMAP_ERROR_CHECK:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CHECK error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CHECK error\n"), session_server);
                break;
        case MAILIMAP_ERROR_CLOSE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CLOSE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CLOSE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_EXPUNGE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXPUNGE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXPUNGE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_COPY:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: COPY error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: COPY error\n"), session_server);
                break;
        case MAILIMAP_ERROR_UID_COPY:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID COPY error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID COPY error\n"), session_server);
                break;
        case MAILIMAP_ERROR_CREATE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CREATE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: CREATE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_DELETE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: DELETE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: DELETE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_EXAMINE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXAMINE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXAMINE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_FETCH:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: FETCH error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: FETCH error\n"), session_server);
                break;
        case MAILIMAP_ERROR_UID_FETCH:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID FETCH error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID FETCH error\n"), session_server);
                break;
        case MAILIMAP_ERROR_LIST:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LIST error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LIST error\n"), session_server);
                break;
        case MAILIMAP_ERROR_LOGIN:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LOGIN error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LOGIN error\n"), session_server);
                break;
        case MAILIMAP_ERROR_LSUB:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LSUB error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: LSUB error\n"), session_server);
                break;
        case MAILIMAP_ERROR_RENAME:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: RENAME error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: RENAME error\n"), session_server);
                break;
        case MAILIMAP_ERROR_SEARCH:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SEARCH error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SEARCH error\n"), session_server);
                break;
        case MAILIMAP_ERROR_UID_SEARCH:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID SEARCH error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID SEARCH error\n"), session_server);
                break;
        case MAILIMAP_ERROR_SELECT:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SELECT error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SELECT error\n"), session_server);
                break;
        case MAILIMAP_ERROR_STATUS:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: STATUS error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: STATUS error\n"), session_server);
                break;
        case MAILIMAP_ERROR_STORE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: STORE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: STORE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_UID_STORE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID STORE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID STORE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_SUBSCRIBE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SUBSCRIBE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SUBSCRIBE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_UNSUBSCRIBE:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UNSUBSCRIBE error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: UNSUBSCRIBE error\n"), session_server);
                break;
        case MAILIMAP_ERROR_STARTTLS:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: STARTTLS error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: STARTTLS error\n"), session_server);
                break;
        case MAILIMAP_ERROR_INVAL:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: INVAL error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: INVAL error\n"), session_server);
                break;
        case MAILIMAP_ERROR_EXTENSION:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXTENSION error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXTENSION error\n"), session_server);
                break;
        case MAILIMAP_ERROR_SASL:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SASL error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SASL error\n"), session_server);
                break;
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
        case MAILIMAP_ERROR_SSL:
-               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SSL error\n"), session->server);
+               log_warning(LOG_PROTOCOL, _("IMAP error on %s: SSL error\n"), session_server);
                break;
 #endif
        default:
                log_warning(LOG_PROTOCOL, _("IMAP error on %s: Unknown error [%d]\n"),
-                       session->server, libetpan_errcode);
+                       session_server, libetpan_errcode);
                break;
        }
 
@@ -2489,28 +2490,48 @@ static gchar *imap_folder_get_path(Folder *folder)
 static gchar *imap_item_get_path(Folder *folder, FolderItem *item)
 {
        gchar *folder_path, *path;
-
+       gchar *item_path = NULL;
+       
        g_return_val_if_fail(folder != NULL, NULL);
        g_return_val_if_fail(item != NULL, NULL);
        folder_path = imap_folder_get_path(folder);
 
        g_return_val_if_fail(folder_path != NULL, NULL);
+       item_path = g_strdup(item->path);
+
+#ifdef G_OS_WIN32
+       if (strchr(item_path, ':') ||
+           strchr(item_path, '|') ||
+           strchr(item_path, '<') ||
+           strchr(item_path, '>') ||
+           strchr(item_path, '*') ||
+           strchr(item_path, '?') ||
+           strchr(item_path, '#') ||
+           strchr(item_path, ':')
+           ) {
+               g_free(item_path);
+               item_path = g_malloc(strlen(item->path)*3 +1);
+               qp_encode_line(item_path, item->path);
+       }
+#endif 
+
         if (g_path_is_absolute(folder_path)) {
-                if (item->path)
+                if (item_path)
                         path = g_strconcat(folder_path, G_DIR_SEPARATOR_S,
-                                           item->path, NULL);
+                                           item_path, NULL);
                 else
                         path = g_strdup(folder_path);
         } else {
-                if (item->path)
+                if (item_path)
                         path = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
                                            folder_path, G_DIR_SEPARATOR_S,
-                                           item->path, NULL);
+                                           item_path, NULL);
                 else
                         path = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
                                            folder_path, NULL);
         }
         g_free(folder_path);
+        g_free(item_path);
 #ifdef G_OS_WIN32
        while (strchr(path, '/'))
                *strchr(path, '/') = '\\';