Archived
This forum has been archived. Please start a new discussion on GitHub.
Chat Demo SessionCallbackAdapter problem
Hello! I'm trying to implement Chat Demo server in c#. I implemented ChatRoom like this:
Am I right writing like that?
Class ChatRoomCallbackAdapter I wrote like this:
Then I wrote next:
What method should I pass for each delegate? How do I set callbacks (Init, Join, Leave..)? In c#.
Also as I looked thru the tutorial there is no servants implementation at the phase I've stopped (i.e. SessionCallbackAdapter implementation) is that normal, or I have missed something?
Thanks!
using Chat.Server.PullModel; public class ChatRoom { private static Object syncobject = new System.Object(); private Dictionary<String, ChatRoomCallbackAdapter> members; private HashSet<String> reserved; private Boolean trace; private Ice.Logger logger; #region [utilities] private void Init() { this.reserved = new HashSet<String>(); this.members = new Dictionary<String, ChatRoomCallbackAdapter>(); } #endregion #region [ctor] public ChatRoom(Boolean trace, Ice.Logger logger) { this.Init(); this.trace = trace; this.logger = logger; } #endregion public void Reserve(String name) { lock(syncobject) { if(this.members.ContainsKey(name) || this.reserved.Contains(name)) { throw new Exception("user already exists"); } this.reserved.Add(name); } } public void UnReserve(String name) { lock(syncobject) { this.reserved.Remove(name); } } public void Join(String name, ChatRoomCallbackAdapter callback) { lock(syncobject) { this.reserved.Remove(name); var names = new List<String>(); foreach(var item in this.members) { names.Add(item.Key); } callback.Init(names); this.members[name] = callback; var e = new UserJoinedEvent(DateTime.Now.ToBinary(), name); foreach(var item in this.members) { item.Value.Join(e); } if(this.trace) { this.logger.trace("info", name + " user joined"); } } } public void Leave(String name) { lock(syncobject) { this.members.Remove(name); var e = new UserLeftEvent(DateTime.Now.ToBinary(), name); foreach(var item in this.members) { item.Value.Leave(e); } if(this.trace) { this.logger.trace("info", name + " user left"); } } } public Int64 Send(String name, String message) { lock(syncobject) { var ts = DateTime.Now.ToBinary(); var e = new MessageEvent(ts, name, message); foreach(var item in this.members) { item.Value.Send(e); } if(this.trace) { this.logger.trace("info", "user '" + name + "' sent message"); } return ts; } } }
Am I right writing like that?
Class ChatRoomCallbackAdapter I wrote like this:
public abstract class ChatRoomCallbackAdapter { public abstract void Init(List<String> names); public abstract void Join(Chat.Server.PullModel.UserJoinedEvent e); public abstract void Leave(Chat.Server.PullModel.UserLeftEvent e); public abstract void Send(Chat.Server.PullModel.MessageEvent e); }
Then I wrote next:
using Chat.Server.PushModel; /// <summary> /// Push model session callback adapter /// </summary> public class SessionCallbackAdapter : ChatRoomCallbackAdapter { #region [ctor] public SessionCallbackAdapter ( ChatRoomCallbackPrx cbproxy, ChatSessionPrx ssproxy, Boolean trace, Ice.Logger logger, String name ) { } #endregion #region [ChatRoomCallbackAdapter implementation] public override void Init(List<String> names) { Callback_ChatRoomCallback_Init InitCb = // method??; } public override void Join(Chat.Server.PullModel.UserJoinedEvent e) { throw new NotImplementedException(); } public override void Leave(Chat.Server.PullModel.UserLeftEvent e) { throw new NotImplementedException(); } public override void Send(Chat.Server.PullModel.MessageEvent e) { throw new NotImplementedException(); } #endregion }
What method should I pass for each delegate? How do I set callbacks (Init, Join, Leave..)? In c#.
Also as I looked thru the tutorial there is no servants implementation at the phase I've stopped (i.e. SessionCallbackAdapter implementation) is that normal, or I have missed something?
Thanks!
0
Comments
-
Hi Aleksey,
The ChatRoom implementation you posted seems correct.
ChatRoomCallbackAdapter can be just an interface, in C++ we use an abstract class because there isn't interfaces in C++.
In your SessionCallbackAdapter implementation you should use C# AMI invocations, see Asynchronous Method Invocation (AMI). Is better to use the "Type-Safe Completion Callbacks" explained in the above link.
The servants that are implemented in chat demo are the sessions, and session managers, the article explain both.
Bests,
Jose0 -
Thanks! That was rather helpful!!! So as far as I understand I need to use the proxy wcich I do instantiate in the SessionCBAdapter class? I get it. Thanks one more time!0
-
Yes you need to call the corresponding cbproxy method, using the C# AMI API to avoid blocking.
You will see when implement the session servant that cbproxy is the callback passed from the client as its callback proxy.0 -
I'm writng this, but that's not working. I thought whenCompleted method should take its class calling callback..
public void Init(List<String> names) { this.cbproxy.begin_Init(names.ToArray()).whenCompleted(this.Init, this.FailureCallback); }
What am I doing wrong?0 -
Your call to whenCompleted is wrong, the arguments for whenCompleted are the delegates to handle success and failure conditions.
Something like this should do the trick:public class SessionCallbackAdapter : ChatRoomCallbackAdapter { //... public override void Init(List<String> names) { this.cbproxy.begin_Init(names.ToArray()).whenCompleted( this.Success, this.Failure); } public Success() { // Nothing to do in chat demo. } public Failure(Ice.Exception ex) { // Handle exception here. Destroy the session, log or whatever } }
0 -
I see.. As it is in c++ server. I just didn't pay attention for that) Thanks!0