protected override bool ProcessResponse(string text) { if (!base.ProcessResponse(text)) { return(false); } // So now syncml model is created from text UpdateCurrentURI(ServerSyncML); //0: Always have a status response to the SyncHdr of the server message. However, this status may not be sent back if it is the only one in the queue. SyncMLStatus responseStatus = SyncMLStatus.Create(); responseStatus.MsgRef.Content = ServerSyncML.Hdr.MsgID.Content; responseStatus.Data.Content = "200"; responseStatus.Cmd.Content = "SyncHdr"; responseStatus.CmdRef.Content = "0"; responseStatus.TargetRefCollection.Add(SyncMLSimpleElementFactory.Create <SyncMLTargetRef>(ServerSyncML.Hdr.Target.LocURI.Content)); responseStatus.SourceRefCollection.Add(SyncMLSimpleElementFactory.Create <SyncMLSourceRef>(ServerSyncML.Hdr.Source.LocURI.Content)); Facade.ResponseCommandPool.Add(responseStatus);//respond in next request. //1: Handle returned status commands Collection <SyncMLStatus> serverStatusCommands = AccessBody.GetStatusCommands(ServerSyncML); foreach (SyncMLStatus status in serverStatusCommands) { CommandAndStatusRegister.RegisterStatus(status.CmdRef.Content, status.Data.Content); HandleServerStatus(status); //this fn is still abstract here. Derived classes have different ways of handling. } //2: Prepare status commands for returned Alert commands. Derived classes then handle the alerts all the same way. Collection <SyncMLAlert> serverAlertCommands = AccessBody.GetAlertCommands(ServerSyncML); foreach (SyncMLAlert alert in serverAlertCommands) { Debug.WriteLine("Alert:" + alert.Xml.ToString()); PrepareStatusForReturnedAlert(alert); } //3: Handle returned Sync command. Derived classes handle sync commands the same way. SyncMLSync serverSyncCommand = AccessBody.GetSyncCommand(ServerSyncML); if (serverSyncCommand != null) { string numberOfChangesStr = serverSyncCommand.NumberOfChanges.Content; if (!String.IsNullOrEmpty(numberOfChangesStr)) {//where numberOfChanges > 0, display progress bar in GUI. Facade.totalNumberOfChangesReceiving = Convert.ToInt32(numberOfChangesStr); if (Facade.totalNumberOfChangesReceiving > 0) { Facade.DisplayOperationMessage(String.Format("Total number of changes received from the server: {0}", numberOfChangesStr)); Facade.InitProgressBarReceiving(0, Facade.totalNumberOfChangesReceiving, 1); Facade.DisplayStageMessageReceiving(String.Format("Receiving {0} updates ...", Facade.totalNumberOfChangesReceiving)); } } int numbersOfChangesThisMessage = serverSyncCommand.Commands.Count; // the server might send in multiple messages Facade.numberOfChangesReceived += numbersOfChangesThisMessage; if (Facade.numberOfChangesReceived == Facade.totalNumberOfChangesReceiving) { Facade.DisplayStageMessageReceiving("Receiving Done"); } GenerateStatusCommandsForSyncCommand(serverSyncCommand); if (Facade.GracefulStop) { return(true); // simply return, ture of false is meaningless. } Facade.IncrementProgressBarReceiving(numbersOfChangesThisMessage); ApplySyncCommandToLocal(serverSyncCommand); } //4: Verify if the server return all status codes to commands sent if (!CommandAndStatusRegister.IsAllCommandsReturnedWithStatus()) { Trace.TraceInformation("!!!! Not all commands got status code. Please check the log for details."); Trace.TraceInformation("Commands without status: " + CommandAndStatusRegister.CommandsXmlWithoutStatus); //It is expected CommandAndStatusRegister is not used any more, otherwise, should clear it here. } //5: At the end, do what the server ask to do, likely a new SyncML message to be sent ProcessServerAlertCommands(serverAlertCommands); return(true); }