зеркало из https://github.com/mozilla/pjs.git
250 строки
5.7 KiB
Java
250 строки
5.7 KiB
Java
/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License
|
|
* Version 1.0 (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS"
|
|
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
|
* the License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* The Original Code is the Grendel mail/news client.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
|
* Corporation. Portions created by Netscape are Copyright (C) 1997
|
|
* Netscape Communications Corporation. All Rights Reserved.
|
|
*
|
|
* Created: Eric Bina <ebina@netscape.com>, 30 Oct 1997.
|
|
*/
|
|
|
|
package grendel.storage.addressparser;
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
|
|
class MailboxToken extends AddressToken
|
|
{
|
|
private AddressToken addr_spec, phrase, route_addr;
|
|
private Vector comments;
|
|
private String name, address;
|
|
|
|
public MailboxToken(AddressToken addr_spec)
|
|
{
|
|
this.name = null;
|
|
this.address = null;
|
|
this.comments = null;
|
|
this.addr_spec = addr_spec;
|
|
this.phrase = null;
|
|
this.route_addr = null;
|
|
this.indx1 = addr_spec.getTokenStart();
|
|
this.indx2 = addr_spec.getTokenEnd();
|
|
this.token_type = AddressToken.MAILBOX;
|
|
}
|
|
|
|
|
|
public MailboxToken(AddressToken phrase, AddressToken route_addr)
|
|
{
|
|
this.name = null;
|
|
this.address = null;
|
|
this.comments = null;
|
|
this.addr_spec = null;
|
|
this.phrase = phrase;
|
|
this.route_addr = route_addr;
|
|
|
|
// Phrase and route addr must be contiguous.
|
|
if (route_addr.getTokenStart() != (phrase.getTokenEnd() + 1))
|
|
{
|
|
// ERROR
|
|
}
|
|
|
|
this.indx1 = phrase.getTokenStart();
|
|
this.indx2 = route_addr.getTokenEnd();
|
|
this.token_type = AddressToken.MAILBOX;
|
|
}
|
|
|
|
|
|
/*
|
|
* Get the address as a string from the list of parsed tokens.
|
|
*/
|
|
public String getAddress(Vector tokens)
|
|
{
|
|
String address = null;
|
|
|
|
if (this.address != null)
|
|
{
|
|
return(this.address);
|
|
}
|
|
|
|
address = new String("");
|
|
/*
|
|
* Here we strip any optional route from the route-addr.
|
|
*/
|
|
if (this.addr_spec == null)
|
|
{
|
|
int start, end;
|
|
|
|
start = this.route_addr.getTokenStart();
|
|
end = this.route_addr.getTokenEnd();
|
|
for (int i=(end - 1); i >= start; i--)
|
|
{
|
|
RFC822Token token = (RFC822Token)tokens.elementAt(i);
|
|
String str;
|
|
|
|
if ((token.isSpecialChar('<') == true)||
|
|
(token.isSpecialChar(':') == true))
|
|
{
|
|
break;
|
|
}
|
|
|
|
str = (String)token.getObject();
|
|
address = str + address;
|
|
}
|
|
}
|
|
/*
|
|
* Just compose the addr-spec as a string.
|
|
*/
|
|
else
|
|
{
|
|
int start, end;
|
|
|
|
start = this.addr_spec.getTokenStart();
|
|
end = this.addr_spec.getTokenEnd();
|
|
for (int i=start; i <= end; i++)
|
|
{
|
|
RFC822Token token = (RFC822Token)tokens.elementAt(i);
|
|
String str = (String)token.getObject();
|
|
|
|
address = address + str;
|
|
}
|
|
}
|
|
this.address = address;
|
|
|
|
return(address);
|
|
}
|
|
|
|
|
|
/*
|
|
* Get the name as a string from the list of parsed tokens.
|
|
*/
|
|
public String getName(Vector tokens)
|
|
{
|
|
String name = null;
|
|
|
|
if (this.name != null)
|
|
{
|
|
return(this.name);
|
|
}
|
|
|
|
name = new String("");
|
|
/*
|
|
* Here there was no phrase, but there were some
|
|
* comments. Compose a name from the comments,
|
|
* replace characters not allowed in the name,
|
|
* and enclose the new name as a quoted string.
|
|
* when combining multiple comments, use a comma
|
|
* separator.
|
|
*/
|
|
if ((this.phrase == null)&&(this.comments != null)&&
|
|
(this.comments.isEmpty() == false))
|
|
{
|
|
int num_comments = this.comments.size();
|
|
|
|
for (int c=0; c < num_comments; c++)
|
|
{
|
|
RFC822Token comment = (RFC822Token)this.comments.elementAt(c);
|
|
String str = (String)comment.getObject();
|
|
int len = str.length();
|
|
|
|
if (len < 3)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
str = str.substring(1, len - 1);
|
|
|
|
/*
|
|
* Replace all double quotes with
|
|
* single quotes, and replace nested
|
|
* comment parens with square brackets.
|
|
*/
|
|
str = str.replace('\"', '\'');
|
|
str = str.replace('(', '[');
|
|
str = str.replace(')', ']');
|
|
|
|
name = name + str;
|
|
if (c != (num_comments - 1))
|
|
{
|
|
name = name + ", ";
|
|
}
|
|
}
|
|
if (name.equalsIgnoreCase("") == false)
|
|
{
|
|
name = "\"" + name + "\"";
|
|
}
|
|
}
|
|
/*
|
|
* Else just compose the phrase as a string
|
|
*/
|
|
else if (this.phrase != null)
|
|
{
|
|
int start, end;
|
|
|
|
start = this.phrase.getTokenStart();
|
|
end = this.phrase.getTokenEnd();
|
|
for (int i=start; i <= end; i++)
|
|
{
|
|
RFC822Token token = (RFC822Token)tokens.elementAt(i);
|
|
String str = (String)token.getObject();
|
|
|
|
name = name + str;
|
|
if (i != end)
|
|
{
|
|
name = name + " ";
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* If there was no phrase and no comments, the name
|
|
* will become the empty string ""
|
|
*/
|
|
|
|
this.name = name;
|
|
return(name);
|
|
}
|
|
|
|
|
|
public void addComment(RFC822Token comment)
|
|
{
|
|
if (this.comments == null)
|
|
{
|
|
this.comments = new Vector();
|
|
}
|
|
this.comments.addElement((Object)comment);
|
|
}
|
|
|
|
|
|
public Vector GetComments()
|
|
{
|
|
return(this.comments);
|
|
}
|
|
|
|
|
|
public boolean noComments()
|
|
{
|
|
if (this.comments == null)
|
|
{
|
|
return(true);
|
|
}
|
|
else if (this.comments.isEmpty() == true)
|
|
{
|
|
return(true);
|
|
}
|
|
return(false);
|
|
}
|
|
}
|
|
|