/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set sw=2 ts=8 et tw=80 : */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla IPC. * * The Initial Developer of the Original Code is * Ben Turner . * Portions created by the Initial Developer are Copyright (C) 2009 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef __IPC_GLUE_IPCMESSAGEUTILS_H__ #define __IPC_GLUE_IPCMESSAGEUTILS_H__ #include "chrome/common/ipc_message_utils.h" #include "prtypes.h" #include "nsStringGlue.h" #include "nsTArray.h" #include "gfxMatrix.h" #ifdef _MSC_VER #pragma warning( disable : 4800 ) #endif namespace IPC { template<> struct ParamTraits { typedef PRInt8 paramType; static void Write(Message* aMsg, const paramType& aParam) { aMsg->WriteBytes(&aParam, sizeof(aParam)); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { const char* outp; if (!aMsg->ReadBytes(aIter, &outp, sizeof(*aResult))) return false; *aResult = *reinterpret_cast(outp); return true; } }; template<> struct ParamTraits { typedef PRUint8 paramType; static void Write(Message* aMsg, const paramType& aParam) { aMsg->WriteBytes(&aParam, sizeof(aParam)); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { const char* outp; if (!aMsg->ReadBytes(aIter, &outp, sizeof(*aResult))) return false; *aResult = *reinterpret_cast(outp); return true; } }; template <> struct ParamTraits { typedef nsACString paramType; static void Write(Message* aMsg, const paramType& aParam) { bool isVoid = aParam.IsVoid(); aMsg->WriteBool(isVoid); if (isVoid) // represents a NULL pointer return; PRUint32 length = aParam.Length(); WriteParam(aMsg, length); aMsg->WriteBytes(aParam.BeginReading(), length); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { bool isVoid; if (!aMsg->ReadBool(aIter, &isVoid)) return false; if (isVoid) { aResult->SetIsVoid(PR_TRUE); return true; } PRUint32 length; if (ReadParam(aMsg, aIter, &length)) { const char* buf; if (aMsg->ReadBytes(aIter, &buf, length)) { aResult->Assign(buf, length); return true; } } return false; } static void Log(const paramType& aParam, std::wstring* aLog) { if (aParam.IsVoid()) aLog->append(L"(NULL)"); else aLog->append(UTF8ToWide(aParam.BeginReading())); } }; template <> struct ParamTraits { typedef nsAString paramType; static void Write(Message* aMsg, const paramType& aParam) { bool isVoid = aParam.IsVoid(); aMsg->WriteBool(isVoid); if (isVoid) // represents a NULL pointer return; PRUint32 length = aParam.Length(); WriteParam(aMsg, length); aMsg->WriteBytes(aParam.BeginReading(), length * sizeof(PRUnichar)); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { bool isVoid; if (!aMsg->ReadBool(aIter, &isVoid)) return false; if (isVoid) { aResult->SetIsVoid(PR_TRUE); return true; } PRUint32 length; if (ReadParam(aMsg, aIter, &length)) { const PRUnichar* buf; if (aMsg->ReadBytes(aIter, reinterpret_cast(&buf), length * sizeof(PRUnichar))) { aResult->Assign(buf, length); return true; } } return false; } static void Log(const paramType& aParam, std::wstring* aLog) { if (aParam.IsVoid()) aLog->append(L"(NULL)"); else { #ifdef WCHAR_T_IS_UTF16 aLog->append(reinterpret_cast(aParam.BeginReading())); #else PRUint32 length = aParam.Length(); for (PRUint32 index = 0; index < length; index++) { aLog->push_back(std::wstring::value_type(aParam[index])); } #endif } } }; template <> struct ParamTraits : ParamTraits { typedef nsCString paramType; }; template <> struct ParamTraits : ParamTraits { typedef nsString paramType; }; template struct ParamTraits > { typedef nsTArray paramType; static void Write(Message* aMsg, const paramType& aParam) { PRUint32 length = aParam.Length(); WriteParam(aMsg, length); for (PRUint32 index = 0; index < length; index++) { WriteParam(aMsg, aParam[index]); } } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { PRUint32 length; if (!ReadParam(aMsg, aIter, &length)) { return false; } for (PRUint32 index = 0; index < length; index++) { E* element = aResult->AppendElement(); if (!(element && ReadParam(aMsg, aIter, element))) { return false; } } return true; } static void Log(const paramType& aParam, std::wstring* aLog) { for (PRUint32 index = 0; index < aParam.Length(); index++) { if (index) { aLog->append(L" "); } LogParam(aParam[index], aLog); } } }; template<> struct ParamTraits { typedef float paramType; static void Write(Message* aMsg, const paramType& aParam) { aMsg->WriteBytes(&aParam, sizeof(paramType)); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { const char* outFloat; if (!aMsg->ReadBytes(aIter, &outFloat, sizeof(float))) return false; *aResult = *reinterpret_cast(outFloat); return true; } static void Log(const paramType& aParam, std::wstring* aLog) { aLog->append(StringPrintf(L"%g", aParam)); } }; template<> struct ParamTraits { typedef gfxMatrix paramType; static void Write(Message* aMsg, const paramType& aParam) { WriteParam(aMsg, aParam.xx); WriteParam(aMsg, aParam.xy); WriteParam(aMsg, aParam.yx); WriteParam(aMsg, aParam.yy); WriteParam(aMsg, aParam.x0); WriteParam(aMsg, aParam.y0); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { if (ReadParam(aMsg, aIter, &aResult->xx) && ReadParam(aMsg, aIter, &aResult->xy) && ReadParam(aMsg, aIter, &aResult->yx) && ReadParam(aMsg, aIter, &aResult->yy) && ReadParam(aMsg, aIter, &aResult->x0) && ReadParam(aMsg, aIter, &aResult->y0)) return true; return false; } static void Log(const paramType& aParam, std::wstring* aLog) { aLog->append(StringPrintf(L"[[%g %g] [%g %g] [%g %g]]", aParam.xx, aParam.xy, aParam.yx, aParam.yy, aParam.x0, aParam.y0)); } }; } /* namespace IPC */ #endif /* __IPC_GLUE_IPCMESSAGEUTILS_H__ */