package jimm.cl;
import jimm.*;
import jimmui.model.chat.ChatModel;
import jimmui.model.chat.MessData;
import jimm.comm.Util;
import protocol.Contact;
import protocol.Profile;
import protocol.Protocol;
import protocol.ui.InfoFactory;
import protocol.ui.StatusInfo;
import protocol.icq.*;
import protocol.mrim.*;
import protocol.xmpp.*;
import java.util.Vector;
/**
* Created with IntelliJ IDEA.
* <p/>
* Date: 29.06.13 14:44
*
* @author vladimir
*/
public class JimmModel {
public Vector<Protocol> protocols = new Vector<Protocol>();
public final Vector<ChatModel> chats = new Vector<ChatModel>();
private int contactListSaveDelay = 0;
// #sijapp cond.if modules_FILES="true"#
private Vector<FileTransfer> transfers = new Vector<FileTransfer>();
// #sijapp cond.end#
public boolean registerChat(ChatModel item) {
if (-1 == Util.getIndex(chats, item)) {
chats.addElement(item);
item.getContact().updateChatState(item);
Jimm.getJimm().getCL().getUpdater().registerChat(item);
return true;
}
return false;
}
public boolean unregisterChat(ChatModel item) {
if (null == item) return false;
chats.removeElement(item);
item.clear();
item.getContact().updateChatState(null);
Contact c = item.getContact();
c.updateChatState(null);
Jimm.getJimm().getCL().getUpdater().unregisterChat(item);
if (0 < item.getUnreadMessageCount()) {
Jimm.getJimm().getCL().markMessages(item.protocol, c);
}
return true;
}
public ChatModel getChatModel(Contact c) {
synchronized (chats) {
for (int i = chats.size() - 1; 0 <= i; --i) {
if (c == ((ChatModel)chats.elementAt(i)).contact) {
return (ChatModel)chats.elementAt(i);
}
}
}
return null;
}
public Protocol[] getProtocols() {
Protocol[] all = new Protocol[protocols.size()];
for (int i = 0; i < all.length; ++i) {
all[i] = (Protocol) protocols.elementAt(i);
}
return all;
}
// #sijapp cond.if modules_FILES="true"#
public void addTransfer(FileTransfer ft) {
transfers.addElement(ft);
}
public void removeTransfer(MessData par, boolean cancel) {
for (int i = 0; i < transfers.size(); ++i) {
FileTransfer ft = (FileTransfer)transfers.elementAt(i);
if (ft.is(par)) {
transfers.removeElementAt(i);
if (cancel) {
ft.cancel();
}
return;
}
}
}
// #sijapp cond.end#
public byte getGlobalStatus() {
byte globalStatus = StatusInfo.STATUS_OFFLINE;
int globalStatusWidth = StatusInfo.getWidth(globalStatus);
for (int i = 0; i < protocols.size(); ++i) {
byte status = ((Protocol)protocols.elementAt(i)).getProfile().statusIndex;
if (StatusInfo.getWidth(status) < globalStatusWidth) {
globalStatus = status;
globalStatusWidth = StatusInfo.getWidth(globalStatus);
}
}
if (null == InfoFactory.factory.global.getIcon(globalStatus)) {
globalStatus = StatusInfo.STATUS_ONLINE;
}
return globalStatus;
}
public Protocol getProtocol(String account) {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
if (p.getUserId().equals(account)) {
return p;
}
}
return null;
}
public Protocol getProtocol(Profile profile) {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
if (p.getProfile() == profile) {
return p;
}
}
return null;
}
public Protocol getProtocol(Contact c) {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
if (p.hasContact(c)) {
return p;
}
}
return null;
}
public boolean isConnected() {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
if (p.isConnected() && !p.isConnecting()) {
return true;
}
}
return false;
}
public boolean isConnecting() {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
if (p.isConnecting()) {
return true;
}
}
return false;
}
public boolean disconnect() {
boolean disconnecting = false;
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
if (p.isConnected()) {
p.disconnect(false);
disconnecting = true;
}
}
return disconnecting;
}
public void safeSave() {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
p.safeSave();
}
}
public void updateAccounts() {
Protocol[] oldProtocols = getProtocols();
Vector<Protocol> newProtocols = new Vector<Protocol>();
int accountCount = Options.getAccountCount();
for (int i = 0; i < accountCount; ++i) {
Profile profile = Options.getAccount(i);
if (!profile.isActive) continue;
for (int j = 0; j < oldProtocols.length; ++j) {
Protocol protocol = oldProtocols[j];
if ((null != protocol) && profile.equalsTo(protocol.getProfile())) {
if (protocol.getProfile() != profile) {
protocol.setProfile(profile);
}
oldProtocols[j] = null;
profile = null;
newProtocols.addElement(protocol);
break;
}
}
if (null != profile) {
Protocol p = createProtocol(profile);
if (null != p) {
newProtocols.addElement(p);
}
}
}
if (0 == newProtocols.size()) {
Profile profile = Options.getAccount(0);
profile.isActive = true;
newProtocols.addElement(createProtocol(profile));
}
for (Protocol protocol : oldProtocols) {
if (null != protocol) {
protocol.disconnect(true);
protocol.safeSave();
for (int j = chats.size() - 1; 0 <= j; --j) {
ChatModel key = (ChatModel) chats.elementAt(j);
if (key.getProtocol() == protocol) {
Jimm.getJimm().jimmModel.unregisterChat(key);
}
}
Jimm.getJimm().getCL().markMessages(null, null);
protocol.dismiss();
}
}
protocols = newProtocols;
}
private Protocol createProtocol(Profile account) {
Protocol protocol = null;
switch (account.getEffectiveType()) {
// #sijapp cond.if protocols_ICQ is "true" #
case Profile.PROTOCOL_ICQ:
protocol = new Icq();
break;
// #sijapp cond.end #
// #sijapp cond.if protocols_MRIM is "true" #
case Profile.PROTOCOL_MRIM:
protocol = new Mrim();
break;
// #sijapp cond.end #
// #sijapp cond.if protocols_JABBER is "true" #
case Profile.PROTOCOL_XMPP:
protocol = new Xmpp();
break;
// #sijapp cond.end #
// #sijapp cond.if protocols_OBIMP is "true" #
case Profile.PROTOCOL_OBIMP:
protocol = new protocol.obimp.Obimp();
break;
// #sijapp cond.end #
// #sijapp cond.if protocols_VKAPI is "true" #
case Profile.PROTOCOL_VK_API:
protocol = new protocol.vk.Vk();
break;
// #sijapp cond.end #
}
if (null == protocol) {
return null;
}
protocol.setProfile(account);
protocol.init();
protocol.safeLoad();
return protocol;
}
public final void needRosterSave() {
contactListSaveDelay = 60 * 4 /* * 250 = 60 sec */;
// #sijapp cond.if modules_ANDROID is "true" #
synchronized (this) {
saveRosters();
}
// #sijapp cond.end #
}
public void saveRostersIfNeed() {
// #sijapp cond.if modules_ANDROID isnot "true" #
if (0 < contactListSaveDelay) {
contactListSaveDelay--;
if (0 == contactListSaveDelay) {
saveRosters();
}
}
// #sijapp cond.end #
}
private void saveRosters() {
int count = protocols.size();
for (int i = 0; i < count; ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
p.safeSave();
}
}
public void restoreContactsWithChat(Protocol p) {
for (int i = 0; i < chats.size(); ++i) {
ChatModel chat = (ChatModel) chats.elementAt(i);
Contact contact = chat.contact;
if (p != chat.getProtocol()) {
continue;
}
if (!p.hasContact(contact)) {
Contact newContact = p.getItemByUID(contact.getUserId());
if (null != newContact) {
chat.contact = newContact;
contact.updateChatState(null);
newContact.updateChatState(chat);
continue;
}
if (contact.isSingleUserContact()) {
contact.setTempFlag(true);
contact.setGroup(null);
} else {
if (null == p.getGroup(contact)) {
contact.setGroup(p.getGroup(contact.getDefaultGroupName()));
}
}
p.addTempContact(contact);
}
}
}
}