private void FindMembershipAsync(string partnerScenario, FindMembershipCompletedEventHandler findMembershipCallback) { if (NSMessageHandler.MSNTicket == MSNTicket.Empty || AddressBook == null) { OnServiceOperationFailed(this, new ServiceOperationFailedEventArgs("FindMembership", new MSNPSharpException("You don't have access right on this action anymore."))); return; } bool msdeltasOnly = false; DateTime serviceLastChange = WebServiceDateTimeConverter.ConvertToDateTime(WebServiceConstants.ZeroTime); DateTime msLastChange = WebServiceDateTimeConverter.ConvertToDateTime(AddressBook.MembershipLastChange); string strLastChange = WebServiceConstants.ZeroTime; if (msLastChange != serviceLastChange) { msdeltasOnly = true; strLastChange = AddressBook.MembershipLastChange; } FindMembershipRequestType request = new FindMembershipRequestType(); request.view = "Full"; // NO default! request.deltasOnly = msdeltasOnly; request.lastChange = strLastChange; request.serviceFilter = new ServiceFilter(); request.serviceFilter.Types = new ServiceName[] { ServiceName.Messenger, ServiceName.IMAvailability, ServiceName.SocialNetwork }; MsnServiceState FindMembershipObject = new MsnServiceState(partnerScenario, "FindMembership", true); SharingServiceBinding sharingService = (SharingServiceBinding)CreateService(MsnServiceType.Sharing, FindMembershipObject); sharingService.FindMembershipCompleted += delegate(object sender, FindMembershipCompletedEventArgs e) { OnAfterCompleted(new ServiceOperationEventArgs(sharingService, MsnServiceType.Sharing, e)); // Cancelled or signed off if (e.Cancelled || NSMessageHandler.MSNTicket == MSNTicket.Empty) { return; } if (e.Error != null) { // Handle errors and recall this method if necesarry. if (e.Error.Message.ToLowerInvariant().Contains("need to do full sync") || e.Error.Message.ToLowerInvariant().Contains("full sync required")) { // recursive Call ----------------------------- DeleteRecordFile(true); FindMembershipAsync(partnerScenario, findMembershipCallback); } else if (e.Error.Message.ToLowerInvariant().Contains("address book does not exist")) { ABAddRequestType abAddRequest = new ABAddRequestType(); abAddRequest.abInfo = new abInfoType(); abAddRequest.abInfo.ownerEmail = NSMessageHandler.Owner.Account; abAddRequest.abInfo.ownerPuid = 0; abAddRequest.abInfo.fDefault = true; MsnServiceState ABAddObject = new MsnServiceState(partnerScenario, "ABAdd", true); ABServiceBinding abservice = (ABServiceBinding)CreateService(MsnServiceType.AB, ABAddObject); abservice.ABAddCompleted += delegate(object srv, ABAddCompletedEventArgs abadd_e) { OnAfterCompleted(new ServiceOperationEventArgs(abservice, MsnServiceType.AB, abadd_e)); if (abadd_e.Cancelled || NSMessageHandler.MSNTicket == MSNTicket.Empty) { return; } if (abadd_e.Error == null) { // recursive Call ----------------------------- DeleteRecordFile(true); FindMembershipAsync(partnerScenario, findMembershipCallback); } }; RunAsyncMethod(new BeforeRunAsyncMethodEventArgs(abservice, MsnServiceType.AB, ABAddObject, abAddRequest)); } else { Trace.WriteLineIf(Settings.TraceSwitch.TraceVerbose, "UNHANDLED ERROR: " + e.Error.Message.ToString(), GetType().Name); // Pass to the callback if (findMembershipCallback != null) { findMembershipCallback(sharingService, e); } } } else { // No error, fire event handler. if (findMembershipCallback != null) { findMembershipCallback(sharingService, e); } } }; RunAsyncMethod(new BeforeRunAsyncMethodEventArgs(sharingService, MsnServiceType.Sharing, FindMembershipObject, request)); }
private void FindMembershipAsync(string partnerScenario, FindMembershipCompletedEventHandler findMembershipCallback) { if (NSMessageHandler.MSNTicket == MSNTicket.Empty || AddressBook == null) { OnServiceOperationFailed(this, new ServiceOperationFailedEventArgs("FindMembership", new MSNPSharpException("You don't have access right on this action anymore."))); return; } bool msdeltasOnly = false; DateTime serviceLastChange = WebServiceDateTimeConverter.ConvertToDateTime(WebServiceConstants.ZeroTime); DateTime msLastChange = WebServiceDateTimeConverter.ConvertToDateTime(AddressBook.MembershipLastChange); string strLastChange = WebServiceConstants.ZeroTime; if (msLastChange != serviceLastChange) { msdeltasOnly = true; strLastChange = AddressBook.MembershipLastChange; } FindMembershipRequestType request = new FindMembershipRequestType(); request.view = "Full"; // NO default! request.deltasOnly = msdeltasOnly; request.lastChange = strLastChange; request.serviceFilter = new ServiceFilter(); request.serviceFilter.Types = new ServiceName[] { ServiceName.Messenger, ServiceName.IMAvailability, ServiceName.SocialNetwork }; MsnServiceState FindMembershipObject = new MsnServiceState(partnerScenario, "FindMembership", true); SharingServiceBinding sharingService = (SharingServiceBinding)CreateService(MsnServiceType.Sharing, FindMembershipObject); sharingService.FindMembershipCompleted += delegate(object sender, FindMembershipCompletedEventArgs e) { OnAfterCompleted(new ServiceOperationEventArgs(sharingService, MsnServiceType.Sharing, e)); // Cancelled or signed off if (e.Cancelled || NSMessageHandler.MSNTicket == MSNTicket.Empty) return; if (e.Error != null) { // Handle errors and recall this method if necesarry. if (e.Error.Message.ToLowerInvariant().Contains("need to do full sync") || e.Error.Message.ToLowerInvariant().Contains("full sync required")) { // recursive Call ----------------------------- DeleteRecordFile(true); FindMembershipAsync(partnerScenario, findMembershipCallback); } else if (e.Error.Message.ToLowerInvariant().Contains("address book does not exist")) { ABAddRequestType abAddRequest = new ABAddRequestType(); abAddRequest.abInfo = new abInfoType(); abAddRequest.abInfo.ownerEmail = NSMessageHandler.Owner.Account; abAddRequest.abInfo.ownerPuid = 0; abAddRequest.abInfo.fDefault = true; MsnServiceState ABAddObject = new MsnServiceState(partnerScenario, "ABAdd", true); ABServiceBinding abservice = (ABServiceBinding)CreateService(MsnServiceType.AB, ABAddObject); abservice.ABAddCompleted += delegate(object srv, ABAddCompletedEventArgs abadd_e) { OnAfterCompleted(new ServiceOperationEventArgs(abservice, MsnServiceType.AB, abadd_e)); if (abadd_e.Cancelled || NSMessageHandler.MSNTicket == MSNTicket.Empty) return; if (abadd_e.Error == null) { // recursive Call ----------------------------- DeleteRecordFile(true); FindMembershipAsync(partnerScenario, findMembershipCallback); } }; RunAsyncMethod(new BeforeRunAsyncMethodEventArgs(abservice, MsnServiceType.AB, ABAddObject, abAddRequest)); } else { Trace.WriteLineIf(Settings.TraceSwitch.TraceVerbose, "UNHANDLED ERROR: " + e.Error.Message.ToString(), GetType().Name); // Pass to the callback if (findMembershipCallback != null) { findMembershipCallback(sharingService, e); } } } else { // No error, fire event handler. if (findMembershipCallback != null) { findMembershipCallback(sharingService, e); } } }; RunAsyncMethod(new BeforeRunAsyncMethodEventArgs(sharingService, MsnServiceType.Sharing, FindMembershipObject, request)); }
/// <summary> /// Async membership request /// </summary> /// <param name="partnerScenario"></param> /// <param name="onSuccess">The delegate to be executed after async membership request completed successfuly</param> internal void msRequest(string partnerScenario, FindMembershipCompletedEventHandler onSuccess) { if (NSMessageHandler.MSNTicket == MSNTicket.Empty || AddressBook == null) { OnServiceOperationFailed(this, new ServiceOperationFailedEventArgs("FindMembership", new MSNPSharpException("You don't have access right on this action anymore."))); return; } FindMembershipAsync(partnerScenario, // Register callback for success/error. e.Cancelled handled by FindMembershipAsync. delegate(object sender, FindMembershipCompletedEventArgs fmcea) { if (fmcea.Error == null /* No error */) { BinarySemaphore.WaitOne(); // Addressbook re-defined here, because the reference can be changed. // FindMembershipAsync can delete addressbook if addressbook sync is required. XMLContactList xmlcl; MembershipResult fmResult; if ((null != (xmlcl = AddressBook)) && (null != (fmResult = fmcea.Result.FindMembershipResult))) { BinarySemaphore.Release(); try { // Following line is horrible for semaphore usage... xmlcl .Merge(fmResult) .Save(); } catch (Exception unknownException) { OnServiceOperationFailed(this, new ServiceOperationFailedEventArgs("FindMembership", new MSNPSharpException("Unknown Exception occurred while synchronizing contact list, please see inner exception.", unknownException))); } } else { BinarySemaphore.Release(); } BinarySemaphore.WaitOne(); if (AddressBook != null && Deltas != null) { BinarySemaphore.Release(); if (onSuccess != null) { onSuccess(sender, fmcea); } } else { BinarySemaphore.Release(); OnServiceOperationFailed(this, new ServiceOperationFailedEventArgs("FindMembership", new MSNPSharpException("Addressbook and Deltas have been reset."))); } } else { // Error handler BinarySemaphore.WaitOne(); { if (AddressBook == null && Deltas == null && AddressBookSynchronized == false) { // This means before the webservice returned the connection had broken. BinarySemaphore.Release(); OnServiceOperationFailed(this, new ServiceOperationFailedEventArgs("FindMembership", new MSNPSharpException("Addressbook and Deltas have been reset."))); return; } } BinarySemaphore.Release(); } } ); }