vcard 解析
场景:vcard解析与打包
vcard解析与打包求助?
想实现以下功能:自己定义一个结构体:
typedef struct
{
unsigned short szName[30];//姓名
unsigned short szNickName[30];//昵称
unsigned short szMoB[40];//手机
unsigned short szMoB_HOME[40];//手机(家庭)
。。。。。。。。。//共20项
};
能把这个结构体打包成vcard,能从vcard中解出这个结构体//20项字段
vcard我没接触过,要求汉字是用UTF_8解析的,求c++/MFC代码,80718901@qq.com,万分感谢,270分全部送上,另开一帖在:
http://topic.****.net/u/20100717/16/79f5db5f-c873-4673-a85c-4cdd36c1eafc.html?seed=1303330889&r=67048502#r_67048502
另开一帖在http://topic.****.net/u/20100717/21/073314c6-0341-4a53-8c3e-7ba0f6138861.html
最简单的我也知道是自己一个一个按定义写结构体到vcard中,那么在取vcard流时,vcard流用unicode或多字节保存会有什么影响吗??
------解决方案--------------------
有一段JAVA的 , 上上来LZ自己揣摩一下吧
package org.mobiledream.safebox.function.card;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Vector;
import javax.microedition.pim.Contact;
import javax.microedition.pim.ContactList;
import javax.microedition.pim.PIM;
import javax.microedition.pim.PIMException;
import javax.microedition.pim.PIMItem;
import javax.microedition.pim.PIMList;
import org.mobiledream.safebox.function.frame.ContactListener;
import org.mobiledream.safebox.function.frame.VCardListener;
/**
* 对电子名片的所有操作
* @author Mobile Dream
*
*/
public class VCard extends Thread{
/**
* 监听器
*/
private ContactListener c = null;
/**
* 监听器
*/
private VCardListener v = null;
/**
* 联系人
*/
private Vector contacts = null;
/**
* 是否停止
*/
boolean stop = false;
/**
* 构造
*
*/
public VCard() {
contacts = new Vector();
}
/**
* 设置监听器
* @param c
*/
public void setContactListener(ContactListener c) {
this.c = c;
}
/**
* 移出监听器
*
*/
public void removeContactListener() {
c = null;
}
/**
* 取得监听器
* @return
*/
public VCardListener getVCardListener() {
return v;
}
/**
* 移除监听器
* @param v
*/
public void setVCardListener(VCardListener v) {
this.v = v;
}
/**
* 多线程
*/
public void run() {
if(c == null) { // 没有监听器
return;
}
try {
// 打开电话本并获得列表
PIMList pimlist = (PIMList) PIM.getInstance().openPIMList(
PIM.CONTACT_LIST, PIM.READ_ONLY);
Card.init(pimlist); // 初始化
// 对联系人表进行清空
contacts = new Vector();
int counter = 1;
Enumeration enu = pimlist.items(); // 所有联系人
// 获得所有联系人
while (enu.hasMoreElements()) {
Card card = new Card((PIMItem) enu.nextElement());
contacts.addElement(card); // 装入向量保存
if(stop) { // 停止获取
contacts = null;
stop = false;
return;
}
c.contactAcquired(card, counter++); // 触发监听器
}
pimlist.close();
} catch (Exception e) {
contacts = null;
c.contactAcquireError(e); // 触发监听器
}
c.contactAcquireComplete(contacts); // 触发监听器
}
/**
* 将vcard串行化
* @param item
* @param ops
*/
public static void toSerialFormat(PIMItem item, ByteArrayOutputStream bops) {
try {
PIM.getInstance().toSerialFormat(item, bops, "UTF-8", "VCARD/2.1");
} catch (UnsupportedEncodingException e) {
// 不做处理
} catch (PIMException e) {
// 不做处理
}
}
/**
* 导入并提交修改
* @param items
* @throws PIMException
*/
public void commitPIMItem(byte[] byteData) {
if(v == null) {
return;
}
stop = false;
int restoreCounter = 0;
PIMList list = null;
try {
list = PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.WRITE_ONLY); // 打开电话本
Card.init(list); // 初始化
Vector card = Card.fromByteFormat(byteData); // 得到自定义名片
for (int i = 0; i < card.size(); i++) {
((ContactList)list).importContact(
(Contact)(((Card)card.elementAt(i)).toPIMItem(list))
).commit(); // 提交
v.commitPIMItemNumber(restoreCounter++);
if (stop) {
v.commitPIMItemSucceed(restoreCounter); // 触发监听器
stop = false;
return;
}
}
} catch (PIMException e) {
v.commitPIMItemFailed(e);
}
try {
list.close();
} catch (Exception e) {
}
v.commitPIMItemSucceed(restoreCounter); // 触发监听器
}
/**
* 停止获取
*
*/
public void cancelAcquire() {
stop = true;
}
/**
* 获取联系人
*
*/
public void acquireContacts() {
start();
}
/**
* 获取存储好的联系人
* @return
*/
public Vector getStoredContacts() {
return contacts;
}
/**
* 获得PIM版本号
* @return PIM版本号,null为不支持
*/
public static String getVersion() {
return System.getProperty("microedition.pim.version");
}
}
vcard解析与打包求助?
想实现以下功能:自己定义一个结构体:
typedef struct
{
unsigned short szName[30];//姓名
unsigned short szNickName[30];//昵称
unsigned short szMoB[40];//手机
unsigned short szMoB_HOME[40];//手机(家庭)
。。。。。。。。。//共20项
};
能把这个结构体打包成vcard,能从vcard中解出这个结构体//20项字段
vcard我没接触过,要求汉字是用UTF_8解析的,求c++/MFC代码,80718901@qq.com,万分感谢,270分全部送上,另开一帖在:
http://topic.****.net/u/20100717/16/79f5db5f-c873-4673-a85c-4cdd36c1eafc.html?seed=1303330889&r=67048502#r_67048502
另开一帖在http://topic.****.net/u/20100717/21/073314c6-0341-4a53-8c3e-7ba0f6138861.html
最简单的我也知道是自己一个一个按定义写结构体到vcard中,那么在取vcard流时,vcard流用unicode或多字节保存会有什么影响吗??
------解决方案--------------------
有一段JAVA的 , 上上来LZ自己揣摩一下吧
package org.mobiledream.safebox.function.card;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Vector;
import javax.microedition.pim.Contact;
import javax.microedition.pim.ContactList;
import javax.microedition.pim.PIM;
import javax.microedition.pim.PIMException;
import javax.microedition.pim.PIMItem;
import javax.microedition.pim.PIMList;
import org.mobiledream.safebox.function.frame.ContactListener;
import org.mobiledream.safebox.function.frame.VCardListener;
/**
* 对电子名片的所有操作
* @author Mobile Dream
*
*/
public class VCard extends Thread{
/**
* 监听器
*/
private ContactListener c = null;
/**
* 监听器
*/
private VCardListener v = null;
/**
* 联系人
*/
private Vector contacts = null;
/**
* 是否停止
*/
boolean stop = false;
/**
* 构造
*
*/
public VCard() {
contacts = new Vector();
}
/**
* 设置监听器
* @param c
*/
public void setContactListener(ContactListener c) {
this.c = c;
}
/**
* 移出监听器
*
*/
public void removeContactListener() {
c = null;
}
/**
* 取得监听器
* @return
*/
public VCardListener getVCardListener() {
return v;
}
/**
* 移除监听器
* @param v
*/
public void setVCardListener(VCardListener v) {
this.v = v;
}
/**
* 多线程
*/
public void run() {
if(c == null) { // 没有监听器
return;
}
try {
// 打开电话本并获得列表
PIMList pimlist = (PIMList) PIM.getInstance().openPIMList(
PIM.CONTACT_LIST, PIM.READ_ONLY);
Card.init(pimlist); // 初始化
// 对联系人表进行清空
contacts = new Vector();
int counter = 1;
Enumeration enu = pimlist.items(); // 所有联系人
// 获得所有联系人
while (enu.hasMoreElements()) {
Card card = new Card((PIMItem) enu.nextElement());
contacts.addElement(card); // 装入向量保存
if(stop) { // 停止获取
contacts = null;
stop = false;
return;
}
c.contactAcquired(card, counter++); // 触发监听器
}
pimlist.close();
} catch (Exception e) {
contacts = null;
c.contactAcquireError(e); // 触发监听器
}
c.contactAcquireComplete(contacts); // 触发监听器
}
/**
* 将vcard串行化
* @param item
* @param ops
*/
public static void toSerialFormat(PIMItem item, ByteArrayOutputStream bops) {
try {
PIM.getInstance().toSerialFormat(item, bops, "UTF-8", "VCARD/2.1");
} catch (UnsupportedEncodingException e) {
// 不做处理
} catch (PIMException e) {
// 不做处理
}
}
/**
* 导入并提交修改
* @param items
* @throws PIMException
*/
public void commitPIMItem(byte[] byteData) {
if(v == null) {
return;
}
stop = false;
int restoreCounter = 0;
PIMList list = null;
try {
list = PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.WRITE_ONLY); // 打开电话本
Card.init(list); // 初始化
Vector card = Card.fromByteFormat(byteData); // 得到自定义名片
for (int i = 0; i < card.size(); i++) {
((ContactList)list).importContact(
(Contact)(((Card)card.elementAt(i)).toPIMItem(list))
).commit(); // 提交
v.commitPIMItemNumber(restoreCounter++);
if (stop) {
v.commitPIMItemSucceed(restoreCounter); // 触发监听器
stop = false;
return;
}
}
} catch (PIMException e) {
v.commitPIMItemFailed(e);
}
try {
list.close();
} catch (Exception e) {
}
v.commitPIMItemSucceed(restoreCounter); // 触发监听器
}
/**
* 停止获取
*
*/
public void cancelAcquire() {
stop = true;
}
/**
* 获取联系人
*
*/
public void acquireContacts() {
start();
}
/**
* 获取存储好的联系人
* @return
*/
public Vector getStoredContacts() {
return contacts;
}
/**
* 获得PIM版本号
* @return PIM版本号,null为不支持
*/
public static String getVersion() {
return System.getProperty("microedition.pim.version");
}
}