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