package com.smit.rssreader;
import java.net.URL;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.filter.OrFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.IQ.Type;
import org.jivesoftware.smack.provider.ProviderManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.smit.rssreader.extension.notification.SuperfeedrEventExtension;
import com.smit.rssreader.extension.subscription.SubUnSubExtension;
import com.smit.rssreader.iqrequest.SubUnsubIQ;
import com.smit.rssreader.provider.EventProvider;
import com.smit.rssreader.provider.ItemProvider;
import com.smit.rssreader.provider.ItemsProvider;
import com.smit.rssreader.provider.TitleProvider;
public class InteractiveServer {
private final String SUBSCRIBE = "sub";
private final String UNSUBSCRIBE = "unsub";
private XMPPConnection connection;
private String jid;
private String server;
private Context context;
// private boolean success;
private ArrayList<OnNotificationHandler> onNotificationHandlers = new ArrayList<OnNotificationHandler>();
private Map<String, List<String>> subUnsubFeed = new HashMap<String, List<String>>();
private static DateFormat m_ISO8601Local = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss");
public InteractiveServer(XMPPConnection conn, final String jid, final String server,
Context context){
this.connection = conn;
this.jid = jid;
this.server = server;
this.context = context;
registerExtensionProvider();
connection.addPacketListener(new InteractivePacketListener(),
new OrFilter(new PacketTypeFilter(Message.class),
new PacketTypeFilter(IQ.class)));
}
public static Date convertDate(final String date) {
try {
return m_ISO8601Local.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return new Date();
}
}
// public boolean getSuccess(){
// return success;
// }
//
// public void setSuccess(boolean flag){
// this.success = flag;
// }
public void addOnNotificationHandler(final OnNotificationHandler handler) {
if (handler != null && !onNotificationHandlers.contains(handler)) {
onNotificationHandlers.add(handler);
}
}
/**
*
* @param event
*/
private void fireOnNotificationHandlers(final SuperfeedrEventExtension event) {
for (OnNotificationHandler handler : onNotificationHandlers) {
handler.onNotification(event);
}
}
/**
* Try to remove the specified handler from the list of notification handler
*
* @param handler
* the notification handler to be removed from the list
*/
public void removeOnNotificationHandler(final OnNotificationHandler handler) {
onNotificationHandlers.remove(handler);
}
private void subUnsubscribe(final SubUnSubExtension subUnsubscription,
List<String> list) {
String str = subUnsubscription.toXML();
Log.i("�����������", "-------" + str);
SubUnsubIQ iq = new SubUnsubIQ(str);
//iq.setTo(server);
iq.setType(Type.SET);
connection.sendPacket(iq);
subUnsubFeed.put(iq.getPacketID(), list);
}
/**
* Call this method to add subscription to your easylauncher account. The
* passed URL must be well formatted and must be valid
*
* @param feedUrls
* the list of feeds you want to add to your superfeedr account
* @param handler
* the callback
*/
public void subscribe(List<URL> feedUrls) {
List<String> list = new ArrayList<String>();
list.add(feedUrls.get(0).toString());
list.add(SUBSCRIBE);
subUnsubscribe(new SubUnSubExtension(feedUrls, jid,
SubUnSubExtension.TYPE_SUBSCRIPTION), list);
}
public void unsubscribe(List<URL> feedUrls) {
List<String> list = new ArrayList<String>();
list.add(feedUrls.get(0).toString());
list.add(UNSUBSCRIBE);
subUnsubscribe(new SubUnSubExtension(feedUrls, jid,
SubUnSubExtension.TYPE_UNSUBSCRIPTION), list);
}
// ע���Զ����provider
private void registerExtensionProvider() {
ProviderManager pm = ProviderManager.getInstance();
pm.addExtensionProvider("event",
"smit:pubsub:notification", new EventProvider());
pm.addExtensionProvider("title",
"smit:pubsub:notification", new TitleProvider());
pm.addExtensionProvider("items",
"smit:pubsub:notification", new ItemsProvider());
pm.addExtensionProvider("item", "smit:pubsub:notification",
new ItemProvider());
}
private class InteractivePacketListener implements PacketListener {
@Override
public void processPacket(Packet packet) {
// TODO Auto-generated method stub
Log.i("�յ���������Ӧ�İ���Ϣ--------", "NotificationPacketListener.processPacket()...");
Log.i("�յ��İ�����---------", "packet.toXML()=" + packet.toXML());
if (packet instanceof Message) {
fireOnNotificationHandlers((SuperfeedrEventExtension) ((Message) packet)
.getExtension(SuperfeedrEventExtension.NAMESPACE));
} else {
IQ response = (IQ)packet;
String packetID = packet.getPacketID();
if (subUnsubFeed.get(packetID) != null) {
String feed = subUnsubFeed.get(packetID).get(0);
String flag = subUnsubFeed.get(packetID).get(1);
subUnsubFeed.remove(packetID);
//XMPPError error = packet.getError();
if (response.getType()==IQ.Type.ERROR) {
// setSuccess(true);
// ���㲥֪ͨRSSReaderActivity�����и���
Intent i = new Intent(RssReaderConstant.IQRESPONSENO);
Bundle bundle = new Bundle();
bundle.putString("FEEDURL", feed);
bundle.putString("SUBUNSUB", flag);
i.putExtras(bundle);
context.sendBroadcast(i);
// handler1.onError(builder.toString());
} else {
// setSuccess(false);
Intent i = new Intent(RssReaderConstant.IQRESPONSEYES);
Bundle bundle = new Bundle();
bundle.putString("FEEDURL", feed);
bundle.putString("SUBUNSUB", flag);
i.putExtras(bundle);
context.sendBroadcast(i);
}
}
}
}
}
}