diff options
Diffstat (limited to 'gps/libloc_api_50001/loc_eng_msg.cpp')
-rw-r--r-- | gps/libloc_api_50001/loc_eng_msg.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/gps/libloc_api_50001/loc_eng_msg.cpp b/gps/libloc_api_50001/loc_eng_msg.cpp new file mode 100644 index 0000000..97c0457 --- /dev/null +++ b/gps/libloc_api_50001/loc_eng_msg.cpp @@ -0,0 +1,133 @@ +/* Copyright (c) 2011, Code Aurora Forum. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Code Aurora Forum, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include <fcntl.h> +#include "loc_eng_msg.h" +#include "loc_eng_dmn_conn_glue_msg.h" + +#ifdef _ANDROID_ + +#define LOC_ENG_MSG_REQ_Q_PATH "/data/misc/gpsone_d/loc_eng_msg_req_q" + +#else + +#define LOC_ENG_MSG_REQ_Q_PATH "/tmp/loc_eng_msg_req_q" + +#endif + +int loc_eng_msgget(int * p_req_msgq) +{ + * p_req_msgq = loc_eng_dmn_conn_glue_msgget(LOC_ENG_MSG_REQ_Q_PATH, O_RDWR); + return 0; +} + +int loc_eng_msgremove(int req_msgq) +{ + loc_eng_dmn_conn_glue_piperemove(LOC_ENG_MSG_REQ_Q_PATH, req_msgq); + return 0; +} + +int loc_eng_msgsnd(int msgqid, void * msgp) +{ + int ret = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, sizeof(void*)); + return ret; +} + +int loc_eng_msgsnd_raw(int msgqid, void * msgp, unsigned int msgsz) +{ + int result; + + struct msgbuf * pmsg = (struct msgbuf *) msgp; + + if (msgsz < sizeof(struct msgbuf)) { + LOC_LOGE("%s:%d] msgbuf is too small %d\n", __func__, __LINE__, msgsz); + return -1; + } + + pmsg->msgsz = msgsz; + + result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz); + if (result != (int) msgsz) { + LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz); + return -1; + } + return result; +} + +int loc_eng_msgrcv(int msgqid, void ** msgp) +{ + int ret = loc_eng_dmn_conn_glue_piperead(msgqid, msgp, sizeof(void*)); + return ret; +} + +int loc_eng_msgrcv_raw(int msgqid, void *msgp, unsigned int msgsz) +{ + int result; + struct msgbuf * pmsg = (struct msgbuf *) msgp; + + if (msgsz < sizeof(struct msgbuf)) { + LOC_LOGE("%s:%d] msgbuf is too small %d\n", __func__, __LINE__, msgsz); + return -1; + } + + result = loc_eng_dmn_conn_glue_piperead(msgqid, msgp, sizeof(struct msgbuf)); + if (result != sizeof(struct msgbuf)) { + LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result); + return -1; + } + + if (msgsz < pmsg->msgsz) { + LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgsz, (int) pmsg->msgsz); + return -1; + } + + if (pmsg->msgsz > sizeof(struct msgbuf)) { + /* there is msg body */ + msgp += sizeof(struct msgbuf); + + result = loc_eng_dmn_conn_glue_piperead(msgqid, msgp, pmsg->msgsz - sizeof(struct msgbuf)); + + if (result != (int) (pmsg->msgsz - sizeof(struct msgbuf))) { + LOC_LOGE("%s:%d] pipe broken %d, msgid = %p, msgsz = %d\n", __func__, __LINE__, result, + (pmsg->msgid), (int) pmsg->msgsz); + return -1; + } + } + + return pmsg->msgsz; +} + +int loc_eng_msgflush(int msgqid) +{ + return loc_eng_dmn_conn_glue_msgflush(msgqid); +} + +int loc_eng_msgunblock(int msgqid) +{ + return loc_eng_dmn_conn_glue_pipeunblock(msgqid); +} |