diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index a7db5bcc..dc2e8997 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -291,7 +291,10 @@ server.multi_endpoint false ## 是否支持PC多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PC端多端登录。 server.multi_pc_endpoint false -# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。 +## 是否支持PAD多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PAD端多端登录。 +server.multi_pad_endpoint false + +# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或pad或web端登录的通知。 server.multi_platform_notification true # 当pc或者web在线时,手机是否默认静音,默认为true。注意仅影响默认值,用户可以手动切换是否静音。 diff --git a/broker/src/main/java/cn/wildfirechat/push/PushServer.java b/broker/src/main/java/cn/wildfirechat/push/PushServer.java index b203c55b..a59cc5ed 100644 --- a/broker/src/main/java/cn/wildfirechat/push/PushServer.java +++ b/broker/src/main/java/cn/wildfirechat/push/PushServer.java @@ -95,9 +95,15 @@ public class PushServer { pushMessage.deviceToken = session.getDeviceToken(); pushMessage.unReceivedMsg = badge; pushMessage.userId = session.getUsername(); - if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_Android) { + if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || + session.getPlatform() == ProtoConstants.Platform.Platform_iPad || + session.getPlatform() == ProtoConstants.Platform.Platform_Android || + session.getPlatform() == ProtoConstants.Platform.Platform_APad || + session.getPlatform() == ProtoConstants.Platform.Platform_Harmony || + session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad + ) { String url = androidPushServerUrl; - if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS) { + if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_iPad) { url = iOSPushServerUrl; pushMessage.voipDeviceToken = session.getVoipDeviceToken(); } diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index b9dd2a04..e2bc9d19 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -135,6 +135,7 @@ public final class BrokerConstants { public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint"; public static final String SERVER_MULTI_PC_ENDPOINT = "server.multi_pc_endpoint"; + public static final String SERVER_MULTI_PAD_ENDPOINT = "server.multi_pad_endpoint"; public static final String SERVER_MULTI_PLATFROM_NOTIFICATION = "server.multi_platform_notification"; public static final String SERVER_MOBILE_DEFAULT_SILENT_WHEN_PC_ONLINE = "server.mobile_default_silent_when_pc_online"; public static final String SERVER_CLIENT_SUPPORT_KICKOFF_EVENT = "server.client_support_kickoff_event"; diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index 42c54525..18e76c28 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -1798,10 +1798,12 @@ public class DatabaseStore { try { connection = DBUtil.getConnection(); String sql; - if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX) { + if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX || platform == ProtoConstants.Platform.Platform_HarmonyPC) { + sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0"; + } else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_Harmony) { + sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0"; + } else if(platform == ProtoConstants.Platform.Platform_iPad || platform == ProtoConstants.Platform.Platform_APad || platform == ProtoConstants.Platform.Platform_HarmonyPad) { sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0"; - } else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) { - sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0"; } else { sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and `_platform` = ? and `_cid` <> ? and `_deleted` = 0"; } @@ -1816,13 +1818,19 @@ public class DatabaseStore { statement.setString(index++, uid); - if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX) { + if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX || platform == ProtoConstants.Platform.Platform_HarmonyPC) { statement.setInt(index++, ProtoConstants.Platform.Platform_Windows); statement.setInt(index++, ProtoConstants.Platform.Platform_OSX); statement.setInt(index++, ProtoConstants.Platform.Platform_LINUX); - } else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) { + statement.setInt(index++, ProtoConstants.Platform.Platform_HarmonyPC); + } else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_Harmony) { statement.setInt(index++, ProtoConstants.Platform.Platform_iOS); statement.setInt(index++, ProtoConstants.Platform.Platform_Android); + statement.setInt(index++, ProtoConstants.Platform.Platform_Harmony); + } else if(platform == ProtoConstants.Platform.Platform_iPad || platform == ProtoConstants.Platform.Platform_APad || platform == ProtoConstants.Platform.Platform_HarmonyPad) { + statement.setInt(index++, ProtoConstants.Platform.Platform_iPad); + statement.setInt(index++, ProtoConstants.Platform.Platform_APad); + statement.setInt(index++, ProtoConstants.Platform.Platform_HarmonyPad); } else { statement.setInt(index++, platform); } diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 96b5412f..e1bb1ce8 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -2764,6 +2764,7 @@ public class MemoryMessagesStore implements IMessagesStore { } String pcValue = null; + String padValue = null; for (MemorySessionStore.Session s : m_Server.getStore().sessionsStore().sessionForUser(session.username)) { if (s.getDeleted() != 0 || !m_Server.getConnectionsManager().isConnected(s.getClientID())) { continue; @@ -2773,8 +2774,14 @@ public class MemoryMessagesStore implements IMessagesStore { case Platform_LINUX: case Platform_Windows: case Platform_OSX: + case Platform_HarmonyPC: pcValue = System.currentTimeMillis() + "|" + s.getPlatform() + "|" + s.getClientID() + "|" + s.getPhoneName(); break; + case Platform_iPad: + case Platform_APad: + case Platform_HarmonyPad: + padValue = System.currentTimeMillis() + "|" + s.getPlatform() + "|" + s.getClientID() + "|" + s.getPhoneName(); + break; default: break; } @@ -2784,6 +2791,11 @@ public class MemoryMessagesStore implements IMessagesStore { if (!isOnlineValueEqual(pcentry, pcValue)) { updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(pcValue==null?"":pcValue).build(), session.clientID); } + + WFCMessage.UserSettingEntry padentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "Pad"); + if (!isOnlineValueEqual(padentry, padValue)) { + updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("Pad").setValue(padValue==null?"":padValue).build(), session.clientID); + } } @Override diff --git a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java index 5361652a..a1622f6c 100755 --- a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java @@ -40,6 +40,7 @@ public class MemorySessionStore implements ISessionsStore { private boolean supportMultiEndpoint = false; private boolean supportMultiPCEndpoint = false; + private boolean supportMultiPadEndpoint = false; private boolean clientSupportKickoff = false; public static class Session implements Comparable{ @@ -292,6 +293,10 @@ public class MemorySessionStore implements ISessionsStore { supportMultiPCEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_PC_ENDPOINT, "false")); } catch (Exception e) { } + try { + supportMultiPadEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_PAD_ENDPOINT, "false")); + } catch (Exception e) { + } try { clientSupportKickoff = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_CLIENT_SUPPORT_KICKOFF_EVENT, "false")); @@ -396,6 +401,10 @@ public class MemorySessionStore implements ISessionsStore { && !(platform == ProtoConstants.Platform.Platform_Windows && supportMultiPCEndpoint) && !(platform == ProtoConstants.Platform.Platform_LINUX && supportMultiPCEndpoint) && !(platform == ProtoConstants.Platform.Platform_OSX && supportMultiPCEndpoint) + && !(platform == ProtoConstants.Platform.Platform_HarmonyPC && supportMultiPCEndpoint) + && !(platform == ProtoConstants.Platform.Platform_iPad && supportMultiPadEndpoint) + && !(platform == ProtoConstants.Platform.Platform_APad && supportMultiPadEndpoint) + && !(platform == ProtoConstants.Platform.Platform_HarmonyPad && supportMultiPadEndpoint) ) { databaseStore.clearMultiEndpoint(username, clientID, platform); if (userSessions.get(username) != null) { @@ -410,15 +419,19 @@ public class MemorySessionStore implements ISessionsStore { } boolean remove = false; - if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS) { - if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS) { + if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Harmony) { + if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS || s.getPlatform() == ProtoConstants.Platform.Platform_Harmony) { remove = true; } - } else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_LINUX) { - if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows || s.getPlatform() == ProtoConstants.Platform.Platform_LINUX) { + } else if(platform == ProtoConstants.Platform.Platform_iPad || platform == ProtoConstants.Platform.Platform_APad || platform == ProtoConstants.Platform.Platform_HarmonyPad) { + if (s.getPlatform() == ProtoConstants.Platform.Platform_iPad || s.getPlatform() == ProtoConstants.Platform.Platform_APad || s.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad) { remove = true; } - } else { + } else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_LINUX || platform == ProtoConstants.Platform.Platform_HarmonyPC) { + if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows || s.getPlatform() == ProtoConstants.Platform.Platform_LINUX || s.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPC) { + remove = true; + } + } else { //web, microapp if (s.getPlatform() ==platform) { remove = true; } @@ -747,7 +760,12 @@ public class MemorySessionStore implements ISessionsStore { if (session.getPlatform() == ProtoConstants.Platform.Platform_LINUX || session.getPlatform() == ProtoConstants.Platform.Platform_WEB || session.getPlatform() == ProtoConstants.Platform.Platform_Windows - || session.getPlatform() == ProtoConstants.Platform.Platform_OSX) { + || session.getPlatform() == ProtoConstants.Platform.Platform_OSX + || session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPC + || session.getPlatform() == ProtoConstants.Platform.Platform_iPad + || session.getPlatform() == ProtoConstants.Platform.Platform_APad + || session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad + ) { databaseStore.updateSessionDeleted(operator, pcClientId, 1); sessions.remove(pcClientId); mServer.getProcessor().kickoffSession(session); diff --git a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java index ef2e87a9..3e5f5716 100755 --- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java +++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java @@ -223,7 +223,12 @@ public class MessagesPublisher { if (targetSession.getPlatform() == ProtoConstants.Platform.Platform_WEB || targetSession.getPlatform() == ProtoConstants.Platform.Platform_Windows || targetSession.getPlatform() == ProtoConstants.Platform.Platform_LINUX - || targetSession.getPlatform() == ProtoConstants.Platform.Platform_OSX) { + || targetSession.getPlatform() == ProtoConstants.Platform.Platform_OSX + || targetSession.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPC + || targetSession.getPlatform() == ProtoConstants.Platform.Platform_iPad + || targetSession.getPlatform() == ProtoConstants.Platform.Platform_APad + || targetSession.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad + ) { boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID); if (targetIsActive) { isPcOnline = true; diff --git a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java index aa02adab..8faacd54 100644 --- a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java +++ b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java @@ -53,6 +53,9 @@ public class ProtoConstants { int Platform_LINUX = 7; int Platform_iPad = 8; int Platform_APad = 9; + int Platform_Harmony = 10; + int Platform_HarmonyPad = 11; + int Platform_HarmonyPC = 12; } //message NotifyMessage & PullMessageRequest -> type diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 23e4068b..3509e295 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -289,7 +289,10 @@ server.multi_endpoint false ## 是否支持PC多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PC端多端登录。 server.multi_pc_endpoint false -# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。 +## 是否支持PAD多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PAD端多端登录。 +server.multi_pad_endpoint false + +# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或pad或web端登录的通知。 server.multi_platform_notification true # 当pc或者web在线时,手机是否默认静音,默认为true。注意仅影响默认值,用户可以手动切换是否静音。