1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project 3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License. 6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at 7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and 14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License. 15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Store data bytes in a variable-size queue. 19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "DataQueue.h" 22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 237b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk#include <cutils/log.h> 247b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk 25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: DataQueue 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Initialize member variables. 31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectDataQueue::DataQueue () 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: ~DataQueue 43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Release all resources. 45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectDataQueue::~DataQueue () 50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project while (mQueue.empty() == false) 53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tHeader* header = mQueue.front (); 55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mQueue.pop_front (); 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project free (header); 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool DataQueue::isEmpty() 63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = mQueue.empty(); 66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: enqueue 74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Append data to the queue. 76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** data: array of bytes 77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** dataLen: length of the data. 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool DataQueue::enqueue (UINT8* data, UINT16 dataLen) 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((data == NULL) || (dataLen==0)) 85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return false; 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = false; 90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tHeader* header = (tHeader*) malloc (sizeof(tHeader) + dataLen); 91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (header) 93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (header, 0, sizeof(tHeader)); 95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project header->mDataLen = dataLen; 96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (header+1, data, dataLen); 97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mQueue.push_back (header); 99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("DataQueue::enqueue: out of memory ?????"); 105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: dequeue 114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Retrieve and remove data from the front of the queue. 116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** buffer: array to store the data. 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** bufferMaxLen: maximum size of the buffer. 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** actualLen: actual length of the data. 119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool DataQueue::dequeue (UINT8* buffer, UINT16 bufferMaxLen, UINT16& actualLen) 124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tHeader* header = mQueue.front (); 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = false; 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (header && buffer && (bufferMaxLen>0)) 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (header->mDataLen <= bufferMaxLen) 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //caller's buffer is big enough to store all data 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project actualLen = header->mDataLen; 136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project char* src = (char*)(header) + sizeof(tHeader) + header->mOffset; 137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (buffer, src, actualLen); 138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mQueue.pop_front (); 140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project free (header); 141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //caller's buffer is too small 145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project actualLen = bufferMaxLen; 146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project char* src = (char*)(header) + sizeof(tHeader) + header->mOffset; 147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (buffer, src, actualLen); 148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //adjust offset so the next dequeue() will get the remainder 149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project header->mDataLen -= actualLen; 150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project header->mOffset += actualLen; 151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 158