Example #1
0
 public void OnMessage(com.sybase.afx.json.JsonMessage msg)
 {
     string _notification = msg.GetHeaders().GetNullableString("SUPObjCmd");
     bool _reregistered = (_notification != null && _notification.Equals("reregister"));
     if(_reregistered)
     {
         YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSubscriptionEnd();
         return;
     }
     string method = msg.GetHeaders().GetString("method");
     bool _isAsync = "asyncReplayCompleted".Equals(method);
     string serverRemoteId = msg.GetHeaders().GetNullableString("remoteId");
     string clientRemoteId = GetRemoteId();
     if(serverRemoteId != null && clientRemoteId != null && !serverRemoteId.Equals(clientRemoteId))
     {
         return;
     }
     bool _isTcn = "tcn".Equals(method);
     if(!_isAsync && !_isTcn)
     {
         return;
     }
     com.sybase.afx.json.JsonObject _content = (com.sybase.afx.json.JsonObject)(msg.GetContent());
     string userContext = _content.GetString("userContext");
     string synchronizationGroup = _content.GetString("synchronizationGroup");
         
     Sybase.Persistence.SynchronizationContext syncContext = new Sybase.Persistence.SynchronizationContext();
     syncContext.UserContext = userContext;
     Sybase.Collections.GenericList<Sybase.Persistence.ISynchronizationGroup> sgs = new Sybase.Collections.GenericList<Sybase.Persistence.ISynchronizationGroup>();
     foreach(string sg in com.sybase.afx.util.StringUtil.GetCommaSeparatedList(synchronizationGroup))
     {
         sgs.Add(YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetSynchronizationGroup(sg));
     }
     if(_isTcn)
     {
         syncContext.Status = Sybase.Persistence.SynchronizationStatus.STARTING_ON_NOTIFICATION;
     }
     else
     {
         syncContext.Status = Sybase.Persistence.SynchronizationStatus.ASYNC_REPLAY_COMPLETED;
     }
     if(YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSynchronize(sgs, syncContext) == Sybase.Persistence.SynchronizationAction.CANCEL)
     {
         return;
     }
     try
     {
         YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.BeginSynchronize(sgs, userContext);
     }
     catch(Sybase.Persistence.SynchronizeException ex)
     {
         syncContext.Exception = ex;
         syncContext.Status = Sybase.Persistence.SynchronizationStatus.ERROR;
         YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSynchronize(sgs, syncContext);            
         throw ex;
     }
     syncContext.Status = Sybase.Persistence.SynchronizationStatus.FINISHING;
     YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSynchronize(sgs, syncContext);
 }
Example #2
0
 private static void InternalSynchronize (string synchronizationGroup, 
         Sybase.Persistence.SyncStatusListener listener,
         Sybase.Persistence.SynchronizationContext syncContext,
         com.sybase.afx.json.JsonObject syncContextEx)
 {
     string mlServerHost;
     int mlServerPort;
     string syncUsername;
     string syncPassword;
     
     bool isInitialSync = "initialSync".Equals(synchronizationGroup) || KeyGenerator.InitSync();
     YPF.Comercial.RRCC.SUP.PersonalizationParameters _pp = GetPersonalizationParameters();
     _pp.Username =(GetSynchronizationProfile().UserName);
     _pp.Password =(GetSynchronizationProfile().Password);
     _pp.SaveUserNamePassword();
 	
     lock(_synchronizeLock)
     {
         Sybase.Mobile.Application.GetInstance().ApplicationSettings.CheckApplicationSettingsAvailable();
         Sybase.Persistence.ConnectionProfile _interProfile = new Sybase.Persistence.ConnectionProfile();
         _interProfile.DomainName =("default");
         _interProfile.ServerName =("sdbuetmapl28");
         _interProfile.PortNumber =(2480);
         _interProfile.NetworkProtocol =("http,https");
         _interProfile.NetworkStreamParams =("trusted_certificates=;url_suffix=");
         _interProfile.ApplyProperties(Sybase.Mobile.Application.GetInstance().ApplicationSettings);
         _interProfile.ApplyProperties(GetSynchronizationProfile());
 
         mlServerHost = _interProfile.ServerName;
         mlServerPort = _interProfile.PortNumber;
         syncUsername = _interProfile.UserName;
         syncPassword = _interProfile.Password;
         string sysPlatform = _interProfile.GetProperty("os");
         Sybase.Persistence.ConnectionWrapper ulConn = null;
         com.sybase.afx.db.ConnectionSyncParams syncParms = new com.sybase.afx.db.ConnectionSyncParams();
         try
         {
             YPF.Comercial.RRCC.SUP.PersonalizationParameters pp = new YPF.Comercial.RRCC.SUP.PersonalizationParameters();
             syncUsername += ("@" + _interProfile.DomainName);
             com.sybase.afx.json.JsonObject json = new com.sybase.afx.json.JsonObject();
             Sybase.Collections.GenericList<YPF.Comercial.RRCC.SUP.ClientPersonalization> listClientPersonalization = pp.ListClientPK;
             foreach(YPF.Comercial.RRCC.SUP.ClientPersonalization __item in listClientPersonalization)
             {
                 json.Put(__item.Key_name, __item.GetRealValue());
             }
             Sybase.Collections.GenericList<YPF.Comercial.RRCC.SUP.SessionPersonalization> sessionServerPersonalization = pp.ListSessionPK;
             foreach(YPF.Comercial.RRCC.SUP.SessionPersonalization __item in sessionServerPersonalization)
             {
                 json.Put(__item.Key_name, __item.Value);
             }
             json.Put("pv", "" + YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetProtocolVersion());
             json.Put("pid", com.sybase.afx.util.PidUtil.GetId());
             json.Put("cle", _interProfile.GetProperty("changeLogEnabled", "false"));
             if(isInitialSync)
             {
                 com.sybase.afx.json.JsonObject jsonMBOMap = new com.sybase.afx.json.JsonObject();
                 jsonMBOMap.Put("DireccionEntrega",231);
                 jsonMBOMap.Put("Interaccion",232);
                 jsonMBOMap.Put("CalendarioInteraccionLocal",233);
                 jsonMBOMap.Put("CategoriaPregunta",234);
                 jsonMBOMap.Put("ClienteCabeceraPedido",235);
                 jsonMBOMap.Put("ClienteDetallePedido",236);
                 jsonMBOMap.Put("ClienteDeuda",237);
                 jsonMBOMap.Put("ClienteFacturacion",238);
                 jsonMBOMap.Put("CustomLocalData",239);
                 jsonMBOMap.Put("Direccion",240);
                 jsonMBOMap.Put("EstadoInteraccion",241);
                 jsonMBOMap.Put("Formulario",242);
                 jsonMBOMap.Put("FormularioMercado",243);
                 jsonMBOMap.Put("FormularioMercadoSegmento",244);
                 jsonMBOMap.Put("FormularioMercadoSubsegmento",245);
                 jsonMBOMap.Put("FormularioMercadoTamano",246);
                 jsonMBOMap.Put("FormularioPrecios",247);
                 jsonMBOMap.Put("FormularioPreciosMercado",248);
                 jsonMBOMap.Put("FormularioPreciosRed",249);
                 jsonMBOMap.Put("FormularioPreciosZonaInspeccion",250);
                 jsonMBOMap.Put("FormularioTransporte",251);
                 jsonMBOMap.Put("Mail",252);
                 jsonMBOMap.Put("Motivo",253);
                 jsonMBOMap.Put("Negocio",254);
                 jsonMBOMap.Put("OpcionRespuesta",255);
                 jsonMBOMap.Put("Parametro",256);
                 jsonMBOMap.Put("Pregunta",257);
                 jsonMBOMap.Put("PreguntaFormulario",258);
                 jsonMBOMap.Put("Provincia",259);
                 jsonMBOMap.Put("RelevamientoPrecios",260);
                 jsonMBOMap.Put("RelevamientoPreciosProducto",261);
                 jsonMBOMap.Put("RelevamientoProducto",262);
                 jsonMBOMap.Put("RelevamientoProductoProducto",263);
                 jsonMBOMap.Put("RelevamientoProductoTipo",264);
                 jsonMBOMap.Put("RelevamientoProveedor",265);
                 jsonMBOMap.Put("RelevamientoProveedorCanal",266);
                 jsonMBOMap.Put("RelevamientoProveedorLogistica",267);
                 jsonMBOMap.Put("RelevamientoTransporte",268);
                 jsonMBOMap.Put("RelevamientoTransporteCompetidor",269);
                 jsonMBOMap.Put("RelevamientoTransporteProducto",270);
                 jsonMBOMap.Put("RepresentanteComercial",271);
                 jsonMBOMap.Put("Respuesta",272);
                 jsonMBOMap.Put("RespuestaInteraccionFormulario",273);
                 jsonMBOMap.Put("Segmento",274);
                 jsonMBOMap.Put("SeleccionFormulario",275);
                 jsonMBOMap.Put("SeleccionTablaRelevamiento",276);
                 jsonMBOMap.Put("TablaRelevamiento",277);
                 jsonMBOMap.Put("Telefono",278);
                 jsonMBOMap.Put("TipoInteraccion",279);
                 jsonMBOMap.Put("LogRecordImpl",281);
                 jsonMBOMap.Put("OperationReplay",282);
                 jsonMBOMap.Put("SISSubscription",285);
                 jsonMBOMap.Put("PackageProperties",286);
                 jsonMBOMap.Put("ChangeLogImpl",288);
                 jsonMBOMap.Put("OfflineAuthentication",289);
                 jsonMBOMap.Put("RepresentanteComercialSynchronizationParameters",290);
                 jsonMBOMap.Put("RepresentanteComercial_pull_pq",291);
                 jsonMBOMap.Put("ClientPersonalization",341);
                 jsonMBOMap.Put("KeyGenerator",346);
                 jsonMBOMap.Put("LocalKeyGenerator",348);
                 json.Put("mboMap", jsonMBOMap);
                 json.Put("publications", synchronizationGroup);
                 json.Put("isInitialSync", isInitialSync.ToString());
             }
             else
             {
                 json.Put("publications", synchronizationGroup);
             }
             bool async = !isInitialSync && _interProfile.GetBoolean("asyncReplay", true);
             if(syncContextEx == null)
             {
                 syncContextEx = new com.sybase.afx.json.JsonObject();
             }
             syncContextEx.Remove("async");
             syncContextEx.Put("async", async + "");
             json.Put("_as", async + "");
             if(async && !IsReplayQueueEmpty())
             {
                 YPF.Comercial.RRCC.SUP.intrnl.OperationReplay rq = new YPF.Comercial.RRCC.SUP.intrnl.OperationReplay();
                 rq.SetComponent("CRMMobileDesaDB");
                 com.sybase.afx.json.JsonObject parameter = new com.sybase.afx.json.JsonObject();
                 if(syncContext != null)
                 {
                     object userContext = syncContext.UserContext;
                     if(userContext != null)
                     {
                         if(userContext is string)
                         {
                             parameter.Put("userContext", userContext);
                         }
                         else
                         {
                             throw new Sybase.Persistence.PersistenceException("user context must be string for async operation replay");
                         }
                     }
                     parameter.Put("synchronizationGroup",synchronizationGroup);
                 }
                 rq.SetParameters(parameter.ToString());
                 rq.SetOperation("batchNotify");
                 rq.Save();
             }
             if(_appName != null)
             {
                 json.Put("app", _appName);
             }
             json.Put("appId", Sybase.Mobile.Application.GetInstance().ApplicationIdentifier);
             if (sysPlatform != null)
             {
                 json.Put("os",  sysPlatform);
             }
             string str = json.ToString();
             byte[] bin = com.sybase.afx.util.StringUtil.ToUTF8(str);
             string authParam = com.sybase.afx.util.BinaryUtil.ToStringBase64(bin);
             bool isHttps = _interProfile.NetworkProtocol.Equals("https", System.StringComparison.OrdinalIgnoreCase);
             int maxLen = 4000;
             int size = (authParam.Length + maxLen - 1) / maxLen;
             if (size > 16)
             {
                 throw new Sybase.Persistence.SynchronizeException("the whole length of personalization parameters exceeds the limit of authenticate parameters and the safe length is 512 bytes");
             }
             string[] authList = new string[16];
             for (int i = 0; i < size; i++)
             {
                 authList[i] = authParam.Substring(i * maxLen, ((i + 1) * maxLen < authParam.Length) ? maxLen : (authParam.Length - i * maxLen));
             }
             for (int i = size; i < 16; i++)
             {
                 authList[i] = "x";//Spacer
             }
             ulConn = AcquireDBWriteConnection();
             syncParms.IsHttps = isHttps;        
             syncParms.Version = _interProfile.DomainName + "_" + "crmmobiledesa.1_0";
             syncParms.UserName = syncUsername;
             if(_interProfile.Certificate != null)
             {
                 syncPassword = null;
             }
             syncParms.Password = syncPassword + ("@" + com.sybase.afx.util.PidUtil.GetId());
             string mlStreamParams = "host=\"" + mlServerHost + "\";port=\"" + mlServerPort + "\"";
             string urlSuffix = com.sybase.afx.util.NetworkStreamParams.ExtractValue("url_suffix", _interProfile.NetworkStreamParams);
             if(urlSuffix != null && urlSuffix.Length != 0)
             {
                 mlStreamParams = "host=\"" + mlServerHost + "\";port=\"" + mlServerPort + "\";url_suffix=\"" + urlSuffix + "\"";
             }
 
             //setting http_userid and http_password if HTTPCredentials are available
             Sybase.Persistence.LoginCredentials lc = Sybase.Mobile.Application.GetInstance().ConnectionProperties.HTTPCredentials;
             if (lc != null)
             {
                 string http_userid = lc.UserName;
                 string http_password = lc.Password;
                 mlStreamParams = mlStreamParams + ";http_userid=\"" + http_userid + "\";http_password=\"" + http_password + "\"";
             }
             string cookie = com.sybase.afx.util.NetworkStreamParams.ExtractValue("set_cookie", _interProfile.NetworkStreamParams);
             Sybase.Collections.StringProperties httpCookies = Sybase.Mobile.Application.GetInstance().ConnectionProperties.HttpCookies;
             if (httpCookies != null)
             {
                 foreach(string key in httpCookies.Keys())
                 {
                     string value = httpCookies.Item(key);
                     if (cookie == null || cookie.Length == 0)
                     {
                         cookie = key + "=" + value;
                     }
                     else
                     {
                         cookie += "," + key + "=" + value;
                     }
                 }
             }
             if (cookie != null && cookie.Length != 0)
             {
                 mlStreamParams = mlStreamParams + ";set_cookie=\"" + cookie +"\"";
             }
             System.Collections.Generic.List<string> headers = com.sybase.afx.util.NetworkStreamParams.ExtractListValue("custom_header", _interProfile.NetworkStreamParams);
             foreach (string header in headers)
             {
                 mlStreamParams = mlStreamParams + ";custom_header=\"" + header +"\"";
             }
             Sybase.Collections.StringProperties httpHeaders = Sybase.Mobile.Application.GetInstance().ConnectionProperties.HttpHeaders;
             if (httpHeaders != null)
             {
                 foreach(string key in httpHeaders.Keys())
                 {
                     string value = httpHeaders.Item(key);
                     mlStreamParams = mlStreamParams + ";custom_header=\"" + key + ":" + value + "\"";
                 }
             }
             string ip = _interProfile.GetString("client_ip");
             if(ip != null && ip.Length != 0)
             {
                 mlStreamParams = mlStreamParams + ";client_ip_addr=\"" + ip + "\"";
             }
             if(isHttps)
             {
                 string ts =  com.sybase.afx.util.NetworkStreamParams.ExtractValue("trusted_certificates", _interProfile.NetworkStreamParams);
                 mlStreamParams += ";trusted_certificates=\"" + ts + "\"";
                 string tls = com.sybase.afx.util.NetworkStreamParams.ExtractValue("tls_type", _interProfile.NetworkStreamParams);
                 if (tls != null)
                 {
                     mlStreamParams += ";tls_type=\"" + tls + "\"";
                 }
             }
             System.Collections.Generic.IList<System.Collections.Generic.KeyValuePair<string, string>> nwParams = com.sybase.afx.util.NetworkStreamParams.Parse(_interProfile.NetworkStreamParams);
             foreach (System.Collections.Generic.KeyValuePair<string, string> entry in nwParams)
             {
                 string v = entry.Key;
                 if (!v.StartsWith("url_suffix") && !v.StartsWith("trusted_certificates") && !v.StartsWith("tls_type") 
                     && !v.StartsWith("http_userid") && !v.StartsWith("http_password") && !v.StartsWith("set_cookie") && !v.StartsWith("custom_header"))
                 {
                     mlStreamParams += ";" + v + "=\"" + entry.Value + "\"";
                 }
             }
                 
             syncParms.StreamParms = mlStreamParams;
             syncParms.Publications = synchronizationGroup;
             syncParms.AuthenticationParms = authList;
             syncParms.UploadOnly = syncContextEx.GetBoolean("uploadOnly");
             com.sybase.afx.db.ConnectionUtil.SetConnectionSyncParams(ulConn, syncParms);
             com.sybase.afx.db.CommandUtil.TraceSynchronize(_profile.GetSyncProfile(), synchronizationGroup, syncContext, GetRemoteId(ulConn));
             if (listener != null)
             {
                 string[] mboNames = com.sybase.afx.DatabaseBase.GetMBONames(synchronizationGroup, GetPublications());
                 System.Collections.Hashtable tableMBOMap = getTableMBOMap();
                 com.sybase.afx.db.ConnectionUtil.Synchronize(ulConn, listener, _interProfile.ToSyncConnection(), mboNames, tableMBOMap);                
             }
             else
             {
                 com.sybase.afx.db.ConnectionUtil.Synchronize(ulConn);                
             }
             
             //check protocol version
             PackageProperties _props = PackageProperties.Find("protocol_version");
             int _pv = 0;
             if (_props != null)
             {
                 _pv = System.Int32.Parse(_props.Value);
             }
             if (!isInitialSync && GetProtocolVersion() > _pv)
             {
                 string _msg = "device's protocol version is incompatible with the server's protocol version. (" + GetProtocolVersion() + " > " + _pv + ")";
                 Sybase.Persistence.ProtocolException _pe = new Sybase.Persistence.ProtocolException(_msg);
                 GetCallbackHandler().OnMessageException(_pe);
                 throw _pe;
             }            
             PackageProperties lastRequestId = PackageProperties.Find("lastRequestId");
             if(lastRequestId == null)
             {
                 lastRequestId = new PackageProperties();
                 lastRequestId.Key = "lastRequestId";
             }
             try
             {
                 lastRequestId.Value = KeyGenerator.GenerateId()+"";
             }
             catch(Sybase.Persistence.SynchronizeRequiredException)
             {
                 lastRequestId = null;
             }
             if(lastRequestId != null)
             {
                 lastRequestId.Save();
             }
             YPF.Comercial.RRCC.SUP.intrnl.OperationReplay.Finish();
         }
         catch(com.sybase.afx.db.SynchronizationException _ex)
         {
             string exMsg = _ex.ToString();
             com.sybase.afx.db.ConnectionImpl connImpl = (com.sybase.afx.db.ConnectionImpl)ulConn;
             iAnywhere.Data.UltraLite.ULConnection ul_conn = (iAnywhere.Data.UltraLite.ULConnection)connImpl.GetConnection();
             if (_ex.NativeError == com.sybase.afx.db.SynchronizationException.SQLE_MOBILINK_COMMUNICATIONS_ERROR)
             {                        
                 string strMessage = ul_conn.SyncResult.StreamErrorParameters;
                 try
                 {
                     int errorCode = System.Convert.ToInt32(strMessage);
                     Sybase.Mobile.Application.GetInstance().ApplicationCallback.OnHttpCommunicationError(errorCode, "", new Sybase.Collections.StringProperties());
                 }
                 catch (System.FormatException)
                 {
                 }
             }
 
             long authValue = ul_conn.SyncResult.AuthValue;
             if ((_ex.NativeError == com.sybase.afx.db.SynchronizationException.SQLE_MOBILINK_AUTHENTICATION_FAILED)
                && (authValue == com.sybase.afx.util.AuthExceptionUtil.FAILURE_CODE_TOKEN_VALIDATION_ERROR
                    || authValue == 4000))
             {
                 GetCallbackHandler().OnLoginFailure();
                 if (syncContext == null)
                 {
                     syncContext = new Sybase.Persistence.SynchronizationContext();
                 }
                 syncContext.ErrorCode = 401;
                 syncContext.ErrorMessage = "authentication failed.";
                 if (authValue == com.sybase.afx.util.AuthExceptionUtil.FAILURE_CODE_TOKEN_VALIDATION_ERROR)
                 {
                     syncContext.ErrorCode = 412;
                 }
             }
             com.sybase.afx.util.AuthExceptionUtil.CheckAuthValueAfterSync(com.sybase.afx.db.ConnectionUtil.GetConnectionSyncAuthValue(ulConn), _ex);
             if (_ex.NativeError == com.sybase.afx.db.SynchronizationException.SQLE_MOBILINK_COMMUNICATIONS_ERROR)
             {
                 exMsg += "Details:\n" + com.sybase.afx.db.ConnectionUtil.GetConnectionSyncDetail(ulConn) + "\n";
             }
             if( !"system".Equals(synchronizationGroup) &&
                     com.sybase.afx.db.SynchronizationException.SQLE_SERVER_SYNCHRONIZATION_ERROR == _ex.NativeError
             )
             {
                 try
                 {
                     YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.Synchronize("system", null);
                 }
                 catch
                 {
                     if (!"initialSync".Equals(synchronizationGroup))
                     {
                         string _msg = "the package is not deployed or device's protocol version may be incompatible with the server's protocol version. (" + GetProtocolVersion() + " > 0)";
                         Sybase.Persistence.ProtocolException _pe = new Sybase.Persistence.ProtocolException(_msg);
                         GetCallbackHandler().OnMessageException(_pe);
                         throw _pe;
                     }
                 }
             }
             
             throw new Sybase.Persistence.SynchronizeException(exMsg,_ex);
         }
         catch(System.Exception _ex)
         {
             throw new Sybase.Persistence.SynchronizeException(_ex.ToString(),_ex);
         }
         finally
         {
             if(ulConn != null)
             {
                 ReleaseDBConnection();;
             }
         }
     }
 }
Example #3
0
 private static void SynchronizeWithCallback (string synchronizationGroups, 
         object userContext, 
         Sybase.Persistence.SyncStatusListener listener, 
         com.sybase.afx.json.JsonObject syncContextEx)
 {
     Sybase.Persistence.SynchronizationContext syncContext = new Sybase.Persistence.SynchronizationContext(); 
     syncContext.UserContext =(userContext);
     Sybase.Collections.GenericList<Sybase.Persistence.ISynchronizationGroup> sgs = new Sybase.Collections.GenericList<Sybase.Persistence.ISynchronizationGroup>();
     foreach(string sg in com.sybase.afx.util.StringUtil.GetCommaSeparatedList(synchronizationGroups))
     {
         sgs.Add(GetSynchronizationGroup(sg));
     }
         
     syncContext.Status =(Sybase.Persistence.SynchronizationStatus.STARTING);
     Sybase.Persistence.SynchronizationAction _action = onSynchronizeCallback(sgs, syncContext);
     if(_action == Sybase.Persistence.SynchronizationAction.CANCEL)
     {
         return;
     }
     try
     {
         InternalSynchronize (synchronizationGroups, listener, syncContext, syncContextEx);
     }
     catch(Sybase.Persistence.SynchronizeException ex)
     {
         syncContext.Exception =(ex);
         syncContext.Status =(Sybase.Persistence.SynchronizationStatus.ERROR);
         onSynchronizeCallback(sgs, syncContext);            
         throw ex;
     }
     catch(Sybase.Persistence.PersistenceException ex)
     {
         syncContext.Exception =(ex);
         syncContext.Status =(Sybase.Persistence.SynchronizationStatus.ERROR);
         onSynchronizeCallback(sgs, syncContext);            
         throw ex;
     }
 
     if(GetSynchronizationProfile().AsyncReplay)
     {
         syncContext.Status =(Sybase.Persistence.SynchronizationStatus.ASYNC_REPLAY_UPLOADED);
     }
     else
     {
         syncContext.Status =(Sybase.Persistence.SynchronizationStatus.FINISHING);
     }
     onSynchronizeCallback(sgs, syncContext);
 }
Example #4
0
     public void Run()
     {
         Sybase.Persistence.SynchronizationContext syncContext = new Sybase.Persistence.SynchronizationContext();
         Sybase.Collections.GenericList<Sybase.Persistence.ISynchronizationGroup> sgs;
         System.Exception syncException;
         bool failed;
     
         while (true)
         {
             // Block for entries in SRQ
             if (_SRQ.Peek())
             {
                 // This thread is the only entity the dequeue while all only enqueue
                 // so there is no race condition regarding multiple dequeuers
                 // Transfer SRQ to IMQ
                 while (_SRQ.Size() != 0)
                 {
                     Sybase.Persistence.SynchronizationRequest request = _SRQ.Dequeue();
                     request.SyncReqStatus = Sybase.Persistence.SynchronizationRequest.ACTIVE;
                     _IMQ.Enqueue(request);
                 }
 
                 // Clear set to build list of synchronization group
                 syncSet.Clear();
                 contextSet.Clear();
                 syncMode = Sybase.Persistence.SynchronizationRequest.UPLOADONLYSYNC;
 
                 // onSynchronization call back for each request in case application wishes to cancel
                 foreach (Sybase.Persistence.SynchronizationRequest sr in _IMQ)
                 {
                     string userContext = (string)sr.Context;
                     syncContext.UserContext = userContext;
                     sgs = sr.SyncReqGroups;
                     syncContext.Status = Sybase.Persistence.SynchronizationStatus.STARTING;
 
                     // onSynchronize call back to validate sync requests
                     Sybase.Persistence.SynchronizationAction action = onSynchronizeCallback(sgs, syncContext);
                     if (action == Sybase.Persistence.SynchronizationAction.CANCEL)
                     {
                         // mark request canceled
                         sr.SyncReqStatus = Sybase.Persistence.SynchronizationRequest.CANCELLED;
                     }
                     else
                     {
                         // Collect distinct sync groups for approved requests
                         foreach (Sybase.Persistence.ISynchronizationGroup syncGroup in sr.SyncReqGroups)
                         {
                             if (!syncSet.Contains(syncGroup.Name))
                             {
                                 syncSet.Add(syncGroup.Name);
                             }
                         }
                         if (sr.SyncReqMode == Sybase.Persistence.SynchronizationRequest.FULLSYNC)
                         {
                             syncMode = Sybase.Persistence.SynchronizationRequest.FULLSYNC;
                         }
                         if (userContext != null)
                         {
                             // the user context is always a string
                             // Add non-duplicated context for this batch synchronization
                             contextSet.Add(userContext);
                         }
                     }
                 }
 
                 try
                 {
                     failed = false;
                     syncException = null;
                     if (syncSet.Size() > 0)
                     {
                         string allGroups = com.sybase.afx.util.StringUtil.Join(syncSet, ",");
 
                         // set up Synchronization context
                         // status field should still be STARTING
                         syncContext.Exception = null;
                         string allUserContext = com.sybase.afx.util.StringUtil.Join(contextSet, ",");
                         syncContext.UserContext = allUserContext;
  
                         com.sybase.afx.json.JsonObject syncContextEx = new com.sybase.afx.json.JsonObject();
                         if (syncMode == Sybase.Persistence.SynchronizationRequest.UPLOADONLYSYNC)
                         {
                             syncContextEx.Put("uploadOnly", "true");
                         }
                         else
                         {
                             syncContextEx.Put("uploadOnly", "false");
                         }
                         InternalSynchronize(allGroups, new Sybase.Persistence.DefaultStatusListener(syncContext), syncContext, syncContextEx);
                     }
                 }
                 catch (Sybase.Persistence.SynchronizeException ex)
                 {
                     failed = true;
                     syncException = ex;
                 }
                 catch (System.Exception e)
                 {
                     failed = true;
                     syncException = new Sybase.Persistence.SynchronizeException(e);
                 }
 
                 foreach (Sybase.Persistence.SynchronizationRequest sr in _IMQ)
                 {
                     if (sr.SyncReqStatus == Sybase.Persistence.SynchronizationRequest.CANCELLED)
                     {
                         continue;
                     }
 
                     syncContext.UserContext = sr.Context;
                     sgs = sr.SyncReqGroups;
 
                     if (failed)
                     {
                         syncContext.Status = Sybase.Persistence.SynchronizationStatus.ERROR;
                         syncContext.Exception = syncException;
                     }
                     else
                     {
                         syncContext.Status = Sybase.Persistence.SynchronizationStatus.FINISHING;
                         if(YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetSynchronizationProfile().AsyncReplay)
                         {
                             syncContext.Status = Sybase.Persistence.SynchronizationStatus.ASYNC_REPLAY_UPLOADED;                            
                         }
                         syncContext.Exception = null;
                     }
                     // onSynchronize call back with synchronization result
                     onSynchronizeCallback(sgs, syncContext);
                 }
                 _IMQ.Clear();
             }
         }
     }
        public void OnMessage(com.sybase.afx.json.JsonMessage msg)
        {
            string _notification = msg.GetHeaders().GetNullableString("SUPObjCmd");
            bool   _reregistered = (_notification != null && _notification.Equals("reregister"));

            if (_reregistered)
            {
                YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSubscriptionEnd();
                return;
            }
            string method         = msg.GetHeaders().GetString("method");
            bool   _isAsync       = "asyncReplayCompleted".Equals(method);
            string serverRemoteId = msg.GetHeaders().GetNullableString("remoteId");
            string clientRemoteId = GetRemoteId();

            if (serverRemoteId != null && clientRemoteId != null && !serverRemoteId.Equals(clientRemoteId))
            {
                return;
            }
            bool _isTcn = "tcn".Equals(method);

            if (!_isAsync && !_isTcn)
            {
                return;
            }
            com.sybase.afx.json.JsonObject _content = (com.sybase.afx.json.JsonObject)(msg.GetContent());
            string userContext          = _content.GetString("userContext");
            string synchronizationGroup = _content.GetString("synchronizationGroup");

            Sybase.Persistence.SynchronizationContext syncContext = new Sybase.Persistence.SynchronizationContext();
            syncContext.UserContext = userContext;
            Sybase.Collections.GenericList <Sybase.Persistence.ISynchronizationGroup> sgs = new Sybase.Collections.GenericList <Sybase.Persistence.ISynchronizationGroup>();
            foreach (string sg in com.sybase.afx.util.StringUtil.GetCommaSeparatedList(synchronizationGroup))
            {
                sgs.Add(YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetSynchronizationGroup(sg));
            }
            if (_isTcn)
            {
                syncContext.Status = Sybase.Persistence.SynchronizationStatus.STARTING_ON_NOTIFICATION;
            }
            else
            {
                syncContext.Status = Sybase.Persistence.SynchronizationStatus.ASYNC_REPLAY_COMPLETED;
            }
            if (YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSynchronize(sgs, syncContext) == Sybase.Persistence.SynchronizationAction.CANCEL)
            {
                return;
            }
            try
            {
                YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.BeginSynchronize(sgs, userContext);
            }
            catch (Sybase.Persistence.SynchronizeException ex)
            {
                syncContext.Exception = ex;
                syncContext.Status    = Sybase.Persistence.SynchronizationStatus.ERROR;
                YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSynchronize(sgs, syncContext);
                throw ex;
            }
            syncContext.Status = Sybase.Persistence.SynchronizationStatus.FINISHING;
            YPF.Comercial.RRCC.SUP.CRMMobileDesaDB.GetCallbackHandler().OnSynchronize(sgs, syncContext);
        }