commsfwutils/commsbufs/src/commsbufasyncreqinternal.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/src/commsbufasyncreqinternal.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,97 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "es_commsbuf_internal.h"
+#include <comms-infras/commsbufpondop.h>
+#include "commsbufasyncreqinternal.h"
+#include "commsbufpondintf.h"
+ 
+EXPORT_C CCommsBufAsyncRequest::CCommsBufAsyncRequest(TCommsBufAllocator& aAllocator)
+:iAllocator(aAllocator)
+    {
+    iLink.iPrev = &iLink;
+    iLink.iNext = &iLink;    
+    }
+ 
+EXPORT_C CCommsBufAsyncRequest::~CCommsBufAsyncRequest()
+    {
+    
+    }
+
+void CCommsBufAsyncRequest::Alloc(RCommsBufChain& aChain, TInt aSize, TInt aMinSize, TInt aMaxSize, TRequestStatus& aStatus)
+    {
+    iSize = aSize;
+    iMinSize = aMinSize;
+    iMaxSize = aMaxSize;
+    iChain = &aChain;
+    iStatusPtr = &aStatus;
+    *iStatusPtr = KRequestPending;
+    // Try to satify the request syncronously
+    TInt err = aChain.Alloc(iSize, iAllocator);
+    if (err==KErrNone)
+        {
+#ifdef __CFLOG_ACTIVE
+        __CFLOG_2(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RMBufAsyncRequest %x:\tAlloc(aLength %d) request satisfied immediately"), this, aLength);
+#endif
+        User::RequestComplete(iStatusPtr, KErrNone);
+        return;
+        }
+
+    // Sync alloc failed, so setup the async alloc request
+    TThreadId id = RThread().Id();
+    TInt ret = iThread.Open(id);
+    if(ret == KErrNone)
+        {
+#ifdef __CFLOG_ACTIVE
+        __CFLOG_2(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RCommsBufAsyncRequest %x:\tAlloc(aLength %d) starting request"), this, aSize);
+#endif
+        iAllocator.iPond.StartRequest(*this);
+        }
+    else
+        {
+#ifdef __CFLOG_ACTIVE
+        __CFLOG_3(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RCommsBufAsyncRequest %x:\tAlloc(aLength %d) failed with %d"), this, aSize, ret);
+#endif
+        }    
+    }
+
+void CCommsBufAsyncRequest::Cancel()
+    {
+    iAllocator.iPond.CancelRequest(*this);
+    }
+    
+EXPORT_C void CCommsBufAsyncRequest::Complete(TInt aCode)
+    {
+#ifdef __CFLOG_ACTIVE
+    __CFLOG_2(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RCommsBufAsyncRequest %x:\tComplete(aCode %d)"), this, aCode);
+#endif
+    iLink.Deque();
+    if (aCode==KErrNone)
+        {
+        // In future we may have another smarter way of doing this.
+        // Currently RCommsBufQ is internal
+        RCommsBufChain chain(iBufQ.First());       
+        iChain->Assign(chain);
+        iBufQ.Init();
+        }
+    else
+        {
+        iBufQ.Free();  
+        }
+        
+    iThread.RequestComplete(iStatusPtr, aCode);
+    iThread.Close();  
+    }
+