package net.thesocialos.client.helper; import net.thesocialos.client.CacheLayer; import net.thesocialos.client.TheSocialOS; import net.thesocialos.client.channelApi.Channel; import net.thesocialos.client.channelApi.ChannelFactory; import net.thesocialos.client.channelApi.ChannelFactory.ChannelCreatedCallback; import net.thesocialos.client.channelApi.Socket; import net.thesocialos.client.channelApi.SocketError; import net.thesocialos.client.channelApi.SocketListener; import net.thesocialos.client.event.ChannelClose; import net.thesocialos.client.event.ChannelOpen; import net.thesocialos.client.event.ContactsChangeEvent; import net.thesocialos.client.service.ChannelService; import net.thesocialos.shared.ChannelApiEvents.ChApiEvent; import net.thesocialos.shared.messages.ChannelTextMessage; import net.thesocialos.shared.messages.Message; import net.thesocialos.shared.model.User; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.SerializationException; import com.google.gwt.user.client.rpc.SerializationStreamFactory; import com.google.gwt.user.client.rpc.SerializationStreamReader; public class ChannelApiHelper { // private Channel channel; static SerializationStreamFactory pushServiceStreamFactory; public static int retry = 3; public static boolean isChannelOpen = false; public static Socket socket; public ChannelApiHelper() { } /** * Extract the Object information of the encodedString * * @param encodedString * the string coded * @return a ChApiEvent Object */ private static ChApiEvent decodedString(String encodedString) { try { pushServiceStreamFactory = (SerializationStreamFactory) ChannelService.App.getInstance(); SerializationStreamReader reader = pushServiceStreamFactory.createStreamReader(encodedString); ChApiEvent message = (ChApiEvent) reader.readObject(); return message; } catch (SerializationException e) { e.printStackTrace(); // Window.alert("Excepcion serializacion"); return null; } catch (Exception e) { e.printStackTrace(); // Window.alert("Excepcion" + e.getCause().toString()); return null; } } private static void fireEvent(String encodedString) { // Window.alert("Descodificando String"); System.out.println(encodedString); ChApiEvent channelEvent = decodedString(encodedString); System.out.println(channelEvent.getClass()); // System.out.println(c) // Window.alert("String descodificado:" + channelEvent.getAssociatedType());; if (channelEvent != null) TheSocialOS.getEventBus().fireEvent(channelEvent); } /** * Handle messages pushed from the server. */ public static void handleMessage(Message msg) { switch (msg.getType()) { case NEW_CHATMSG_AVAILABLE: GWT.log("Pushed msg received: NEW_CONTENT_AVAILABLE"); // eventBus.fireEvent(new MessageChatAvailableEvent(((MessageChatAvailableMessage) msg).getMessage())); break; case TEXT_MESSAGE: String ttext = ((ChannelTextMessage) msg).get(); GWT.log("Pushed msg received: TEXT_MESSAGE: " + ttext); break; default: Window.alert("Unknown message type: " + msg.getType()); } } private static void updateTokenChannel() { if (retry == 0) return; CacheLayer.UserCalls.getNewChannelId(new AsyncCallback<Void>() { @Override public void onSuccess(Void result) { listenToChannel(CacheLayer.UserCalls.getUser()); } @Override public void onFailure(Throwable caught) { System.out.println(caught); } }); } public static void listenToChannel(User user) { if (user.getTokenChannel() == null) { updateTokenChannel(); return; } ChannelFactory.createChannel(user.getTokenChannel(), new ChannelCreatedCallback() { @Override public void onChannelCreated(Channel channel) { socket = channel.open(new SocketListener() { @Override public void onClose() { TheSocialOS.getEventBus().fireEvent(new ChannelClose()); isChannelOpen = false; // Window.alert("Socket close"); } @Override public void onError(SocketError error) { // System.out.println(error.getDescription()); ChannelFactory.deleteChannel(); updateTokenChannel(); retry--; // Window.alert("Socket error"); } @Override public void onMessage(String encodedString) { // .alert("Socket onMessage " + encodedString); fireEvent(encodedString); } @Override public void onOpen() { TheSocialOS.getEventBus().fireEvent(new ChannelOpen()); TheSocialOS.getEventBus().fireEvent(new ContactsChangeEvent()); System.out.println("Canal abierto " + CacheLayer.UserCalls.getUser().getEmail()); isChannelOpen = true; retry = 3; // Window.alert("Socket open"); } }); } }); } }