Example #1
0
            /// <summary>
            /// Dequeue messages from a persistent message queue file at server side in batch
            /// </summary>
            /// <param name="key">An ASCII string for identifying a queue at server side</param>
            /// <param name="d">A callback for tracking data like remaining message count within a server queue file, queue file size in bytes, message dequeued within this batch and bytes dequeued within this batch</param>
            /// <param name="timeout">A time-out number in milliseconds</param>
            /// <param name="discarded">a callback for tracking cancel or socket closed event</param>
            /// <returns>true for sending the request successfully, and false for failure</returns>
            public virtual bool Dequeue(byte[] key, DDequeue d, uint timeout, DDiscarded discarded)
            {
                DAsyncResultHandler rh = null;

                lock (m_csQ)
                {
                    m_keyDequeue = key;
                    if (d != null)
                    {
                        rh = (ar) =>
                        {
                            ulong messageCount, fileSize, ret;
                            ar.UQueue.Load(out messageCount).Load(out fileSize).Load(out ret);
                            uint messages = (uint)ret;
                            uint bytes    = (uint)(ret >> 32);
                            d((CAsyncQueue)ar.AsyncServiceHandler, messageCount, fileSize, messages, bytes);
                        };
                        m_dDequeue = d;
                    }
                    else
                    {
                        m_dDequeue = null;
                    }
                }
                using (CScopeUQueue sb = new CScopeUQueue())
                {
                    CUQueue q = sb.UQueue;
                    q.Save(key).Save(timeout);
                    return(SendRequest(idDequeue, q, rh, discarded, (DOnExceptionFromServer)null));
                }
            }
Example #2
0
        protected override void OnPostProcessing(uint hint, ulong data)
        {
            CContext      ctx = null;
            CClientSocket cs  = AttachedClientSocket;

            lock (m_csFile) {
                if (m_vContext.Count > 0)
                {
                    CContext context = m_vContext[0];
                    if (context.Uploading)
                    {
                        OpenLocalRead(context);
                    }
                    else
                    {
                        OpenLocalWrite(context);
                    }
                    DAsyncResultHandler    rh = null;
                    DOnExceptionFromServer se = null;
                    if (context.HasError)
                    {
                        ctx = context;
                    }
                    else if (context.Uploading)
                    {
                        if (!SendRequest(idUpload, context.FilePath, context.Flags, context.FileSize, rh, context.Discarded, se))
                        {
                            ctx             = context;
                            context.ErrCode = cs.ErrorCode;
                            context.ErrMsg  = cs.ErrorMsg;
                        }
                    }
                    else
                    {
                        if (!SendRequest(idDownload, context.LocalFile, context.FilePath, context.Flags, context.InitSize, rh, context.Discarded, se))
                        {
                            ctx             = context;
                            context.ErrCode = cs.ErrorCode;
                            context.ErrMsg  = cs.ErrorMsg;
                        }
                    }
                }
            }
            if (ctx == null)
            {
                return;
            }
            if (ctx.Download != null)
            {
                ctx.Download(this, ctx.ErrCode, ctx.ErrMsg);
            }
            lock (m_csFile) {
                CloseFile(m_vContext.RemoveFromFront());
                if (m_vContext.Count > 0)
                {
                    ClientCoreLoader.PostProcessing(AttachedClientSocket.Handle, 0, 0);
                    AttachedClientSocket.DoEcho(); //make sure WaitAll works correctly
                }
            }
        }
Example #3
0
 /// <summary>
 /// Dequeue messages from a persistent message queue file at server side in batch
 /// </summary>
 /// <param name="key">An ASCII string for identifying a queue at server side</param>
 /// <param name="d">A callback for tracking data like remaining message count within a server queue file, queue file size in bytes, message dequeued within this batch and bytes dequeued within this batch</param>
 /// <param name="timeout">A time-out number in milliseconds</param>
 /// <returns>true for sending the request successfully, and false for failure</returns>
 public bool Dequeue(byte[] key, DDequeue d, uint timeout)
 {
     DAsyncResultHandler rh = null;
     if (key == null)
         key = new byte[0];
     lock (m_csQ)
     {
         m_keyDequeue = key;
         if (d != null)
         {
             rh = (ar) =>
             {
                 ulong messageCount, fileSize, ret;
                 ar.Load(out messageCount).Load(out fileSize).Load(out ret);
                 uint messages = (uint)ret;
                 uint bytes = (uint)(ret >> 32);
                 d(messageCount, fileSize, messages, bytes);
             };
             m_dDequeue = d;
         }
         else
         {
             m_dDequeue = null;
         }
     }
     using (CScopeUQueue sb = new CScopeUQueue())
     {
         sb.Save(key).Save(timeout);
         return SendRequest(idDequeue, sb, rh);
     }
 }
Example #4
0
 public virtual bool SendRequest(ushort reqId, CScopeUQueue q, DAsyncResultHandler ash)
 {
     if (q == null)
     {
         return(SendRequest(reqId, ash));
     }
     return(SendRequest(reqId, q.UQueue, ash));
 }
Example #5
0
 public virtual bool SendRequest(ushort reqId, CScopeUQueue q, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception)
 {
     if (q == null)
     {
         return(SendRequest(reqId, ash, discarded, exception));
     }
     return(SendRequest(reqId, q.UQueue, ash, discarded, exception));
 }
Example #6
0
            public bool SendRequest <T0, T1, T2>(ushort reqId, T0 t0, T1 t1, T2 t2, DAsyncResultHandler ash)
            {
                CUQueue su = CScopeUQueue.Lock();

                su.Save(t0).Save(t1).Save(t2);
                bool ok = SendRequest(reqId, su, ash);

                CScopeUQueue.Unlock(su);
                return(ok);
            }
Example #7
0
            public bool SendRequest <T0, T1, T2>(ushort reqId, T0 t0, T1 t1, T2 t2, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception)
            {
                CUQueue su = CScopeUQueue.Lock();

                su.Save(t0).Save(t1).Save(t2);
                bool ok = SendRequest(reqId, su, ash, discarded, exception);

                CScopeUQueue.Unlock(su);
                return(ok);
            }
Example #8
0
 public virtual bool SendRequest(ushort reqId, CUQueue q, DAsyncResultHandler ash)
 {
     if (q == null)
     {
         return(SendRequest(reqId, ash));
     }
     if (q.HeadPosition > 0)
     {
         return(SendRequest(reqId, q.GetBuffer(), q.GetSize(), ash));
     }
     return(SendRequest(reqId, q.m_bytes, q.GetSize(), ash));
 }
Example #9
0
 public virtual bool SendRequest(ushort reqId, CUQueue q, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception)
 {
     if (q == null)
     {
         return(SendRequest(reqId, ash, discarded, exception));
     }
     if (q.HeadPosition > 0)
     {
         return(SendRequest(reqId, q.GetBuffer(), q.GetSize(), ash, discarded, exception));
     }
     return(SendRequest(reqId, q.m_bytes, q.GetSize(), ash, discarded, exception));
 }
Example #10
0
    public bool GetMasterSlaveConnectedSessions(DConnectedSessions cs, DDiscarded discarded = null)
    {
        DAsyncResultHandler arh = (ar) => {
            uint master_connections, slave_conenctions;
            ar.Load(out master_connections).Load(out slave_conenctions);
            if (cs != null)
            {
                cs(master_connections, slave_conenctions);
            }
        };

        return(SendRequest(ss.Consts.idGetMasterSlaveConnectedSessions, arh, discarded, (DOnExceptionFromServer)null));
    }
Example #11
0
            private DAsyncResultHandler GetRH(DEnqueue e)
            {
                DAsyncResultHandler rh = null;

                if (e != null)
                {
                    rh = (ar) => {
                        ulong index;
                        ar.Load(out index);
                        e((CAsyncQueue)ar.AsyncServiceHandler, index);
                    };
                }
                return(rh);
            }
Example #12
0
 private DAsyncResultHandler GetRH(DEnqueue e)
 {
     DAsyncResultHandler rh = null;
     if (e != null)
     {
         rh = (ar) =>
         {
             ulong index;
             ar.Load(out index);
             e(index);
         };
     }
     return rh;
 }
Example #13
0
    public bool GetRentalDateTimes(long rentalId, DRentalDateTimes rdt, DDiscarded discarded = null)
    {
        DAsyncResultHandler arh = (ar) => {
            int    errCode;
            string errMsg;
            ss.CRentalDateTimes dates;
            ar.Load(out dates).Load(out errCode).Load(out errMsg);
            if (rdt != null)
            {
                rdt(dates, errCode, errMsg);
            }
        };

        return(SendRequest(ss.Consts.idGetRentalDateTimes, rentalId, arh, discarded, (DOnExceptionFromServer)null));
    }
Example #14
0
    public bool UploadEmployees(SocketProAdapter.UDB.CDBVariantArray vData, DUploadEmployees res, DDiscarded discarded = null)
    {
        DAsyncResultHandler arh = (ar) => {
            int            errCode;
            string         errMsg;
            ss.CInt64Array vId;
            ar.Load(out errCode).Load(out errMsg).Load(out vId);
            if (res != null)
            {
                res(errCode, errMsg, vId);
            }
        };

        return(SendRequest(ss.Consts.idUploadEmployees, vData, arh, discarded, (DOnExceptionFromServer)null));
    }
Example #15
0
    public bool QueryPaymentMaxMinAvgs(string filter, DMaxMinAvg mma, DDiscarded discarded = null)
    {
        DAsyncResultHandler arh = (ar) => {
            int           res;
            string        errMsg;
            ss.CMaxMinAvg m_m_a;
            ar.Load(out res).Load(out errMsg).Load(out m_m_a);
            if (mma != null)
            {
                mma(m_m_a, res, errMsg);
            }
        };

        return(SendRequest(ss.Consts.idQueryMaxMinAvgs, filter, arh, discarded, (DOnExceptionFromServer)null));
    }
Example #16
0
        protected override void OnResultReturned(ushort reqId, CUQueue mc)
        {
            switch (reqId)
            {
            case idDownload:
            {
                int    res;
                string errMsg;
                mc.Load(out res).Load(out errMsg);
                DDownload dl = null;
                lock (m_csFile)
                {
                    if (m_vContext.Count > 0)
                    {
                        CContext ctx = m_vContext[0];
                        ctx.ErrCode = res;
                        ctx.ErrMsg  = errMsg;
                        dl          = ctx.Download;
                    }
                }
                if (dl != null)
                {
                    dl.Invoke(this, res, errMsg);
                }
                lock (m_csFile)
                {
                    if (m_vContext.Count > 0)
                    {
                        CloseFile(m_vContext.RemoveFromFront());
                    }
                }
                OnPostProcessing(0, 0);
            }
            break;

            case idStartDownloading:
                lock (m_csFile)
                {
                    long   fileSize;
                    string localFile, remoteFile;
                    uint   flags;
                    long   initSize;
                    mc.Load(out fileSize).Load(out localFile).Load(out remoteFile).Load(out flags).Load(out initSize);
                    lock (m_csFile)
                    {
                        if (m_vContext.Count == 0)
                        {
                            CContext ctx = new CContext(false, flags);
                            ctx.LocalFile = localFile;
                            ctx.FilePath  = remoteFile;
                            OpenLocalWrite(ctx);
                            ctx.InitSize = initSize;
                            m_vContext.AddToBack(ctx);
                        }
                        CContext context = m_vContext[0];
                        context.FileSize = fileSize;
                        initSize         = (context.InitSize > 0) ? context.InitSize : 0;
                        if (context.File.Position > initSize)
                        {
                            context.File.SetLength(initSize);
                        }
                    }
                }
                break;

            case idDownloading:
            {
                long          downloaded = 0;
                DTransferring trans      = null;
                CContext      context    = null;
                lock (m_csFile)
                {
                    if (m_vContext.Count > 0)
                    {
                        context = m_vContext[0];
                        trans   = context.Transferring;
                        byte[] buffer = mc.IntenalBuffer;
                        try
                        {
                            context.File.Write(buffer, 0, (int)mc.GetSize());
                            long initSize = (context.InitSize > 0) ? context.InitSize : 0;
                            downloaded = context.File.Position - initSize;
                        }
                        catch (System.IO.IOException err)
                        {
                            context.ErrMsg = err.Message;
#if NO_HRESULT
                            context.ErrCode = CANNOT_OPEN_LOCAL_FILE_FOR_WRITING;
#else
                            context.ErrCode = err.HResult;
#endif
                        }
                    }
                }
                mc.SetSize(0);
                if (context != null && context.HasError)
                {
                    if (context.Download != null)
                    {
                        context.Download.Invoke(this, context.ErrCode, context.ErrMsg);
                    }
                    CloseFile(m_vContext.RemoveFromFront());
                    OnPostProcessing(0, 0);
                }
                else if (trans != null)
                {
                    trans.Invoke(this, downloaded);
                }
            }
            break;

            case idUploadBackup:
                break;

            case idUpload:
            {
                CContext context = null;
                int      res;
                string   errMsg;
                mc.Load(out res).Load(out errMsg);
                if (res != 0 || (errMsg != null && errMsg.Length > 0))
                {
                    lock (m_csFile)
                    {
                        if (m_vContext.Count > 0)
                        {
                            context = m_vContext[0];
                            mc.Load(out context.InitSize);
                            context.ErrCode = res;
                            context.ErrMsg  = errMsg;
                        }
                    }
                }
                else
                {
                    CClientSocket cs = Socket;
                    lock (m_csFile)
                    {
                        if (m_vContext.Count > 0)
                        {
                            context = m_vContext[0];
                            mc.Load(out context.InitSize);
                            using (CScopeUQueue sb = new CScopeUQueue())
                            {
                                DAsyncResultHandler    rh = null;
                                DOnExceptionFromServer se = null;
                                if (sb.UQueue.MaxBufferSize < STREAM_CHUNK_SIZE)
                                {
                                    sb.UQueue.Realloc(STREAM_CHUNK_SIZE);
                                }
                                byte[] buffer = sb.UQueue.IntenalBuffer;
                                try
                                {
                                    context.QueueOk = cs.ClientQueue.StartJob();
                                    bool queue_enabled = cs.ClientQueue.Available;
                                    if (queue_enabled)
                                    {
                                        SendRequest(idUploadBackup, context.FilePath, context.Flags, context.FileSize, context.InitSize, rh, context.Discarded, se);
                                    }
                                    int ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE);
                                    while (ret == STREAM_CHUNK_SIZE)
                                    {
                                        if (!SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se))
                                        {
                                            context.ErrCode = cs.ErrorCode;
                                            context.ErrMsg  = cs.ErrorMsg;
                                            break;
                                        }
                                        ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE);
                                        if (queue_enabled)
                                        {
                                            //save file into client message queue
                                        }
                                        else if (cs.BytesInSendingBuffer > 40 * STREAM_CHUNK_SIZE)
                                        {
                                            break;
                                        }
                                    }
                                    if (ret > 0 && !context.HasError)
                                    {
                                        if (!SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se))
                                        {
                                            context.ErrCode = cs.ErrorCode;
                                            context.ErrMsg  = cs.ErrorMsg;
                                        }
                                    }
                                    if (ret < STREAM_CHUNK_SIZE && !context.HasError)
                                    {
                                        context.Sent = true;
                                        SendRequest(idUploadCompleted, rh, context.Discarded, se);
                                        if (context.QueueOk)
                                        {
                                            Socket.ClientQueue.EndJob();
                                        }
                                    }
                                }
                                catch (System.IO.IOException err)
                                {
                                    errMsg = err.Message;
#if NO_HRESULT
                                    res = CANNOT_OPEN_LOCAL_FILE_FOR_READING;
#else
                                    res = err.HResult;
#endif
                                    context.ErrCode = res;
                                    context.ErrMsg  = errMsg;
                                }
                            }
                        }
                    }
                }
                if (context != null && context.HasError)
                {
                    if (context.Upload != null)
                    {
                        context.Upload.Invoke(this, context.ErrCode, context.ErrMsg);
                    }
                    lock (m_csFile)
                    {
                        CloseFile(m_vContext.RemoveFromFront());
                    }
                    if (context.QueueOk)
                    {
                        Socket.ClientQueue.AbortJob();
                    }
                    OnPostProcessing(0, 0);
                }
            }
            break;

            case idUploading:
            {
                int           errCode = 0;
                string        errMsg  = "";
                CContext      context = null;
                DTransferring trans   = null;
                long          uploaded;
                mc.Load(out uploaded);
                if (mc.GetSize() >= 8)
                {
                    mc.Load(out errCode).Load(out errMsg);
                }
                lock (m_csFile)
                {
                    if (m_vContext.Count > 0)
                    {
                        context = m_vContext[0];
                        trans   = context.Transferring;
                        if (uploaded < 0 || errCode != 0 || errMsg.Length != 0)
                        {
                            context.ErrCode = errCode;
                            context.ErrMsg  = errMsg;
                            CloseFile(context);
                        }
                        else if (!context.Sent)
                        {
                            using (CScopeUQueue sb = new CScopeUQueue())
                            {
                                DAsyncResultHandler    rh = null;
                                DOnExceptionFromServer se = null;
                                if (sb.UQueue.MaxBufferSize < STREAM_CHUNK_SIZE)
                                {
                                    sb.UQueue.Realloc(STREAM_CHUNK_SIZE);
                                }
                                byte[] buffer = sb.UQueue.IntenalBuffer;
                                try
                                {
                                    int ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE);
                                    if (ret > 0)
                                    {
                                        SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se);
                                    }
                                    if (ret < STREAM_CHUNK_SIZE)
                                    {
                                        context.Sent = true;
                                        SendRequest(idUploadCompleted, rh, context.Discarded, se);
                                    }
                                }
                                catch (System.IO.IOException err)
                                {
                                    context.ErrMsg = err.Message;
#if NO_HRESULT
                                    context.ErrCode = CANNOT_OPEN_LOCAL_FILE_FOR_READING;
#else
                                    context.ErrCode = err.HResult;
#endif
                                }
                            }
                        }
                    }
                }
                if (context != null && context.HasError)
                {
                    if (context.Upload != null)
                    {
                        context.Upload.Invoke(this, context.ErrCode, context.ErrMsg);
                    }
                    lock (m_csFile)
                    {
                        CloseFile(m_vContext.RemoveFromFront());
                    }
                    OnPostProcessing(0, 0);
                }
                else if (trans != null)
                {
                    trans.Invoke(this, uploaded);
                }
            }
            break;

            case idUploadCompleted:
            {
                DUpload upl = null;
                lock (m_csFile)
                {
                    if (m_vContext.Count > 0)
                    {
                        if (m_vContext[0].File != null)
                        {
                            upl = m_vContext[0].Upload;
                        }
                        else
                        {
                            m_vContext[0].QueueOk = false;
                            m_vContext[0].Sent    = false;
                            CloseFile(m_vContext[0]);
                        }
                    }
                }
                if (upl != null)
                {
                    upl.Invoke(this, 0, "");
                }
                lock (m_csFile)
                {
                    if (m_vContext.Count > 0)
                    {
                        if (m_vContext[0].File != null)
                        {
                            CloseFile(m_vContext.RemoveFromFront());
                        }
                    }
                }
                OnPostProcessing(0, 0);
            }
            break;

            default:
                base.OnResultReturned(reqId, mc);
                break;
            }
        }
Example #17
0
 public virtual bool SendRequest(ushort reqId, byte[] data, uint len, DAsyncResultHandler ash)
 {
     return(SendRequest(reqId, data, len, ash, null, null));
 }
Example #18
0
        protected override void OnPostProcessing(uint hint, ulong data)
        {
            uint d = 0;
            DAsyncResultHandler rh = null;

            System.Threading.Monitor.Enter(m_csFile);
            foreach (CContext it in m_vContext)
            {
                if (d >= m_MaxDownloading)
                {
                    break;
                }
                if (it.File != null)
                {
                    if (it.Uploading)
                    {
                        break;
                    }
                    else
                    {
                        ++d;
                        continue;
                    }
                }
                if (it.HasError)
                {
                    continue;
                }
                if (it.Uploading)
                {
                    OpenLocalRead(it);
                    if (!it.HasError)
                    {
                        if (!SendRequest(idUpload, it.FilePath, it.Flags, it.FileSize, rh, it.Discarded, it.Se))
                        {
                            CClientSocket cs = Socket;
                            it.ErrCode = cs.ErrorCode;
                            if (it.ErrCode == 0)
                            {
                                it.ErrCode = SESSION_CLOSED_BEFORE;
                                it.ErrMsg  = SESSION_CLOSED_BEFORE_ERR_MSG;
                            }
                            else
                            {
                                it.ErrMsg = cs.ErrorMsg;
                            }
#if TASKS_ENABLED
                            if (it.Fut != null)
                            {
                                it.Fut.TrySetException(new CSocketError(it.ErrCode, it.ErrMsg, idUpload, true));
                                it.Discarded = null;
                                it.Se        = null;
                            }
#endif
                            continue;
                        }
                        break;
                    }
                }
                else
                {
                    OpenLocalWrite(it);
                    if (!it.HasError)
                    {
                        if (!SendRequest(idDownload, it.LocalFile, it.FilePath, it.Flags, it.InitSize, rh, it.Discarded, it.Se))
                        {
                            CClientSocket cs = Socket;
                            it.ErrCode = cs.ErrorCode;
                            if (it.ErrCode == 0)
                            {
                                it.ErrCode = SESSION_CLOSED_BEFORE;
                                it.ErrMsg  = SESSION_CLOSED_BEFORE_ERR_MSG;
                            }
                            else
                            {
                                it.ErrMsg = cs.ErrorMsg;
                            }
#if TASKS_ENABLED
                            if (it.Fut != null)
                            {
                                it.Fut.TrySetException(new CSocketError(it.ErrCode, it.ErrMsg, idDownload, true));
                                it.Discarded = null;
                                it.Se        = null;
                            }
#endif
                        }
                        ++d;
                    }
                }
            }
            while (m_vContext.Count > 0)
            {
                CContext it = m_vContext[0];
                if (it.HasError)
                {
                    CloseFile(it);
                    if (it.Uploading)
                    {
                        DUpload cb = it.Upload;
                        if (cb != null)
                        {
                            int    errCode = it.ErrCode;
                            string errMsg  = it.ErrMsg;
                            try
                            {
                                System.Threading.Monitor.Exit(m_csFile);
                                cb.Invoke(this, errCode, errMsg);
                            }
                            finally
                            {
                                System.Threading.Monitor.Enter(m_csFile);
                            }
                        }
                    }
                    else
                    {
                        DDownload cb = it.Download;
                        if (cb != null)
                        {
                            int    errCode = it.ErrCode;
                            string errMsg  = it.ErrMsg;
                            try
                            {
                                System.Threading.Monitor.Exit(m_csFile);
                                cb.Invoke(this, errCode, errMsg);
                            }
                            finally
                            {
                                System.Threading.Monitor.Enter(m_csFile);
                            }
                        }
                    }
                    m_vContext.RemoveFromFront();
                }
                else
                {
                    break;
                }
            }
            System.Threading.Monitor.Exit(m_csFile);
        }
Example #19
0
            public bool SendRequest <T0, T1, T2, T3, T4, T5, T6, T7, T8>(ushort reqId, T0 t0, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception)
            {
                CUQueue su = CScopeUQueue.Lock();

                su.Save(t0).Save(t1).Save(t2).Save(t3).Save(t4).Save(t5).Save(t6).Save(t7).Save(t8);
                bool ok = SendRequest(reqId, su, ash, discarded, exception);

                CScopeUQueue.Unlock(su);
                return(ok);
            }
Example #20
0
 public bool SendRequest(ushort reqId, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception)
 {
     return(SendRequest(reqId, (byte[])null, (uint)0, ash, discarded, exception));
 }
Example #21
0
 public bool SendRequest(ushort reqId, DAsyncResultHandler ash)
 {
     return(SendRequest(reqId, (byte[])null, (uint)0, ash));
 }
Example #22
0
        private bool Transfer()
        {
            int index = 0;
            DAsyncResultHandler    rh = null;
            DOnExceptionFromServer se = null;
            CClientSocket          cs = AttachedClientSocket;

            if (!cs.Sendable)
            {
                return(false);
            }
            uint sent_buffer_size = cs.BytesInSendingBuffer;

            if (sent_buffer_size > 3 * STREAM_CHUNK_SIZE)
            {
                return(true);
            }
            while (index < m_vContext.Count)
            {
                CContext context = m_vContext[index];
                if (context.Sent)
                {
                    ++index;
                    continue;
                }
                if (context.Uploading && context.Tried && context.File == null)
                {
                    if (index == 0)
                    {
                        if (context.Upload != null)
                        {
                            context.Upload(this, CANNOT_OPEN_LOCAL_FILE_FOR_READING, context.ErrMsg);
                        }
                        m_vContext.RemoveFromFront();
                    }
                    else
                    {
                        ++index;
                    }
                    continue;
                }
                if (context.Uploading)
                {
                    if (!context.Tried)
                    {
                        context.Tried = true;
                        try
                        {
                            FileShare fs = FileShare.None;
                            if ((context.Flags & FILE_OPEN_SHARE_READ) == FILE_OPEN_SHARE_READ)
                            {
                                fs = FileShare.Read;
                            }
                            context.File     = new FileStream(context.LocalFile, FileMode.Open, FileAccess.Read, fs);
                            context.FileSize = context.File.Length;
                            IClientQueue cq = AttachedClientSocket.ClientQueue;
                            if (cq.Available)
                            {
                                if (!cq.StartJob())
                                {
                                    context.File.Close();
                                    context.File = null;
                                    throw new Exception("Cannot start queue job");
                                }
                            }
                            if (!SendRequest(idUpload, context.FilePath, context.Flags, context.FileSize, rh, context.Discarded, se))
                            {
                                return(false);
                            }
                        }
                        catch (Exception err)
                        {
                            context.ErrMsg = err.Message;
                        }
                        finally { }
                    }
                    if (context.File == null)
                    {
                        if (index == 0)
                        {
                            if (context.Upload != null)
                            {
                                context.Upload(this, CANNOT_OPEN_LOCAL_FILE_FOR_READING, context.ErrMsg);
                            }
                            m_vContext.RemoveFromFront();
                        }
                        else
                        {
                            ++index;
                        }
                        continue;
                    }
                    else
                    {
                        using (CScopeUQueue sb = new CScopeUQueue())
                        {
                            if (sb.UQueue.MaxBufferSize < STREAM_CHUNK_SIZE)
                            {
                                sb.UQueue.Realloc(STREAM_CHUNK_SIZE);
                            }
                            byte[] buffer = sb.UQueue.IntenalBuffer;
                            int    ret    = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE);
                            while (ret > 0)
                            {
                                if (!SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se))
                                {
                                    return(false);
                                }
                                sent_buffer_size = cs.BytesInSendingBuffer;
                                if (ret < (int)STREAM_CHUNK_SIZE)
                                {
                                    break;
                                }
                                if (sent_buffer_size >= 5 * STREAM_CHUNK_SIZE)
                                {
                                    break;
                                }
                                ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE);
                            }
                            if (ret < (int)STREAM_CHUNK_SIZE)
                            {
                                context.Sent = true;
                                if (!SendRequest(idUploadCompleted, rh, context.Discarded, se))
                                {
                                    return(false);
                                }
                                IClientQueue cq = AttachedClientSocket.ClientQueue;
                                if (cq.Available)
                                {
                                    cq.EndJob();
                                }
                            }
                            if (sent_buffer_size >= 4 * STREAM_CHUNK_SIZE)
                            {
                                break;
                            }
                        }
                    }
                }
                else
                {
                    if (!SendRequest(idDownload, context.FilePath, context.Flags, rh, context.Discarded, se))
                    {
                        return(false);
                    }
                    context.Sent     = true;
                    context.Tried    = true;
                    sent_buffer_size = cs.BytesInSendingBuffer;
                    if (sent_buffer_size > 3 * STREAM_CHUNK_SIZE)
                    {
                        break;
                    }
                }
                ++index;
            }
            return(true);
        }
Example #23
0
            public bool SendRequest <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(ushort reqId, T0 t0, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, DAsyncResultHandler ash)
            {
                CUQueue su = CScopeUQueue.Lock();

                su.Save(t0).Save(t1).Save(t2).Save(t3).Save(t4).Save(t5).Save(t6).Save(t7).Save(t8).Save(t9);
                bool ok = SendRequest(reqId, su, ash);

                CScopeUQueue.Unlock(su);
                return(ok);
            }
Example #24
0
            public virtual bool SendRequest(ushort reqId, byte[] data, uint len, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception)
            {
                bool sent;
                byte batching;
                MyKeyValue <ushort, CResultCb> kv;

                if (reqId <= (ushort)tagBaseRequestID.idReservedTwo)
                {
                    throw new ArgumentException("Request id must be larger than 0x2001");
                }
                if (null == m_ClientSocket)
                {
                    return(false);
                }
                IntPtr h = m_ClientSocket.Handle;

                if (data != null && len > (uint)data.Length)
                {
                    len = (uint)data.Length;
                }
                if (ash != null || discarded != null || exception != null)
                {
                    CResultCb rcb = new CResultCb(ash, discarded, exception);
                    kv       = new MyKeyValue <ushort, CResultCb>(reqId, rcb);
                    batching = ClientCoreLoader.IsBatching(h);
                    lock (m_csSend)
                    {
                        lock (m_cs)
                        {
                            if (batching != 0)
                            {
                                m_kvBatching.AddToBack(kv);
                            }
                            else
                            {
                                m_kvCallback.AddToBack(kv);
                            }
                        }
                        unsafe
                        {
                            fixed(byte *buffer = data)
                            {
                                sent = (ClientCoreLoader.SendRequest(h, reqId, buffer, len) != 0);
                            }
                        }
                    }
                }
                else
                {
                    kv       = null;
                    batching = 0;
                    unsafe
                    {
                        fixed(byte *buffer = data)
                        {
                            sent = (ClientCoreLoader.SendRequest(h, reqId, buffer, len) != 0);
                        }
                    }
                }
                if (sent)
                {
                    return(true);
                }
                if (kv != null)
                {
                    lock (m_cs)
                    {
                        if (batching > 0)
                        {
                            m_kvBatching.Clear();
                        }
                        else
                        {
                            m_kvCallback.Clear();
                        }
                    }
                }
                return(false);
            }
Example #25
0
 public CResultCb(DAsyncResultHandler rh, DDiscarded d, DOnExceptionFromServer ex)
 {
     AsyncResultHandler  = rh;
     Discarded           = d;
     ExceptionFromServer = ex;
 }