public bool BookingMeeting(Model.SVCMMeetingDetail meetingDetail, Model.HandlerSession session, out string error)
        {
            error = string.Empty;
            try
            {
                session.AddMessageId();
                string xmlData = this._dataTransform.GetXmlDataFromMeetingDetail(meetingDetail, session);
                ////logger.Debug(string.Format("BookingMeeting, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "startConfer", xmlData);
                ////logger.Debug(string.Format("BookingMeeting response, xmldata: {0}", response.OuterXml));
                string status = response.SelectSingleNode("startConfer").SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    meetingDetail.Id = response.SelectSingleNode("startConfer").SelectSingleNode("conferId").InnerText;
                    return true;
                }
                else
                {
                    error = response.SelectSingleNode("startConfer").SelectSingleNode("result").Attributes["property"].Value;
                    ////logger.Error(string.Format("BookingMeeting failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, response.SelectSingleNode("startConfer").SelectSingleNode("result"));
                    return false;
                }
            }
            catch(Exception ex)
            {
                ////logger.Error("BookingMeeting failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);

            }

            return false;
        }
        public bool DeleteMeeting(string conferId, Model.HandlerSession session, out string error)
        {
            error = string.Empty;
            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><deleteConfer><messageId>{0}</messageId><token>{1}</token><conferId>{2}</conferId><conf_operate_obj>1</conf_operate_obj></deleteConfer>", session.MessageId, session.Token, conferId);
                ////logger.Debug(string.Format("DeleteMeeting, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "deleteConfer", xmlData);
                ////logger.Debug(string.Format("DeleteMeeting response, xmldata: {0}", response.OuterXml));
                XmlNode root = response.SelectSingleNode("deleteConfer");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    return true;
                }
                else
                {
                    ////logger.Error(string.Format("DeleteMeeting failed, status: {0}, error:{1}", status, response.InnerXml));
                    //this.ReLogin(session, root.SelectSingleNode("result"));
                    //return false;
                    error = response.SelectSingleNode("deleteConfer").SelectSingleNode("result").Attributes["property"].Value;
                    ////logger.Error(string.Format("DeleteMeeting failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, response.SelectSingleNode("deleteConfer").SelectSingleNode("result"));
                    return false;
                }
            }
            catch (Exception ex)
            {
                ////logger.Error("DeleteMeeting failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);
            }

            return false;
        }
        public bool UpdateMeeting(Model.SVCMMeetingDetail meetingDetail, string operateType, Model.HandlerSession session, out string error, out string errorCode)
        {
            error = string.Empty;
            errorCode = string.Empty;
            try
            {
                session.AddMessageId();
                string xmlData = this._dataTransform.GetXmlDataForUpdatingMeeting(meetingDetail, operateType, session);
                ////logger.Debug(string.Format("UpdateMeeting, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "updateConfer", xmlData);
                ////logger.Debug(string.Format("UpdateMeeting response, xmldata: {0}", response.OuterXml));
                string status = response.SelectSingleNode("updateConfer").SelectSingleNode("result").InnerText;
                errorCode = status;
                if (status == "200")
                {
                    return true;
                }
                else
                {
                    error = response.SelectSingleNode("updateConfer").SelectSingleNode("result").Attributes["property"].Value;
                    ////logger.Error(string.Format("UpdateMeeting failed, status: {0}, error:{1}", status, response.InnerXml));
                    if(errorCode == "500" || errorCode == "502" || errorCode == "501")
                    this.ReLogin(session, response.SelectSingleNode("updateConfer").SelectSingleNode("result"));
                    return false;
                }
            }
            catch(Exception ex)
            {
                //logger.Error("UpdateMeeting failed, error:" + ex.Message + "\n" + ex.StackTrace);
                error = ex.Message;
                this.Login(ref session);
            }

            return false;
        }
        public bool TryGetSeriesList(Model.HandlerSession session, out List<Model.MeetingSeries> seriesList)
        {
            seriesList = new List<Model.MeetingSeries>();
            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><seriesList><messageId>{0}</messageId><token>{1}</token></seriesList>", session.MessageId, session.Token);
                ////logger.Debug(string.Format("TryGetSeriesList, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "seriesList", xmlData);
                ////logger.Debug(string.Format("TryGetSeriesList response, xmldata: {0}", response.OuterXml));
                XmlNode root = response.SelectSingleNode("seriesList");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    foreach (var item in root.SelectNodes("series"))
                    {
                        var node = item as XmlNode;
                        var series = new MeetingSeries();
                        series.Id = node.SelectSingleNode("seriesId").InnerText;
                        series.Name = node.SelectSingleNode("seriesName").InnerText;

                        seriesList.Add(series);
                    }

                    return true;
                }
                else
                {
                    ////logger.Error(string.Format("TryGetSeriesList failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, root.SelectSingleNode("result"));
                    return false;
                }
            }
            catch (Exception ex)
            {
                ////logger.Error("TryGetSeriesList failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);

            }

            return false;
        }
        public bool TryGetSearchRoomList(SearchRoomListQuery query, Model.HandlerSession session, out List<Model.MeetingRoom> roomList, out string error)
        {
            roomList = new List<MeetingRoom>();
            error = string.Empty;
            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><roomList><messageId>{0}</messageId><token>{1}</token><pageSize>{2}</pageSize><pageNumber>{3}</pageNumber><roomName>{4}</roomName><alias>{5}</alias><roomType>{6}</roomType></roomList>",
                                                session.MessageId,
                                                session.Token,
                                                query.pageSize,
                                                query.pageNumber,
                                                query.roomName,
                                                query.alias,
                                                query.roomType
                                                );
                ////logger.Debug(string.Format("TryGetMeetingRoomList, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "roomSearch", xmlData);
                ////logger.Debug(string.Format("TryGetMeetingRoomList response, xmldata: {0}", response.OuterXml));

                XmlNode root = response.SelectSingleNode("roomList");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    foreach (var item in root.SelectNodes("roomInfo"))
                    {
                        var node = item as XmlNode;
                        var room = new MeetingRoom();
                        room.RoomId = node.SelectSingleNode("roomId").InnerText.Split(",".ToCharArray())[0];
                        room.Name = node.SelectSingleNode("roomName").InnerText;

                        roomList.Add(room);
                    }

                    return true;
                }
                else
                {
                    //logger.Error(string.Format("TryGetMeetingRoomList failed, status: {0}, error:{1}", status, response.InnerXml));
                    error = "error Code: " + status;
                    this.ReLogin(session, root.SelectSingleNode("result"));
                    return false;
                }
            }
            catch (Exception ex)
            {
                //logger.Error("TryGetMeetingRoomList failed, error:" + ex.Message + "\n" + ex.StackTrace);
                error = ex.Message;
                this.Login(ref session);
            }

            return false;
        }
        public bool TryGetRegionCatagory(RegionCatagoryQuery query, Model.HandlerSession session, out Model.RegionCatagory regionCatagory)
        {
            regionCatagory = new RegionCatagory();

            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><searchCity><messageId>{0}</messageId><token>{1}</token><seriesId>{2}</seriesId><provinceCode>{3}</provinceCode><cityCode>{4}</cityCode><boroughCode>{5}</boroughCode></searchCity>",
                                                session.MessageId,
                                                session.Token,
                                                query.SeriesId,
                                                query.ProvinceCode,
                                                query.CityCode,
                                                query.BoroughCode);
                //logger.Debug(string.Format("TryGetRegionCatagory, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "searchcity", xmlData);
                ////logger.Debug(string.Format("TryGetRegionCatagory response, xmldata: {0}", response.OuterXml));
                XmlNode root = response.SelectSingleNode("searchCity");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    regionCatagory.SeriesList = new List<MeetingSeries>();
                    if(root.SelectSingleNode("seriesList") != null)
                        foreach (var item in root.SelectSingleNode("seriesList").SelectNodes("series"))
                    {
                        var node = item as XmlNode;
                        var series = new MeetingSeries();
                        series.Id = node.SelectSingleNode("seriesId").InnerText;
                        series.Name = node.SelectSingleNode("seriesName").InnerText;

                        regionCatagory.SeriesList.Add(series);
                    }

                    regionCatagory.ProvinceList = new List<RegionInfo>();
                    if(root.SelectSingleNode("provinceList") != null)
                    foreach (var item in root.SelectSingleNode("provinceList").SelectNodes("provinceInfo"))
                    {
                        var node = item as XmlNode;
                        var region = new RegionInfo();
                        region.Code = node.SelectSingleNode("provinceCode").InnerText;
                        region.Name = node.SelectSingleNode("provinceName").InnerText;

                        regionCatagory.ProvinceList.Add(region);
                    }

                    regionCatagory.CityList = new List<RegionInfo>();
                    if (root.SelectSingleNode("cityList") != null)
                    foreach (var item in root.SelectSingleNode("cityList").SelectNodes("cityInfo"))
                    {
                        var node = item as XmlNode;
                        var region = new RegionInfo();
                        region.Code = node.SelectSingleNode("cityCode").InnerText;
                        region.Name = node.SelectSingleNode("cityName").InnerText;

                        regionCatagory.CityList.Add(region);
                    }

                    regionCatagory.BoroughList = new List<RegionInfo>();
                    if (root.SelectSingleNode("boroughList") != null)
                    foreach (var item in root.SelectSingleNode("boroughList").SelectNodes("boroughInfo"))
                    {
                        var node = item as XmlNode;
                        var region = new RegionInfo();
                        region.Code = node.SelectSingleNode("boroughCode").InnerText;
                        XmlNode nameNode = node.SelectSingleNode("boroughName");
                        if(nameNode == null)
                            nameNode = node.SelectSingleNode("cityName");
                        region.Name = nameNode.InnerText;

                        regionCatagory.BoroughList.Add(region);
                    }

                    return true;
                }
                else
                {
                    //logger.Error(string.Format("TryGetRegionCatagory failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, root.SelectSingleNode("result"));
                    return false;
                }
            }
            catch(Exception ex)
            {
                //logger.Error("TryGetRegionCatagory failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);

            }

            return false;
        }
        public bool TryGetMobileTermList(Model.HandlerSession session, DateTime from, DateTime to, out List<Model.MobileTerm> mobileTermList)
        {
            mobileTermList = new List<MobileTerm>();
            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><mobileTermList><messageId>{0}</messageId><token>{1}</token><startTime>{2}</startTime><endTime>{3}</endTime></mobileTermList>",
                                                session.MessageId,
                                                session.Token,
                                                from.ToString("yyyy-MM-dd HH:mm:ss"),
                                                to.ToString("yyyy-MM-dd HH:mm:ss"));
                //logger.Debug(string.Format("TryGetMobileTermList, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "mobileTermList", xmlData);
                ////logger.Debug(string.Format("TryGetMobileTermList response, xmldata: {0}", response.OuterXml));
                XmlNode root = response.SelectSingleNode("mobileTermList");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    foreach (var item in root.SelectNodes("roomInfo"))
                    {
                        var node = item as XmlNode;
                        var term = new MobileTerm();
                        term.RoomId = node.SelectSingleNode("roomId").InnerText;
                        term.RoomName = node.SelectSingleNode("roomName").InnerText;

                        mobileTermList.Add(term);
                    }

                    return true;
                }
                else
                {
                    //logger.Error(string.Format("TryGetMobileTermList failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, root.SelectSingleNode("result"));
                    return false;
                }
            }
            catch (Exception ex)
            {
                //logger.Error("TryGetMobileTermList failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);

            }

            return false;
        }
        public bool TryGetMeetingRoomList(MeetingRoomListQuery query, Model.HandlerSession session, out List<Model.MeetingRoom> roomList)
        {
            roomList = new List<MeetingRoom>();

            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><roomList><messageId>{0}</messageId><token>{1}</token><seriesId>{2}</seriesId><levelId>{3}</levelId><confType>{4}</confType><startTime>{5}</startTime><endTime>{6}</endTime></roomList>",
                                                session.MessageId,
                                                session.Token,
                                                query.SeriesId,
                                                query.LevelId,
                                                (int)query.ConfType,
                                                query.StartTime.ToString("yyyy-MM-dd HH:mm:ss"),
                                                query.EndTime.ToString("yyyy-MM-dd HH:mm:ss")
                                                );
                ////logger.Debug(string.Format("TryGetMeetingRoomList, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "roomList", xmlData);
                ////logger.Debug(string.Format("TryGetMeetingRoomList response, xmldata: {0}", response.OuterXml));

                XmlNode root = response.SelectSingleNode("roomList");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    foreach (var item in root.SelectNodes("roomInfo"))
                    {
                        var node = item as XmlNode;
                        var room = new MeetingRoom();
                        room.RoomId = node.SelectSingleNode("roomId").InnerText.Split(",".ToCharArray())[0];
                        room.Name = node.SelectSingleNode("roomName").InnerText;

                        roomList.Add(room);
                    }

                    return true;
                }
                else
                {
                    //logger.Error(string.Format("TryGetMeetingRoomList failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, root.SelectSingleNode("result"));
                    return false;
                }
            }
            catch (Exception ex)
            {
                //logger.Error("TryGetMeetingRoomList failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);
            }

            return false;
        }
        public bool TryGetMeetingList(Model.MeetingListQuery query, Model.HandlerSession session, out List<Model.SVCMMeeting> meetingList)
        {
            meetingList = new List<SVCMMeeting>();

            try
            {
                session.AddMessageId();
                string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><bookingConferList><messageId>{0}</messageId><token>{1}</token><conferName>{2}</conferName><roomName>{3}</roomName><servicegk>{4}</servicegk><alias>{5}</alias><startTime>{6}</startTime><endTime>{7}</endTime ><confProperty>{8}</confProperty><statVideoType>{9}</statVideoType><confType>{10}</confType></bookingConferList>",
                                               session.MessageId,
                                               session.Token,
                                               query.MeetingName,
                                               query.RoomName,
                                               query.ServiceKey,
                                               query.Alias,
                                               query.StartTime.ToString("yyyy-MM-dd"),
                                               query.EndTime.ToString("yyyy-MM-dd"),
                                               query.ConferenceProperty,
                                               query.StatVideoType,
                                               query.ConfType);
                //logger.Debug(string.Format("TryGetMeetingList, xmldata: {0}", xmlData));
                var response = this._client.DoHttpWebRequest(session.BaseUrl + "bookingConferList", xmlData);
                ////logger.Debug(string.Format("TryGetMeetingList response, xmldata: {0}", response.OuterXml));
                XmlNode root = response.SelectSingleNode("bookingConferList");
                string status = root.SelectSingleNode("result").InnerText;

                if (status == "200")
                {
                    foreach (var item in root.SelectSingleNode("conferenceList").SelectNodes("conference"))
                    {
                        var node = item as XmlNode;
                        var meeting = new SVCMMeeting();
                        meeting.Id = node.SelectSingleNode("conferId").InnerText;
                        meeting.Name = node.SelectSingleNode("conferName").InnerText;
                        meeting.AccountName = node.SelectSingleNode("accountName").InnerText;
                        meeting.StartTime = DateTime.Parse(node.SelectSingleNode("startTime").InnerText);
                        meeting.EndTime = DateTime.Parse(node.SelectSingleNode("endTime").InnerText);
                        meeting.StatusCode = int.Parse(node.SelectSingleNode("status").InnerText);
                        meeting.Type = int.Parse(node.SelectSingleNode("mediaType").InnerText);
                        meeting.MainRoom = node.SelectSingleNode("mettingRoom").InnerText;
                        meeting.ServiceKey = node.SelectSingleNode("servicegk").InnerText;
                        meeting.Password = node.SelectSingleNode("confPassword").InnerText;
                        meetingList.Add(meeting);
                    }

                    return true;
                }
                else
                {
                    //logger.Error(string.Format("TryGetMeetingList failed, status: {0}, error:{1}", status, response.InnerXml));
                    this.ReLogin(session, root.SelectSingleNode("result"));
                    return false;
                }
            }
            catch (Exception ex)
            {
                //logger.Error("TryGetMeetingList failed, error:" + ex.Message + "\n" + ex.StackTrace);
                this.Login(ref session);

            }

            return false;
        }
        public bool TryGetMeetingDetail(string meetingId, Model.HandlerSession session, out Model.SVCMMeetingDetail detail)
        {
            detail = new SVCMMeetingDetail();

               try
               {
               session.AddMessageId();
               string xmlData = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><confInfo><messageId>{0}</messageId><token>{1}</token><conferId>{2}</conferId></confInfo>", session.MessageId, session.Token, meetingId);
               //logger.Debug(string.Format("TryGetMeetingDetail, xmldata: {0}", xmlData));
               var response = this._client.DoHttpWebRequest(session.BaseUrl + "getConfInfo", xmlData);
               //logger.Debug(string.Format("TryGetMeetingDetail response, xmldata: {0}", response.OuterXml));
               XmlNode root = response.SelectSingleNode("confInfo");
               string status = root.SelectSingleNode("result").InnerText;

               if (status == "200")
               {
                   detail.Id = root.SelectSingleNode("conferId").InnerText;
                   detail.Name = root.SelectSingleNode("conferName").InnerText??string.Empty;
                   detail.StartTime = DateTime.Parse(root.SelectSingleNode("startTime").InnerText);
                   detail.EndTime = DateTime.Parse(root.SelectSingleNode("endTime").InnerText);
                   detail.Status = root.SelectSingleNode("status").InnerText;

                   string str = root.SelectSingleNode("mediaType").InnerText;
                   if (str == "4")
                       detail.ConfMideaType = MideaType.Local;
                   else
                       detail.ConfMideaType = MideaType.Video;

                   detail.ParticipatorNumber = int.Parse(root.SelectSingleNode("participatorNumber").InnerText);
                   detail.Series.Name = root.SelectSingleNode("seriesName").InnerText;
                   detail.AccountName = root.SelectSingleNode("accountName").InnerText;
                   detail.Phone = root.SelectSingleNode("telephone").InnerText.Replace("null", "");

                   var leaders = root.SelectSingleNode("leader").InnerText.Replace("null", "").Split(",".ToCharArray());

                   foreach (var item in leaders)
                   {
                       detail.LeaderList.Add(new MeetingLeader()
                       {
                           UserName = item
                       });
                   }

                   detail.LeaderNameListStr = root.SelectSingleNode("leaderName").InnerText;
                   detail.LeaderRoom = root.SelectSingleNode("leaderRoom").InnerText.Replace("null", "");
                   detail.IpTelephoneNumber = root.SelectSingleNode("ipTelephoneNumber").InnerText;
                   detail.Department = root.SelectSingleNode("department").InnerText;

                   detail.Memo = root.SelectSingleNode("confMemo").InnerText.Replace("null", "");
                   detail.Password = root.SelectSingleNode("confPassword").InnerText.Replace("null", "");

                   if (root.SelectSingleNode("videoSet") != null)
                       detail.VideoSet = (VideoSet)int.Parse(root.SelectSingleNode("videoSet").InnerText);

                   detail.IPDesc = root.SelectSingleNode("ipdesc").InnerText.Replace("null","");
                   XmlNode mobileTermlistNode = root.SelectSingleNode("mobileTermList");
                   if (mobileTermlistNode != null)
                   {
                       foreach (var item in root.SelectSingleNode("mobileTermList").SelectNodes("roomInfo"))
                       {
                           var node = item as XmlNode;

                           detail.MobileTermList.Add(new MobileTerm()
                           {
                               RoomId = node.SelectSingleNode("roomId").InnerText,
                               RoomName = node.SelectSingleNode("roomName").InnerText
                           });
                       }
                   }

                   XmlNode roomlistNode = root.SelectSingleNode("roomList");
                   if (roomlistNode != null)
                   {
                       foreach (var item in root.SelectSingleNode("roomList").SelectNodes("roomInfo"))
                       {
                           var node = item as XmlNode;
                           string termType = node.SelectSingleNode("termType").InnerText;

                           if (termType != "2")
                           {
                               detail.Rooms.Add(new MeetingRoom()
                               {
                                   RoomId = node.SelectSingleNode("roomId").InnerText,
                                   Name = node.SelectSingleNode("roomName").InnerText,
                                   Address = node.SelectSingleNode("address").InnerText

                               });

                               if (node.SelectSingleNode("roomType").InnerText == "1")
                               {
                                   detail.MainRoom = new MeetingRoom()
                                   {
                                       RoomId = node.SelectSingleNode("roomId").InnerText,
                                       Name = node.SelectSingleNode("roomName").InnerText
                                   };
                               }
                           }

                       }
                   }

                   //TermList

                   return true;
               }
               else
               {
                   //logger.Error(string.Format("TryGetMeetingDetail failed, status: {0}, error:{1}", status, response.InnerXml));
                   this.ReLogin(session, root.SelectSingleNode("result"));
                   return false;
               }
               }
               catch (Exception ex)
               {
               //logger.Error("TryGetMeetingDetail failed, error:" + ex.Message + "\n" + ex.StackTrace);
               this.Login(ref session);

               }

               return false;
        }