Back to index

lightning-sunbird  0.9+nobinonly
nsCUPSShim.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
00002 /* ex: set tabstop=8 softtabstop=4 shiftwidth=4 expandtab: */
00003 /* ***** BEGIN LICENSE BLOCK *****
00004  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00005  *
00006  * The contents of this file are subject to the Mozilla Public License Version
00007  * 1.1 (the "License"); you may not use this file except in compliance with
00008  * the License. You may obtain a copy of the License at
00009  * http://www.mozilla.org/MPL/
00010  *
00011  * Software distributed under the License is distributed on an "AS IS" basis,
00012  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013  * for the specific language governing rights and limitations under the
00014  * License.
00015  *
00016  * The Original Code is the Mozilla PostScript driver printer list component.
00017  *
00018  * The Initial Developer of the Original Code is
00019  * Kenneth Herron <kherron+mozilla@fmailbox.com>
00020  * Portions created by the Initial Developer are Copyright (C) 2004
00021  * the Initial Developer. All Rights Reserved.
00022  *
00023  * Contributor(s):
00024  *
00025  * Alternatively, the contents of this file may be used under the terms of
00026  * either the GNU General Public License Version 2 or later (the "GPL"), or
00027  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028  * in which case the provisions of the GPL or the LGPL are applicable instead
00029  * of those above. If you wish to allow use of your version of this file only
00030  * under the terms of either the GPL or the LGPL, and not to allow others to
00031  * use your version of this file under the terms of the MPL, indicate your
00032  * decision by deleting the provisions above and replace them with the notice
00033  * and other provisions required by the GPL or the LGPL. If you do not delete
00034  * the provisions above, a recipient may use your version of this file under
00035  * the terms of any one of the MPL, the GPL or the LGPL.
00036  *
00037  * ***** END LICENSE BLOCK ***** */
00038 
00039 #include "nsDebug.h"
00040 #include "nsString.h"
00041 #include "nsCUPSShim.h"
00042 #include "prlink.h"
00043 
00044 
00045 // List of symbols to find in libcups. Must match symAddr[] defined in Init().
00046 // Making this an array of arrays instead of pointers allows storing the
00047 // whole thing in read-only memory.
00048 static const char gSymName[][sizeof("cupsPrintFile")] = {
00049     { "cupsAddOption" },
00050     { "cupsFreeDests" },
00051     { "cupsGetDest" },
00052     { "cupsGetDests" },
00053     { "cupsPrintFile" },
00054     { "cupsTempFd" },
00055 };
00056 static const int gSymNameCt = sizeof(gSymName) / sizeof(gSymName[0]);
00057 
00058 
00059 PRBool
00060 nsCUPSShim::Init()
00061 {
00062     mCupsLib = PR_LoadLibrary("libcups.so.2");
00063     if (!mCupsLib)
00064         return PR_FALSE;
00065 
00066     // List of symbol pointers. Must match gSymName[] defined above.
00067     void **symAddr[] = {
00068         (void **)&mCupsAddOption,
00069         (void **)&mCupsFreeDests,
00070         (void **)&mCupsGetDest,
00071         (void **)&mCupsGetDests,
00072         (void **)&mCupsPrintFile,
00073         (void **)&mCupsTempFd,
00074     };
00075 
00076     for (int i = gSymNameCt; i--; ) {
00077         *(symAddr[i]) = PR_FindSymbol(mCupsLib, gSymName[i]);
00078         if (! *(symAddr[i])) {
00079 #ifdef DEBUG
00080             nsCAutoString msg(gSymName[i]);
00081             msg.Append(" not found in CUPS library");
00082             NS_WARNING(msg.get());
00083 #endif
00084             PR_UnloadLibrary(mCupsLib);
00085             mCupsLib = nsnull;
00086             return PR_FALSE;
00087         }
00088     }
00089     return PR_TRUE;
00090 }
00091 
00092 nsCUPSShim::~nsCUPSShim()
00093 {
00094     if (mCupsLib)
00095         PR_UnloadLibrary(mCupsLib);
00096 }