more fixes for double byte folder names, including create and rename, r=putterman,jefft

This commit is contained in:
bienvenu%netscape.com 2000-02-08 01:20:00 +00:00
Родитель bd07ef4b98
Коммит 85ee28a198
16 изменённых файлов: 75 добавлений и 64 удалений

Просмотреть файл

@ -80,10 +80,10 @@ interface nsIMessenger : nsISupports {
void NewFolder(in nsIRDFCompositeDataSource database, void NewFolder(in nsIRDFCompositeDataSource database,
in nsIRDFResource parentFolder, in nsIRDFResource parentFolder,
in string name); in wstring name);
void RenameFolder(in nsIRDFCompositeDataSource db, void RenameFolder(in nsIRDFCompositeDataSource db,
in nsIRDFResource folder, in string name); in nsIRDFResource folder, in wstring name);
void CompactFolder(in nsIRDFCompositeDataSource db, void CompactFolder(in nsIRDFCompositeDataSource db,
in nsIRDFResource folder); in nsIRDFResource folder);
void EmptyTrash(in nsIRDFCompositeDataSource db, void EmptyTrash(in nsIRDFCompositeDataSource db,

Просмотреть файл

@ -132,7 +132,7 @@ interface nsIMsgFolder : nsIFolder {
* *
* @param name the new name of the folder * @param name the new name of the folder
*/ */
void rename(in string name); void rename(in wstring name);
void adopt(in nsIMsgFolder srcFolder, out unsigned long outPos); void adopt(in nsIMsgFolder srcFolder, out unsigned long outPos);
/** /**

Просмотреть файл

@ -848,7 +848,7 @@ nsMessenger::MarkMessagesFlagged(nsIRDFCompositeDataSource *database,
NS_IMETHODIMP NS_IMETHODIMP
nsMessenger::NewFolder(nsIRDFCompositeDataSource *database, nsIRDFResource *parentFolderResource, nsMessenger::NewFolder(nsIRDFCompositeDataSource *database, nsIRDFResource *parentFolderResource,
const char *name) const PRUnichar *name)
{ {
nsresult rv; nsresult rv;
nsCOMPtr<nsISupportsArray> nameArray, folderArray; nsCOMPtr<nsISupportsArray> nameArray, folderArray;
@ -884,23 +884,25 @@ nsMessenger::NewFolder(nsIRDFCompositeDataSource *database, nsIRDFResource *pare
NS_IMETHODIMP NS_IMETHODIMP
nsMessenger::RenameFolder(nsIRDFCompositeDataSource* db, nsMessenger::RenameFolder(nsIRDFCompositeDataSource* db,
nsIRDFResource* folderResource, nsIRDFResource* folderResource,
const char* name) const PRUnichar* name)
{ {
nsresult rv = NS_ERROR_NULL_POINTER; nsresult rv = NS_ERROR_NULL_POINTER;
if (!db || !folderResource || !name || !*name) return rv; if (!db || !folderResource || !name || !*name) return rv;
nsCOMPtr<nsISupports> streamSupport;
rv = NS_NewCharInputStream(getter_AddRefs(streamSupport), name);
if (NS_SUCCEEDED(rv))
{
nsCOMPtr<nsISupportsArray> folderArray; nsCOMPtr<nsISupportsArray> folderArray;
nsCOMPtr<nsISupportsArray> argsArray; nsCOMPtr<nsISupportsArray> argsArray;
rv = NS_NewISupportsArray(getter_AddRefs(folderArray)); rv = NS_NewISupportsArray(getter_AddRefs(folderArray));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
folderArray->AppendElement(folderResource); folderArray->AppendElement(folderResource);
rv = NS_NewISupportsArray(getter_AddRefs(argsArray)); rv = NS_NewISupportsArray(getter_AddRefs(argsArray));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
argsArray->AppendElement(streamSupport); NS_WITH_SERVICE(nsIRDFService, rdfService, kRDFServiceCID, &rv);
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIRDFLiteral> nameLiteral;
rdfService->GetLiteral(name, getter_AddRefs(nameLiteral));
argsArray->AppendElement(nameLiteral);
rv = DoCommand(db, NC_RDF_RENAME, folderArray, argsArray); rv = DoCommand(db, NC_RDF_RENAME, folderArray, argsArray);
} }
return rv; return rv;

Просмотреть файл

@ -678,28 +678,16 @@ nsMsgFolderDataSource::DoCommand(nsISupportsArray/*<nsIRDFResource>*/* aSources,
} }
else if ((aCommand == kNC_Rename)) else if ((aCommand == kNC_Rename))
{ {
nsCOMPtr<nsISupports> streamSupport = getter_AddRefs(aArguments->ElementAt(0)); nsCOMPtr<nsISupports> elem = getter_AddRefs(aArguments->ElementAt(0));
if (streamSupport) nsCOMPtr<nsIRDFLiteral> literal = do_QueryInterface(elem, &rv);
{ if(NS_SUCCEEDED(rv))
nsCOMPtr<nsIInputStream> charInputStream = do_QueryInterface(streamSupport); {
if (charInputStream) PRUnichar *name;
{ literal->GetValue(&name);
PRUint32 length = 0;
rv = charInputStream->Available(&length); rv = folder->Rename(name);
if (NS_SUCCEEDED(rv) && length > 0) PR_FREEIF(name);
{ }
char *newName = (char*) PR_MALLOC(length+1);
PRUint32 readCount = 0;
rv = charInputStream->Read(newName, length, &readCount);
if(NS_SUCCEEDED(rv) && readCount > 0)
{
newName[readCount] = 0;
rv = folder->Rename(newName);
}
PR_FREEIF(newName);
}
}
}
} }
} }
} }

Просмотреть файл

@ -735,10 +735,13 @@ NS_IMETHODIMP nsMsgFolder::GetName(PRUnichar **name)
NS_IMETHODIMP nsMsgFolder::SetName(const PRUnichar * name) NS_IMETHODIMP nsMsgFolder::SetName(const PRUnichar * name)
{ {
// override the URI-generated name // override the URI-generated name
mName = name; if (!mName.Equals(name))
{
mName = name;
// old/new value doesn't matter here // old/new value doesn't matter here
NotifyUnicharPropertyChanged(kNameAtom, name, name); NotifyUnicharPropertyChanged(kNameAtom, name, name);
}
return NS_OK; return NS_OK;
} }
@ -1034,7 +1037,7 @@ NS_IMETHODIMP nsMsgFolder::EmptyTrash()
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
} }
NS_IMETHODIMP nsMsgFolder::Rename(const char *name) NS_IMETHODIMP nsMsgFolder::Rename(const PRUnichar *name)
{ {
nsresult status = NS_OK; nsresult status = NS_OK;
nsAutoString2 unicharString(name); nsAutoString2 unicharString(name);

Просмотреть файл

@ -92,7 +92,7 @@ public:
NS_IMETHOD AddSubfolder(nsAutoString *folderName, nsIMsgFolder **newFolder); NS_IMETHOD AddSubfolder(nsAutoString *folderName, nsIMsgFolder **newFolder);
NS_IMETHOD Compact(void); NS_IMETHOD Compact(void);
NS_IMETHOD EmptyTrash(void); NS_IMETHOD EmptyTrash(void);
NS_IMETHOD Rename(const char *name); NS_IMETHOD Rename(const PRUnichar *name);
NS_IMETHOD Adopt(nsIMsgFolder *srcFolder, PRUint32 *outPos); NS_IMETHOD Adopt(nsIMsgFolder *srcFolder, PRUint32 *outPos);
NS_IMETHOD ContainsChildNamed(const char *name, PRBool *_retval); NS_IMETHOD ContainsChildNamed(const char *name, PRBool *_retval);
NS_IMETHOD IsAncestorOf(nsIMsgFolder *folder, PRBool *_retval); NS_IMETHOD IsAncestorOf(nsIMsgFolder *folder, PRBool *_retval);

Просмотреть файл

@ -61,4 +61,5 @@ interface nsIImapIncomingServer : nsISupports {
void ResetNamespaceReferences(); void ResetNamespaceReferences();
void PseudoInterruptMsgLoad(in nsIImapUrl aImapUrl, out boolean interrupted); void PseudoInterruptMsgLoad(in nsIImapUrl aImapUrl, out boolean interrupted);
void ResetConnection(in string folderName); void ResetConnection(in string folderName);
void CreatePRUnicharStringFromUTF7(in string aSourceString, out wstring aUnicodeStr);
}; };

Просмотреть файл

@ -166,7 +166,7 @@ public:
nsIURI** aUrl) = 0; nsIURI** aUrl) = 0;
NS_IMETHOD RenameLeaf(nsIEventQueue* aClientEventQ, NS_IMETHOD RenameLeaf(nsIEventQueue* aClientEventQ,
nsIMsgFolder* srcFolder, nsIMsgFolder* srcFolder,
const char* leafName, const PRUnichar* leafName,
nsIUrlListener* urlListener, nsIUrlListener* urlListener,
nsIURI** url) = 0; nsIURI** url) = 0;
NS_IMETHOD DeleteFolder(nsIEventQueue* aClientEventQ, NS_IMETHOD DeleteFolder(nsIEventQueue* aClientEventQ,

Просмотреть файл

@ -1507,7 +1507,7 @@ NS_IMETHODIMP nsImapIncomingServer::RemoveChannelFromUrl(nsIMsgMailNewsUrl *aUrl
return rv; return rv;
} }
nsresult nsImapIncomingServer::CreatePRUnicharStringFromUTF7(const char * aSourceString, PRUnichar **aUnicodeStr) NS_IMETHODIMP nsImapIncomingServer::CreatePRUnicharStringFromUTF7(const char * aSourceString, PRUnichar **aUnicodeStr)
{ {
PRUnichar *convertedString = NULL; PRUnichar *convertedString = NULL;
nsresult res; nsresult res;

Просмотреть файл

@ -61,8 +61,6 @@ protected:
PRBool NoDescendentsAreVerified(nsIFolder *parentFolder); PRBool NoDescendentsAreVerified(nsIFolder *parentFolder);
PRBool AllDescendentsAreNoSelect(nsIFolder *parentFolder); PRBool AllDescendentsAreNoSelect(nsIFolder *parentFolder);
nsresult CreatePRUnicharStringFromUTF7(const char * aSourceString, PRUnichar **aUnicodeStr);
private: private:
nsresult CreateImapConnection (nsIEventQueue* aEventQueue, nsresult CreateImapConnection (nsIEventQueue* aEventQueue,
nsIImapUrl* aImapUrl, nsIImapUrl* aImapUrl,

Просмотреть файл

@ -287,6 +287,12 @@ nsresult nsImapMailFolder::CreateSubFolders(nsFileSpec &path)
nsAutoString currentFolderNameStr; // online name nsAutoString currentFolderNameStr; // online name
nsAutoString currentFolderDBNameStr; // possibly munged name nsAutoString currentFolderDBNameStr; // possibly munged name
nsCOMPtr<nsIMsgFolder> child; nsCOMPtr<nsIMsgFolder> child;
nsCOMPtr<nsIMsgIncomingServer> server;
nsCOMPtr<nsIImapIncomingServer> imapServer;
if (NS_SUCCEEDED(GetServer(getter_AddRefs(server))) && server)
imapServer = do_QueryInterface(server);
char *folderName; char *folderName;
for (nsDirectoryIterator dir(path, PR_FALSE); dir.Exists(); dir++) for (nsDirectoryIterator dir(path, PR_FALSE); dir.Exists(); dir++)
{ {
@ -321,11 +327,19 @@ nsresult nsImapMailFolder::CreateSubFolders(nsFileSpec &path)
rv = cacheElement->GetStringProperty("onlineName", getter_Copies(onlineName)); rv = cacheElement->GetStringProperty("onlineName", getter_Copies(onlineName));
if (NS_SUCCEEDED(rv) && (const char *) onlineName && nsCRT::strlen((const char *) onlineName)) if (NS_SUCCEEDED(rv) && (const char *) onlineName && nsCRT::strlen((const char *) onlineName))
{ {
currentFolderNameStr = onlineName; if (imapServer)
{
nsXPIDLString nonUtf7Name;
imapServer->CreatePRUnicharStringFromUTF7(onlineName, getter_Copies(nonUtf7Name));
currentFolderNameStr = nonUtf7Name;
}
else
currentFolderNameStr = onlineName;
PRInt32 leafPos = currentFolderNameStr.RFindChar('/'); PRInt32 leafPos = currentFolderNameStr.RFindChar('/');
if (leafPos > 0) if (leafPos > 0)
currentFolderNameStr.Cut(0, leafPos + 1); currentFolderNameStr.Cut(0, leafPos + 1);
} }
} }
} }
@ -856,11 +870,12 @@ NS_IMETHODIMP nsImapMailFolder::Delete ()
return rv; return rv;
} }
NS_IMETHODIMP nsImapMailFolder::Rename (const char *newName) NS_IMETHODIMP nsImapMailFolder::Rename (const PRUnichar *newName)
{ {
nsresult rv = NS_ERROR_FAILURE; nsresult rv = NS_ERROR_FAILURE;
char *utf7Name = CreateUtf7ConvertedStringFromUnicode(newName);
rv = RenameLocal(newName); rv = RenameLocal(utf7Name);
nsCRT::free(utf7Name);
NS_WITH_SERVICE (nsIImapService, imapService, kCImapService, &rv); NS_WITH_SERVICE (nsIImapService, imapService, kCImapService, &rv);
if (NS_SUCCEEDED(rv)) if (NS_SUCCEEDED(rv))

Просмотреть файл

@ -122,7 +122,7 @@ public:
NS_IMETHOD Compact(); NS_IMETHOD Compact();
NS_IMETHOD EmptyTrash(); NS_IMETHOD EmptyTrash();
NS_IMETHOD Delete (); NS_IMETHOD Delete ();
NS_IMETHOD Rename (const char *newName); NS_IMETHOD Rename (const PRUnichar *newName);
NS_IMETHOD Adopt(nsIMsgFolder *srcFolder, PRUint32 *outPos); NS_IMETHOD Adopt(nsIMsgFolder *srcFolder, PRUint32 *outPos);
NS_IMETHOD GetPrettyName(PRUnichar ** prettyName); // Override of the base, for top-level mail folder NS_IMETHOD GetPrettyName(PRUnichar ** prettyName); // Override of the base, for top-level mail folder

Просмотреть файл

@ -1825,10 +1825,10 @@ void nsImapProtocol::ProcessSelectedStateURL()
char *canonicalName = NULL; char *canonicalName = NULL;
if (nameStruct) if (nameStruct)
{ {
const char *mailboxName = GetServerStateParser().GetSelectedMailboxName(); const char *selectedMailboxName = GetServerStateParser().GetSelectedMailboxName();
if (mailboxName ) if (selectedMailboxName )
{ {
m_runningUrl->AllocateCanonicalPath(mailboxName, m_runningUrl->AllocateCanonicalPath(selectedMailboxName,
kOnlineHierarchySeparatorUnknown, &canonicalName); kOnlineHierarchySeparatorUnknown, &canonicalName);
} }
} }
@ -5105,17 +5105,15 @@ void nsImapProtocol::FolderRenamed(const char *oldName,
(m_hierarchyNameState == kListingForInfoAndDiscovery)) (m_hierarchyNameState == kListingForInfoAndDiscovery))
{ {
char *oldName, *newName; nsXPIDLCString canonicalOldName, canonicalNewName;
m_runningUrl->AllocateCanonicalPath(oldName, m_runningUrl->AllocateCanonicalPath(oldName,
onlineDelimiter, onlineDelimiter,
&oldName); getter_Copies(canonicalOldName));
m_runningUrl->AllocateCanonicalPath(newName, m_runningUrl->AllocateCanonicalPath(newName,
onlineDelimiter, onlineDelimiter,
&newName); getter_Copies(canonicalNewName));
m_imapServerSink->OnlineFolderRename(oldName, newName); m_imapServerSink->OnlineFolderRename(canonicalOldName, canonicalNewName);
PR_FREEIF (oldName);
PR_FREEIF(newName);
} }
} }

Просмотреть файл

@ -1553,7 +1553,7 @@ nsImapService::MoveFolder(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder,
NS_IMETHODIMP NS_IMETHODIMP
nsImapService::RenameLeaf(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder, nsImapService::RenameLeaf(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder,
const char* newLeafName, nsIUrlListener* urlListener, const PRUnichar* newLeafName, nsIUrlListener* urlListener,
nsIURI** url) nsIURI** url)
{ {
NS_ASSERTION(eventQueue && srcFolder && newLeafName && *newLeafName, NS_ASSERTION(eventQueue && srcFolder && newLeafName && *newLeafName,
@ -1581,6 +1581,9 @@ nsImapService::RenameLeaf(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder,
urlSpec.Append((const char *) folderName); urlSpec.Append((const char *) folderName);
urlSpec.Append('>'); urlSpec.Append('>');
urlSpec.Append(hierarchySeparator); urlSpec.Append(hierarchySeparator);
char *utfNewName = CreateUtf7ConvertedStringFromUnicode( newLeafName);
nsCAutoString cStrFolderName = (const char *) folderName; nsCAutoString cStrFolderName = (const char *) folderName;
PRInt32 leafNameStart = PRInt32 leafNameStart =
cStrFolderName.RFindChar('/'); // ** troublesome hierarchyseparator cStrFolderName.RFindChar('/'); // ** troublesome hierarchyseparator
@ -1589,7 +1592,11 @@ nsImapService::RenameLeaf(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder,
cStrFolderName.SetLength(leafNameStart+1); cStrFolderName.SetLength(leafNameStart+1);
urlSpec.Append(cStrFolderName.GetBuffer()); urlSpec.Append(cStrFolderName.GetBuffer());
} }
urlSpec.Append(newLeafName);
urlSpec.Append(utfNewName);
nsCRT::free(utfNewName);
rv = uri->SetSpec((char*) urlSpec.GetBuffer()); rv = uri->SetSpec((char*) urlSpec.GetBuffer());
if (NS_SUCCEEDED(rv)) if (NS_SUCCEEDED(rv))
{ {

Просмотреть файл

@ -166,7 +166,7 @@ public:
nsIURI** url); nsIURI** url);
NS_IMETHOD RenameLeaf(nsIEventQueue* eventQueue, NS_IMETHOD RenameLeaf(nsIEventQueue* eventQueue,
nsIMsgFolder* srcFolder, nsIMsgFolder* srcFolder,
const char* leafName, const PRUnichar* leafName,
nsIUrlListener* urlListener, nsIUrlListener* urlListener,
nsIURI** url); nsIURI** url);
NS_IMETHOD DeleteFolder(nsIEventQueue* eventQueue, NS_IMETHOD DeleteFolder(nsIEventQueue* eventQueue,

Просмотреть файл

@ -467,7 +467,6 @@ CreateUtf7ConvertedStringFromUnicode(const PRUnichar * aSourceString)
if(NS_SUCCEEDED(res) && (nsnull != ccm)) if(NS_SUCCEEDED(res) && (nsnull != ccm))
{ {
nsString aCharset("x-imap4-modified-utf7"); nsString aCharset("x-imap4-modified-utf7");
PRUnichar *unichars = nsnull;
PRInt32 unicharLength; PRInt32 unicharLength;
// convert from 8 bit ascii string to modified utf7 // convert from 8 bit ascii string to modified utf7