IMAP: New folders will now adopt default mail attributes.

* Added a function CopyMailFolderAttributes() that copies the attribute
  layout from the text/x-email default query folder.
* This using the new CopyAttributes() method in libshared that is pretty
  much a copy of a similar method from copyattr. However, I did not
  replace the latter, as that one allows for more fine grained error
  reporting (and attribute filtering).
* Closes ticket #3498.
This commit is contained in:
Axel Dörfler
2016-01-14 21:00:38 +01:00
parent 4681e405ef
commit 618cc43b64
7 changed files with 119 additions and 2 deletions
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2011, Haiku, Inc. All rights reserved. * Copyright 2011-2016, Haiku, Inc. All rights reserved.
* Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved. * Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved.
*/ */
#ifndef ZOIDBERG_GARGOYLE_MAIL_UTIL_H #ifndef ZOIDBERG_GARGOYLE_MAIL_UTIL_H
@@ -102,5 +102,7 @@ void extract_address_name(BString &address);
void get_address_list(BList &list, const char *string, void get_address_list(BList &list, const char *string,
void (*cleanupFunc)(BString &) = NULL); void (*cleanupFunc)(BString &) = NULL);
status_t CopyMailFolderAttributes(const char* targetPath);
#endif /* ZOIDBERG_GARGOYLE_MAIL_UTIL_H */ #endif /* ZOIDBERG_GARGOYLE_MAIL_UTIL_H */
@@ -0,0 +1,24 @@
/*
* Copyright 2016 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef ATTRIBUTE_UTILITIES_H
#define ATTRIBUTE_UTILITIES_H
#include <SupportDefs.h>
class BNode;
namespace BPrivate {
status_t CopyAttributes(BNode& source, BNode& destination);
} // namespace BPrivate
#endif // ATTRIBUTE_UTILITIES_H
@@ -13,6 +13,8 @@
#include "IMAPFolder.h" #include "IMAPFolder.h"
#include "Utilities.h" #include "Utilities.h"
#include <mail_util.h>
IMAPProtocol::IMAPProtocol(const BMailAccountSettings& settings) IMAPProtocol::IMAPProtocol(const BMailAccountSettings& settings)
: :
@@ -280,6 +282,8 @@ IMAPProtocol::_CreateFolder(const BString& mailbox, const BString& separator)
return NULL; return NULL;
} }
CopyMailFolderAttributes(path.Path());
entry_ref ref; entry_ref ref;
status = get_ref_for_path(path.Path(), &ref); status = get_ref_for_path(path.Path(), &ref);
if (status != B_OK) { if (status != B_OK) {
+1 -1
View File
@@ -58,7 +58,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
SharedLibrary $(libmail) : SharedLibrary $(libmail) :
$(sources) $(sources)
: :
be bnetapi textencoding tracker be bnetapi textencoding tracker libshared.a
[ TargetLibstdc++ ] [ TargetLibstdc++ ]
$(TARGET_NETWORK_LIBS) $(TARGET_NETWORK_LIBS)
$(TARGET_SELECT_UNAME_ETC_LIB) $(TARGET_SELECT_UNAME_ETC_LIB)
+20
View File
@@ -14,14 +14,17 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <FindDirectory.h>
#include <List.h> #include <List.h>
#include <Locker.h> #include <Locker.h>
#include <parsedate.h> #include <parsedate.h>
#include <Path.h>
#include <String.h> #include <String.h>
#include <UTF8.h> #include <UTF8.h>
#include <mail_encoding.h> #include <mail_encoding.h>
#include <AttributeUtilities.h>
#include <CharacterSet.h> #include <CharacterSet.h>
#include <CharacterSetRoster.h> #include <CharacterSetRoster.h>
@@ -1547,3 +1550,20 @@ get_address_list(BList &list, const char *string,
} }
} }
status_t
CopyMailFolderAttributes(const char* targetPath)
{
BPath path;
status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path);
if (status != B_OK)
return status;
path.Append("Tracker");
path.Append("DefaultQueryTemplates");
path.Append("text_x-email");
BNode source(path.Path());
BNode target(targetPath);
return BPrivate::CopyAttributes(source, target);
}
+66
View File
@@ -0,0 +1,66 @@
/*
* Copyright 2005-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2016, Axel Dörfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*/
#include "AttributeUtilities.h"
#include <fs_attr.h>
#include <Node.h>
#include <StorageDefs.h>
static const int kCopyBufferSize = 64 * 1024;
// 64 KB
namespace BPrivate {
status_t
CopyAttributes(BNode& source, BNode& destination)
{
char attrName[B_ATTR_NAME_LENGTH];
while (source.GetNextAttrName(attrName) == B_OK) {
// get attr info
attr_info attrInfo;
status_t status = source.GetAttrInfo(attrName, &attrInfo);
if (status != B_OK)
return status;
// copy the attribute
char buffer[kCopyBufferSize];
off_t offset = 0;
off_t bytesLeft = attrInfo.size;
// Go at least once through the loop, so that an empty attribute will be
// created as well
do {
size_t toRead = kCopyBufferSize;
if ((off_t)toRead > bytesLeft)
toRead = bytesLeft;
// read
ssize_t bytesRead = source.ReadAttr(attrName, attrInfo.type,
offset, buffer, toRead);
if (bytesRead < 0)
return bytesRead;
// write
ssize_t bytesWritten = destination.WriteAttr(attrName,
attrInfo.type, offset, buffer, bytesRead);
if (bytesWritten < 0)
return bytesWritten;
bytesLeft -= bytesRead;
offset += bytesRead;
} while (bytesLeft > 0);
}
return B_OK;
}
} // namespace BPrivate
+1
View File
@@ -29,6 +29,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
StaticLibrary [ MultiArchDefaultGristFiles libshared.a ] : StaticLibrary [ MultiArchDefaultGristFiles libshared.a ] :
AboutMenuItem.cpp AboutMenuItem.cpp
ArgumentVector.cpp ArgumentVector.cpp
AttributeUtilities.cpp
CalendarView.cpp CalendarView.cpp
ColorQuantizer.cpp ColorQuantizer.cpp
CommandPipe.cpp CommandPipe.cpp