コード例 #1
0
ファイル: StepBase.cs プロジェクト: datttit/SyncMLDotNet
        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);
        }