messagemanager.java
来自「moblie syncml mail javame」· Java 代码 · 共 1,265 行 · 第 1/4 页
JAVA
1,265 行
Hashtable attr = XmlUtil.getTagAttributes(xml, ITEM_TAG);
String encoding = (String)attr.get("enc");
// Try with Uppercase for 3.0 connector bug
if(encoding == null) {
encoding = (String)attr.get("ENC");
}
if(encoding != null) {
Log.debug("EmailData.parse: encoding from server= " + encoding);
if(StringUtil.equalsIgnoreCase(encoding,"quoted-printable")) {
// TODO: optimize this. Since the connector now does
// not send QP to the client, we will not fall
// into this case.
String qp = item.toString();
qp = QuotedPrintable.decode(qp.getBytes(), "UTF-8");
item = new ChunkedString(qp);
}
}
//
MIMEProcessor mp = new MIMEProcessor();
Message msg = mp.parseMailMessage(item);
msg.setFlags(flags);
// Process the Funambol extensions for filtering. Example:
// <Ext><XNam>x-funambol-body</XNam><XVal>15000</XVal></Ext>
// <Ext><XNam>x-funambol-attach-n</XNam><XVal>1</XVal></Ext>
// <Ext><XNam>x-funambol-attach</XNam><XVal>att1.txt</XVal><XVal>10000</XVal></Ext>
// XXX: we are now considering x-funambol-body only
Vector extList = XmlUtil.getTagValues(xml, EXT_TAG);
Multipart multipart = null;
for(int i=0, l=extList.size(); i<l; i++) {
ChunkedString ext = (ChunkedString)extList.elementAt(i);
try {
ChunkedString xnam = XmlUtil.getTagValue(ext, "XNam");
if(xnam.equals("x-funambol-body")) {
String xval = XmlUtil.getTagValue(ext, "XVal").toString();
if (xval == null) {
Log.info("Incomplete header");
}
msg.getFlags().setFlag(MessageFlags.PARTIAL, true);
//break;
}
//ifndef isBlackberry
if(xnam.equals("x-funambol-attach-n")){
if(msg.isMultipart()){
multipart = (Multipart)msg.getContent();
}else{
multipart = new Multipart();
BodyPart bodyPartText = new BodyPart();
bodyPartText.addHeader(BodyPart.CONTENT_TRANSFER_ENCODING, "8bit");
bodyPartText.setContent(msg.getTextContent());
multipart.addBodyPart(bodyPartText);
}
}
if(xnam.equals("x-funambol-attach")){
Vector vec = XmlUtil.getTagValues(ext, "XVal");
BodyPart bodyPartAttach = new BodyPart();
bodyPartAttach.setDisposition(BodyPart.CD_ATTACHMENT);
bodyPartAttach.addHeader(BodyPart.CONTENT_TRANSFER_ENCODING, "8bit");
String name = ((ChunkedString)vec.elementAt(0)).toString();
if (name.equals("null")){
name = "Att.html";
}
bodyPartAttach.setFileName(name);
bodyPartAttach.setSize(((ChunkedString)vec.elementAt(1)).toString());
if (vec.size() == 4){
bodyPartAttach.setContentType(((ChunkedString)vec.elementAt(2)).toString());
String url = checkUrl(((ChunkedString)vec.elementAt(3)).toString());
bodyPartAttach.setAttachUrl(url);
}
multipart.addBodyPart(bodyPartAttach);
}
//endif
} catch (XmlException xe) {
xe.printStackTrace();
Log.error("[EmailData.parse]Invalid Ext field. Ignoring it");
}
}
if(multipart != null){
msg.setContent(multipart);
Log.debug("Message is multipart : "+msg.isMultipart());
}
// Dump memory stats
Log.stats("End of MessageManager.parseMessage");
return msg;
}
return null;
}
private String checkUrl(String url) {
if(url.startsWith("/")){
try{
String syncUrl = ConfigManager.getConfig().getMailAccount().getUrl();
int index = syncUrl.indexOf('/',7);
String prefixUrl = syncUrl.substring(0, index);
return prefixUrl+url;
} catch (ConfigException cex) {
cex.printStackTrace();
Log.error(this,"Extracting attachments url from ext "+cex.toString());
return null;
}
}else{
return url;
}
}
/**
* Parse a SyncML byte stream representing a folder.
*
* @param syncmlData syncml byte stream
* @return the Folder
* @throws XmlException if the SyncML item is not formed properly
*/
private Folder parseFolder(byte[] syncmlData) throws XmlException {
ChunkedString xml = new ChunkedString(new String(syncmlData));
String name;
String role = XmlUtil.getTagValue(xml, ROLE_TAG).toString();
//TODO: be careful while doing turkish localization: there are
//two different lowercase 'i' in turkey!
if (role.toLowerCase().equals(Store.INBOX.toLowerCase())) {
Log.debug("Folder Inbox from server");
name = Store.INBOX;
}
else if (role.toLowerCase().equals(Store.OUTBOX.toLowerCase())) {
Log.debug("Folder Outbox from server");
name = Store.OUTBOX;
}
else if (role.toLowerCase().equals(Store.DRAFTS.toLowerCase())) {
Log.debug("Folder Drafts from server");
name = Store.DRAFTS;
}
else if (role.toLowerCase().equals(Store.SENT.toLowerCase())) {
Log.debug("Folder Sent from server");
name = Store.SENT;
}
else {
throw new XmlException("Invalid folder from server:"+role);
}
//Date created = MailDateFormatter.parseUTCDate(XmlUtil.getTagValue(xml, CREATED_TAG).toString());
Folder folder = new Folder(name, msgStore);
return folder;
}
/**
* Utility method to check if a tag is found in a chunked string
*
* @param xml a chunked string
* @param tag to be extracted
*
* @return true if the tag is found, false otherwise
*/
private boolean getXmlFlag(ChunkedString xml, String tag) throws XmlException {
ChunkedString val = null;
if(XmlUtil.getTag(xml, tag) > -1) {
val = XmlUtil.getTagValue(xml, tag);
if(val.equals("true")) {
return true;
}
}
return false;
}
/**
* Utility method to add a boolean xml flag into a String buffer
* @param out the xml output stream
* @param tag tag name
* @param flag tag value (true, false)
*/
private void addXmlFlag(StringBuffer out, String tag, boolean flag) {
String val = flag ? "true" : "false" ;
XmlUtil.addElement(out, tag, val);
}
/**
* Utility method to get an xml date out of a chunked string
* @param xml is the chunked string
* @param tag the date tag
* @return the date tag value
*/
private Date getXmlDate(ChunkedString xml, String tag) throws XmlException {
String val = null;
MailDateFormatter df = new MailDateFormatter();
if(XmlUtil.getTag(xml, tag) > -1) {
val = XmlUtil.getTagValue(xml, tag).toString();
return MailDateFormatter.parseUTCDate(val);
}
return null;
}
/**
* Convert Funambol 3.0 folder names into local folder names.
*
* @param parent the item parent string
* @return the converted name, or the original one if does not
* starts with "ROOT/"
*/
private String folderFromParent(String parent) {
final String root = "ROOT/";
if(parent == null) {
return null;
}
if (parent.startsWith(root)) {
return folderFromPrefix(parent.charAt(root.length()));
}
return parent;
}
/**
* Find the folder name from the Funambol key prefix.
*/
private String folderFromPrefix(char prefix) {
switch (prefix) {
case 'I':
return "Inbox";
case 'O':
return "Outbox";
case 'D':
return "Drafts";
case 'S':
return "Sent";
default:
return null;
}
}
/**
* This method creates a LUID for a given message.
* In our client a LUID is folderName/messageRecordId
*
* @param msg the message
* @return the LUID
*/
private String makeLuid(Message msg) {
String luid = msg.getParent().getName()+"/"+msg.getRecordId();
return luid;
}
/**
* Utility method to dump the message flags into a string representing a
* SyncML email item.
* @param flags message flags
* @param out output string
*/
private void formatFlags(MessageFlags flags, StringBuffer out) {
addXmlFlag(out, READ_TAG, flags.isSet(MessageFlags.OPENED));
addXmlFlag(out, FORW_TAG, flags.isSet(MessageFlags.FORWARDED));
addXmlFlag(out, REPL_TAG, flags.isSet(MessageFlags.ANSWERED));
addXmlFlag(out, DELE_TAG, flags.isSet(MessageFlags.DELETED));
addXmlFlag(out, FLAG_TAG, flags.isSet(MessageFlags.FLAGGED));
}
/**
* Compute root folders. This method initializes the rootFolders array with
* the set of root folders. If the array has already been computed then the
* method will overwrite it.
*/
private void computeRootFolders() {
if (rootFolders == null) {
// Build the ordered root folder list
Folder[] flist = msgStore.list();
int len=flist.length;
rootFolders = new Folder[len];
for(int i=0, j=4; i<flist.length; i++) {
String name = flist[i].getName();
int idx = 0;
if(name.equals(Store.INBOX)) {
idx = INBOX;
} else if (name.equals(Store.OUTBOX)) {
idx = OUTBOX;
} else if (name.equals(Store.DRAFTS)) {
idx = DRAFTS;
} else if (name.equals(Store.SENT)) {
idx = SENT;
} else {
idx = j++;
}
rootFolders[idx] = new Folder(flist[i].getFullName(), msgStore);
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?