Compare commits
2 Commits
tags/START
...
FAST-GTK-G
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33a0a6fec0 | ||
|
|
58b1c92ba4 |
53
mozilla/gfx/src/gtk/Makefile.in
Normal file
53
mozilla/gfx/src/gtk/Makefile.in
Normal file
@@ -0,0 +1,53 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
|
||||
LIBRARY_NAME = gfxgtk
|
||||
|
||||
MODULE=raptor
|
||||
|
||||
REQUIRES=util img xpcom raptor netlib ps
|
||||
|
||||
DEFINES += -D_IMPL_NS_GFXONXP
|
||||
CXXFLAGS += $(TK_CFLAGS)
|
||||
INCLUDES += $(TK_CFLAGS) -I$(srcdir)/..
|
||||
|
||||
CPPSRCS = \
|
||||
nsDrawingSurfaceGTK.cpp \
|
||||
nsDeviceContextGTK.cpp \
|
||||
nsDeviceContextSpecFactoryG.cpp \
|
||||
nsDeviceContextSpecG.cpp \
|
||||
nsFontMetricsGTK.cpp \
|
||||
nsGfxFactoryGTK.cpp \
|
||||
nsRenderingContextGTK.cpp \
|
||||
nsImageGTK.cpp \
|
||||
nsRegionGTK.cpp
|
||||
|
||||
CSRCS = \
|
||||
nsPrintdGTK.c
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
|
||||
375
mozilla/gfx/src/gtk/nsDeviceContextGTK.cpp
Normal file
375
mozilla/gfx/src/gtk/nsDeviceContextGTK.cpp
Normal file
@@ -0,0 +1,375 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "nspr.h"
|
||||
#include "il_util.h"
|
||||
|
||||
#include "nsDeviceContextGTK.h"
|
||||
#include "nsGfxCIID.h"
|
||||
|
||||
#include "../ps/nsDeviceContextPS.h"
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
#define NS_TO_GDK_RGB(ns) (ns & 0xff) << 16 | (ns & 0xff00) | ((ns >> 16) & 0xff)
|
||||
|
||||
#define GDK_COLOR_TO_NS_RGB(c) \
|
||||
((nscolor) NS_RGB(c.red, c.green, c.blue))
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID);
|
||||
|
||||
nsDeviceContextGTK::nsDeviceContextGTK()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mTwipsToPixels = 1.0;
|
||||
mPixelsToTwips = 1.0;
|
||||
mDepth = 0 ;
|
||||
mPaletteInfo.isPaletteDevice = PR_FALSE;
|
||||
mPaletteInfo.sizePalette = 0;
|
||||
mPaletteInfo.numReserved = 0;
|
||||
mPaletteInfo.palette = NULL;
|
||||
mNumCells = 0;
|
||||
}
|
||||
|
||||
nsDeviceContextGTK::~nsDeviceContextGTK()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMPL_QUERY_INTERFACE(nsDeviceContextGTK, kDeviceContextIID)
|
||||
NS_IMPL_ADDREF(nsDeviceContextGTK)
|
||||
NS_IMPL_RELEASE(nsDeviceContextGTK)
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::Init(nsNativeWidget aNativeWidget)
|
||||
{
|
||||
GdkVisual *vis;
|
||||
GtkRequisition req;
|
||||
GtkWidget *sb;
|
||||
|
||||
mWidget = aNativeWidget;
|
||||
|
||||
// Compute dpi of display
|
||||
float screenWidth = float(::gdk_screen_width());
|
||||
float screenWidthIn = float(::gdk_screen_width_mm()) / 25.4f;
|
||||
nscoord dpi = nscoord(screenWidth / screenWidthIn);
|
||||
|
||||
// Now for some wacky heuristics.
|
||||
if (dpi < 84) dpi = 72;
|
||||
else if (dpi < 108) dpi = 96;
|
||||
else if (dpi < 132) dpi = 120;
|
||||
|
||||
mTwipsToPixels = float(dpi) / float(NSIntPointsToTwips(72));
|
||||
mPixelsToTwips = 1.0f / mTwipsToPixels;
|
||||
|
||||
#if 0
|
||||
mTwipsToPixels = ( ((float)::gdk_screen_width()) /
|
||||
((float)::gdk_screen_width_mm()) * 25.4) /
|
||||
(float)NSIntPointsToTwips(72);
|
||||
|
||||
mPixelsToTwips = 1.0f / mTwipsToPixels;
|
||||
#endif
|
||||
|
||||
vis = gdk_rgb_get_visual();
|
||||
mDepth = vis->depth;
|
||||
|
||||
sb = gtk_vscrollbar_new(NULL);
|
||||
gtk_widget_ref(sb);
|
||||
gtk_object_sink(GTK_OBJECT(sb));
|
||||
gtk_widget_size_request(sb,&req);
|
||||
mScrollbarWidth = req.width;
|
||||
gtk_widget_destroy(sb);
|
||||
gtk_widget_unref(sb);
|
||||
|
||||
sb = gtk_hscrollbar_new(NULL);
|
||||
gtk_widget_ref(sb);
|
||||
gtk_object_sink(GTK_OBJECT(sb));
|
||||
gtk_widget_size_request(sb,&req);
|
||||
mScrollbarHeight = req.height;
|
||||
gtk_widget_destroy(sb);
|
||||
gtk_widget_unref(sb);
|
||||
|
||||
#ifdef DEBUG
|
||||
static PRBool once = PR_TRUE;
|
||||
if (once) {
|
||||
printf("GFX: dpi=%d t2p=%g p2t=%g depth=%d\n", dpi, mTwipsToPixels, mPixelsToTwips,mDepth);
|
||||
once = PR_FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::CreateRenderingContext(nsIRenderingContext *&aContext)
|
||||
{
|
||||
nsIRenderingContext *pContext;
|
||||
nsresult rv;
|
||||
nsDrawingSurfaceGTK *surf;
|
||||
|
||||
// to call init for this, we need to have a valid nsDrawingSurfaceGTK created
|
||||
pContext = new nsRenderingContextGTK();
|
||||
|
||||
if (nsnull != pContext)
|
||||
{
|
||||
NS_ADDREF(pContext);
|
||||
|
||||
// create the nsDrawingSurfaceGTK
|
||||
surf = new nsDrawingSurfaceGTK();
|
||||
|
||||
if (nsnull != surf)
|
||||
{
|
||||
GdkDrawable *win = nsnull;
|
||||
// FIXME
|
||||
if (GTK_IS_LAYOUT((GtkWidget*)mWidget))
|
||||
win = (GdkDrawable*)gdk_window_ref(GTK_LAYOUT((GtkWidget*)mWidget)->bin_window);
|
||||
else
|
||||
win = (GdkDrawable*)gdk_window_ref(((GtkWidget*)mWidget)->window);
|
||||
|
||||
GdkGC *gc = gdk_gc_new(win);
|
||||
|
||||
// init the nsDrawingSurfaceGTK
|
||||
rv = surf->Init(win,gc);
|
||||
|
||||
if (NS_OK == rv)
|
||||
// Init the nsRenderingContextGTK
|
||||
rv = pContext->Init(this, surf);
|
||||
}
|
||||
else
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
else
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
if (NS_OK != rv)
|
||||
{
|
||||
NS_IF_RELEASE(pContext);
|
||||
}
|
||||
|
||||
aContext = pContext;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::SupportsNativeWidgets(PRBool &aSupportsWidgets)
|
||||
{
|
||||
//XXX it is very critical that this not lie!! MMP
|
||||
// read the comments in the mac code for this
|
||||
aSupportsWidgets = PR_TRUE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::GetScrollBarDimensions(float &aWidth, float &aHeight) const
|
||||
{
|
||||
aWidth = mScrollbarWidth * mPixelsToTwips;
|
||||
aHeight = mScrollbarHeight * mPixelsToTwips;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::GetSystemAttribute(nsSystemAttrID anID, SystemAttrStruct * aInfo) const
|
||||
{
|
||||
nsresult status = NS_OK;
|
||||
GtkStyle *style = gtk_style_new(); // get the default styles
|
||||
|
||||
switch (anID) {
|
||||
//---------
|
||||
// Colors
|
||||
//---------
|
||||
case eSystemAttr_Color_WindowBackground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
|
||||
break;
|
||||
case eSystemAttr_Color_WindowForeground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
|
||||
break;
|
||||
case eSystemAttr_Color_WidgetBackground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
|
||||
break;
|
||||
case eSystemAttr_Color_WidgetForeground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
|
||||
break;
|
||||
case eSystemAttr_Color_WidgetSelectBackground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_SELECTED]);
|
||||
break;
|
||||
case eSystemAttr_Color_WidgetSelectForeground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_SELECTED]);
|
||||
break;
|
||||
case eSystemAttr_Color_Widget3DHighlight:
|
||||
*aInfo->mColor = NS_RGB(0xa0,0xa0,0xa0);
|
||||
break;
|
||||
case eSystemAttr_Color_Widget3DShadow:
|
||||
*aInfo->mColor = NS_RGB(0x40,0x40,0x40);
|
||||
break;
|
||||
case eSystemAttr_Color_TextBackground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
|
||||
break;
|
||||
case eSystemAttr_Color_TextForeground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
|
||||
break;
|
||||
case eSystemAttr_Color_TextSelectBackground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_SELECTED]);
|
||||
break;
|
||||
case eSystemAttr_Color_TextSelectForeground:
|
||||
*aInfo->mColor = GDK_COLOR_TO_NS_RGB(style->text[GTK_STATE_SELECTED]);
|
||||
break;
|
||||
//---------
|
||||
// Size
|
||||
//---------
|
||||
case eSystemAttr_Size_ScrollbarHeight:
|
||||
aInfo->mSize = mScrollbarHeight;
|
||||
break;
|
||||
case eSystemAttr_Size_ScrollbarWidth:
|
||||
aInfo->mSize = mScrollbarWidth;
|
||||
break;
|
||||
case eSystemAttr_Size_WindowTitleHeight:
|
||||
aInfo->mSize = 0;
|
||||
break;
|
||||
case eSystemAttr_Size_WindowBorderWidth:
|
||||
aInfo->mSize = style->klass->xthickness;
|
||||
break;
|
||||
case eSystemAttr_Size_WindowBorderHeight:
|
||||
aInfo->mSize = style->klass->ythickness;
|
||||
break;
|
||||
case eSystemAttr_Size_Widget3DBorder:
|
||||
aInfo->mSize = 4;
|
||||
break;
|
||||
//---------
|
||||
// Fonts
|
||||
//---------
|
||||
case eSystemAttr_Font_Caption:
|
||||
case eSystemAttr_Font_Icon:
|
||||
case eSystemAttr_Font_Menu:
|
||||
case eSystemAttr_Font_MessageBox:
|
||||
case eSystemAttr_Font_SmallCaption:
|
||||
case eSystemAttr_Font_StatusBar:
|
||||
case eSystemAttr_Font_Tooltips:
|
||||
case eSystemAttr_Font_Widget:
|
||||
status = NS_ERROR_FAILURE;
|
||||
break;
|
||||
} // switch
|
||||
|
||||
gtk_style_unref(style);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::GetDrawingSurface(nsIRenderingContext &aContext,
|
||||
nsDrawingSurface &aSurface)
|
||||
{
|
||||
aContext.CreateDrawingSurface(nsnull, 0, aSurface);
|
||||
return nsnull == aSurface ? NS_ERROR_OUT_OF_MEMORY : NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::ConvertPixel(nscolor aColor,
|
||||
PRUint32 & aPixel)
|
||||
{
|
||||
aPixel = ::gdk_rgb_xpixel_from_rgb (NS_TO_GDK_RGB(aColor));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::CheckFontExistence(const nsString& aFontName)
|
||||
{
|
||||
char **fnames = nsnull;
|
||||
PRInt32 namelen = aFontName.Length() + 1;
|
||||
char *wildstring = (char *)PR_Malloc(namelen + 200);
|
||||
float t2d;
|
||||
GetTwipsToDevUnits(t2d);
|
||||
PRInt32 dpi = NSToIntRound(t2d * 1440);
|
||||
int numnames = 0;
|
||||
XFontStruct *fonts;
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
if (nsnull == wildstring)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
||||
if (abs(dpi - 75) < abs(dpi - 100))
|
||||
dpi = 75;
|
||||
else
|
||||
dpi = 100;
|
||||
|
||||
char* fontName = aFontName.ToNewCString();
|
||||
PR_snprintf(wildstring, namelen + 200,
|
||||
"*-%s-*-*-normal--*-*-%d-%d-*-*-*",
|
||||
fontName, dpi, dpi);
|
||||
delete [] fontName;
|
||||
|
||||
fnames = ::XListFontsWithInfo(GDK_DISPLAY(), wildstring, 1, &numnames, &fonts);
|
||||
|
||||
if (numnames > 0)
|
||||
{
|
||||
::XFreeFontInfo(fnames, fonts, numnames);
|
||||
rv = NS_OK;
|
||||
}
|
||||
|
||||
PR_Free(wildstring);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::GetDeviceSurfaceDimensions(PRInt32 &aWidth, PRInt32 &aHeight)
|
||||
{
|
||||
aWidth = 1;
|
||||
aHeight = 1;
|
||||
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::GetDeviceContextFor(nsIDeviceContextSpec *aDevice,
|
||||
nsIDeviceContext *&aContext)
|
||||
{
|
||||
// Create a Postscript device context
|
||||
aContext = new nsDeviceContextPS();
|
||||
((nsDeviceContextPS *)aContext)->SetSpec(aDevice);
|
||||
NS_ADDREF(aDevice);
|
||||
return((nsDeviceContextPS *) aContext)->Init((nsIDeviceContext*)aContext, (nsIDeviceContext*)this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::BeginDocument(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::EndDocument(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::BeginPage(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::EndPage(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextGTK::GetDepth(PRUint32& aDepth)
|
||||
{
|
||||
GdkVisual * rgb_visual = gdk_rgb_get_visual();
|
||||
|
||||
gint rgb_depth = rgb_visual->depth;
|
||||
|
||||
aDepth = (PRUint32) rgb_depth;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
79
mozilla/gfx/src/gtk/nsDeviceContextGTK.h
Normal file
79
mozilla/gfx/src/gtk/nsDeviceContextGTK.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsDeviceContextGTK_h___
|
||||
#define nsDeviceContextGTK_h___
|
||||
|
||||
#include "nsDeviceContext.h"
|
||||
#include "nsUnitConversion.h"
|
||||
#include "nsIWidget.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsIRenderingContext.h"
|
||||
|
||||
#include "nsRenderingContextGTK.h"
|
||||
|
||||
class nsDeviceContextGTK : public DeviceContextImpl
|
||||
{
|
||||
public:
|
||||
nsDeviceContextGTK();
|
||||
virtual ~nsDeviceContextGTK();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Init(nsNativeWidget aNativeWidget);
|
||||
|
||||
NS_IMETHOD CreateRenderingContext(nsIRenderingContext *&aContext);
|
||||
NS_IMETHOD SupportsNativeWidgets(PRBool &aSupportsWidgets);
|
||||
|
||||
NS_IMETHOD GetScrollBarDimensions(float &aWidth, float &aHeight) const;
|
||||
NS_IMETHOD GetSystemAttribute(nsSystemAttrID anID, SystemAttrStruct * aInfo) const;
|
||||
|
||||
//get a low level drawing surface for rendering. the rendering context
|
||||
//that is passed in is used to create the drawing surface if there isn't
|
||||
//already one in the device context. the drawing surface is then cached
|
||||
//in the device context for re-use.
|
||||
|
||||
NS_IMETHOD GetDrawingSurface(nsIRenderingContext &aContext, nsDrawingSurface &aSurface);
|
||||
|
||||
NS_IMETHOD ConvertPixel(nscolor aColor, PRUint32 & aPixel);
|
||||
NS_IMETHOD CheckFontExistence(const nsString& aFontName);
|
||||
|
||||
NS_IMETHOD GetDeviceSurfaceDimensions(PRInt32 &aWidth, PRInt32 &aHeight);
|
||||
|
||||
NS_IMETHOD GetDeviceContextFor(nsIDeviceContextSpec *aDevice,
|
||||
nsIDeviceContext *&aContext);
|
||||
|
||||
NS_IMETHOD BeginDocument(void);
|
||||
NS_IMETHOD EndDocument(void);
|
||||
|
||||
NS_IMETHOD BeginPage(void);
|
||||
NS_IMETHOD EndPage(void);
|
||||
|
||||
NS_IMETHOD GetDepth(PRUint32& aDepth);
|
||||
|
||||
private:
|
||||
PRUint32 mDepth;
|
||||
PRBool mWriteable;
|
||||
nsPaletteInfo mPaletteInfo;
|
||||
PRUint32 mNumCells;
|
||||
PRInt16 mScrollbarHeight;
|
||||
PRInt16 mScrollbarWidth;
|
||||
};
|
||||
|
||||
#endif /* nsDeviceContextGTK_h___ */
|
||||
|
||||
77
mozilla/gfx/src/gtk/nsDeviceContextSpecFactoryG.cpp
Normal file
77
mozilla/gfx/src/gtk/nsDeviceContextSpecFactoryG.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "nsDeviceContextSpecFactoryG.h"
|
||||
#include "nsDeviceContextSpecG.h"
|
||||
#include "nsGfxCIID.h"
|
||||
#include "plstr.h"
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Constructor
|
||||
* @update dc 2/16/98
|
||||
*/
|
||||
nsDeviceContextSpecFactoryGTK :: nsDeviceContextSpecFactoryGTK()
|
||||
{
|
||||
}
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Destructor
|
||||
* @update dc 2/16/98
|
||||
*/
|
||||
nsDeviceContextSpecFactoryGTK :: ~nsDeviceContextSpecFactoryGTK()
|
||||
{
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kDeviceContextSpecFactoryIID, NS_IDEVICE_CONTEXT_SPEC_FACTORY_IID);
|
||||
static NS_DEFINE_IID(kIDeviceContextSpecIID, NS_IDEVICE_CONTEXT_SPEC_IID);
|
||||
static NS_DEFINE_IID(kDeviceContextSpecCID, NS_DEVICE_CONTEXT_SPEC_CID);
|
||||
|
||||
NS_IMPL_QUERY_INTERFACE(nsDeviceContextSpecFactoryGTK, kDeviceContextSpecFactoryIID)
|
||||
NS_IMPL_ADDREF(nsDeviceContextSpecFactoryGTK)
|
||||
NS_IMPL_RELEASE(nsDeviceContextSpecFactoryGTK)
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Initialize the device context spec factory
|
||||
* @update dc 2/16/98
|
||||
*/
|
||||
NS_IMETHODIMP nsDeviceContextSpecFactoryGTK :: Init(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Get a device context specification
|
||||
* @update dc 2/16/98
|
||||
*/
|
||||
NS_IMETHODIMP nsDeviceContextSpecFactoryGTK :: CreateDeviceContextSpec(nsIDeviceContextSpec *aOldSpec,
|
||||
nsIDeviceContextSpec *&aNewSpec,
|
||||
PRBool aQuiet)
|
||||
{
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
nsIDeviceContextSpec *devSpec = nsnull;
|
||||
|
||||
nsComponentManager::CreateInstance(kDeviceContextSpecCID, nsnull, kIDeviceContextSpecIID, (void **)&devSpec);
|
||||
|
||||
if (nsnull != devSpec){
|
||||
if (NS_OK == ((nsDeviceContextSpecGTK *)devSpec)->Init(aQuiet)){
|
||||
aNewSpec = devSpec;
|
||||
rv = NS_OK;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
41
mozilla/gfx/src/gtk/nsDeviceContextSpecFactoryG.h
Normal file
41
mozilla/gfx/src/gtk/nsDeviceContextSpecFactoryG.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsDeviceContextSpecFactoryG_h___
|
||||
#define nsDeviceContextSpecFactoryG_h___
|
||||
|
||||
#include "nsIDeviceContextSpecFactory.h"
|
||||
#include "nsIDeviceContextSpec.h"
|
||||
|
||||
class nsDeviceContextSpecFactoryGTK : public nsIDeviceContextSpecFactory
|
||||
{
|
||||
public:
|
||||
nsDeviceContextSpecFactoryGTK();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Init(void);
|
||||
NS_IMETHOD CreateDeviceContextSpec(nsIDeviceContextSpec *aOldSpec,
|
||||
nsIDeviceContextSpec *&aNewSpec,
|
||||
PRBool aQuiet);
|
||||
|
||||
protected:
|
||||
virtual ~nsDeviceContextSpecFactoryGTK();
|
||||
};
|
||||
|
||||
#endif
|
||||
197
mozilla/gfx/src/gtk/nsDeviceContextSpecG.cpp
Normal file
197
mozilla/gfx/src/gtk/nsDeviceContextSpecG.cpp
Normal file
@@ -0,0 +1,197 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "nsDeviceContextSpecG.h"
|
||||
#include "prenv.h" /* for PR_GetEnv */
|
||||
|
||||
//#include "prmem.h"
|
||||
//#include "plstr.h"
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Construct the nsDeviceContextSpecGTK
|
||||
* @update dc 12/02/98
|
||||
*/
|
||||
nsDeviceContextSpecGTK :: nsDeviceContextSpecGTK()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
}
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Destroy the nsDeviceContextSpecGTK
|
||||
* @update dc 2/15/98
|
||||
*/
|
||||
nsDeviceContextSpecGTK :: ~nsDeviceContextSpecGTK()
|
||||
{
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kIDeviceContextSpecIID, NS_IDEVICE_CONTEXT_SPEC_IID);
|
||||
static NS_DEFINE_IID(kIDeviceContextSpecPSIID, NS_IDEVICE_CONTEXT_SPEC_PS_IID);
|
||||
|
||||
#if 0
|
||||
NS_IMPL_QUERY_INTERFACE(nsDeviceContextSpecGTK, kDeviceContextSpecIID)
|
||||
NS_IMPL_ADDREF(nsDeviceContextSpecGTK)
|
||||
NS_IMPL_RELEASE(nsDeviceContextSpecGTK)
|
||||
#endif
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
{
|
||||
if (nsnull == aInstancePtr)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
if (aIID.Equals(kIDeviceContextSpecIID))
|
||||
{
|
||||
nsIDeviceContextSpec* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (aIID.Equals(kIDeviceContextSpecPSIID))
|
||||
{
|
||||
nsIDeviceContextSpecPS* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
if (aIID.Equals(kISupportsIID))
|
||||
{
|
||||
nsIDeviceContextSpec* tmp = this;
|
||||
nsISupports* tmp2 = tmp;
|
||||
*aInstancePtr = (void*) tmp2;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsDeviceContextSpecGTK)
|
||||
NS_IMPL_RELEASE(nsDeviceContextSpecGTK)
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Initialize the nsDeviceContextSpecGTK
|
||||
* @update dc 2/15/98
|
||||
* @update syd 3/2/99
|
||||
*/
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: Init(PRBool aQuiet)
|
||||
{
|
||||
char *path;
|
||||
|
||||
// XXX these settings should eventually come out of preferences
|
||||
|
||||
mPrData.toPrinter = PR_TRUE;
|
||||
mPrData.fpf = PR_TRUE;
|
||||
mPrData.grayscale = PR_FALSE;
|
||||
mPrData.size = NS_LETTER_SIZE;
|
||||
sprintf( mPrData.command, "lpr" );
|
||||
|
||||
// PWD, HOME, or fail
|
||||
|
||||
if ( ( path = PR_GetEnv( "PWD" ) ) == (char *) NULL )
|
||||
if ( ( path = PR_GetEnv( "HOME" ) ) == (char *) NULL )
|
||||
strcpy( mPrData.path, "netscape.ps" );
|
||||
if ( path != (char *) NULL )
|
||||
sprintf( mPrData.path, "%s/netscape.ps", path );
|
||||
else
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
::UnixPrDialog( &mPrData );
|
||||
if ( mPrData.cancel == PR_TRUE )
|
||||
return NS_ERROR_FAILURE;
|
||||
else
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetToPrinter( PRBool &aToPrinter )
|
||||
{
|
||||
aToPrinter = mPrData.toPrinter;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetFirstPageFirst ( PRBool &aFpf )
|
||||
{
|
||||
aFpf = mPrData.fpf;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetGrayscale ( PRBool &aGrayscale )
|
||||
{
|
||||
aGrayscale = mPrData.grayscale;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetSize ( int &aSize )
|
||||
{
|
||||
aSize = mPrData.size;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetTopMargin ( float &value )
|
||||
{
|
||||
value = mPrData.top;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetBottomMargin ( float &value )
|
||||
{
|
||||
value = mPrData.bottom;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetRightMargin ( float &value )
|
||||
{
|
||||
value = mPrData.right;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetLeftMargin ( float &value )
|
||||
{
|
||||
value = mPrData.left;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetCommand ( char **aCommand )
|
||||
{
|
||||
*aCommand = &mPrData.command[0];
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetPath ( char **aPath )
|
||||
{
|
||||
*aPath = &mPrData.path[0];
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: GetUserCancelled( PRBool &aCancel )
|
||||
{
|
||||
aCancel = mPrData.cancel;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/** -------------------------------------------------------
|
||||
* Closes the printmanager if it is open.
|
||||
* @update dc 2/15/98
|
||||
*/
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK :: ClosePrintManager()
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
97
mozilla/gfx/src/gtk/nsDeviceContextSpecG.h
Normal file
97
mozilla/gfx/src/gtk/nsDeviceContextSpecG.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsDeviceContextSpecG_h___
|
||||
#define nsDeviceContextSpecG_h___
|
||||
|
||||
#include "nsIDeviceContextSpec.h"
|
||||
#include "nsDeviceContextSpecG.h"
|
||||
#include "nsIDeviceContextSpecPS.h"
|
||||
|
||||
#include "nsPrintdGTK.h"
|
||||
|
||||
class nsDeviceContextSpecGTK : public nsIDeviceContextSpec ,
|
||||
public nsIDeviceContextSpecPS
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Construct a nsDeviceContextSpecMac, which is an object which contains and manages a mac printrecord
|
||||
* @update dc 12/02/98
|
||||
*/
|
||||
nsDeviceContextSpecGTK();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/**
|
||||
* Initialize the nsDeviceContextSpecMac for use. This will allocate a printrecord for use
|
||||
* @update dc 2/16/98
|
||||
* @param aQuiet if PR_TRUE, prevent the need for user intervention
|
||||
* in obtaining device context spec. if nsnull is passed in for
|
||||
* the aOldSpec, this will typically result in getting a device
|
||||
* context spec for the default output device (i.e. default
|
||||
* printer).
|
||||
* @return error status
|
||||
*/
|
||||
NS_IMETHOD Init(PRBool aQuiet);
|
||||
|
||||
|
||||
/**
|
||||
* Closes the printmanager if it is open.
|
||||
* @update dc 2/13/98
|
||||
* @update syd 3/20/99
|
||||
* @return error status
|
||||
*/
|
||||
|
||||
NS_IMETHOD ClosePrintManager();
|
||||
|
||||
NS_IMETHOD GetToPrinter( PRBool &aToPrinter );
|
||||
|
||||
NS_IMETHOD GetFirstPageFirst ( PRBool &aFpf );
|
||||
|
||||
NS_IMETHOD GetGrayscale( PRBool &aGrayscale );
|
||||
|
||||
NS_IMETHOD GetSize ( int &aSize );
|
||||
|
||||
NS_IMETHOD GetTopMargin ( float &value );
|
||||
|
||||
NS_IMETHOD GetBottomMargin ( float &value );
|
||||
|
||||
NS_IMETHOD GetLeftMargin ( float &value );
|
||||
|
||||
NS_IMETHOD GetRightMargin ( float &value );
|
||||
|
||||
NS_IMETHOD GetCommand ( char **aCommand );
|
||||
|
||||
NS_IMETHOD GetPath ( char **aPath );
|
||||
|
||||
NS_IMETHOD GetUserCancelled( PRBool &aCancel );
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Destuct a nsDeviceContextSpecMac, this will release the printrecord
|
||||
* @update dc 2/16/98
|
||||
*/
|
||||
virtual ~nsDeviceContextSpecGTK();
|
||||
|
||||
protected:
|
||||
|
||||
UnixPrData mPrData;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
367
mozilla/gfx/src/gtk/nsDrawingSurfaceGTK.cpp
Normal file
367
mozilla/gfx/src/gtk/nsDrawingSurfaceGTK.cpp
Normal file
@@ -0,0 +1,367 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#if defined (HAVE_IPC_H) && defined (HAVE_SHM_H) && defined (HAVE_XSHM_H)
|
||||
#define USE_SHM
|
||||
#endif
|
||||
|
||||
//#define USE_SHM
|
||||
|
||||
#include <gdk/gdkx.h>
|
||||
#include <gdk/gdkprivate.h>
|
||||
#ifdef USE_SHM
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <X11/extensions/XShm.h>
|
||||
#endif /* USE_SHM */
|
||||
#include "nsDrawingSurfaceGTK.h"
|
||||
|
||||
static NS_DEFINE_IID(kIDrawingSurfaceIID, NS_IDRAWING_SURFACE_IID);
|
||||
static NS_DEFINE_IID(kIDrawingSurfaceGTKIID, NS_IDRAWING_SURFACE_GTK_IID);
|
||||
|
||||
nsDrawingSurfaceGTK :: nsDrawingSurfaceGTK()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
GdkVisual *v;
|
||||
|
||||
mPixmap = nsnull;
|
||||
mGC = nsnull;
|
||||
mDepth = 0;
|
||||
mWidth = mHeight = 0;
|
||||
mFlags = 0;
|
||||
|
||||
mImage = nsnull;
|
||||
mLockWidth = mLockHeight = 0;
|
||||
mLockFlags = 0;
|
||||
mLocked = PR_FALSE;
|
||||
|
||||
v = ::gdk_rgb_get_visual();
|
||||
|
||||
mPixFormat.mRedMask = v->red_mask;
|
||||
mPixFormat.mGreenMask = v->green_mask;
|
||||
mPixFormat.mBlueMask = v->blue_mask;
|
||||
// FIXME
|
||||
mPixFormat.mAlphaMask = 0;
|
||||
|
||||
mPixFormat.mRedShift = v->red_shift;
|
||||
mPixFormat.mGreenShift = v->green_shift;
|
||||
mPixFormat.mBlueShift = v->blue_shift;
|
||||
// FIXME
|
||||
mPixFormat.mAlphaShift = 0;
|
||||
|
||||
mDepth = v->depth;
|
||||
}
|
||||
|
||||
nsDrawingSurfaceGTK :: ~nsDrawingSurfaceGTK()
|
||||
{
|
||||
if (mPixmap)
|
||||
::gdk_pixmap_unref(mPixmap);
|
||||
|
||||
if (mImage)
|
||||
::gdk_image_destroy(mImage);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
{
|
||||
if (nsnull == aInstancePtr)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
if (aIID.Equals(kIDrawingSurfaceIID))
|
||||
{
|
||||
nsIDrawingSurface* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (aIID.Equals(kIDrawingSurfaceGTKIID))
|
||||
{
|
||||
nsDrawingSurfaceGTK* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
if (aIID.Equals(kISupportsIID))
|
||||
{
|
||||
nsIDrawingSurface* tmp = this;
|
||||
nsISupports* tmp2 = tmp;
|
||||
*aInstancePtr = (void*) tmp2;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsDrawingSurfaceGTK);
|
||||
NS_IMPL_RELEASE(nsDrawingSurfaceGTK);
|
||||
|
||||
|
||||
/**
|
||||
* Lock a rect of a drawing surface and return a
|
||||
* pointer to the upper left hand corner of the
|
||||
* bitmap.
|
||||
* @param aX x position of subrect of bitmap
|
||||
* @param aY y position of subrect of bitmap
|
||||
* @param aWidth width of subrect of bitmap
|
||||
* @param aHeight height of subrect of bitmap
|
||||
* @param aBits out parameter for upper left hand
|
||||
* corner of bitmap
|
||||
* @param aStride out parameter for number of bytes
|
||||
* to add to aBits to go from scanline to scanline
|
||||
* @param aWidthBytes out parameter for number of
|
||||
* bytes per line in aBits to process aWidth pixels
|
||||
* @return error status
|
||||
*
|
||||
**/
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: Lock(PRInt32 aX, PRInt32 aY,
|
||||
PRUint32 aWidth, PRUint32 aHeight,
|
||||
void **aBits, PRInt32 *aStride,
|
||||
PRInt32 *aWidthBytes, PRUint32 aFlags)
|
||||
{
|
||||
#if 0
|
||||
g_print("nsDrawingSurfaceGTK::Lock() called\n" \
|
||||
" aX = %i, aY = %i,\n" \
|
||||
" aWidth = %i, aHeight = %i,\n" \
|
||||
" aBits, aStride, aWidthBytes,\n" \
|
||||
" aFlags = %i\n", aX, aY, aWidth, aHeight, aFlags);
|
||||
#endif
|
||||
|
||||
if (mLocked)
|
||||
{
|
||||
NS_ASSERTION(0, "nested lock attempt");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
mLocked = PR_TRUE;
|
||||
|
||||
mLockX = aX;
|
||||
mLockY = aY;
|
||||
mLockWidth = aWidth;
|
||||
mLockHeight = aHeight;
|
||||
mLockFlags = aFlags;
|
||||
|
||||
// Obtain an ximage from the pixmap.
|
||||
#ifdef USE_SHM
|
||||
if (gdk_get_use_xshm())
|
||||
{
|
||||
mImage = gdk_image_new(GDK_IMAGE_FASTEST,
|
||||
gdk_rgb_get_visual(),
|
||||
mLockWidth,
|
||||
mLockHeight);
|
||||
|
||||
XShmGetImage(GDK_DISPLAY(),
|
||||
GDK_WINDOW_XWINDOW(mPixmap),
|
||||
GDK_IMAGE_XIMAGE(mImage),
|
||||
mLockX, mLockY,
|
||||
0xFFFFFFFF);
|
||||
|
||||
gdk_flush();
|
||||
}
|
||||
else
|
||||
{
|
||||
#endif /* USE_SHM */
|
||||
mImage = ::gdk_image_get(mPixmap, mLockX, mLockY, mLockWidth, mLockHeight);
|
||||
#ifdef USE_SHM
|
||||
}
|
||||
#endif /* USE_SHM */
|
||||
|
||||
*aBits = GDK_IMAGE_XIMAGE(mImage)->data;
|
||||
|
||||
*aWidthBytes = GDK_IMAGE_XIMAGE(mImage)->bytes_per_line;
|
||||
*aStride = GDK_IMAGE_XIMAGE(mImage)->bytes_per_line;
|
||||
|
||||
|
||||
#if 0
|
||||
int bytes_per_line = GDK_IMAGE_XIMAGE(mImage)->bytes_per_line;
|
||||
|
||||
//
|
||||
// All this code is a an attempt to set the stride width properly.
|
||||
// Needs to be cleaned up alot. For now, it will only work in the
|
||||
// case where aWidthBytes and aStride are the same. One is assigned to
|
||||
// the other.
|
||||
//
|
||||
|
||||
*aWidthBytes = mImage->bpl;
|
||||
*aStride = mImage->bpl;
|
||||
|
||||
int width_in_pixels = *aWidthBytes << 8;
|
||||
|
||||
|
||||
int bitmap_pad = GDK_IMAGE_XIMAGE(mImage)->bitmap_pad;
|
||||
int depth = GDK_IMAGE_XIMAGE(mImage)->depth;
|
||||
|
||||
#define RASWIDTH8(width, bpp) (width)
|
||||
#define RASWIDTH16(width, bpp) ((((width) * (bpp) + 15) >> 4) << 1)
|
||||
#define RASWIDTH32(width, bpp) ((((width) * (bpp) + 31) >> 5) << 2)
|
||||
|
||||
switch(bitmap_pad)
|
||||
{
|
||||
case 8:
|
||||
*aStride = RASWIDTH8(aWidth,bitmap_pad);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
*aStride = bytes_per_line;
|
||||
*aStride = RASWIDTH16(aWidth,bitmap_pad);
|
||||
break;
|
||||
|
||||
case 32:
|
||||
*aStride = bytes_per_line;
|
||||
*aStride = RASWIDTH32(aWidth,bitmap_pad);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
NS_ASSERTION(nsnull,"something got screwed");
|
||||
|
||||
}
|
||||
|
||||
*aStride = (*aWidthBytes) + ((bitmap_pad >> 3) - 1);
|
||||
|
||||
GDK_IMAGE_XIMAGE(mImage)->bitmap_pad;
|
||||
|
||||
*aWidthBytes = mImage->bpl;
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: Unlock(void)
|
||||
{
|
||||
// g_print("nsDrawingSurfaceGTK::UnLock() called\n");
|
||||
if (!mLocked)
|
||||
{
|
||||
NS_ASSERTION(0, "attempting to unlock an DS that isn't locked");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// If the lock was not read only, put the bits back on the pixmap
|
||||
if (!(mLockFlags & NS_LOCK_SURFACE_READ_ONLY))
|
||||
{
|
||||
#if 0
|
||||
g_print("gdk_draw_image(pixmap=%p,lockx=%d,locky=%d,lockw=%d,lockh=%d)\n",
|
||||
mPixmap,
|
||||
mLockX, mLockY,
|
||||
mLockWidth, mLockHeight);
|
||||
#endif
|
||||
|
||||
gdk_draw_image(mPixmap,
|
||||
mGC,
|
||||
mImage,
|
||||
0, 0,
|
||||
mLockX, mLockY,
|
||||
mLockWidth, mLockHeight);
|
||||
|
||||
}
|
||||
|
||||
// FIXME if we are using shared mem, we shouldn't destroy the image...
|
||||
if (mImage)
|
||||
::gdk_image_destroy(mImage);
|
||||
mImage = nsnull;
|
||||
|
||||
mLocked = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: GetDimensions(PRUint32 *aWidth, PRUint32 *aHeight)
|
||||
{
|
||||
*aWidth = mWidth;
|
||||
*aHeight = mHeight;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: IsOffscreen(PRBool *aOffScreen)
|
||||
{
|
||||
*aOffScreen = mIsOffscreen;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: IsPixelAddressable(PRBool *aAddressable)
|
||||
{
|
||||
// FIXME
|
||||
*aAddressable = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: GetPixelFormat(nsPixelFormat *aFormat)
|
||||
{
|
||||
*aFormat = mPixFormat;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: Init(GdkDrawable *aDrawable, GdkGC *aGC)
|
||||
{
|
||||
mGC = aGC;
|
||||
mPixmap = aDrawable;
|
||||
// this is definatly going to be on the screen, as it will be the window of a
|
||||
// widget or something.
|
||||
mIsOffscreen = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: Init(GdkGC *aGC, PRUint32 aWidth,
|
||||
PRUint32 aHeight, PRUint32 aFlags)
|
||||
{
|
||||
// ::g_return_val_if_fail (aGC != nsnull, NS_ERROR_FAILURE);
|
||||
// ::g_return_val_if_fail ((aWidth > 0) && (aHeight > 0), NS_ERROR_FAILURE);
|
||||
|
||||
mGC = aGC;
|
||||
mWidth = aWidth;
|
||||
mHeight = aHeight;
|
||||
mFlags = aFlags;
|
||||
|
||||
// we can draw on this offscreen because it has no parent
|
||||
mIsOffscreen = PR_TRUE;
|
||||
|
||||
mPixmap = ::gdk_pixmap_new(nsnull, mWidth, mHeight, mDepth);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: GetGC(GdkGC *aGC)
|
||||
{
|
||||
aGC = ::gdk_gc_ref(mGC);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDrawingSurfaceGTK :: ReleaseGC(void)
|
||||
{
|
||||
::gdk_gc_unref(mGC);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* below are utility functions used mostly for nsRenderingContext and nsImage
|
||||
* to plug into gdk_* functions for drawing. You should not set a pointer
|
||||
* that might hang around with the return from these. instead use the ones
|
||||
* above. pav
|
||||
*/
|
||||
GdkGC *nsDrawingSurfaceGTK::GetGC(void)
|
||||
{
|
||||
return mGC;
|
||||
}
|
||||
|
||||
GdkDrawable *nsDrawingSurfaceGTK::GetDrawable(void)
|
||||
{
|
||||
return mPixmap;
|
||||
}
|
||||
|
||||
85
mozilla/gfx/src/gtk/nsDrawingSurfaceGTK.h
Normal file
85
mozilla/gfx/src/gtk/nsDrawingSurfaceGTK.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsDrawingSurfaceGTK_h___
|
||||
#define nsDrawingSurfaceGTK_h___
|
||||
|
||||
#include "nsIDrawingSurface.h"
|
||||
#include "nsIDrawingSurfaceGTK.h"
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
class nsDrawingSurfaceGTK : public nsIDrawingSurface,
|
||||
public nsIDrawingSurfaceGTK
|
||||
{
|
||||
public:
|
||||
nsDrawingSurfaceGTK();
|
||||
virtual ~nsDrawingSurfaceGTK();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
//nsIDrawingSurface interface
|
||||
|
||||
NS_IMETHOD Lock(PRInt32 aX, PRInt32 aY, PRUint32 aWidth, PRUint32 aHeight,
|
||||
void **aBits, PRInt32 *aStride, PRInt32 *aWidthBytes,
|
||||
PRUint32 aFlags);
|
||||
NS_IMETHOD Unlock(void);
|
||||
NS_IMETHOD GetDimensions(PRUint32 *aWidth, PRUint32 *aHeight);
|
||||
NS_IMETHOD IsOffscreen(PRBool *aOffScreen);
|
||||
NS_IMETHOD IsPixelAddressable(PRBool *aAddressable);
|
||||
NS_IMETHOD GetPixelFormat(nsPixelFormat *aFormat);
|
||||
|
||||
//nsIDrawingSurfaceGTK interface
|
||||
|
||||
NS_IMETHOD Init(GdkDrawable *aDrawable, GdkGC *aGC);
|
||||
NS_IMETHOD Init(GdkGC *aGC, PRUint32 aWidth, PRUint32 aHeight, PRUint32 aFlags);
|
||||
|
||||
/* get the GC and manage the GdkGC's refcount */
|
||||
NS_IMETHOD GetGC(GdkGC *aGC);
|
||||
NS_IMETHOD ReleaseGC(void);
|
||||
|
||||
/* below are utility functions used mostly for nsRenderingContext and nsImage
|
||||
* to plug into gdk_* functions for drawing. You should not set a pointer
|
||||
* that might hang around with the return from these. instead use the ones
|
||||
* above. pav
|
||||
*/
|
||||
GdkGC *GetGC(void);
|
||||
GdkDrawable *GetDrawable(void);
|
||||
|
||||
private:
|
||||
/* general */
|
||||
GdkPixmap *mPixmap;
|
||||
GdkGC *mGC;
|
||||
gint mDepth;
|
||||
nsPixelFormat mPixFormat;
|
||||
PRUint32 mWidth;
|
||||
PRUint32 mHeight;
|
||||
PRUint32 mFlags;
|
||||
PRBool mIsOffscreen;
|
||||
|
||||
/* for locks */
|
||||
GdkImage *mImage;
|
||||
PRInt32 mLockX;
|
||||
PRInt32 mLockY;
|
||||
PRUint32 mLockWidth;
|
||||
PRUint32 mLockHeight;
|
||||
PRUint32 mLockFlags;
|
||||
PRBool mLocked;
|
||||
};
|
||||
|
||||
#endif
|
||||
2170
mozilla/gfx/src/gtk/nsFontMetricsGTK.cpp
Normal file
2170
mozilla/gfx/src/gtk/nsFontMetricsGTK.cpp
Normal file
File diff suppressed because it is too large
Load Diff
162
mozilla/gfx/src/gtk/nsFontMetricsGTK.h
Normal file
162
mozilla/gfx/src/gtk/nsFontMetricsGTK.h
Normal file
@@ -0,0 +1,162 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsFontMetricsGTK_h__
|
||||
#define nsFontMetricsGTK_h__
|
||||
|
||||
#include "nsIFontMetrics.h"
|
||||
#include "nsFont.h"
|
||||
#include "nsString.h"
|
||||
#include "nsUnitConversion.h"
|
||||
#include "nsIDeviceContext.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsDeviceContextGTK.h"
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
#define FONT_SWITCHING
|
||||
#ifdef FONT_SWITCHING
|
||||
|
||||
#ifdef ADD_GLYPH
|
||||
#undef ADD_GLYPH
|
||||
#endif
|
||||
#define ADD_GLYPH(map, g) (map)[(g) >> 3] |= (1 << ((g) & 7))
|
||||
|
||||
#ifdef FONT_HAS_GLYPH
|
||||
#undef FONT_HAS_GLYPH
|
||||
#endif
|
||||
#define FONT_HAS_GLYPH(map, g) (((map)[(g) >> 3] >> ((g) & 7)) & 1)
|
||||
|
||||
typedef struct nsFontCharSetInfo nsFontCharSetInfo;
|
||||
|
||||
typedef gint (*nsFontCharSetConverter)(nsFontCharSetInfo* aSelf,
|
||||
const PRUnichar* aSrcBuf, PRUint32 aSrcLen, PRUint8* aDestBuf,
|
||||
PRUint32 aDestLen);
|
||||
|
||||
struct nsFontCharSet;
|
||||
class nsFontMetricsGTK;
|
||||
|
||||
struct nsFontGTK
|
||||
{
|
||||
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
||||
|
||||
void LoadFont(nsFontCharSet* aCharSet, nsFontMetricsGTK* aMetrics);
|
||||
|
||||
GdkFont* mFont;
|
||||
PRUint8* mMap;
|
||||
nsFontCharSetInfo* mCharSetInfo;
|
||||
char* mName;
|
||||
PRUint16 mSize;
|
||||
PRUint16 mActualSize;
|
||||
PRInt16 mBaselineAdjust;
|
||||
};
|
||||
|
||||
struct nsFontStretch;
|
||||
struct nsFontFamily;
|
||||
typedef struct nsFontSearch nsFontSearch;
|
||||
|
||||
#endif /* FONT_SWITCHING */
|
||||
|
||||
class nsFontMetricsGTK : public nsIFontMetrics
|
||||
{
|
||||
public:
|
||||
nsFontMetricsGTK();
|
||||
virtual ~nsFontMetricsGTK();
|
||||
|
||||
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Init(const nsFont& aFont, nsIDeviceContext* aContext);
|
||||
NS_IMETHOD Destroy();
|
||||
|
||||
NS_IMETHOD GetXHeight(nscoord& aResult);
|
||||
NS_IMETHOD GetSuperscriptOffset(nscoord& aResult);
|
||||
NS_IMETHOD GetSubscriptOffset(nscoord& aResult);
|
||||
NS_IMETHOD GetStrikeout(nscoord& aOffset, nscoord& aSize);
|
||||
NS_IMETHOD GetUnderline(nscoord& aOffset, nscoord& aSize);
|
||||
|
||||
NS_IMETHOD GetHeight(nscoord &aHeight);
|
||||
NS_IMETHOD GetLeading(nscoord &aLeading);
|
||||
NS_IMETHOD GetMaxAscent(nscoord &aAscent);
|
||||
NS_IMETHOD GetMaxDescent(nscoord &aDescent);
|
||||
NS_IMETHOD GetMaxAdvance(nscoord &aAdvance);
|
||||
NS_IMETHOD GetFont(const nsFont *&aFont);
|
||||
NS_IMETHOD GetFontHandle(nsFontHandle &aHandle);
|
||||
|
||||
#ifdef FONT_SWITCHING
|
||||
|
||||
nsFontGTK* FindFont(PRUnichar aChar);
|
||||
static gint GetWidth(nsFontGTK* aFont, const PRUnichar* aString,
|
||||
PRUint32 aLength);
|
||||
static void DrawString(nsDrawingSurfaceGTK* aSurface, nsFontGTK* aFont,
|
||||
nscoord aX, nscoord aY, const PRUnichar* aString,
|
||||
PRUint32 aLength);
|
||||
static void InitFonts(void);
|
||||
|
||||
friend void PickASizeAndLoad(nsFontSearch* aSearch, nsFontStretch* aStretch,
|
||||
nsFontCharSet* aCharSet);
|
||||
friend void TryCharSet(nsFontSearch* aSearch, nsFontCharSet* aCharSet);
|
||||
friend void TryFamily(nsFontSearch* aSearch, nsFontFamily* aFamily);
|
||||
friend struct nsFontGTK;
|
||||
|
||||
nsFontGTK **mLoadedFonts;
|
||||
PRUint16 mLoadedFontsAlloc;
|
||||
PRUint16 mLoadedFontsCount;
|
||||
|
||||
nsString *mFonts;
|
||||
PRUint16 mFontsAlloc;
|
||||
PRUint16 mFontsCount;
|
||||
PRUint16 mFontsIndex;
|
||||
|
||||
#endif /* FONT_SWITCHING */
|
||||
|
||||
protected:
|
||||
char *PickAppropriateSize(char **names, XFontStruct *fonts, int cnt, nscoord desired);
|
||||
void RealizeFont();
|
||||
|
||||
nsIDeviceContext *mDeviceContext;
|
||||
nsFont *mFont;
|
||||
GdkFont *mFontHandle;
|
||||
|
||||
nscoord mHeight;
|
||||
nscoord mAscent;
|
||||
nscoord mDescent;
|
||||
nscoord mLeading;
|
||||
nscoord mMaxAscent;
|
||||
nscoord mMaxDescent;
|
||||
nscoord mMaxAdvance;
|
||||
nscoord mXHeight;
|
||||
nscoord mSuperscriptOffset;
|
||||
nscoord mSubscriptOffset;
|
||||
nscoord mStrikeoutSize;
|
||||
nscoord mStrikeoutOffset;
|
||||
nscoord mUnderlineSize;
|
||||
nscoord mUnderlineOffset;
|
||||
|
||||
#ifdef FONT_SWITCHING
|
||||
|
||||
PRUint16 mPixelSize;
|
||||
PRUint8 mStretchIndex;
|
||||
PRUint8 mStyleIndex;
|
||||
|
||||
#endif /* FONT_SWITCHING */
|
||||
};
|
||||
|
||||
#endif
|
||||
205
mozilla/gfx/src/gtk/nsGfxFactoryGTK.cpp
Normal file
205
mozilla/gfx/src/gtk/nsGfxFactoryGTK.cpp
Normal file
@@ -0,0 +1,205 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsGfxCIID.h"
|
||||
#include "nsFontMetricsGTK.h"
|
||||
#include "nsRenderingContextGTK.h"
|
||||
#include "nsImageGTK.h"
|
||||
#include "nsDeviceContextGTK.h"
|
||||
#include "nsRegionGTK.h"
|
||||
#include "nsBlender.h"
|
||||
#include "nsDeviceContextSpecG.h"
|
||||
#include "nsDeviceContextSpecFactoryG.h"
|
||||
#include "nsIDeviceContextSpecPS.h"
|
||||
|
||||
static NS_DEFINE_IID(kCFontMetrics, NS_FONT_METRICS_CID);
|
||||
static NS_DEFINE_IID(kCRenderingContext, NS_RENDERING_CONTEXT_CID);
|
||||
static NS_DEFINE_IID(kCImage, NS_IMAGE_CID);
|
||||
static NS_DEFINE_IID(kCDeviceContext, NS_DEVICE_CONTEXT_CID);
|
||||
static NS_DEFINE_IID(kCRegion, NS_REGION_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCBlender, NS_BLENDER_CID);
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
|
||||
static NS_DEFINE_IID(kCDeviceContextSpec, NS_DEVICE_CONTEXT_SPEC_CID);
|
||||
static NS_DEFINE_IID(kCDeviceContextSpecFactory, NS_DEVICE_CONTEXT_SPEC_FACTORY_CID);
|
||||
|
||||
|
||||
class nsGfxFactoryGTK : public nsIFactory
|
||||
{
|
||||
public:
|
||||
// nsISupports methods
|
||||
NS_IMETHOD QueryInterface(const nsIID &aIID,
|
||||
void **aResult);
|
||||
NS_IMETHOD_(nsrefcnt) AddRef(void);
|
||||
NS_IMETHOD_(nsrefcnt) Release(void);
|
||||
|
||||
// nsIFactory methods
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult);
|
||||
|
||||
NS_IMETHOD LockFactory(PRBool aLock);
|
||||
|
||||
nsGfxFactoryGTK(const nsCID &aClass);
|
||||
virtual ~nsGfxFactoryGTK();
|
||||
|
||||
private:
|
||||
nsrefcnt mRefCnt;
|
||||
nsCID mClassID;
|
||||
};
|
||||
|
||||
nsGfxFactoryGTK::nsGfxFactoryGTK(const nsCID &aClass)
|
||||
{
|
||||
mRefCnt = 0;
|
||||
mClassID = aClass;
|
||||
}
|
||||
|
||||
nsGfxFactoryGTK::~nsGfxFactoryGTK()
|
||||
{
|
||||
NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction");
|
||||
}
|
||||
|
||||
nsresult nsGfxFactoryGTK::QueryInterface(const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (aResult == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aResult = NULL;
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aResult = (void *)(nsISupports*)this;
|
||||
} else if (aIID.Equals(kIFactoryIID)) {
|
||||
*aResult = (void *)(nsIFactory*)this;
|
||||
}
|
||||
|
||||
if (*aResult == NULL) {
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
AddRef(); // Increase reference count for caller
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsrefcnt nsGfxFactoryGTK::AddRef()
|
||||
{
|
||||
return ++mRefCnt;
|
||||
}
|
||||
|
||||
nsrefcnt nsGfxFactoryGTK::Release()
|
||||
{
|
||||
if (--mRefCnt == 0) {
|
||||
delete this;
|
||||
return 0; // Don't access mRefCnt after deleting!
|
||||
}
|
||||
return mRefCnt;
|
||||
}
|
||||
|
||||
nsresult nsGfxFactoryGTK::CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (aResult == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
*aResult = NULL;
|
||||
|
||||
nsISupports *inst = nsnull;
|
||||
|
||||
if (mClassID.Equals(kCFontMetrics)) {
|
||||
inst = (nsISupports *)new nsFontMetricsGTK();
|
||||
}
|
||||
else if (mClassID.Equals(kCDeviceContext)) {
|
||||
inst = (nsISupports *)new nsDeviceContextGTK();
|
||||
}
|
||||
else if (mClassID.Equals(kCRenderingContext)) {
|
||||
inst = (nsISupports *)new nsRenderingContextGTK();
|
||||
}
|
||||
else if (mClassID.Equals(kCImage)) {
|
||||
inst = (nsISupports *)new nsImageGTK();
|
||||
}
|
||||
else if (mClassID.Equals(kCRegion)) {
|
||||
inst = (nsISupports *)new nsRegionGTK();
|
||||
}
|
||||
else if (mClassID.Equals(kCBlender)) {
|
||||
inst = (nsISupports *)new nsBlender;
|
||||
}
|
||||
else if (mClassID.Equals(kCDeviceContextSpec)) {
|
||||
nsDeviceContextSpecGTK* dcs;
|
||||
NS_NEWXPCOM(dcs, nsDeviceContextSpecGTK);
|
||||
inst = (nsISupports *)((nsIDeviceContextSpecPS *)dcs);
|
||||
}
|
||||
else if (mClassID.Equals(kCDeviceContextSpecFactory)) {
|
||||
nsDeviceContextSpecFactoryGTK* dcs;
|
||||
NS_NEWXPCOM(dcs, nsDeviceContextSpecFactoryGTK);
|
||||
inst = (nsISupports *)dcs;
|
||||
}
|
||||
|
||||
if (inst == NULL) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
nsresult res = inst->QueryInterface(aIID, aResult);
|
||||
|
||||
if (res != NS_OK) {
|
||||
// We didn't get the right interface, so clean up
|
||||
delete inst;
|
||||
}
|
||||
// else {
|
||||
// inst->Release();
|
||||
// }
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
nsresult nsGfxFactoryGTK::LockFactory(PRBool aLock)
|
||||
{
|
||||
// Not implemented in simplest case.
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// return the proper factory to the caller
|
||||
extern "C" NS_GFXNONXP nsresult NSGetFactory(nsISupports* servMgr,
|
||||
const nsCID &aClass,
|
||||
const char *aClassName,
|
||||
const char *aProgID,
|
||||
nsIFactory **aFactory)
|
||||
{
|
||||
if (nsnull == aFactory) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
*aFactory = new nsGfxFactoryGTK(aClass);
|
||||
|
||||
if (nsnull == aFactory) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory);
|
||||
}
|
||||
77
mozilla/gfx/src/gtk/nsIDrawingSurfaceGTK.h
Normal file
77
mozilla/gfx/src/gtk/nsIDrawingSurfaceGTK.h
Normal file
@@ -0,0 +1,77 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsIDrawingSurfaceGTK_h___
|
||||
#define nsIDrawingSurfaceGTK_h___
|
||||
|
||||
#include "nsIDrawingSurface.h"
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
// windows specific drawing surface method set
|
||||
|
||||
#define NS_IDRAWING_SURFACE_GTK_IID \
|
||||
{ 0x1ed958b0, 0xcab6, 0x11d2, \
|
||||
{ 0xa8, 0x49, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9 } }
|
||||
|
||||
class nsIDrawingSurfaceGTK : public nsISupports
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Initialize a drawing surface using a windows DC.
|
||||
* aDC is "owned" by the drawing surface until the drawing
|
||||
* surface is destroyed.
|
||||
* @param aDC HDC to initialize drawing surface with
|
||||
* @return error status
|
||||
**/
|
||||
NS_IMETHOD Init(GdkDrawable *aDrawable, GdkGC *aGC) = 0;
|
||||
|
||||
/**
|
||||
* Initialize an offscreen drawing surface using a
|
||||
* windows DC. aDC is not "owned" by this drawing surface, instead
|
||||
* it is used to create a drawing surface compatible
|
||||
* with aDC. if width or height are less than zero, aDC will
|
||||
* be created with no offscreen bitmap installed.
|
||||
* @param aDC HDC to initialize drawing surface with
|
||||
* @param aWidth width of drawing surface
|
||||
* @param aHeight height of drawing surface
|
||||
* @param aFlags flags used to control type of drawing
|
||||
* surface created
|
||||
* @return error status
|
||||
**/
|
||||
NS_IMETHOD Init(GdkGC *aGC, PRUint32 aWidth, PRUint32 aHeight,
|
||||
PRUint32 aFlags) = 0;
|
||||
|
||||
/**
|
||||
* Get a windows DC that represents the drawing surface.
|
||||
* GetDC() must be paired with ReleaseDC(). Getting a DC
|
||||
* and Lock()ing are mutually exclusive operations.
|
||||
* @param aDC out parameter for HDC
|
||||
* @return error status
|
||||
**/
|
||||
NS_IMETHOD GetGC(GdkGC *aGC) = 0;
|
||||
|
||||
/**
|
||||
* Release a windows DC obtained by GetDC().
|
||||
* ReleaseDC() must be preceded by a call to ReleaseDC().
|
||||
* @return error status
|
||||
**/
|
||||
NS_IMETHOD ReleaseGC(void) = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif // nsIDrawingSurfaceGTK_h___
|
||||
515
mozilla/gfx/src/gtk/nsImageGTK.cpp
Normal file
515
mozilla/gfx/src/gtk/nsImageGTK.cpp
Normal file
@@ -0,0 +1,515 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
#include "nsImageGTK.h"
|
||||
#include "nsRenderingContextGTK.h"
|
||||
|
||||
#include "nspr.h"
|
||||
|
||||
#define IsFlagSet(a,b) (a & b)
|
||||
|
||||
#undef CHEAP_PERFORMANCE_MEASURMENT
|
||||
|
||||
|
||||
// Defining this will trace the allocation of images. This includes
|
||||
// ctor, dtor and update.
|
||||
#undef TRACE_IMAGE_ALLOCATION
|
||||
|
||||
static NS_DEFINE_IID(kIImageIID, NS_IIMAGE_IID);
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
nsImageGTK::nsImageGTK()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mImageBits = nsnull;
|
||||
mWidth = 0;
|
||||
mHeight = 0;
|
||||
mDepth = 0;
|
||||
mAlphaBits = nsnull;
|
||||
mAlphaPixmap = nsnull;
|
||||
mImagePixmap = nsnull;
|
||||
mGC = nsnull;
|
||||
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::nsImageGTK(this=%p)\n",
|
||||
this);
|
||||
#endif
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
nsImageGTK::~nsImageGTK()
|
||||
{
|
||||
if(nsnull != mImageBits) {
|
||||
delete[] (PRUint8*)mImageBits;
|
||||
mImageBits = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mAlphaBits) {
|
||||
delete[] (PRUint8*)mAlphaBits;
|
||||
mAlphaBits = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mAlphaPixmap) {
|
||||
gdk_pixmap_unref(mAlphaPixmap);
|
||||
mAlphaPixmap = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mImagePixmap) {
|
||||
gdk_pixmap_unref(mImagePixmap);
|
||||
mImagePixmap = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mGC) {
|
||||
gdk_gc_unref(mGC);
|
||||
mGC = nsnull;
|
||||
}
|
||||
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::~nsImageGTK(this=%p)\n",
|
||||
this);
|
||||
#endif
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsImageGTK, kIImageIID);
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
nsresult nsImageGTK::Init(PRInt32 aWidth, PRInt32 aHeight,
|
||||
PRInt32 aDepth, nsMaskRequirements aMaskRequirements)
|
||||
{
|
||||
g_return_val_if_fail ((aWidth != 0) || (aHeight != 0), NS_ERROR_FAILURE);
|
||||
|
||||
if (nsnull != mImageBits) {
|
||||
delete[] (PRUint8*)mImageBits;
|
||||
mImageBits = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mAlphaBits) {
|
||||
delete[] (PRUint8*)mAlphaBits;
|
||||
mAlphaBits = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mAlphaPixmap) {
|
||||
gdk_pixmap_unref(mAlphaPixmap);
|
||||
mAlphaPixmap = nsnull;
|
||||
}
|
||||
|
||||
if (nsnull != mImagePixmap) {
|
||||
gdk_pixmap_unref(mImagePixmap);
|
||||
mImagePixmap = nsnull;
|
||||
}
|
||||
|
||||
if (24 == aDepth) {
|
||||
mNumBytesPixel = 3;
|
||||
} else {
|
||||
NS_ASSERTION(PR_FALSE, "unexpected image depth");
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
mImageUpdated = PR_TRUE;
|
||||
mWidth = aWidth;
|
||||
mHeight = aHeight;
|
||||
mDepth = aDepth;
|
||||
mIsTopToBottom = PR_TRUE;
|
||||
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::Init(this=%p,%d,%d,%d,%d)\n",
|
||||
this,
|
||||
aWidth,
|
||||
aHeight,
|
||||
aDepth,
|
||||
aMaskRequirements);
|
||||
#endif
|
||||
|
||||
// create the memory for the image
|
||||
ComputMetrics();
|
||||
|
||||
mImageBits = (PRUint8*) new PRUint8[mSizeImage];
|
||||
|
||||
switch(aMaskRequirements)
|
||||
{
|
||||
case nsMaskRequirements_kNoMask:
|
||||
mAlphaBits = nsnull;
|
||||
mAlphaWidth = 0;
|
||||
mAlphaHeight = 0;
|
||||
break;
|
||||
|
||||
case nsMaskRequirements_kNeeds1Bit:
|
||||
mAlphaRowBytes = (aWidth + 7) / 8;
|
||||
mAlphaDepth = 1;
|
||||
|
||||
// 32-bit align each row
|
||||
mAlphaRowBytes = (mAlphaRowBytes + 3) & ~0x3;
|
||||
|
||||
mAlphaBits = new PRUint8[mAlphaRowBytes * aHeight];
|
||||
mAlphaWidth = aWidth;
|
||||
mAlphaHeight = aHeight;
|
||||
|
||||
mAlphaPixmap = gdk_pixmap_new(nsnull, aWidth, aHeight,
|
||||
mAlphaDepth);
|
||||
break;
|
||||
|
||||
case nsMaskRequirements_kNeeds8Bit:
|
||||
mAlphaBits = nsnull;
|
||||
mAlphaWidth = 0;
|
||||
mAlphaHeight = 0;
|
||||
mAlphaDepth = 8;
|
||||
g_print("TODO: want an 8bit mask for an image..\n");
|
||||
|
||||
mAlphaPixmap = gdk_pixmap_new(nsnull, aWidth, aHeight,
|
||||
mAlphaDepth);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
mImagePixmap = gdk_pixmap_new(nsnull, aWidth, aHeight,
|
||||
gdk_rgb_get_visual()->depth);
|
||||
mGC = gdk_gc_new(mImagePixmap);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
PRInt32 nsImageGTK::CalcBytesSpan(PRUint32 aWidth)
|
||||
{
|
||||
PRInt32 spanbytes;
|
||||
|
||||
spanbytes = (aWidth * mDepth) >> 5;
|
||||
|
||||
if (((PRUint32)aWidth * mDepth) & 0x1F)
|
||||
spanbytes++;
|
||||
spanbytes <<= 2;
|
||||
return(spanbytes);
|
||||
}
|
||||
|
||||
void nsImageGTK::ComputMetrics()
|
||||
{
|
||||
mRowBytes = CalcBytesSpan(mWidth);
|
||||
mSizeImage = mRowBytes * mHeight;
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetHeight()
|
||||
{
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetWidth()
|
||||
{
|
||||
return mWidth;
|
||||
}
|
||||
|
||||
PRUint8 *nsImageGTK::GetBits()
|
||||
{
|
||||
return mImageBits;
|
||||
}
|
||||
|
||||
void *nsImageGTK::GetBitInfo()
|
||||
{
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetLineStride()
|
||||
{
|
||||
return mRowBytes;
|
||||
}
|
||||
|
||||
nsColorMap *nsImageGTK::GetColorMap()
|
||||
{
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
PRBool nsImageGTK::IsOptimized()
|
||||
{
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRUint8 *nsImageGTK::GetAlphaBits()
|
||||
{
|
||||
return mAlphaBits;
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetAlphaWidth()
|
||||
{
|
||||
return mAlphaWidth;
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetAlphaHeight()
|
||||
{
|
||||
return mAlphaHeight;
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetAlphaLineStride()
|
||||
{
|
||||
return mAlphaRowBytes;
|
||||
}
|
||||
|
||||
nsIImage *nsImageGTK::DuplicateImage()
|
||||
{
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
void nsImageGTK::SetAlphaLevel(PRInt32 aAlphaLevel)
|
||||
{
|
||||
}
|
||||
|
||||
PRInt32 nsImageGTK::GetAlphaLevel()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nsImageGTK::MoveAlphaMask(PRInt32 aX, PRInt32 aY)
|
||||
{
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
// set up the palette to the passed in color array, RGB only in this array
|
||||
void nsImageGTK::ImageUpdated(nsIDeviceContext *aContext,
|
||||
PRUint8 aFlags,
|
||||
nsRect *aUpdateRect)
|
||||
{
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::ImageUpdated(this=%p,%d)\n",
|
||||
this,
|
||||
aFlags);
|
||||
#endif
|
||||
|
||||
if (IsFlagSet(nsImageUpdateFlags_kBitsChanged, aFlags)) {
|
||||
mImageUpdated = PR_TRUE;
|
||||
// FIXME do something with aUpdateRect
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CHEAP_PERFORMANCE_MEASURMENT
|
||||
static PRTime gConvertTime, gStartTime, gPixmapTime, gEndTime;
|
||||
#endif
|
||||
|
||||
// Draw the bitmap, this method has a source and destination coordinates
|
||||
NS_IMETHODIMP
|
||||
nsImageGTK::Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface,
|
||||
PRInt32 aSX, PRInt32 aSY, PRInt32 aSWidth, PRInt32 aSHeight,
|
||||
PRInt32 aDX, PRInt32 aDY, PRInt32 aDWidth, PRInt32 aDHeight)
|
||||
{
|
||||
g_return_val_if_fail ((aSurface != nsnull), NS_ERROR_FAILURE);
|
||||
|
||||
nsDrawingSurfaceGTK *drawing = (nsDrawingSurfaceGTK*)aSurface;
|
||||
|
||||
if (mAlphaBits)
|
||||
g_print("calling nsImageGTK::Draw() with alpha bits\n");
|
||||
|
||||
gdk_draw_rgb_image (drawing->GetDrawable(),
|
||||
mGC,
|
||||
aDX, aDY, aDWidth, aDHeight,
|
||||
GDK_RGB_DITHER_MAX,
|
||||
mImageBits + mRowBytes * aSY + 3 * aDX,
|
||||
mRowBytes);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
// Draw the bitmap, this draw just has destination coordinates
|
||||
NS_IMETHODIMP
|
||||
nsImageGTK::Draw(nsIRenderingContext &aContext,
|
||||
nsDrawingSurface aSurface,
|
||||
PRInt32 aX, PRInt32 aY,
|
||||
PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
g_return_val_if_fail ((aSurface != nsnull), NS_ERROR_FAILURE);
|
||||
|
||||
|
||||
// XXX kipp: this is temporary code until we eliminate the
|
||||
// width/height arguments from the draw method.
|
||||
if ((aWidth != mWidth) || (aHeight != mHeight)) {
|
||||
aWidth = mWidth;
|
||||
aHeight = mHeight;
|
||||
}
|
||||
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::Draw(this=%p,x=%d,y=%d,width=%d,height=%d)\n",
|
||||
this,
|
||||
aX,
|
||||
aY,
|
||||
aWidth,
|
||||
aHeight);
|
||||
#endif
|
||||
|
||||
nsDrawingSurfaceGTK* drawing = (nsDrawingSurfaceGTK*) aSurface;
|
||||
|
||||
XImage *x_image = nsnull;
|
||||
Pixmap pixmap = 0;
|
||||
Display *dpy = nsnull;
|
||||
Visual *visual = nsnull;
|
||||
GC gc;
|
||||
XGCValues gcv;
|
||||
|
||||
#ifdef CHEAP_PERFORMANCE_MEASURMENT
|
||||
gStartTime = gPixmapTime = PR_Now();
|
||||
#endif
|
||||
|
||||
// Create gc clip-mask on demand
|
||||
if ((mAlphaBits) && (mImageUpdated == PR_TRUE))
|
||||
{
|
||||
/* get the X primitives */
|
||||
dpy = GDK_WINDOW_XDISPLAY(mAlphaPixmap);
|
||||
|
||||
|
||||
/* this is the depth of the pixmap that we are going to draw to.
|
||||
It's always a bitmap. We're doing alpha here folks. */
|
||||
visual = GDK_VISUAL_XVISUAL(gdk_rgb_get_visual());
|
||||
|
||||
// Make an image out of the alpha-bits created by the image library
|
||||
x_image = XCreateImage(dpy, visual,
|
||||
1, /* visual depth...1 for bitmaps */
|
||||
XYPixmap,
|
||||
0, /* x offset, XXX fix this */
|
||||
(char *)mAlphaBits, /* cast away our sign. */
|
||||
aWidth,
|
||||
aHeight,
|
||||
32,/* bitmap pad */
|
||||
mAlphaRowBytes); /* bytes per line */
|
||||
|
||||
x_image->bits_per_pixel=1;
|
||||
|
||||
/* Image library always places pixels left-to-right MSB to LSB */
|
||||
x_image->bitmap_bit_order = MSBFirst;
|
||||
|
||||
/* This definition doesn't depend on client byte ordering
|
||||
because the image library ensures that the bytes in
|
||||
bitmask data are arranged left to right on the screen,
|
||||
low to high address in memory. */
|
||||
x_image->byte_order = MSBFirst;
|
||||
#if defined(IS_LITTLE_ENDIAN)
|
||||
// no, it's still MSB XXX check on this!!
|
||||
// x_image->byte_order = LSBFirst;
|
||||
#elif defined (IS_BIG_ENDIAN)
|
||||
x_image->byte_order = MSBFirst;
|
||||
#else
|
||||
#error ERROR! Endianness is unknown;
|
||||
#endif
|
||||
|
||||
// Write into the pixemap that is underneath gdk's mAlphaPixmap
|
||||
// the image we just created.
|
||||
|
||||
pixmap = GDK_WINDOW_XWINDOW(mAlphaPixmap);
|
||||
memset(&gcv, 0, sizeof(XGCValues));
|
||||
gcv.function = GXcopy;
|
||||
gc = XCreateGC(dpy, pixmap, GCFunction, &gcv);
|
||||
XPutImage(dpy, pixmap, gc, x_image, 0, 0, 0, 0,
|
||||
aWidth, aHeight);
|
||||
XFreeGC(dpy, gc);
|
||||
|
||||
// Now we are done with the temporary image
|
||||
x_image->data = 0; /* Don't free the IL_Pixmap's bits. */
|
||||
XDestroyImage(x_image);
|
||||
|
||||
#ifdef CHEAP_PERFORMANCE_MEASURMENT
|
||||
gPixmapTime = PR_Now();
|
||||
#endif
|
||||
}
|
||||
|
||||
// Render unique image bits onto an off screen pixmap only once
|
||||
// The image bits can change as a result of ImageUpdated() - for
|
||||
// example: animated GIFs.
|
||||
if (mImageUpdated == PR_TRUE)
|
||||
{
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::Draw(this=%p) gdk_pixmap_new(nsnull,width=%d,height=%d,depth=%d)\n",
|
||||
this,
|
||||
aWidth,
|
||||
aHeight,
|
||||
mDepth);
|
||||
#endif
|
||||
|
||||
gdk_gc_set_clip_origin(mGC, 0, 0);
|
||||
gdk_gc_set_clip_mask(mGC, nsnull);
|
||||
|
||||
// Render the image bits into an off screen pixmap
|
||||
gdk_draw_rgb_image (mImagePixmap,
|
||||
mGC,
|
||||
0, 0, aWidth, aHeight,
|
||||
GDK_RGB_DITHER_MAX,
|
||||
mImageBits, mRowBytes);
|
||||
|
||||
if (mAlphaPixmap)
|
||||
{
|
||||
// Setup gc to use the given alpha-pixmap for clipping
|
||||
gdk_gc_set_clip_mask(mGC, mAlphaPixmap);
|
||||
gdk_gc_set_clip_origin(mGC, aX, aY);
|
||||
}
|
||||
|
||||
#ifdef TRACE_IMAGE_ALLOCATION
|
||||
printf("nsImageGTK::Draw(this=%p) gdk_draw_pixmap(x=%d,y=%d,width=%d,height=%d)\n",
|
||||
this,
|
||||
aX,
|
||||
aY,
|
||||
aWidth,
|
||||
aHeight);
|
||||
#endif
|
||||
|
||||
mImageUpdated = PR_FALSE;
|
||||
}
|
||||
|
||||
|
||||
// copy our offscreen pixmap onto the window.
|
||||
gdk_window_copy_area(drawing->GetDrawable(), // dest window
|
||||
mGC, // gc
|
||||
aX, // xsrc
|
||||
aY, // ysrc
|
||||
mImagePixmap, // source window
|
||||
0, // xdest
|
||||
0, // ydest
|
||||
aWidth, // width
|
||||
aHeight); // height
|
||||
|
||||
if (mAlphaBits)
|
||||
{
|
||||
// Revert gc to its old clip-mask and origin
|
||||
gdk_gc_set_clip_origin(mGC, 0, 0);
|
||||
gdk_gc_set_clip_mask(mGC, nsnull);
|
||||
}
|
||||
|
||||
#ifdef CHEAP_PERFORMANCE_MEASURMENT
|
||||
gEndTime = PR_Now();
|
||||
printf("nsImageGTK::Draw(this=%p,w=%d,h=%d) total=%lld pixmap=%lld, cvt=%lld\n",
|
||||
this,
|
||||
aWidth, aHeight,
|
||||
gEndTime - gStartTime,
|
||||
gPixmapTime - gStartTime,
|
||||
gConvertTime - gPixmapTime);
|
||||
#endif
|
||||
|
||||
mImageUpdated = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
nsresult nsImageGTK::Optimize(nsIDeviceContext* aContext)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
115
mozilla/gfx/src/gtk/nsImageGTK.h
Normal file
115
mozilla/gfx/src/gtk/nsImageGTK.h
Normal file
@@ -0,0 +1,115 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsImageGTK_h___
|
||||
#define nsImageGTK_h___
|
||||
|
||||
#include "nsIImage.h"
|
||||
|
||||
#include "X11/Xlib.h"
|
||||
#include "X11/Xutil.h"
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#undef Bool
|
||||
|
||||
class nsImageGTK : public nsIImage
|
||||
{
|
||||
public:
|
||||
nsImageGTK();
|
||||
virtual ~nsImageGTK();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/**
|
||||
@see nsIImage.h
|
||||
*/
|
||||
virtual PRInt32 GetBytesPix() { return mNumBytesPixel; }
|
||||
virtual PRInt32 GetHeight();
|
||||
virtual PRInt32 GetWidth();
|
||||
virtual PRUint8* GetBits();
|
||||
virtual void* GetBitInfo();
|
||||
virtual PRBool GetIsRowOrderTopToBottom() { return mIsTopToBottom; }
|
||||
virtual PRInt32 GetLineStride();
|
||||
virtual nsColorMap* GetColorMap();
|
||||
NS_IMETHOD Draw(nsIRenderingContext &aContext,
|
||||
nsDrawingSurface aSurface,
|
||||
PRInt32 aX, PRInt32 aY,
|
||||
PRInt32 aWidth, PRInt32 aHeight);
|
||||
NS_IMETHOD Draw(nsIRenderingContext &aContext,
|
||||
nsDrawingSurface aSurface,
|
||||
PRInt32 aSX, PRInt32 aSY, PRInt32 aSWidth, PRInt32 aSHeight,
|
||||
PRInt32 aDX, PRInt32 aDY, PRInt32 aDWidth, PRInt32 aDHeight);
|
||||
virtual void ImageUpdated(nsIDeviceContext *aContext,
|
||||
PRUint8 aFlags, nsRect *aUpdateRect);
|
||||
virtual nsresult Init(PRInt32 aWidth, PRInt32 aHeight,
|
||||
PRInt32 aDepth,
|
||||
nsMaskRequirements aMaskRequirements);
|
||||
virtual PRBool IsOptimized();
|
||||
|
||||
virtual nsresult Optimize(nsIDeviceContext* aContext);
|
||||
virtual PRUint8* GetAlphaBits();
|
||||
virtual PRInt32 GetAlphaWidth();
|
||||
virtual PRInt32 GetAlphaHeight();
|
||||
virtual PRInt32 GetAlphaLineStride();
|
||||
virtual nsIImage* DuplicateImage();
|
||||
|
||||
/**
|
||||
* Calculate the number of bytes spaned for this image for a given width
|
||||
* @param aWidth is the width to calculate the number of bytes for
|
||||
* @return the number of bytes in this span
|
||||
*/
|
||||
PRInt32 CalcBytesSpan(PRUint32 aWidth);
|
||||
virtual void SetAlphaLevel(PRInt32 aAlphaLevel);
|
||||
virtual PRInt32 GetAlphaLevel();
|
||||
virtual void MoveAlphaMask(PRInt32 aX, PRInt32 aY);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Calculate the amount of memory needed for the initialization of the image
|
||||
*/
|
||||
void ComputMetrics();
|
||||
void ComputePaletteSize(PRIntn nBitCount);
|
||||
|
||||
private:
|
||||
PRInt32 mWidth;
|
||||
PRInt32 mHeight;
|
||||
PRInt32 mDepth; // bits per pixel
|
||||
PRInt32 mRowBytes;
|
||||
PRUint8 *mImageBits;
|
||||
PRUint8 *mConvertedBits;
|
||||
PRInt32 mSizeImage;
|
||||
PRBool mIsTopToBottom;
|
||||
PRBool mImageUpdated;
|
||||
|
||||
PRInt8 mNumBytesPixel;
|
||||
|
||||
// alpha layer members
|
||||
PRUint8 *mAlphaBits;
|
||||
GdkPixmap *mAlphaPixmap;
|
||||
PRInt8 mAlphaDepth; // alpha layer depth
|
||||
PRInt16 mAlphaRowBytes; // alpha bytes per row
|
||||
PRInt16 mAlphaWidth; // alpha layer width
|
||||
PRInt16 mAlphaHeight; // alpha layer height
|
||||
nsPoint mLocation; // alpha mask location
|
||||
|
||||
GdkPixmap *mImagePixmap;
|
||||
|
||||
GdkGC *mGC;
|
||||
};
|
||||
|
||||
#endif
|
||||
452
mozilla/gfx/src/gtk/nsPrintdGTK.c
Normal file
452
mozilla/gfx/src/gtk/nsPrintdGTK.c
Normal file
@@ -0,0 +1,452 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
/* Original Code: Syd Logan (syd@netscape.com) 3/12/99 */
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "nspr.h"
|
||||
|
||||
#include "nsPrintdGTK.h"
|
||||
|
||||
/* A structure to hold widgets that need to be referenced in callbacks. We
|
||||
declare this statically in the caller entry point (as a field of
|
||||
UnixPrOps, below), and pass a pointer to the structure to Gtk+ for each
|
||||
signal handler registered. This avoids use of globals. */
|
||||
|
||||
typedef struct prwidgets {
|
||||
GtkWidget *toplevel; /* should be set to toplevel window */
|
||||
GtkWidget *prDialog;
|
||||
GtkWidget *cmdEntry;
|
||||
GtkWidget *pathEntry;
|
||||
GtkWidget *browseButton;
|
||||
GtkWidget *fpfToggle;
|
||||
GtkWidget *greyToggle;
|
||||
GtkWidget *letterToggle;
|
||||
GtkWidget *legalToggle;
|
||||
GtkWidget *execToggle;
|
||||
GtkWidget *topSpinner;
|
||||
GtkWidget *bottomSpinner;
|
||||
GtkWidget *leftSpinner;
|
||||
GtkWidget *rightSpinner;
|
||||
GtkFileSelection *fsWidget;
|
||||
} PrWidgets;
|
||||
|
||||
typedef struct unixprops {
|
||||
UnixPrData *prData; /* pointer to caller struct */
|
||||
PrWidgets widgets;
|
||||
} UnixPrOps;
|
||||
|
||||
/* user clicked cancel. tear things down, and set cancel field in
|
||||
caller data to PR_TRUE so printing will not happen */
|
||||
|
||||
static void
|
||||
CancelPrint (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
gtk_main_quit();
|
||||
gtk_widget_destroy( GTK_WIDGET(prOps->widgets.prDialog) );
|
||||
prOps->prData->cancel = PR_TRUE;
|
||||
}
|
||||
|
||||
/* user selected the Print button. Collect any remaining data from the
|
||||
widgets, and set cancel field in caller data to PR_FALSE so printing
|
||||
will be performed. Also, tear down dialog and exit inner main loop */
|
||||
|
||||
static void
|
||||
DoPrint (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
strcpy( prOps->prData->command,
|
||||
gtk_entry_get_text( GTK_ENTRY( prOps->widgets.cmdEntry ) ) );
|
||||
strcpy( prOps->prData->path,
|
||||
gtk_entry_get_text( GTK_ENTRY( prOps->widgets.pathEntry ) ) );
|
||||
|
||||
if ( GTK_TOGGLE_BUTTON( prOps->widgets.fpfToggle )->active == PR_TRUE )
|
||||
prOps->prData->fpf = PR_TRUE;
|
||||
else
|
||||
prOps->prData->fpf = PR_FALSE;
|
||||
|
||||
if ( GTK_TOGGLE_BUTTON( prOps->widgets.greyToggle )->active == PR_TRUE )
|
||||
prOps->prData->grayscale = PR_TRUE;
|
||||
else
|
||||
prOps->prData->grayscale = PR_FALSE;
|
||||
if ( GTK_TOGGLE_BUTTON( prOps->widgets.letterToggle )->active == PR_TRUE )
|
||||
prOps->prData->size = NS_LETTER_SIZE;
|
||||
else if ( GTK_TOGGLE_BUTTON( prOps->widgets.legalToggle )->active == PR_TRUE )
|
||||
prOps->prData->size = NS_LEGAL_SIZE;
|
||||
else if ( GTK_TOGGLE_BUTTON( prOps->widgets.execToggle )->active == PR_TRUE )
|
||||
prOps->prData->size = NS_EXECUTIVE_SIZE;
|
||||
else
|
||||
prOps->prData->size = NS_A4_SIZE;
|
||||
|
||||
/* margins */
|
||||
|
||||
prOps->prData->top = gtk_spin_button_get_value_as_float(
|
||||
GTK_SPIN_BUTTON(prOps->widgets.topSpinner) );
|
||||
prOps->prData->bottom = gtk_spin_button_get_value_as_float(
|
||||
GTK_SPIN_BUTTON(prOps->widgets.bottomSpinner) );
|
||||
prOps->prData->left = gtk_spin_button_get_value_as_float(
|
||||
GTK_SPIN_BUTTON(prOps->widgets.leftSpinner) );
|
||||
prOps->prData->right = gtk_spin_button_get_value_as_float(
|
||||
GTK_SPIN_BUTTON(prOps->widgets.rightSpinner) );
|
||||
|
||||
/* we got everything... bring down the dialog and tell caller
|
||||
it's o.k. to print */
|
||||
|
||||
gtk_main_quit();
|
||||
gtk_widget_destroy( GTK_WIDGET(prOps->widgets.prDialog) );
|
||||
prOps->prData->cancel = PR_FALSE;
|
||||
}
|
||||
|
||||
/* User hit ok in file selection widget brought up by the browse button.
|
||||
snarf the selected file, stuff it in caller data */
|
||||
|
||||
static void
|
||||
ModifyPrPath (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
strcpy( prOps->prData->path,
|
||||
gtk_file_selection_get_filename(prOps->widgets.fsWidget) );
|
||||
gtk_entry_set_text (GTK_ENTRY (prOps->widgets.pathEntry),
|
||||
prOps->prData->path);
|
||||
gtk_widget_destroy( GTK_WIDGET(prOps->widgets.fsWidget) );
|
||||
}
|
||||
|
||||
/* user selected print to printer. de-sensitize print to file fields */
|
||||
|
||||
static void
|
||||
SwitchToPrinter (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
gtk_widget_set_sensitive( prOps->widgets.cmdEntry, PR_TRUE );
|
||||
gtk_widget_set_sensitive( prOps->widgets.pathEntry, PR_FALSE );
|
||||
gtk_widget_set_sensitive( prOps->widgets.browseButton, PR_FALSE );
|
||||
prOps->prData->toPrinter = PR_TRUE;
|
||||
}
|
||||
|
||||
/* user selected print to file. de-sensitize print to printer fields */
|
||||
|
||||
static void
|
||||
SwitchToFile (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
gtk_widget_set_sensitive( prOps->widgets.cmdEntry, PR_FALSE );
|
||||
gtk_widget_set_sensitive( prOps->widgets.pathEntry, PR_TRUE );
|
||||
gtk_widget_set_sensitive( prOps->widgets.browseButton, PR_TRUE );
|
||||
prOps->prData->toPrinter = PR_FALSE;
|
||||
}
|
||||
|
||||
/* user hit the browse button. Pop up a file selection widget and grab
|
||||
result */
|
||||
|
||||
static void
|
||||
GetPrPath (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
GtkWidget *fs;
|
||||
|
||||
fs = gtk_file_selection_new("Netscape: File Browser");
|
||||
|
||||
gtk_file_selection_set_filename( GTK_FILE_SELECTION(fs),
|
||||
prOps->prData->path );
|
||||
|
||||
gtk_window_set_modal (GTK_WINDOW(fs),PR_TRUE);
|
||||
|
||||
#if 0
|
||||
/* XXX not sure what the toplevel window should be. */
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (fs),
|
||||
GTK_WINDOW (prOps->widgets.toplevel));
|
||||
#endif
|
||||
|
||||
prOps->widgets.fsWidget = GTK_FILE_SELECTION(fs);
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
|
||||
"clicked", GTK_SIGNAL_FUNC(ModifyPrPath), prOps);
|
||||
|
||||
gtk_signal_connect_object (GTK_OBJECT(
|
||||
GTK_FILE_SELECTION(fs)->cancel_button), "clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT (fs));
|
||||
|
||||
gtk_widget_show(fs);
|
||||
}
|
||||
|
||||
/* create file data dialog. XXX widget should be NULL */
|
||||
|
||||
static void
|
||||
DoPrintGTK (GtkWidget *widget, UnixPrOps *prOps)
|
||||
{
|
||||
GtkWidget *separator, *dialog, *label, *vbox, *entry, *hbox,
|
||||
*button, *fileButton, *prButton, *table, *spinner1;
|
||||
GtkAdjustment *adj;
|
||||
|
||||
prOps->widgets.prDialog = dialog =
|
||||
gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
||||
gtk_window_set_modal( GTK_WINDOW(dialog), PR_TRUE );
|
||||
#if 0
|
||||
/* not yet sure what the toplevel window should be */
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (dialog),
|
||||
GTK_WINDOW (prOps->widgets.toplevel));
|
||||
#endif
|
||||
gtk_window_set_title( GTK_WINDOW(dialog), "Netscape: Print" );
|
||||
|
||||
vbox = gtk_vbox_new (PR_FALSE, 0);
|
||||
gtk_container_add (GTK_CONTAINER (dialog), vbox);
|
||||
|
||||
table = gtk_table_new (3, 3, PR_FALSE);
|
||||
gtk_table_set_row_spacings (GTK_TABLE (table), 5);
|
||||
gtk_table_set_col_spacings (GTK_TABLE (table), 5);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (table), 10);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), table, PR_TRUE, PR_TRUE, 5);
|
||||
label = gtk_label_new( "Print To:" );
|
||||
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
|
||||
0, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = prButton = gtk_radio_button_new_with_label (NULL, "Printer");
|
||||
if ( prOps->prData->toPrinter == PR_TRUE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
|
||||
button = fileButton = gtk_radio_button_new_with_label (
|
||||
gtk_radio_button_group (GTK_RADIO_BUTTON (button)), "File");
|
||||
gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
if ( prOps->prData->toPrinter == PR_FALSE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
|
||||
label = gtk_label_new( "Print Command:" );
|
||||
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
|
||||
0, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
entry = gtk_entry_new ();
|
||||
gtk_entry_set_text (GTK_ENTRY (entry), prOps->prData->command);
|
||||
gtk_table_attach (GTK_TABLE (table), entry, 1, 3, 1, 2,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
if ( prOps->prData->toPrinter == PR_FALSE )
|
||||
gtk_widget_set_sensitive( entry, PR_FALSE );
|
||||
prOps->widgets.cmdEntry = entry;
|
||||
|
||||
label = gtk_label_new( "File Name:" );
|
||||
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
|
||||
0, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
entry = gtk_entry_new ();
|
||||
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
gtk_entry_set_text (GTK_ENTRY (entry), prOps->prData->path);
|
||||
if ( prOps->prData->toPrinter == PR_TRUE )
|
||||
gtk_widget_set_sensitive( entry, PR_FALSE );
|
||||
prOps->widgets.pathEntry = entry;
|
||||
|
||||
button = gtk_button_new_with_label ("Browse...");
|
||||
gtk_table_attach (GTK_TABLE (table), button, 2, 3, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC (GetPrPath), prOps);
|
||||
if ( prOps->prData->toPrinter == PR_TRUE )
|
||||
gtk_widget_set_sensitive( entry, PR_FALSE );
|
||||
prOps->widgets.browseButton = button;
|
||||
|
||||
separator = gtk_hseparator_new ();
|
||||
gtk_box_pack_start (GTK_BOX (vbox), separator, PR_TRUE, PR_FALSE, 0);
|
||||
|
||||
table = gtk_table_new (2, 4, PR_FALSE);
|
||||
gtk_table_set_row_spacings (GTK_TABLE (table), 5);
|
||||
gtk_table_set_col_spacings (GTK_TABLE (table), 5);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (table), 10);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), table, PR_TRUE, PR_FALSE, 0);
|
||||
|
||||
label = gtk_label_new( "Print: " );
|
||||
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (NULL, "First Page First");
|
||||
if ( prOps->prData->fpf == PR_TRUE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
prOps->widgets.fpfToggle = button;
|
||||
gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (
|
||||
gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
|
||||
"Last Page First");
|
||||
if ( prOps->prData->fpf == PR_FALSE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
|
||||
label = gtk_label_new( "Print: " );
|
||||
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (NULL, "Greyscale");
|
||||
prOps->widgets.greyToggle = button;
|
||||
if ( prOps->prData->grayscale == PR_TRUE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 1, 2, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (
|
||||
gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
|
||||
"Color");
|
||||
if ( prOps->prData->grayscale == PR_FALSE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 2, 3, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
|
||||
label = gtk_label_new( "Paper Size: " );
|
||||
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (NULL,
|
||||
"Letter (8 1/2 x 11 in.)");
|
||||
prOps->widgets.letterToggle = button;
|
||||
if ( prOps->prData->size == NS_LETTER_SIZE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 1, 2, 3, 4,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (
|
||||
gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
|
||||
"Legal (8 1/2 x 14 in.)");
|
||||
prOps->widgets.legalToggle = button;
|
||||
if ( prOps->prData->size == NS_LEGAL_SIZE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 2, 3, 3, 4,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
|
||||
button = gtk_radio_button_new_with_label (
|
||||
gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
|
||||
"Executive (7 1/2 x 10 in.)");
|
||||
prOps->widgets.execToggle = button;
|
||||
if ( prOps->prData->size == NS_EXECUTIVE_SIZE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 1, 2, 4, 5,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
button = gtk_radio_button_new_with_label (
|
||||
gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
|
||||
"A4 (210 x 297 mm)");
|
||||
if ( prOps->prData->size == NS_A4_SIZE )
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
PR_TRUE);
|
||||
gtk_table_attach (GTK_TABLE (table), button, 2, 3, 4, 5,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
|
||||
/* margins */
|
||||
|
||||
separator = gtk_hseparator_new ();
|
||||
gtk_box_pack_start (GTK_BOX (vbox), separator, PR_TRUE, PR_FALSE, 0);
|
||||
|
||||
hbox = gtk_hbox_new (PR_FALSE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, PR_FALSE, PR_FALSE, 5);
|
||||
label = gtk_label_new( "Margins (inches):" );
|
||||
gtk_box_pack_start (GTK_BOX (hbox), label, PR_FALSE, PR_FALSE, 10);
|
||||
|
||||
table = gtk_table_new (1, 2, PR_FALSE);
|
||||
gtk_table_set_row_spacings (GTK_TABLE (table), 5);
|
||||
gtk_table_set_col_spacings (GTK_TABLE (table), 5);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (table), 10);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), table, PR_TRUE, PR_FALSE, 0);
|
||||
hbox = gtk_hbox_new (PR_FALSE, 0);
|
||||
gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
label = gtk_label_new( "Top: " );
|
||||
gtk_box_pack_start (GTK_BOX (hbox), label, PR_TRUE, PR_FALSE, 0);
|
||||
adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 0.0, 999.0,
|
||||
0.25, 1.0, 0.0);
|
||||
prOps->widgets.topSpinner = spinner1 =
|
||||
gtk_spin_button_new (adj, 1.0, 2);
|
||||
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
|
||||
gtk_widget_set_usize (spinner1, 60, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), spinner1, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new( "Bottom: " );
|
||||
gtk_box_pack_start (GTK_BOX (hbox), label, PR_TRUE, PR_FALSE, 0);
|
||||
adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 0.0, 999.0,
|
||||
0.25, 1.0, 0.0);
|
||||
prOps->widgets.bottomSpinner = spinner1 =
|
||||
gtk_spin_button_new (adj, 1.0, 2);
|
||||
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
|
||||
gtk_widget_set_usize (spinner1, 60, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), spinner1, FALSE, TRUE, 0);
|
||||
|
||||
hbox = gtk_hbox_new (PR_FALSE, 0);
|
||||
gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||
|
||||
label = gtk_label_new( "Left: " );
|
||||
gtk_box_pack_start (GTK_BOX (hbox), label, PR_TRUE, PR_FALSE, 0);
|
||||
adj = (GtkAdjustment *) gtk_adjustment_new (0.75, 0.0, 999.0,
|
||||
0.25, 1.0, 0.0);
|
||||
prOps->widgets.leftSpinner = spinner1 =
|
||||
gtk_spin_button_new (adj, 1.0, 2);
|
||||
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
|
||||
gtk_widget_set_usize (spinner1, 60, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), spinner1, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new( "Right: " );
|
||||
gtk_box_pack_start (GTK_BOX (hbox), label, PR_TRUE, PR_FALSE, 0);
|
||||
adj = (GtkAdjustment *) gtk_adjustment_new (0.75, 0.0, 999.0,
|
||||
0.25, 1.0, 0.0);
|
||||
prOps->widgets.rightSpinner = spinner1 =
|
||||
gtk_spin_button_new (adj, 1.0, 2);
|
||||
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
|
||||
gtk_widget_set_usize (spinner1, 60, 0);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), spinner1, FALSE, TRUE, 0);
|
||||
|
||||
separator = gtk_hseparator_new ();
|
||||
gtk_box_pack_start (GTK_BOX (vbox), separator, PR_TRUE, PR_FALSE, 0);
|
||||
|
||||
hbox = gtk_hbox_new (PR_FALSE, 0);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, PR_TRUE, PR_FALSE, 5);
|
||||
button = gtk_button_new_with_label ("Print");
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC (DoPrint), prOps );
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, PR_TRUE, PR_FALSE, 0);
|
||||
|
||||
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
|
||||
gtk_widget_grab_default (button);
|
||||
|
||||
button = gtk_button_new_with_label ("Cancel");
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
GTK_SIGNAL_FUNC ( CancelPrint ), prOps);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, PR_TRUE, PR_FALSE, 0);
|
||||
|
||||
/* Do this here, otherwise, upon creation the callbacks will be
|
||||
triggered and the widgets these callbacks set sensitivity on
|
||||
do not exist yet */
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (prButton), "clicked",
|
||||
GTK_SIGNAL_FUNC (SwitchToPrinter), prOps);
|
||||
gtk_signal_connect (GTK_OBJECT (fileButton), "clicked",
|
||||
GTK_SIGNAL_FUNC (SwitchToFile), prOps);
|
||||
|
||||
gtk_widget_show_all( dialog );
|
||||
gtk_main ();
|
||||
}
|
||||
|
||||
/* public interface to print dialog. Caller passes in preferences using
|
||||
argument, we return any changes and indication of whether to print
|
||||
or cancel. */
|
||||
|
||||
void
|
||||
UnixPrDialog( UnixPrData *prData )
|
||||
{
|
||||
static UnixPrOps prOps;
|
||||
|
||||
prOps.prData = prData;
|
||||
DoPrintGTK( (GtkWidget *) NULL, &prOps );
|
||||
}
|
||||
|
||||
60
mozilla/gfx/src/gtk/nsPrintdGTK.h
Normal file
60
mozilla/gfx/src/gtk/nsPrintdGTK.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
/* Original Code: Syd Logan (syd@netscape.com) 3/12/99 */
|
||||
|
||||
#ifndef nsPrintdGTK_h___
|
||||
#define nsPrintdGTK_h___
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
PR_BEGIN_EXTERN_C
|
||||
|
||||
/* stolen from nsPostScriptObj.h. needs to be put somewhere else that
|
||||
both ps and gtk can see easily */
|
||||
|
||||
#ifndef NS_LEGAL_SIZE
|
||||
#define NS_LETTER_SIZE 0
|
||||
#define NS_LEGAL_SIZE 1
|
||||
#define NS_EXECUTIVE_SIZE 2
|
||||
#define NS_A4_SIZE 3
|
||||
#endif
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX _POSIX_PATH_MAX
|
||||
#endif
|
||||
|
||||
typedef struct unixprdata {
|
||||
PRBool toPrinter; /* If PR_TRUE, print to printer */
|
||||
PRBool fpf; /* If PR_TRUE, first page first */
|
||||
PRBool grayscale; /* If PR_TRUE, print grayscale */
|
||||
int size; /* Paper size e.g., SizeLetter */
|
||||
char command[ PATH_MAX ]; /* Print command e.g., lpr */
|
||||
char path[ PATH_MAX ]; /* If toPrinter = PR_FALSE, dest file */
|
||||
PRBool cancel; /* If PR_TRUE, user cancelled */
|
||||
float left; /* left margin */
|
||||
float right; /* right margin */
|
||||
float top; /* top margin */
|
||||
float bottom; /* bottom margin */
|
||||
} UnixPrData;
|
||||
|
||||
void UnixPrDialog(UnixPrData *prData);
|
||||
|
||||
PR_END_EXTERN_C
|
||||
|
||||
#endif /* nsPrintdGTK_h___ */
|
||||
302
mozilla/gfx/src/gtk/nsRegionGTK.cpp
Normal file
302
mozilla/gfx/src/gtk/nsRegionGTK.cpp
Normal file
@@ -0,0 +1,302 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkprivate.h>
|
||||
#include "nsRegionGTK.h"
|
||||
#include "xregion.h"
|
||||
#include "prmem.h"
|
||||
|
||||
static NS_DEFINE_IID(kRegionIID, NS_IREGION_IID);
|
||||
|
||||
nsRegionGTK::nsRegionGTK()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
mRegion = nsnull;
|
||||
mRegionType = eRegionComplexity_empty;
|
||||
}
|
||||
|
||||
nsRegionGTK::~nsRegionGTK()
|
||||
{
|
||||
if (mRegion)
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nsnull;
|
||||
}
|
||||
|
||||
NS_IMPL_QUERY_INTERFACE(nsRegionGTK, kRegionIID)
|
||||
NS_IMPL_ADDREF(nsRegionGTK)
|
||||
NS_IMPL_RELEASE(nsRegionGTK)
|
||||
|
||||
nsresult nsRegionGTK::Init(void)
|
||||
{
|
||||
NS_ADDREF_THIS();
|
||||
mRegion = ::gdk_region_new();
|
||||
mRegionType = eRegionComplexity_empty;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void nsRegionGTK::SetTo(const nsIRegion &aRegion)
|
||||
{
|
||||
nsRegionGTK * pRegion = (nsRegionGTK *)&aRegion;
|
||||
|
||||
SetRegionEmpty();
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_union(mRegion, pRegion->mRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::SetTo(const nsRegionGTK *aRegion)
|
||||
{
|
||||
SetRegionEmpty();
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_union(mRegion, aRegion->mRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::SetTo(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
SetRegionEmpty();
|
||||
|
||||
GdkRectangle grect;
|
||||
|
||||
grect.x = aX;
|
||||
grect.y = aY;
|
||||
grect.width = aWidth;
|
||||
grect.height = aHeight;
|
||||
|
||||
GdkRegion *nRegion = ::gdk_region_union_with_rect(mRegion, &grect);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Intersect(const nsIRegion &aRegion)
|
||||
{
|
||||
nsRegionGTK * pRegion = (nsRegionGTK *)&aRegion;
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_intersect(mRegion, pRegion->mRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Intersect(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
GdkRegion *tRegion = CreateRectRegion(aX, aY, aWidth, aHeight);
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_intersect(mRegion, tRegion);
|
||||
::gdk_region_destroy(tRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Union(const nsIRegion &aRegion)
|
||||
{
|
||||
nsRegionGTK * pRegion = (nsRegionGTK *)&aRegion;
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_union(mRegion, pRegion->mRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Union(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
GdkRegion *tRegion = CreateRectRegion(aX, aY, aWidth, aHeight);
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_union(mRegion, tRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
::gdk_region_destroy(tRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Subtract(const nsIRegion &aRegion)
|
||||
{
|
||||
nsRegionGTK * pRegion = (nsRegionGTK *)&aRegion;
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_subtract(mRegion, pRegion->mRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Subtract(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
GdkRegion *tRegion = CreateRectRegion(aX, aY, aWidth, aHeight);
|
||||
|
||||
GdkRegion *nRegion = ::gdk_regions_subtract(mRegion, tRegion);
|
||||
::gdk_region_destroy(mRegion);
|
||||
::gdk_region_destroy(tRegion);
|
||||
mRegion = nRegion;
|
||||
}
|
||||
|
||||
PRBool nsRegionGTK::IsEmpty(void)
|
||||
{
|
||||
return (::gdk_region_empty(mRegion));
|
||||
}
|
||||
|
||||
PRBool nsRegionGTK::IsEqual(const nsIRegion &aRegion)
|
||||
{
|
||||
nsRegionGTK *pRegion = (nsRegionGTK *)&aRegion;
|
||||
|
||||
return(::gdk_region_equal(mRegion, pRegion->mRegion));
|
||||
|
||||
}
|
||||
|
||||
void nsRegionGTK::GetBoundingBox(PRInt32 *aX, PRInt32 *aY, PRInt32 *aWidth, PRInt32 *aHeight)
|
||||
{
|
||||
GdkRectangle rect;
|
||||
|
||||
::gdk_region_get_clipbox(mRegion, &rect);
|
||||
|
||||
*aX = rect.x;
|
||||
*aY = rect.y;
|
||||
*aWidth = rect.width;
|
||||
*aHeight = rect.height;
|
||||
}
|
||||
|
||||
void nsRegionGTK::Offset(PRInt32 aXOffset, PRInt32 aYOffset)
|
||||
{
|
||||
::gdk_region_offset(mRegion, aXOffset, aYOffset);
|
||||
}
|
||||
|
||||
PRBool nsRegionGTK::ContainsRect(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
GdkOverlapType containment;
|
||||
GdkRectangle rect;
|
||||
|
||||
rect.x = aX;
|
||||
rect.y = aY;
|
||||
rect.width = aWidth;
|
||||
rect.height = aHeight;
|
||||
|
||||
containment = ::gdk_region_rect_in(mRegion, &rect);
|
||||
|
||||
if (containment != GDK_OVERLAP_RECTANGLE_OUT)
|
||||
return PR_TRUE;
|
||||
else
|
||||
return PR_FALSE;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRegionGTK::GetRects(nsRegionRectSet **aRects)
|
||||
{
|
||||
nsRegionRectSet *rects;
|
||||
GdkRegionPrivate *priv = (GdkRegionPrivate *)mRegion;
|
||||
Region pRegion = priv->xregion;
|
||||
int nbox;
|
||||
BOX *pbox;
|
||||
nsRegionRect *rect;
|
||||
|
||||
NS_ASSERTION(!(nsnull == aRects), "bad ptr");
|
||||
|
||||
//code lifted from old xfe. MMP
|
||||
|
||||
pbox = pRegion->rects;
|
||||
nbox = pRegion->numRects;
|
||||
|
||||
rects = *aRects;
|
||||
|
||||
if ((nsnull == rects) || (rects->mRectsLen < (PRUint32)nbox))
|
||||
{
|
||||
void *buf = PR_Realloc(rects, sizeof(nsRegionRectSet) + (sizeof(nsRegionRect) * (nbox - 1)));
|
||||
|
||||
if (nsnull == buf)
|
||||
{
|
||||
if (nsnull != rects)
|
||||
rects->mNumRects = 0;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
rects = (nsRegionRectSet *)buf;
|
||||
rects->mRectsLen = nbox;
|
||||
}
|
||||
|
||||
rects->mNumRects = nbox;
|
||||
rects->mArea = 0;
|
||||
rect = &rects->mRects[0];
|
||||
|
||||
while (nbox--)
|
||||
{
|
||||
rect->x = pbox->x1;
|
||||
rect->width = (pbox->x2 - pbox->x1);
|
||||
rect->y = pbox->y1;
|
||||
rect->height = (pbox->y2 - pbox->y1);
|
||||
|
||||
rects->mArea += rect->width * rect->height;
|
||||
|
||||
pbox++;
|
||||
rect++;
|
||||
}
|
||||
|
||||
*aRects = rects;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRegionGTK::FreeRects(nsRegionRectSet *aRects)
|
||||
{
|
||||
if (nsnull != aRects)
|
||||
PR_Free((void *)aRects);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRegionGTK::GetNativeRegion(void *&aRegion) const
|
||||
{
|
||||
aRegion = (void *)mRegion;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRegionGTK::GetRegionComplexity(nsRegionComplexity &aComplexity) const
|
||||
{
|
||||
// cast to avoid const-ness problems on some compilers
|
||||
if (((nsRegionGTK*)this)->IsEmpty())
|
||||
aComplexity = eRegionComplexity_empty;
|
||||
else
|
||||
aComplexity = eRegionComplexity_complex;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void nsRegionGTK::SetRegionEmpty()
|
||||
{
|
||||
if (!IsEmpty()) {
|
||||
::gdk_region_destroy(mRegion);
|
||||
mRegion = ::gdk_region_new();
|
||||
}
|
||||
}
|
||||
|
||||
GdkRegion *nsRegionGTK::CreateRectRegion(PRInt32 aX,
|
||||
PRInt32 aY,
|
||||
PRInt32 aWidth,
|
||||
PRInt32 aHeight)
|
||||
{
|
||||
GdkRegion *tRegion = ::gdk_region_new();
|
||||
GdkRectangle rect;
|
||||
|
||||
rect.x = aX;
|
||||
rect.y = aY;
|
||||
rect.width = aWidth;
|
||||
rect.height = aHeight;
|
||||
|
||||
GdkRegion *rRegion = ::gdk_region_union_with_rect(tRegion, &rect);
|
||||
::gdk_region_destroy(tRegion);
|
||||
|
||||
return (rRegion);
|
||||
}
|
||||
63
mozilla/gfx/src/gtk/nsRegionGTK.h
Normal file
63
mozilla/gfx/src/gtk/nsRegionGTK.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsRegionGTK_h___
|
||||
#define nsRegionGTK_h___
|
||||
|
||||
#include "nsIRegion.h"
|
||||
|
||||
class nsRegionGTK : public nsIRegion
|
||||
{
|
||||
public:
|
||||
nsRegionGTK();
|
||||
virtual ~nsRegionGTK();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
virtual nsresult Init();
|
||||
|
||||
virtual void SetTo(const nsIRegion &aRegion);
|
||||
virtual void SetTo(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
|
||||
void SetTo(const nsRegionGTK *aRegion);
|
||||
virtual void Intersect(const nsIRegion &aRegion);
|
||||
virtual void Intersect(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
|
||||
virtual void Union(const nsIRegion &aRegion);
|
||||
virtual void Union(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
|
||||
virtual void Subtract(const nsIRegion &aRegion);
|
||||
virtual void Subtract(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
|
||||
virtual PRBool IsEmpty(void);
|
||||
virtual PRBool IsEqual(const nsIRegion &aRegion);
|
||||
virtual void GetBoundingBox(PRInt32 *aX, PRInt32 *aY, PRInt32 *aWidth, PRInt32 *aHeight);
|
||||
virtual void Offset(PRInt32 aXOffset, PRInt32 aYOffset);
|
||||
virtual PRBool ContainsRect(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
|
||||
NS_IMETHOD GetRects(nsRegionRectSet **aRects);
|
||||
NS_IMETHOD FreeRects(nsRegionRectSet *aRects);
|
||||
NS_IMETHOD GetNativeRegion(void *&aRegion) const;
|
||||
NS_IMETHOD GetRegionComplexity(nsRegionComplexity &aComplexity) const;
|
||||
|
||||
GdkRegion *CreateRectRegion(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
|
||||
|
||||
private:
|
||||
GdkRegion *mRegion;
|
||||
nsRegionComplexity mRegionType;
|
||||
|
||||
virtual void SetRegionEmpty();
|
||||
|
||||
};
|
||||
|
||||
#endif // nsRegionGTK_h___
|
||||
1463
mozilla/gfx/src/gtk/nsRenderingContextGTK.cpp
Normal file
1463
mozilla/gfx/src/gtk/nsRenderingContextGTK.cpp
Normal file
File diff suppressed because it is too large
Load Diff
173
mozilla/gfx/src/gtk/nsRenderingContextGTK.h
Normal file
173
mozilla/gfx/src/gtk/nsRenderingContextGTK.h
Normal file
@@ -0,0 +1,173 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsRenderingContextGTK_h___
|
||||
#define nsRenderingContextGTK_h___
|
||||
|
||||
#include "nsIRenderingContext.h"
|
||||
#include "nsUnitConversion.h"
|
||||
#include "nsFont.h"
|
||||
#include "nsIFontMetrics.h"
|
||||
#include "nsPoint.h"
|
||||
#include "nsString.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsTransform2D.h"
|
||||
#include "nsIViewManager.h"
|
||||
#include "nsIWidget.h"
|
||||
#include "nsRect.h"
|
||||
#include "nsImageGTK.h"
|
||||
#include "nsIDeviceContext.h"
|
||||
#include "nsVoidArray.h"
|
||||
|
||||
#include "nsDrawingSurfaceGTK.h"
|
||||
#include "nsRegionGTK.h"
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
class nsRenderingContextGTK : public nsIRenderingContext
|
||||
{
|
||||
public:
|
||||
nsRenderingContextGTK();
|
||||
virtual ~nsRenderingContextGTK();
|
||||
|
||||
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Init(nsIDeviceContext* aContext, nsIWidget *aWindow);
|
||||
NS_IMETHOD Init(nsIDeviceContext* aContext, nsDrawingSurface aSurface);
|
||||
|
||||
NS_IMETHOD Reset(void);
|
||||
|
||||
NS_IMETHOD GetDeviceContext(nsIDeviceContext *&aContext);
|
||||
|
||||
NS_IMETHOD LockDrawingSurface(PRInt32 aX, PRInt32 aY, PRUint32 aWidth, PRUint32 aHeight,
|
||||
void **aBits, PRInt32 *aStride, PRInt32 *aWidthBytes,
|
||||
PRUint32 aFlags);
|
||||
NS_IMETHOD UnlockDrawingSurface(void);
|
||||
|
||||
NS_IMETHOD SelectOffScreenDrawingSurface(nsDrawingSurface aSurface);
|
||||
NS_IMETHOD GetDrawingSurface(nsDrawingSurface *aSurface);
|
||||
NS_IMETHOD GetHints(PRUint32& aResult);
|
||||
|
||||
NS_IMETHOD PushState(void);
|
||||
NS_IMETHOD PopState(PRBool &aClipEmpty);
|
||||
|
||||
NS_IMETHOD IsVisibleRect(const nsRect& aRect, PRBool &aVisible);
|
||||
|
||||
NS_IMETHOD SetClipRect(const nsRect& aRect, nsClipCombine aCombine, PRBool &aClipEmpty);
|
||||
NS_IMETHOD GetClipRect(nsRect &aRect, PRBool &aClipValid);
|
||||
NS_IMETHOD SetClipRegion(const nsIRegion& aRegion, nsClipCombine aCombine, PRBool &aClipEmpty);
|
||||
NS_IMETHOD GetClipRegion(nsIRegion **aRegion);
|
||||
|
||||
NS_IMETHOD SetLineStyle(nsLineStyle aLineStyle);
|
||||
NS_IMETHOD GetLineStyle(nsLineStyle &aLineStyle);
|
||||
|
||||
NS_IMETHOD SetColor(nscolor aColor);
|
||||
NS_IMETHOD GetColor(nscolor &aColor) const;
|
||||
|
||||
NS_IMETHOD SetFont(const nsFont& aFont);
|
||||
NS_IMETHOD SetFont(nsIFontMetrics *aFontMetrics);
|
||||
|
||||
NS_IMETHOD GetFontMetrics(nsIFontMetrics *&aFontMetrics);
|
||||
|
||||
NS_IMETHOD Translate(nscoord aX, nscoord aY);
|
||||
NS_IMETHOD Scale(float aSx, float aSy);
|
||||
NS_IMETHOD GetCurrentTransform(nsTransform2D *&aTransform);
|
||||
|
||||
NS_IMETHOD CreateDrawingSurface(nsRect *aBounds, PRUint32 aSurfFlags, nsDrawingSurface &aSurface);
|
||||
NS_IMETHOD DestroyDrawingSurface(nsDrawingSurface aDS);
|
||||
|
||||
NS_IMETHOD DrawLine(nscoord aX0, nscoord aY0, nscoord aX1, nscoord aY1);
|
||||
NS_IMETHOD DrawPolyline(const nsPoint aPoints[], PRInt32 aNumPoints);
|
||||
|
||||
NS_IMETHOD DrawRect(const nsRect& aRect);
|
||||
NS_IMETHOD DrawRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight);
|
||||
NS_IMETHOD FillRect(const nsRect& aRect);
|
||||
NS_IMETHOD FillRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight);
|
||||
|
||||
NS_IMETHOD DrawPolygon(const nsPoint aPoints[], PRInt32 aNumPoints);
|
||||
NS_IMETHOD FillPolygon(const nsPoint aPoints[], PRInt32 aNumPoints);
|
||||
|
||||
NS_IMETHOD DrawEllipse(const nsRect& aRect);
|
||||
NS_IMETHOD DrawEllipse(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight);
|
||||
NS_IMETHOD FillEllipse(const nsRect& aRect);
|
||||
NS_IMETHOD FillEllipse(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight);
|
||||
|
||||
NS_IMETHOD DrawArc(const nsRect& aRect,
|
||||
float aStartAngle, float aEndAngle);
|
||||
NS_IMETHOD DrawArc(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight,
|
||||
float aStartAngle, float aEndAngle);
|
||||
NS_IMETHOD FillArc(const nsRect& aRect,
|
||||
float aStartAngle, float aEndAngle);
|
||||
NS_IMETHOD FillArc(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight,
|
||||
float aStartAngle, float aEndAngle);
|
||||
|
||||
NS_IMETHOD GetWidth(char aC, nscoord &aWidth);
|
||||
NS_IMETHOD GetWidth(PRUnichar aC, nscoord &aWidth,
|
||||
PRInt32 *aFontID);
|
||||
NS_IMETHOD GetWidth(const nsString& aString, nscoord &aWidth,
|
||||
PRInt32 *aFontID);
|
||||
NS_IMETHOD GetWidth(const char *aString, nscoord &aWidth);
|
||||
NS_IMETHOD GetWidth(const char *aString, PRUint32 aLength, nscoord &aWidth);
|
||||
NS_IMETHOD GetWidth(const PRUnichar *aString, PRUint32 aLength, nscoord &aWidth,
|
||||
PRInt32 *aFontID);
|
||||
|
||||
NS_IMETHOD DrawString(const char *aString, PRUint32 aLength,
|
||||
nscoord aX, nscoord aY,
|
||||
const nscoord* aSpacing);
|
||||
NS_IMETHOD DrawString(const PRUnichar *aString, PRUint32 aLength,
|
||||
nscoord aX, nscoord aY,
|
||||
PRInt32 aFontID,
|
||||
const nscoord* aSpacing);
|
||||
NS_IMETHOD DrawString(const nsString& aString, nscoord aX, nscoord aY,
|
||||
PRInt32 aFontID,
|
||||
const nscoord* aSpacing);
|
||||
|
||||
NS_IMETHOD DrawImage(nsIImage *aImage, nscoord aX, nscoord aY);
|
||||
NS_IMETHOD DrawImage(nsIImage *aImage, nscoord aX, nscoord aY,
|
||||
nscoord aWidth, nscoord aHeight);
|
||||
NS_IMETHOD DrawImage(nsIImage *aImage, const nsRect& aRect);
|
||||
NS_IMETHOD DrawImage(nsIImage *aImage, const nsRect& aSRect, const nsRect& aDRect);
|
||||
|
||||
NS_IMETHOD CopyOffScreenBits(nsDrawingSurface aSrcSurf, PRInt32 aSrcX, PRInt32 aSrcY,
|
||||
const nsRect &aDestBounds, PRUint32 aCopyFlags);
|
||||
|
||||
//locals
|
||||
NS_IMETHOD CommonInit();
|
||||
|
||||
protected:
|
||||
nsDrawingSurfaceGTK *mOffscreenSurface;
|
||||
nsDrawingSurfaceGTK *mSurface;
|
||||
nsIDeviceContext *mContext;
|
||||
nsIFontMetrics *mFontMetrics;
|
||||
nsRegionGTK *mClipRegion;
|
||||
nsTransform2D *mTMatrix;
|
||||
float mP2T;
|
||||
GdkWChar* mDrawStringBuf;
|
||||
PRUint32 mDrawStringSize;
|
||||
|
||||
// graphic state stack (GraphicsState)
|
||||
nsVoidArray *mStateCache;
|
||||
|
||||
nscolor mCurrentColor;
|
||||
GdkFont *mCurrentFont;
|
||||
nsLineStyle mCurrentLineStyle;
|
||||
};
|
||||
|
||||
#endif /* nsRenderingContextGTK_h___ */
|
||||
8196
mozilla/gfx/src/gtk/u2j208.h
Normal file
8196
mozilla/gfx/src/gtk/u2j208.h
Normal file
File diff suppressed because it is too large
Load Diff
177
mozilla/gfx/src/gtk/xregion.h
Normal file
177
mozilla/gfx/src/gtk/xregion.h
Normal file
@@ -0,0 +1,177 @@
|
||||
/* $XConsortium: region.h,v 11.13 91/09/10 08:21:49 rws Exp $ */
|
||||
/************************************************************************
|
||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
|
||||
and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Digital or MIT not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _XREGION_H
|
||||
#define _XREGION_H
|
||||
|
||||
typedef struct {
|
||||
short x1, x2, y1, y2;
|
||||
} Box, BOX, BoxRec, *BoxPtr;
|
||||
|
||||
typedef struct {
|
||||
short x, y, width, height;
|
||||
}RECTANGLE, RectangleRec, *RectanglePtr;
|
||||
|
||||
#ifdef TRUE
|
||||
#undef TRUE
|
||||
#endif
|
||||
|
||||
#define TRUE 1
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
#ifndef MAXSHORT
|
||||
#define MAXSHORT 32767
|
||||
#endif
|
||||
#ifndef MINSHORT
|
||||
#define MINSHORT -MAXSHORT
|
||||
#endif
|
||||
#ifndef MAX
|
||||
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* clip region
|
||||
*/
|
||||
|
||||
typedef struct _XRegion {
|
||||
long size;
|
||||
long numRects;
|
||||
BOX *rects;
|
||||
BOX extents;
|
||||
} REGION;
|
||||
|
||||
/* Xutil.h contains the declaration:
|
||||
* typedef struct _XRegion *Region;
|
||||
*/
|
||||
|
||||
/* 1 if two BOXs overlap.
|
||||
* 0 if two BOXs do not overlap.
|
||||
* Remember, x2 and y2 are not in the region
|
||||
*/
|
||||
#define EXTENTCHECK(r1, r2) \
|
||||
((r1)->x2 > (r2)->x1 && \
|
||||
(r1)->x1 < (r2)->x2 && \
|
||||
(r1)->y2 > (r2)->y1 && \
|
||||
(r1)->y1 < (r2)->y2)
|
||||
|
||||
/*
|
||||
* update region extents
|
||||
*/
|
||||
#define EXTENTS(r,idRect){\
|
||||
if((r)->x1 < (idRect)->extents.x1)\
|
||||
(idRect)->extents.x1 = (r)->x1;\
|
||||
if((r)->y1 < (idRect)->extents.y1)\
|
||||
(idRect)->extents.y1 = (r)->y1;\
|
||||
if((r)->x2 > (idRect)->extents.x2)\
|
||||
(idRect)->extents.x2 = (r)->x2;\
|
||||
if((r)->y2 > (idRect)->extents.y2)\
|
||||
(idRect)->extents.y2 = (r)->y2;\
|
||||
}
|
||||
|
||||
/*
|
||||
* Check to see if there is enough memory in the present region.
|
||||
*/
|
||||
#define MEMCHECK(reg, rect, firstrect){\
|
||||
if ((reg)->numRects >= ((reg)->size - 1)){\
|
||||
(firstrect) = (BOX *) Xrealloc \
|
||||
((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\
|
||||
if ((firstrect) == 0)\
|
||||
return(0);\
|
||||
(reg)->size *= 2;\
|
||||
(rect) = &(firstrect)[(reg)->numRects];\
|
||||
}\
|
||||
}
|
||||
|
||||
/* this routine checks to see if the previous rectangle is the same
|
||||
* or subsumes the new rectangle to add.
|
||||
*/
|
||||
|
||||
#define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
|
||||
(!(((Reg)->numRects > 0)&&\
|
||||
((R-1)->y1 == (Ry1)) &&\
|
||||
((R-1)->y2 == (Ry2)) &&\
|
||||
((R-1)->x1 <= (Rx1)) &&\
|
||||
((R-1)->x2 >= (Rx2))))
|
||||
|
||||
/* add a rectangle to the given Region */
|
||||
#define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
|
||||
if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
|
||||
CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
|
||||
(r)->x1 = (rx1);\
|
||||
(r)->y1 = (ry1);\
|
||||
(r)->x2 = (rx2);\
|
||||
(r)->y2 = (ry2);\
|
||||
EXTENTS((r), (reg));\
|
||||
(reg)->numRects++;\
|
||||
(r)++;\
|
||||
}\
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* add a rectangle to the given Region */
|
||||
#define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
|
||||
if ((rx1 < rx2) && (ry1 < ry2) &&\
|
||||
CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
|
||||
(r)->x1 = (rx1);\
|
||||
(r)->y1 = (ry1);\
|
||||
(r)->x2 = (rx2);\
|
||||
(r)->y2 = (ry2);\
|
||||
(reg)->numRects++;\
|
||||
(r)++;\
|
||||
}\
|
||||
}
|
||||
|
||||
#define EMPTY_REGION(pReg) pReg->numRects = 0
|
||||
|
||||
#define REGION_NOT_EMPTY(pReg) pReg->numRects
|
||||
|
||||
#define INBOX(r, x, y) \
|
||||
( ( ((r).x2 > x)) && \
|
||||
( ((r).x1 <= x)) && \
|
||||
( ((r).y2 > y)) && \
|
||||
( ((r).y1 <= y)) )
|
||||
|
||||
/*
|
||||
* number of points to buffer before sending them off
|
||||
* to scanlines() : Must be an even number
|
||||
*/
|
||||
#define NUMPTSTOBUFFER 200
|
||||
|
||||
/*
|
||||
* used to allocate buffers for points and link
|
||||
* the buffers together
|
||||
*/
|
||||
typedef struct _POINTBLOCK {
|
||||
XPoint pts[NUMPTSTOBUFFER];
|
||||
struct _POINTBLOCK *next;
|
||||
} POINTBLOCK;
|
||||
|
||||
#endif
|
||||
@@ -1,34 +0,0 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape 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/NPL/
|
||||
#
|
||||
# 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 Communicator client code,
|
||||
# released March 31, 1998.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Samir Gehani <sgehani@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
DIRS = src test
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape 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/NPL/
|
||||
#
|
||||
# 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 Communicator client code,
|
||||
# released March 31, 1998.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Samir Gehani <sgehani@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
DIRS=src test
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape 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/NPL/
|
||||
#
|
||||
# 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 Communicator client code,
|
||||
# released March 31, 1998.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Samir Gehani <sgehani@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VAPTH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = xpnet
|
||||
LIBRARY_NAME = xpnet_s
|
||||
|
||||
CPPSRCS = \
|
||||
nsSocket.cpp \
|
||||
nsFTPConn.cpp \
|
||||
nsHTTPConn.cpp \
|
||||
$(NULL)
|
||||
|
||||
override NO_SHARED_LIB=1
|
||||
override NO_STATIC_LIB=
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape 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/NPL/
|
||||
#
|
||||
# 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 Communicator client code,
|
||||
# released March 31, 1998.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Samir Gehani <sgehani@netscape.com>
|
||||
#
|
||||
|
||||
MODULE=xpnet
|
||||
LIBNAME=$(MODULE)
|
||||
DEPTH=..\..\..\..
|
||||
|
||||
MAKE_OBJ_TYPE=DLL
|
||||
|
||||
LIBRARY=$(OBJDIR)\$(LIBNAME)_s.lib
|
||||
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\nsSocket.obj \
|
||||
.\$(OBJDIR)\nsFTPConn.obj \
|
||||
.\$(OBJDIR)\nsHTTPConn.obj \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)/config/rules.mak>
|
||||
|
||||
install::
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
clobber::
|
||||
$(RM) $(DIST)\lib\$(LIBNAME)_s.lib
|
||||
|
||||
clobber_all:: clobber
|
||||
|
||||
@@ -1,496 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef __unix
|
||||
#include <sys/param.h>
|
||||
#elif defined(_WINDOWS)
|
||||
#include <windows.h>
|
||||
#define MAXPATHLEN MAX_PATH
|
||||
#endif
|
||||
|
||||
#include "nsSocket.h"
|
||||
#include "nsFTPConn.h"
|
||||
|
||||
const int kCntlPort = 21;
|
||||
const int kDataPort = 20;
|
||||
const int kCmdBufSize = 64 + MAXPATHLEN;
|
||||
const int kRespBufSize = 1024;
|
||||
const int kKilobyte = 1024;
|
||||
const int kUsecsPerSec = 1000000;
|
||||
const int kDlBufSize = 1024;
|
||||
|
||||
nsFTPConn::nsFTPConn(char *aHost) :
|
||||
mHost(aHost),
|
||||
mState(CLOSED),
|
||||
mPassive(FALSE),
|
||||
mCntlSock(NULL),
|
||||
mDataSock(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
nsFTPConn::~nsFTPConn()
|
||||
{
|
||||
// don't release mHost cause we don't own it
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::Open()
|
||||
{
|
||||
int err = OK;
|
||||
char cmd[kCmdBufSize], resp[kRespBufSize];
|
||||
int respBufSize = kRespBufSize;
|
||||
|
||||
if (!mHost)
|
||||
return E_PARAM;
|
||||
if (mState != CLOSED)
|
||||
return E_ALREADY_OPEN;
|
||||
|
||||
/* open control connection on port 21 */
|
||||
mCntlSock = new nsSocket(mHost, kCntlPort);
|
||||
if (!mCntlSock)
|
||||
return E_MEM;
|
||||
ERR_CHECK(mCntlSock->Open());
|
||||
ERR_CHECK(mCntlSock->Recv((unsigned char *)resp, &respBufSize));
|
||||
DUMP(resp);
|
||||
|
||||
/* issue USER command on control connection */
|
||||
sprintf(cmd, "USER anonymous\r\n");
|
||||
err = IssueCmd(cmd, resp, kRespBufSize, mCntlSock);
|
||||
|
||||
/* issue PASS command on control connection */
|
||||
sprintf(cmd, "PASS -linux@installer.sbg\r\n");
|
||||
ERR_CHECK(IssueCmd(cmd, resp, kRespBufSize, mCntlSock));
|
||||
|
||||
mState = OPEN;
|
||||
|
||||
return err;
|
||||
|
||||
BAIL:
|
||||
if (mCntlSock)
|
||||
{
|
||||
mCntlSock->Close();
|
||||
delete mCntlSock;
|
||||
mCntlSock = NULL;
|
||||
}
|
||||
if (mDataSock)
|
||||
{
|
||||
mDataSock->Close();
|
||||
delete mDataSock;
|
||||
mDataSock = NULL;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::Open(char *aHost)
|
||||
{
|
||||
if (!aHost)
|
||||
return E_PARAM;
|
||||
|
||||
mHost = aHost;
|
||||
return Open();
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::Get(char *aSrvPath, char *aLoclPath, int aType, int aOvWrite,
|
||||
FTPGetCB aCBFunc)
|
||||
{
|
||||
struct stat dummy;
|
||||
int err = OK, wrote = 0, totBytesRd = 0;
|
||||
char cmd[kCmdBufSize], resp[kRespBufSize];
|
||||
int fileSize = 0, respBufSize = kRespBufSize;
|
||||
FILE *loclfd = NULL;
|
||||
|
||||
if (!aSrvPath || !aLoclPath)
|
||||
return E_PARAM;
|
||||
if (mState != OPEN || !mCntlSock)
|
||||
return E_NOT_OPEN;
|
||||
|
||||
/* stat local path and verify aOvWrite is set if file already exists */
|
||||
err = stat(aLoclPath, &dummy);
|
||||
if (err != -1 && aOvWrite == FALSE)
|
||||
return E_CANT_OVWRITE;
|
||||
|
||||
mState = GETTING;
|
||||
|
||||
/* initialize data connection */
|
||||
ERR_CHECK(DataInit(mHost, kDataPort, &mDataSock));
|
||||
|
||||
/* issue SIZE command on control connection */
|
||||
sprintf(cmd, "SIZE %s\r\n", aSrvPath);
|
||||
err = IssueCmd(cmd, resp, kRespBufSize, mCntlSock); /* non-fatal */
|
||||
if (err == OK && (resp[0] == '2'))
|
||||
fileSize = atoi(&resp[4]);
|
||||
|
||||
/* issue TYPE command on control connection */
|
||||
sprintf(cmd, "TYPE %s\r\n", aType==BINARY ? "I" : "A");
|
||||
ERR_CHECK(IssueCmd(cmd, resp, kRespBufSize, mCntlSock));
|
||||
|
||||
/* issue RETR command on control connection */
|
||||
sprintf(cmd, "RETR %s\r\n", aSrvPath);
|
||||
ERR_CHECK(IssueCmd(cmd, resp, kRespBufSize, mCntlSock));
|
||||
|
||||
/* get file contents on data connection */
|
||||
if (!mPassive)
|
||||
ERR_CHECK(mDataSock->SrvAccept());
|
||||
|
||||
/* initialize locl file */
|
||||
if (!(loclfd = fopen(aLoclPath, aType==BINARY ? "wb" : "w")) ||
|
||||
(fseek(loclfd, 0, SEEK_SET) != 0))
|
||||
{
|
||||
err = E_LOCL_INIT;
|
||||
goto BAIL;
|
||||
}
|
||||
|
||||
totBytesRd = 0;
|
||||
do
|
||||
{
|
||||
respBufSize = kDlBufSize;
|
||||
err = mDataSock->Recv((unsigned char *)resp, &respBufSize);
|
||||
if (err != nsSocket::E_READ_MORE &&
|
||||
err != nsSocket::E_EOF_FOUND &&
|
||||
err != nsSocket::OK)
|
||||
goto BAIL;
|
||||
totBytesRd += respBufSize;
|
||||
if (err == nsSocket::E_READ_MORE && aCBFunc)
|
||||
aCBFunc(totBytesRd, fileSize);
|
||||
|
||||
/* append to local file */
|
||||
wrote = fwrite((void *)resp, 1, respBufSize, loclfd);
|
||||
if (wrote != respBufSize)
|
||||
{
|
||||
err = E_WRITE;
|
||||
goto BAIL;
|
||||
}
|
||||
}
|
||||
while (err == nsSocket::E_READ_MORE || err == nsSocket::OK);
|
||||
if (err == nsSocket::E_EOF_FOUND)
|
||||
err = OK;
|
||||
|
||||
BAIL:
|
||||
/* close locl file if open */
|
||||
if (loclfd)
|
||||
fclose(loclfd);
|
||||
|
||||
/* kill data connection if it exists */
|
||||
if (mDataSock)
|
||||
{
|
||||
mDataSock->Close();
|
||||
delete mDataSock;
|
||||
mDataSock = NULL;
|
||||
}
|
||||
|
||||
mState = OPEN;
|
||||
mPassive = FALSE;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::Close()
|
||||
{
|
||||
int err = OK;
|
||||
|
||||
if (mState != OPEN)
|
||||
return E_NOT_OPEN;
|
||||
|
||||
/* close sockets */
|
||||
if (mCntlSock)
|
||||
{
|
||||
ERR_CHECK(mCntlSock->Close());
|
||||
delete mCntlSock;
|
||||
mCntlSock = NULL;
|
||||
}
|
||||
if (mDataSock)
|
||||
{
|
||||
ERR_CHECK(mDataSock->Close());
|
||||
delete mDataSock;
|
||||
mDataSock = NULL;
|
||||
}
|
||||
|
||||
BAIL:
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::IssueCmd(char *aCmd, char *aResp, int aRespSize, nsSocket *aSock)
|
||||
{
|
||||
int err = OK;
|
||||
int len;
|
||||
|
||||
/* param check */
|
||||
if (!aSock || !aCmd || !aResp || aRespSize <= 0)
|
||||
return E_PARAM;
|
||||
|
||||
/* send command */
|
||||
len = strlen(aCmd);
|
||||
ERR_CHECK(aSock->Send((unsigned char *)aCmd, &len));
|
||||
DUMP(aCmd);
|
||||
|
||||
/* receive response */
|
||||
do
|
||||
{
|
||||
err = aSock->Recv((unsigned char *)aResp, &aRespSize);
|
||||
if (err != nsSocket::OK &&
|
||||
err != nsSocket::E_READ_MORE &&
|
||||
err != nsSocket::E_EOF_FOUND)
|
||||
goto BAIL;
|
||||
DUMP(aResp);
|
||||
}
|
||||
while (err == nsSocket::E_READ_MORE);
|
||||
|
||||
/* alternate interpretation of err codes */
|
||||
if ( (strncmp(aCmd, "APPE", 4) == 0) ||
|
||||
(strncmp(aCmd, "LIST", 4) == 0) ||
|
||||
(strncmp(aCmd, "NLST", 4) == 0) ||
|
||||
(strncmp(aCmd, "REIN", 4) == 0) ||
|
||||
(strncmp(aCmd, "RETR", 4) == 0) ||
|
||||
(strncmp(aCmd, "STOR", 4) == 0) ||
|
||||
(strncmp(aCmd, "STOU", 4) == 0) )
|
||||
{
|
||||
switch (*aResp)
|
||||
{
|
||||
case '1': /* exception: 100 series is OK */
|
||||
case '2':
|
||||
break;
|
||||
case '3':
|
||||
err = E_CMD_ERR;
|
||||
break;
|
||||
case '4':
|
||||
case '5':
|
||||
err = E_CMD_FAIL;
|
||||
break;
|
||||
default:
|
||||
err = E_CMD_UNEXPECTED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* regular interpretation of err codes */
|
||||
else
|
||||
{
|
||||
switch (*aResp)
|
||||
{
|
||||
case '2':
|
||||
break;
|
||||
case '1':
|
||||
case '3':
|
||||
err = E_CMD_ERR;
|
||||
break;
|
||||
case '4':
|
||||
case '5':
|
||||
err = E_CMD_FAIL;
|
||||
break;
|
||||
default:
|
||||
err = E_CMD_UNEXPECTED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BAIL:
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::ParseAddr(char *aBuf, char **aHost, int *aPort)
|
||||
{
|
||||
int err = OK;
|
||||
char *c;
|
||||
int addr[6];
|
||||
|
||||
/* param check */
|
||||
if (!aBuf || !aHost || !aPort)
|
||||
return E_PARAM;
|
||||
|
||||
c = aBuf + strlen("227 "); /* pass by return code */
|
||||
while (!isdigit((int)(*c)))
|
||||
{
|
||||
if (*c == '\0')
|
||||
return E_INVALID_ADDR;
|
||||
c++;
|
||||
}
|
||||
|
||||
if (sscanf(c, "%d,%d,%d,%d,%d,%d",
|
||||
&addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]) != 6)
|
||||
return E_INVALID_ADDR;
|
||||
|
||||
*aHost = (char *)malloc(strlen("XXX.XXX.XXX.XXX"));
|
||||
sprintf(*aHost, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
|
||||
|
||||
*aPort = ((addr[4] & 0xFF) << 8) | (addr[5] & 0xFF);
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("%s %d: PASV response: %d,%d,%d,%d,%d,%d\n", __FILE__, __LINE__,
|
||||
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
|
||||
printf("%s %d: Host = %s\tPort = %d\n", __FILE__, __LINE__, *aHost, *aPort);
|
||||
#endif
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
nsFTPConn::DataInit(char *aHost, int aPort, nsSocket **aSock)
|
||||
{
|
||||
int err = OK;
|
||||
char cmd[kCmdBufSize], resp[kRespBufSize];
|
||||
char *srvHost = NULL;
|
||||
int srvPort = 0;
|
||||
char *hostPort = NULL;
|
||||
|
||||
/* param check */
|
||||
if (!aHost || !aSock)
|
||||
return E_PARAM;
|
||||
|
||||
/* issue PASV command */
|
||||
sprintf(cmd, "PASV\r\n");
|
||||
err = IssueCmd(cmd, resp, kRespBufSize, mCntlSock);
|
||||
if (err != OK)
|
||||
{
|
||||
err = OK;
|
||||
goto ACTIVE; /* failover to active mode */
|
||||
}
|
||||
|
||||
mPassive = TRUE;
|
||||
|
||||
ERR_CHECK(ParseAddr(resp, &srvHost, &srvPort));
|
||||
*aSock = new nsSocket(srvHost, srvPort);
|
||||
if (!*aSock)
|
||||
{
|
||||
err = E_MEM;
|
||||
goto BAIL;
|
||||
}
|
||||
|
||||
ERR_CHECK((*aSock)->Open());
|
||||
|
||||
if (srvHost)
|
||||
{
|
||||
free(srvHost);
|
||||
srvHost = NULL;
|
||||
}
|
||||
|
||||
return err;
|
||||
|
||||
ACTIVE:
|
||||
|
||||
*aSock = new nsSocket(aHost, aPort);
|
||||
if (!*aSock)
|
||||
{
|
||||
err = E_MEM;
|
||||
goto BAIL;
|
||||
}
|
||||
|
||||
/* init data socket making it listen */
|
||||
ERR_CHECK((*aSock)->SrvOpen());
|
||||
|
||||
ERR_CHECK((*aSock)->GetHostPortString(&hostPort)); // allocates
|
||||
if (!hostPort)
|
||||
{
|
||||
err = E_MEM;
|
||||
goto BAIL;
|
||||
}
|
||||
|
||||
sprintf(cmd, "PORT %s\r\n", hostPort);
|
||||
ERR_CHECK(IssueCmd(cmd, resp, kRespBufSize, mCntlSock));
|
||||
|
||||
BAIL:
|
||||
if (mPassive && err != OK)
|
||||
mPassive = FALSE;
|
||||
|
||||
if (err != OK && (*aSock))
|
||||
{
|
||||
delete *aSock;
|
||||
*aSock = NULL;
|
||||
}
|
||||
|
||||
if (srvHost)
|
||||
{
|
||||
free(srvHost);
|
||||
srvHost = NULL;
|
||||
}
|
||||
|
||||
if (hostPort)
|
||||
{
|
||||
free(hostPort);
|
||||
hostPort = NULL;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef TEST_NSFTPCONN
|
||||
static struct timeval init;
|
||||
int
|
||||
TestFTPGetCB(int aBytesRd, int aTotal)
|
||||
{
|
||||
struct timeval now;
|
||||
float rate;
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
rate = nsSocket::CalcRate(&init, &now, aBytesRd);
|
||||
printf("br=%d\ttot=%d\trt=%f\tirt=%d\n",aBytesRd, aTotal, rate, (int)rate);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int err = nsFTPConn::OK;
|
||||
nsFTPConn *conn = 0;
|
||||
char *leaf = NULL;
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
printf("usage: %s <host> <path/on/server>\n", argv[0]);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ((leaf = strrchr(argv[2], '/'))) leaf++;
|
||||
else leaf = argv[2];
|
||||
|
||||
conn = new nsFTPConn(argv[1]);
|
||||
|
||||
printf("Opening connection to %s...\n", argv[1]);
|
||||
err = conn->Open();
|
||||
if (err != nsFTPConn::OK) { printf("error: %d\n", err); exit(err); }
|
||||
|
||||
printf("Getting binary file %s...\n", argv[2]);
|
||||
gettimeofday(&init, NULL);
|
||||
err = conn->Get(argv[2], leaf, nsFTPConn::BINARY, TRUE, TestFTPGetCB);
|
||||
if (err != nsFTPConn::OK) { printf("error: %d\n", err); exit(err); }
|
||||
|
||||
printf("Closing connection to %s...\n", argv[1]);
|
||||
err = conn->Close();
|
||||
if (err != nsFTPConn::OK) { printf("error: %d\n", err); exit(err); }
|
||||
|
||||
printf("Test successful!\n");
|
||||
exit(err);
|
||||
}
|
||||
#endif /* TEST_NSFTPCONN */
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#ifndef _NS_FTPCONN_H_
|
||||
#define _NS_FTPCONN_H_
|
||||
|
||||
class nsSocket;
|
||||
|
||||
typedef int (*FTPGetCB)(int aBytesRd, int aTotal);
|
||||
|
||||
class nsFTPConn
|
||||
{
|
||||
public:
|
||||
nsFTPConn(char *aHost);
|
||||
~nsFTPConn();
|
||||
|
||||
/* ftp type */
|
||||
enum
|
||||
{
|
||||
ASCII = 0,
|
||||
BINARY
|
||||
};
|
||||
|
||||
/* connection state */
|
||||
enum
|
||||
{
|
||||
OPEN = 0,
|
||||
GETTING,
|
||||
CLOSED
|
||||
};
|
||||
|
||||
int Open();
|
||||
int Open(char *aHost);
|
||||
int Get(char *aSrvPath, char *aLoclPath, int aType, int aOvWrite,
|
||||
FTPGetCB aCBFunc);
|
||||
int Close();
|
||||
|
||||
/*--------------------------------------------------------------------*
|
||||
* Errors
|
||||
*--------------------------------------------------------------------*/
|
||||
enum
|
||||
{
|
||||
OK = 0,
|
||||
E_MEM = -801, /* out of memory */
|
||||
E_PARAM = -802, /* parameter null or incorrect */
|
||||
E_ALREADY_OPEN = -803, /* connection already established */
|
||||
E_NOT_OPEN = -804, /* connection not established, can't use */
|
||||
E_CMD_ERR = -805, /* ftp command error */
|
||||
E_CMD_FAIL = -806, /* ftp command failed */
|
||||
E_CMD_UNEXPECTED = -807, /* ftp command unexpected response */
|
||||
E_WRITE = -808, /* write to socket/fd failed */
|
||||
E_READ = -809, /* read on socket/fd failed */
|
||||
E_SMALL_BUF = -810, /* buffer too small, provide bigger one */
|
||||
E_CANT_OVWRITE = -811, /* cannot overwrite existing file */
|
||||
E_LOCL_INIT = -812, /* local file open/init failed */
|
||||
E_INVALID_ADDR = -814 /* couldn't parse address/port */
|
||||
};
|
||||
|
||||
private:
|
||||
int IssueCmd(char *aCmd, char *aResp, int aRespSize,
|
||||
nsSocket *aSock);
|
||||
int ParseAddr(char *aBuf, char **aHost, int *aPort);
|
||||
int DataInit(char *aHost, int aPort, nsSocket **aSock);
|
||||
|
||||
char *mHost;
|
||||
int mState;
|
||||
int mPassive;
|
||||
nsSocket *mCntlSock;
|
||||
nsSocket *mDataSock;
|
||||
};
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL (void*)0L
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#ifdef DUMP
|
||||
#undef DUMP
|
||||
#endif
|
||||
|
||||
#if defined(DEBUG) || defined(DEBUG_sgehani)
|
||||
#define DUMP(_msg) printf("%s %d: %s\n", __FILE__, __LINE__, _msg);
|
||||
#else
|
||||
#define DUMP(_msg)
|
||||
#endif /* DEBUG */
|
||||
|
||||
#ifndef ERR_CHECK
|
||||
#define ERR_CHECK(_func) \
|
||||
do { \
|
||||
err = _func; \
|
||||
if (err != OK) \
|
||||
goto BAIL; \
|
||||
} while(0);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _NS_FTPCONN_H_ */
|
||||
|
||||
@@ -1,598 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <sys/stat.h>
|
||||
#include "nsHTTPConn.h"
|
||||
#include "nsSocket.h"
|
||||
|
||||
const char kHTTPProto[8] = "http://";
|
||||
const char kFTPProto[8] = "ftp://";
|
||||
const int kHTTPPort = 80;
|
||||
const int kFTPPort = 21;
|
||||
const int kRespBufSize = 1024;
|
||||
const int kReqBufSize = 1024;
|
||||
const int kHdrBufSize = 256;
|
||||
const char kCRLF[3] = "\r\n";
|
||||
const char kHdrBodyDelim[5] = "\r\n\r\n";
|
||||
const char kDefaultDestFile[11] = "index.html";
|
||||
|
||||
nsHTTPConn::nsHTTPConn(char *aHost, int aPort, char *aPath) :
|
||||
mHost(aHost),
|
||||
mPath(aPath),
|
||||
mProxiedURL(NULL),
|
||||
mProxyUser(NULL),
|
||||
mProxyPswd(NULL),
|
||||
mDestFile(NULL),
|
||||
mHostPathAllocd(FALSE),
|
||||
mSocket(NULL)
|
||||
{
|
||||
if (aPort <= 0)
|
||||
mPort = kHTTPPort;
|
||||
else
|
||||
mPort = aPort;
|
||||
|
||||
DUMP(("mHost = %s\n", mHost));
|
||||
DUMP(("mPort = %d\n", mPort));
|
||||
DUMP(("mPath = %s\n", mPath));
|
||||
}
|
||||
|
||||
nsHTTPConn::nsHTTPConn(char *aURL) :
|
||||
mPort(kHTTPPort),
|
||||
mProxiedURL(NULL),
|
||||
mProxyUser(NULL),
|
||||
mProxyPswd(NULL),
|
||||
mDestFile(NULL),
|
||||
mHostPathAllocd(FALSE),
|
||||
mSocket(NULL)
|
||||
{
|
||||
// parse URL
|
||||
if (ParseURL(kHTTPProto, aURL, &mHost, &mPort, &mPath) == OK)
|
||||
mHostPathAllocd = TRUE;
|
||||
else
|
||||
{
|
||||
mHost = NULL;
|
||||
mPath = NULL;
|
||||
}
|
||||
|
||||
DUMP(("mHost = %s\n", mHost));
|
||||
DUMP(("mPort = %d\n", mPort));
|
||||
DUMP(("mPath = %s\n", mPath));
|
||||
}
|
||||
|
||||
nsHTTPConn::~nsHTTPConn()
|
||||
{
|
||||
if (mHostPathAllocd)
|
||||
{
|
||||
if (mHost)
|
||||
free(mHost);
|
||||
if (mPath)
|
||||
free(mPath);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::Open()
|
||||
{
|
||||
// verify host && path
|
||||
if (!mHost || !mPath)
|
||||
return E_MALFORMED_URL;
|
||||
|
||||
// create socket
|
||||
mSocket = new nsSocket(mHost, mPort);
|
||||
if (!mSocket)
|
||||
return E_MEM;
|
||||
|
||||
// open socket
|
||||
return mSocket->Open();
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::Get(HTTPGetCB aCallback, char *aDestFile)
|
||||
{
|
||||
int rv;
|
||||
char *pathToUse;
|
||||
|
||||
// verify host && path
|
||||
if (!mHost || !mPath)
|
||||
return E_MALFORMED_URL;
|
||||
|
||||
if (!aDestFile)
|
||||
{
|
||||
if (mProxiedURL)
|
||||
pathToUse = mProxiedURL;
|
||||
else
|
||||
pathToUse = mPath;
|
||||
|
||||
// no leaf: assume default file 'index.html'
|
||||
if (*(pathToUse + strlen(pathToUse) - 1) == '/')
|
||||
aDestFile = (char *) kDefaultDestFile;
|
||||
else
|
||||
aDestFile = strrchr(pathToUse, '/') + 1;
|
||||
}
|
||||
|
||||
// issue request
|
||||
rv = Request();
|
||||
|
||||
// recv response
|
||||
if (rv == OK)
|
||||
rv = Response(aCallback, aDestFile);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::Close()
|
||||
{
|
||||
int rv;
|
||||
|
||||
// close socket
|
||||
rv = mSocket->Close();
|
||||
|
||||
// destroy socket
|
||||
delete mSocket;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
nsHTTPConn::SetProxyInfo(char *aProxiedURL, char *aProxyUser,
|
||||
char *aProxyPswd)
|
||||
{
|
||||
mProxiedURL = aProxiedURL;
|
||||
mProxyUser = aProxyUser;
|
||||
mProxyPswd = aProxyPswd;
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::Request()
|
||||
{
|
||||
char req[kReqBufSize];
|
||||
char hdr[kHdrBufSize];
|
||||
int rv;
|
||||
|
||||
memset(req, 0, kReqBufSize);
|
||||
|
||||
// format header buf:
|
||||
|
||||
// request line
|
||||
memset(hdr, 0, kHdrBufSize);
|
||||
if (mProxiedURL)
|
||||
{
|
||||
sprintf(hdr, "GET %s HTTP/1.1%s", mProxiedURL, kCRLF);
|
||||
strcpy(req, hdr);
|
||||
|
||||
memset(hdr, 0, kHdrBufSize);
|
||||
if (strncmp(mProxiedURL, kFTPProto, strlen(kFTPProto)) == 0)
|
||||
{
|
||||
char *ftpHost, *ftpPath;
|
||||
int ftpPort = kFTPPort;
|
||||
rv = ParseURL(kFTPProto, mProxiedURL,
|
||||
&ftpHost, &ftpPort, &ftpPath);
|
||||
|
||||
if (rv == OK)
|
||||
sprintf(hdr, "Host: %s:%d%s", ftpHost, ftpPort, kCRLF);
|
||||
|
||||
if (ftpHost)
|
||||
free(ftpHost);
|
||||
if (ftpPath)
|
||||
free(ftpPath);
|
||||
}
|
||||
else
|
||||
sprintf(hdr, "Host: %s%s", mHost, kCRLF);
|
||||
strcat(req, hdr);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(hdr, "GET %s HTTP/1.1%s", mPath, kCRLF);
|
||||
strcpy(req, hdr);
|
||||
|
||||
memset(hdr, 0, kHdrBufSize);
|
||||
sprintf(hdr, "Host: %s%s", mHost, kCRLF);
|
||||
strcat(req, hdr);
|
||||
}
|
||||
|
||||
// if proxy set and proxy user/pswd set
|
||||
if (mProxyUser && mProxyPswd)
|
||||
{
|
||||
char *usrPsd = (char *) malloc(strlen(mProxyUser) +
|
||||
strlen(":") +
|
||||
strlen(mProxyPswd));
|
||||
if (!usrPsd)
|
||||
return E_MEM;
|
||||
sprintf(usrPsd, "%s:%s", mProxyUser, mProxyPswd);
|
||||
|
||||
// base 64 encode proxy header
|
||||
char usrPsdEncoded[128]; // pray that 128 is long enough
|
||||
memset(usrPsdEncoded, 0, 128);
|
||||
|
||||
DUMP(("Unencoded string: %s\n", usrPsd));
|
||||
rv = Base64Encode((const unsigned char *)usrPsd, strlen(usrPsd),
|
||||
usrPsdEncoded, 128);
|
||||
DUMP(("Encoded string: %s\n", usrPsdEncoded));
|
||||
DUMP(("Base64Encode returned: %d\n", rv));
|
||||
if (rv <= 0)
|
||||
{
|
||||
return E_B64_ENCODE;
|
||||
}
|
||||
|
||||
// append proxy header to header buf
|
||||
memset(hdr, 0, kHdrBufSize);
|
||||
sprintf(hdr, "Proxy-authorization: Basic %s%s", usrPsdEncoded, kCRLF);
|
||||
strcat(req, hdr);
|
||||
|
||||
// XXX append host with port 21 if ftp
|
||||
|
||||
}
|
||||
|
||||
// headers all done so indicate
|
||||
strcat(req, kCRLF);
|
||||
|
||||
// send header buf over socket
|
||||
int bufSize = strlen(req);
|
||||
rv = mSocket->Send((unsigned char *) req, &bufSize);
|
||||
DUMP(("\n\n%s", req));
|
||||
|
||||
if (bufSize != (int) strlen(req))
|
||||
rv = E_REQ_INCOMPLETE;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::Response(HTTPGetCB aCallback, char *aDestFile)
|
||||
{
|
||||
// NOTE: overwrites dest file if it already exists
|
||||
|
||||
int rv = OK;
|
||||
char resp[kRespBufSize];
|
||||
int bufSize, fwriteLen, fwrote, bytesWritten = 0, expectedSize = 0;
|
||||
FILE *destFd;
|
||||
char *fwritePos;
|
||||
int bFirstIter = TRUE;
|
||||
|
||||
if (!aDestFile)
|
||||
return E_PARAM;
|
||||
|
||||
// open dest file
|
||||
destFd = fopen(aDestFile, "w+");
|
||||
if (!destFd)
|
||||
return E_OPEN_FILE;
|
||||
|
||||
// iteratively recv response
|
||||
do
|
||||
{
|
||||
memset(resp, 0, kRespBufSize);
|
||||
bufSize = kRespBufSize;
|
||||
|
||||
rv = mSocket->Recv((unsigned char *) resp, &bufSize);
|
||||
DUMP((resp));
|
||||
DUMP(("nsSocket::Recv returned: %d\t and recd: %d\n", rv, bufSize));
|
||||
|
||||
if (bFirstIter)
|
||||
{
|
||||
fwritePos = strstr(resp, kHdrBodyDelim);
|
||||
if (fwritePos == NULL)
|
||||
{
|
||||
// XXX no header! should we handle?
|
||||
fwritePos = resp;
|
||||
fwriteLen = bufSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParseContentLength((const char *)resp, &expectedSize);
|
||||
|
||||
// move past hdr-body delimiter
|
||||
fwritePos += strlen(kHdrBodyDelim);
|
||||
fwriteLen = bufSize - (fwritePos - resp);
|
||||
}
|
||||
|
||||
bFirstIter = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
fwritePos = resp;
|
||||
fwriteLen = bufSize;
|
||||
}
|
||||
|
||||
fwrote = fwrite(fwritePos, sizeof(char), fwriteLen, destFd);
|
||||
assert(fwrote == fwriteLen);
|
||||
|
||||
if (fwriteLen > 0)
|
||||
bytesWritten += fwriteLen;
|
||||
if (aCallback)
|
||||
aCallback(bytesWritten, expectedSize);
|
||||
|
||||
} while (rv == nsSocket::E_READ_MORE || rv == nsSocket::OK);
|
||||
|
||||
if (rv == nsSocket::E_EOF_FOUND)
|
||||
{
|
||||
DUMP(("EOF detected\n"));
|
||||
rv = OK;
|
||||
}
|
||||
|
||||
fclose(destFd);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::ParseURL(const char *aProto, char *aURL, char **aHost,
|
||||
int *aPort, char **aPath)
|
||||
{
|
||||
char *pos, *nextSlash, *nextColon, *end, *hostEnd;
|
||||
int protoLen = strlen(aProto);
|
||||
|
||||
if (!aURL || !aHost || !aPort || !aPath || !aProto)
|
||||
return E_PARAM;
|
||||
|
||||
if ((strncmp(aURL, aProto, protoLen) != 0) ||
|
||||
(strlen(aURL) < 9))
|
||||
return E_MALFORMED_URL;
|
||||
|
||||
pos = aURL + protoLen;
|
||||
nextColon = strchr(pos, ':');
|
||||
nextSlash = strchr(pos, '/');
|
||||
|
||||
// optional port specification
|
||||
if (nextColon && ((nextSlash && nextColon < nextSlash) ||
|
||||
!nextSlash))
|
||||
{
|
||||
int portStrLen;
|
||||
if (nextSlash)
|
||||
portStrLen = nextSlash - nextColon;
|
||||
else
|
||||
portStrLen = strlen(nextColon);
|
||||
|
||||
char *portStr = (char *) malloc(portStrLen);
|
||||
if (!portStr)
|
||||
return E_MEM;
|
||||
memset(portStr, 0, portStrLen);
|
||||
strncpy(portStr, nextColon+1, portStrLen);
|
||||
*aPort = atoi(portStr);
|
||||
free(portStr);
|
||||
}
|
||||
if ( (!nextColon || (nextSlash && (nextColon > nextSlash)))
|
||||
&& *aPort <= 0) // don't override port if already set
|
||||
*aPort = -1;
|
||||
|
||||
// only host in URL, assume '/' for path
|
||||
if (!nextSlash)
|
||||
{
|
||||
int copyLen;
|
||||
if (nextColon)
|
||||
copyLen = nextColon - pos;
|
||||
else
|
||||
copyLen = strlen(pos);
|
||||
|
||||
*aHost = (char *) malloc(copyLen + 1); // to NULL terminate
|
||||
strncpy(*aHost, pos, copyLen);
|
||||
|
||||
*aPath = (char *) malloc(2);
|
||||
*aPath = "/\0";
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// normal parsing: both host and path exist
|
||||
if (nextColon)
|
||||
hostEnd = nextColon;
|
||||
else
|
||||
hostEnd = nextSlash;
|
||||
*aHost = (char *) malloc(hostEnd - pos + 1); // to NULL terminate
|
||||
if (!*aHost)
|
||||
return E_MEM;
|
||||
memset(*aHost, 0, hostEnd - pos + 1);
|
||||
strncpy(*aHost, pos, hostEnd - pos);
|
||||
*(*aHost + (hostEnd - pos)) = 0; // NULL terminate
|
||||
|
||||
pos = nextSlash;
|
||||
end = aURL + strlen(aURL);
|
||||
|
||||
*aPath = (char *) malloc(end - pos + 1);
|
||||
if (!*aPath)
|
||||
{
|
||||
if (*aHost)
|
||||
free(*aHost);
|
||||
return E_MEM;
|
||||
}
|
||||
memset(*aPath, 0, end - pos + 1);
|
||||
strncpy(*aPath, pos, end - pos);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsHTTPConn::ParseContentLength(const char *aBuf, int *aLength)
|
||||
{
|
||||
char *clHdr; // Content-length header line start
|
||||
char *eol, *pos;
|
||||
char clNameStr1[16] = "Content-length:";
|
||||
char clNameStr2[16] = "Content-Length:";
|
||||
char *clNameStr = clNameStr1;
|
||||
|
||||
if (!aBuf || !aLength)
|
||||
return; // non fatal so no error codes returned
|
||||
*aLength = 0;
|
||||
|
||||
// XXX strcasestr() needs to be ported for Solaris (and Win32 and Mac?)
|
||||
clHdr = strstr(aBuf, (char *)clNameStr1);
|
||||
if (!clHdr)
|
||||
{
|
||||
clHdr = strstr(aBuf, (char *)clNameStr2);
|
||||
clNameStr = clNameStr2;
|
||||
}
|
||||
if (clHdr)
|
||||
{
|
||||
eol = strstr(clHdr, kCRLF); // end of line
|
||||
pos = clHdr + strlen(clNameStr);
|
||||
while ((pos < eol) && (*pos == ' ' || *pos == '\t'))
|
||||
pos++;
|
||||
if (pos < eol)
|
||||
{
|
||||
int clValStrLen = eol - pos + 1; // extra byte to NULL terminate
|
||||
char *clValStr = (char *) malloc(clValStrLen);
|
||||
if (!clValStr)
|
||||
return; // imminent doom!
|
||||
|
||||
memset(clValStr, 0, clValStrLen);
|
||||
strncpy(clValStr, pos, eol - pos);
|
||||
*aLength = atoi(clValStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
nsHTTPConn::Base64Encode(const unsigned char *in_str, int in_len,
|
||||
char *out_str, int out_len)
|
||||
{
|
||||
// NOTE: shamelessly copied from nsAbSyncPostEngine.cpp
|
||||
|
||||
static unsigned char base64[] =
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', /* 0 */
|
||||
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', /* 1 */
|
||||
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', /* 2 */
|
||||
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', /* 3 */
|
||||
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 4 */
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', /* 5 */
|
||||
'w', 'x', 'y', 'z', '0', '1', '2', '3', /* 6 */
|
||||
'4', '5', '6', '7', '8', '9', '+', '/' /* 7 */
|
||||
};
|
||||
|
||||
int curr_out_len = 0;
|
||||
|
||||
int i = 0;
|
||||
unsigned char a, b, c;
|
||||
|
||||
out_str[0] = '\0';
|
||||
|
||||
if (in_len > 0)
|
||||
{
|
||||
|
||||
while (i < in_len)
|
||||
{
|
||||
a = in_str[i];
|
||||
b = (i + 1 >= in_len) ? 0 : in_str[i + 1];
|
||||
c = (i + 2 >= in_len) ? 0 : in_str[i + 2];
|
||||
|
||||
if (i + 2 < in_len)
|
||||
{
|
||||
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
|
||||
out_str[curr_out_len++] = (base64[((a << 4) & 0x30)
|
||||
+ ((b >> 4) & 0xf)]);
|
||||
out_str[curr_out_len++] = (base64[((b << 2) & 0x3c)
|
||||
+ ((c >> 6) & 0x3)]);
|
||||
out_str[curr_out_len++] = (base64[c & 0x3F]);
|
||||
}
|
||||
else if (i + 1 < in_len)
|
||||
{
|
||||
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
|
||||
out_str[curr_out_len++] = (base64[((a << 4) & 0x30)
|
||||
+ ((b >> 4) & 0xf)]);
|
||||
out_str[curr_out_len++] = (base64[((b << 2) & 0x3c)
|
||||
+ ((c >> 6) & 0x3)]);
|
||||
out_str[curr_out_len++] = '=';
|
||||
}
|
||||
else
|
||||
{
|
||||
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
|
||||
out_str[curr_out_len++] = (base64[((a << 4) & 0x30)
|
||||
+ ((b >> 4) & 0xf)]);
|
||||
out_str[curr_out_len++] = '=';
|
||||
out_str[curr_out_len++] = '=';
|
||||
}
|
||||
|
||||
i += 3;
|
||||
|
||||
if((curr_out_len + 4) > out_len)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
|
||||
}
|
||||
out_str[curr_out_len] = '\0';
|
||||
}
|
||||
|
||||
return curr_out_len;
|
||||
}
|
||||
|
||||
#ifdef TEST_NSHTTPCONN
|
||||
|
||||
int
|
||||
TestHTTPCB(int aBytesRd, int aTotal)
|
||||
{
|
||||
DUMP(("Bytes rd: %d\tTotal: %d\n", aBytesRd, aTotal));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
nsHTTPConn *conn;
|
||||
int rv = nsHTTPConn::OK;
|
||||
char *proxiedURL = NULL;
|
||||
char *proxyUser = NULL;
|
||||
char *proxyPswd = NULL;
|
||||
|
||||
DUMP(("*** %s: A self-test for the nsHTTPConn class.\n", argv[0]));
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
printf("usage: %s <http_url> [<proxied_url> [<proxy_user> ", argv[0]);
|
||||
printf("<proxy_pswd>]]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
conn = new nsHTTPConn(argv[1]);
|
||||
|
||||
if (argc >= 3)
|
||||
{
|
||||
proxiedURL = argv[2];
|
||||
}
|
||||
if (argc >= 5)
|
||||
{
|
||||
proxyUser = argv[3];
|
||||
proxyPswd = argv[4];
|
||||
}
|
||||
|
||||
conn->SetProxyInfo(proxiedURL, proxyUser, proxyPswd);
|
||||
|
||||
rv = conn->Open();
|
||||
DUMP(("nsHTTPConn::Open returned: %d\n", rv));
|
||||
|
||||
rv = conn->Get(TestHTTPCB, NULL); // NULL: local file name = URL leaf
|
||||
DUMP(("nsHTTPConn::Get returned: %d\n", rv));
|
||||
|
||||
rv = conn->Close();
|
||||
DUMP(("nsHTTPConn::Close returned: %d\n", rv));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* TEST_NSHTTPCONN */
|
||||
@@ -1,102 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#ifndef _NS_HTTPCONN_H_
|
||||
#define _NS_HTTPCONN_H_
|
||||
|
||||
class nsSocket;
|
||||
|
||||
typedef int (*HTTPGetCB)(int aBytesRd, int aTotal);
|
||||
|
||||
class nsHTTPConn
|
||||
{
|
||||
public:
|
||||
nsHTTPConn(char *aHost, int aPort, char *aPath);
|
||||
nsHTTPConn(char *aURL);
|
||||
~nsHTTPConn();
|
||||
|
||||
int Open();
|
||||
int Get(HTTPGetCB aCallback, char *aDestFile);
|
||||
int Close();
|
||||
|
||||
void SetProxyInfo(char *aProxiedURL, char *aProxyUser,
|
||||
char *aProxyPswd);
|
||||
static int ParseURL(const char *aProto, char *aURL, char **aHost,
|
||||
int *aPort, char **aPath);
|
||||
|
||||
enum
|
||||
{
|
||||
OK = 0,
|
||||
E_MEM = -801,
|
||||
E_PARAM = -802,
|
||||
E_MALFORMED_URL = -803,
|
||||
E_REQ_INCOMPLETE = -804,
|
||||
E_B64_ENCODE = -805,
|
||||
E_OPEN_FILE = -806
|
||||
};
|
||||
|
||||
private:
|
||||
int Request();
|
||||
int Response(HTTPGetCB aCallback, char *aDestFile);
|
||||
void ParseContentLength(const char *aBuf, int *aLength);
|
||||
int Base64Encode(const unsigned char *in_str, int in_len,
|
||||
char *out_str, int out_len);
|
||||
|
||||
char *mHost;
|
||||
char *mPath;
|
||||
int mPort;
|
||||
char *mProxiedURL;
|
||||
char *mProxyUser;
|
||||
char *mProxyPswd;
|
||||
char *mDestFile;
|
||||
int mHostPathAllocd;
|
||||
nsSocket *mSocket;
|
||||
};
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void*) 0L);
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#ifdef DUMP
|
||||
#undef DUMP
|
||||
#endif
|
||||
#if defined(DEBUG_sgehani) || defined(DEBUG)
|
||||
#define DUMP(_vargs) \
|
||||
do { \
|
||||
printf("%s %d: ", __FILE__, __LINE__); \
|
||||
printf _vargs; \
|
||||
} while(0);
|
||||
#else
|
||||
#define DUMP(_vargs)
|
||||
#endif
|
||||
|
||||
#endif /* _NS_HTTPCONN_H_ */
|
||||
@@ -1,450 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Platform-specific headers for socket functionality */
|
||||
#ifdef __unix
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#elif defined(_WINDOWS)
|
||||
#define read(_socket, _buf, _len) \
|
||||
recv(_socket, (char *) _buf, _len, 0);
|
||||
#define write(_socket, _buf, _len) \
|
||||
send(_socket, (char *) _buf, _len, 0);
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#include "nsSocket.h"
|
||||
|
||||
#define MAXSOCKADDR 128
|
||||
|
||||
#include "platform.h" // for SOLARIS define
|
||||
#if defined(SOLARIS) || defined(_WINDOWS)
|
||||
#define socklen_t int
|
||||
#endif
|
||||
|
||||
#ifndef SHUT_RDWR
|
||||
#define SHUT_RDWR 2
|
||||
#endif
|
||||
|
||||
const int kUsecsPerSec = 1000000;
|
||||
const int kTimeoutThresholdUsecs = 120 * kUsecsPerSec;
|
||||
const int kTimeoutSelectUsecs = 100000;
|
||||
const int kKilobyte = 1024;
|
||||
const int kReadBufSize = 1024;
|
||||
|
||||
nsSocket::nsSocket(char *aHost, int aPort) :
|
||||
mHost(aHost),
|
||||
mPort(aPort),
|
||||
mFd(-1),
|
||||
mListenFd(-1)
|
||||
{
|
||||
}
|
||||
|
||||
nsSocket::~nsSocket()
|
||||
{
|
||||
// don't release mHost cause we don't own it
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::Open()
|
||||
{
|
||||
#ifdef _WINDOWS
|
||||
/* funky windows initialization of winsock */
|
||||
|
||||
int err;
|
||||
WSADATA wsaData;
|
||||
WORD wVersionRequested = MAKEWORD(4, 0);
|
||||
err = WSAStartup(wVersionRequested, &wsaData);
|
||||
if (err != 0)
|
||||
{
|
||||
return E_WINSOCK;
|
||||
}
|
||||
#endif
|
||||
|
||||
int rv = OK;
|
||||
struct sockaddr_in servaddr;
|
||||
struct hostent *hptr = NULL;
|
||||
|
||||
mFd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
#ifdef _WINDOWS
|
||||
if (mFd == INVALID_SOCKET)
|
||||
{
|
||||
printf("Last error: %d\n", WSAGetLastError());
|
||||
}
|
||||
#endif
|
||||
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_port = htons(mPort);
|
||||
|
||||
if ( (hptr = gethostbyname(mHost)) == NULL )
|
||||
return E_INVALID_HOST;
|
||||
|
||||
memcpy(&servaddr.sin_addr, (struct in_addr **) hptr->h_addr_list[0],
|
||||
sizeof(struct in_addr));
|
||||
|
||||
rv = connect(mFd, (struct sockaddr *) &servaddr, sizeof(servaddr));
|
||||
if (rv < 0)
|
||||
{
|
||||
#if defined(DEBUG) && defined(__unix)
|
||||
printf("ETIMEDOUT: %d\n", ETIMEDOUT);
|
||||
printf("ECONNREFUSED: %d\n", ECONNREFUSED);
|
||||
printf("EHOSTUNREACH: %d\n", EHOSTUNREACH);
|
||||
printf("ENETUNREACH: %d\n", ENETUNREACH);
|
||||
|
||||
printf("connect error: %d\n", errno);
|
||||
#endif /* DEBUG && __unix */
|
||||
mFd = -1;
|
||||
rv = E_SOCK_OPEN;
|
||||
}
|
||||
else
|
||||
rv = OK;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::SrvOpen()
|
||||
{
|
||||
int rv = OK;
|
||||
struct sockaddr_in servaddr;
|
||||
|
||||
/* init data socket making it listen */
|
||||
mListenFd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard */
|
||||
servaddr.sin_port = 0; /* let kernel bind an ephemeral port */
|
||||
|
||||
if ((bind(mListenFd, (struct sockaddr *) &servaddr, sizeof(servaddr))) != 0)
|
||||
return E_BIND;
|
||||
|
||||
if ((listen(mListenFd, SOMAXCONN)) != 0)
|
||||
return E_LISTEN;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::SrvAccept()
|
||||
{
|
||||
int rv = OK;
|
||||
struct sockaddr cliaddr;
|
||||
socklen_t clilen;
|
||||
|
||||
if (mListenFd < 0)
|
||||
return E_PARAM;
|
||||
|
||||
clilen = sizeof(cliaddr);
|
||||
mFd = accept(mListenFd, (struct sockaddr *) &cliaddr, &clilen);
|
||||
if (mFd < 0)
|
||||
rv = E_ACCEPT;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::Send(unsigned char *aBuf, int *aBufSize)
|
||||
{
|
||||
int rv = OK;
|
||||
struct timeval seltime;
|
||||
int timeout = 0;
|
||||
fd_set selset;
|
||||
|
||||
if (!aBuf || aBufSize <= 0 || mFd < 0)
|
||||
return E_PARAM;
|
||||
|
||||
while (timeout < kTimeoutThresholdUsecs)
|
||||
{
|
||||
FD_ZERO(&selset);
|
||||
FD_SET(mFd, &selset);
|
||||
seltime.tv_sec = 0;
|
||||
seltime.tv_usec = kTimeoutSelectUsecs;
|
||||
|
||||
rv = select(mFd+1, NULL, &selset, NULL, &seltime);
|
||||
switch (rv)
|
||||
{
|
||||
case -1: /* error occured! */
|
||||
return errno;
|
||||
case 0: /* timeout; retry */
|
||||
timeout += kTimeoutSelectUsecs;
|
||||
continue;
|
||||
default: /* ready to write */
|
||||
break;
|
||||
}
|
||||
|
||||
if (!FD_ISSET(mFd, &selset))
|
||||
{
|
||||
timeout += kTimeoutSelectUsecs;
|
||||
continue; /* not ready to write; retry */
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (rv == 0)
|
||||
return E_TIMEOUT;
|
||||
|
||||
rv = write(mFd, aBuf, *aBufSize);
|
||||
if (rv <= 0)
|
||||
rv = E_WRITE;
|
||||
else
|
||||
{
|
||||
*aBufSize = rv;
|
||||
rv = OK;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::Recv(unsigned char *aBuf, int *aBufSize)
|
||||
{
|
||||
int rv = OK;
|
||||
unsigned char lbuf[kReadBufSize]; /* function local buffer */
|
||||
int bytesrd = 0;
|
||||
struct timeval seltime;
|
||||
fd_set selset;
|
||||
int bufsize;
|
||||
|
||||
if (!aBuf || *aBufSize <= 0 || mFd < 0)
|
||||
return E_PARAM;
|
||||
memset(aBuf, 0, *aBufSize);
|
||||
|
||||
for ( ; ; )
|
||||
{
|
||||
/* return if we anticipate overflowing caller's buffer */
|
||||
if (bytesrd >= *aBufSize)
|
||||
return E_READ_MORE;
|
||||
|
||||
memset(&lbuf, 0, kReadBufSize);
|
||||
|
||||
FD_ZERO(&selset);
|
||||
FD_SET(mFd, &selset);
|
||||
seltime.tv_sec = 0;
|
||||
seltime.tv_usec = kTimeoutSelectUsecs;
|
||||
|
||||
rv = select(mFd+1, &selset, NULL, NULL, &seltime);
|
||||
switch (rv)
|
||||
{
|
||||
case -1: /* error occured! */
|
||||
return errno;
|
||||
case 0: /* timeout; retry */
|
||||
continue;
|
||||
default: /* ready to read */
|
||||
break;
|
||||
}
|
||||
|
||||
// XXX TODO: prevent inf loop returning at kTimeoutThresholdUsecs
|
||||
if (!FD_ISSET(mFd, &selset))
|
||||
continue; /* not ready to read; retry */
|
||||
|
||||
bufsize = *aBufSize - bytesrd;
|
||||
rv = read(mFd, lbuf, bufsize);
|
||||
if (rv == 0) /* EOF encountered */
|
||||
{
|
||||
rv = E_EOF_FOUND;
|
||||
break;
|
||||
}
|
||||
if (rv < 0)
|
||||
{
|
||||
rv = E_READ;
|
||||
break;
|
||||
}
|
||||
|
||||
if (*aBufSize >= bytesrd + rv)
|
||||
{
|
||||
memcpy(aBuf + bytesrd, lbuf, rv);
|
||||
bytesrd += rv;
|
||||
if (rv <= bufsize)
|
||||
{
|
||||
FD_ZERO(&selset);
|
||||
FD_SET(mFd, &selset);
|
||||
seltime.tv_sec = 0;
|
||||
seltime.tv_usec = kTimeoutSelectUsecs;
|
||||
|
||||
/* check if we still need to read from this socket */
|
||||
rv = select(mFd+1, &selset, NULL, NULL, &seltime);
|
||||
if (rv == 1)
|
||||
rv = E_READ_MORE;
|
||||
else
|
||||
rv = OK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = E_SMALL_BUF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*aBufSize = bytesrd;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::Close()
|
||||
{
|
||||
int rv = OK, rv1 = OK, rv2 = OK;
|
||||
|
||||
rv1 = shutdown(mFd, SHUT_RDWR);
|
||||
if (mListenFd > 0)
|
||||
rv2 = shutdown(mListenFd, SHUT_RDWR);
|
||||
|
||||
if (rv1 != 0 || rv2 != 0)
|
||||
rv = E_SOCK_CLOSE;
|
||||
|
||||
/* funky windows shutdown of winsock */
|
||||
#ifdef _WINDOWS
|
||||
int wsaErr = WSACleanup();
|
||||
if (wsaErr != 0)
|
||||
rv = wsaErr;
|
||||
#endif
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
nsSocket::GetHostPortString(char **aHostPort)
|
||||
{
|
||||
int rv = OK;
|
||||
socklen_t salen;
|
||||
struct sockaddr_in servaddr;
|
||||
int hpsLen; // host-port string length
|
||||
|
||||
if (!aHostPort)
|
||||
return E_PARAM;
|
||||
|
||||
salen = MAXSOCKADDR;
|
||||
if ((getsockname(mListenFd, (struct sockaddr *) &servaddr, &salen)) < 0)
|
||||
{
|
||||
*aHostPort = NULL;
|
||||
return E_GETSOCKNAME;
|
||||
}
|
||||
|
||||
hpsLen = strlen("AA1,AA2,AA3,AA4,PP1,PP2");
|
||||
*aHostPort = (char *) malloc(hpsLen);
|
||||
if (!*aHostPort)
|
||||
return E_MEM;
|
||||
|
||||
memset(*aHostPort, 0, hpsLen);
|
||||
sprintf(*aHostPort, "%d,%d,%d,%d,%d,%d",
|
||||
(int)((char*)&servaddr.sin_addr)[0] & 0xFF,
|
||||
(int)((char*)&servaddr.sin_addr)[1] & 0xFF,
|
||||
(int)((char*)&servaddr.sin_addr)[2] & 0xFF,
|
||||
(int)((char*)&servaddr.sin_addr)[3] & 0xFF,
|
||||
(int)((char*)&servaddr.sin_port)[0] & 0xFF,
|
||||
(int)((char*)&servaddr.sin_port)[1] & 0xFF);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
float
|
||||
nsSocket::CalcRate(struct timeval *aPre, struct timeval *aPost, int aBytes)
|
||||
{
|
||||
float diffUsecs, rate;
|
||||
|
||||
/* param check */
|
||||
if (!aPre || !aPost || aBytes <= 0)
|
||||
return 0;
|
||||
|
||||
diffUsecs = (float)(aPost->tv_sec - aPre->tv_sec) * kUsecsPerSec;
|
||||
diffUsecs += (float)aPost->tv_usec - (float)aPre->tv_usec;
|
||||
rate = ((float)(aBytes/kKilobyte))/
|
||||
((float)(diffUsecs/kUsecsPerSec));
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
#ifdef TEST_NSSOCKET
|
||||
|
||||
void
|
||||
my_nprintf(char *buf, int len)
|
||||
{
|
||||
printf("buf size = %d\n", len);
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
printf("%c", *(buf+i));
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
const int kTestBufSize = 1024;
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
DUMP(("*** %s: A self-test for nsSocket.\n", argv[0]));
|
||||
|
||||
if (argc < 4)
|
||||
{
|
||||
fprintf(stderr, "usage: %s <host> <port> <http_url>\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int rv = nsSocket::OK;
|
||||
nsSocket *sock = new nsSocket(argv[1], atoi(argv[2]));
|
||||
char buf[kTestBufSize];
|
||||
int bufSize;
|
||||
memset(buf, 0, kTestBufSize);
|
||||
|
||||
// open socket
|
||||
rv = sock->Open();
|
||||
DUMP(("nsSocket::Open returned: %d\n", rv));
|
||||
|
||||
// prepare http request str
|
||||
sprintf(buf, "GET %s HTTP/1.1\r\n\r\n", argv[3]);
|
||||
bufSize = strlen(buf) + 1; // add 1 for NULL termination
|
||||
|
||||
// make request
|
||||
rv = sock->Send((unsigned char *)buf, &bufSize);
|
||||
DUMP(("nsSocket::Send returned: %d\t and sent: %d bytes\n", rv, bufSize));
|
||||
|
||||
// get response
|
||||
do {
|
||||
// prepare response buf
|
||||
memset(buf, 0, kTestBufSize);
|
||||
bufSize = kTestBufSize;
|
||||
|
||||
rv = sock->Recv((unsigned char *)buf, &bufSize);
|
||||
|
||||
DUMP(("nsSocket::Recv returned: %d\t and recd: %d bytes\n",
|
||||
rv, bufSize));
|
||||
// DUMP(("%s\n", buf));
|
||||
my_nprintf(buf, bufSize);
|
||||
} while (rv == nsSocket::E_READ_MORE);
|
||||
|
||||
// close socket
|
||||
rv = sock->Close();
|
||||
DUMP(("nsSocket::Close returned: %d\n", rv));
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* TEST_NSSOCKET */
|
||||
@@ -1,112 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#ifndef _NS_SOCKET_H_
|
||||
#define _NS_SOCKET_H_
|
||||
|
||||
#ifndef _WINDOWS
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
class nsSocket
|
||||
{
|
||||
public:
|
||||
nsSocket(char *aHost, int aPort);
|
||||
~nsSocket();
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Errors
|
||||
//----------------------------------------------------------------------
|
||||
enum
|
||||
{
|
||||
OK = 0,
|
||||
E_PARAM = -1001,
|
||||
E_MEM = -1002,
|
||||
E_INVALID_HOST = -1003,
|
||||
E_SOCK_OPEN = -1004,
|
||||
E_SOCK_CLOSE = -1005,
|
||||
E_TIMEOUT = -1006,
|
||||
E_WRITE = -1007,
|
||||
E_READ_MORE = -1008,
|
||||
E_READ = -1009,
|
||||
E_SMALL_BUF = -1010,
|
||||
E_EOF_FOUND = -1011,
|
||||
E_BIND = -1012,
|
||||
E_LISTEN = -1014,
|
||||
E_ACCEPT = -1015,
|
||||
E_GETSOCKNAME = -1016,
|
||||
E_WINSOCK = -1017
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Public interface
|
||||
//----------------------------------------------------------------------
|
||||
int Open();
|
||||
int SrvOpen(); // server alternate to client Open()
|
||||
int SrvAccept(); // must be called after SrvOpen()
|
||||
int Send(unsigned char *aBuf, int *aBufSize);
|
||||
int Recv(unsigned char *aBuf, int *aBufSize);
|
||||
int Close();
|
||||
|
||||
int GetHostPortString(char **aHostPort);
|
||||
|
||||
static
|
||||
float CalcRate(struct timeval *aPre, struct timeval *aPost, int aBytes);
|
||||
|
||||
private:
|
||||
char *mHost;
|
||||
int mPort;
|
||||
int mFd; // connected socket
|
||||
int mListenFd; // listening socket (only if SrvOpen() was called)
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Macro definitions
|
||||
//----------------------------------------------------------------------
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void *) 0L)
|
||||
#endif
|
||||
|
||||
#ifdef DUMP
|
||||
#undef DUMP
|
||||
#endif
|
||||
#if defined(DEBUG) || defined(DEBUG_sgehani)
|
||||
#define DUMP(_vargs) \
|
||||
do { \
|
||||
printf("%s %d: ", __FILE__, __LINE__); \
|
||||
printf _vargs; \
|
||||
} while (0);
|
||||
#else
|
||||
#define DUMP(_vargs)
|
||||
#endif
|
||||
|
||||
#endif /* _NS_SOCKET_H_ */
|
||||
@@ -1,40 +0,0 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape 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/NPL/
|
||||
#
|
||||
# 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 Communicator client code,
|
||||
# released March 31, 1998.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Samir Gehani <sgehani@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VAPTH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
CPPSRCS = TestLibxpnet.cpp
|
||||
|
||||
SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=$(BIN_SUFFIX))
|
||||
|
||||
LIBS = -lxpnet_s
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
INCLUDES += -I$(srcdir)/../src
|
||||
|
||||
@@ -1,158 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape 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/NPL/
|
||||
*
|
||||
* 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 Communicator client code,
|
||||
* released March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nsFTPConn.h"
|
||||
#include "nsHTTPConn.h"
|
||||
|
||||
const int kProxySrvrLen = 1024;
|
||||
const char kHTTP[8] = "http://";
|
||||
const char kFTP[7] = "ftp://";
|
||||
const char kLoclFile[7] = "zzzFTP";
|
||||
|
||||
int
|
||||
ProgressCB(int aBytesSoFar, int aTotalFinalSize)
|
||||
{
|
||||
printf(".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
spew(char *funcName, int rv)
|
||||
{
|
||||
printf("%s returned %d\n", funcName, rv);
|
||||
}
|
||||
|
||||
void
|
||||
usage(char *prog)
|
||||
{
|
||||
fprintf(stderr, "usage: %s <URL> [ProxyServer ", prog);
|
||||
fprintf(stderr, "ProxyPort [ProxyUserName ProxyPassword]\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
char *proxyUser = 0, *proxyPswd = 0;
|
||||
char proxyURL[kProxySrvrLen];
|
||||
int rv = 0;
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
usage(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* has a proxy server been specified? */
|
||||
if (argc >= 4)
|
||||
{
|
||||
memset(proxyURL, 0, kProxySrvrLen);
|
||||
sprintf(proxyURL, "http://%s:%s", argv[2], argv[3]);
|
||||
|
||||
if (argc >=6)
|
||||
{
|
||||
proxyUser = argv[4];
|
||||
proxyPswd = argv[5];
|
||||
}
|
||||
|
||||
nsHTTPConn *conn = new nsHTTPConn(proxyURL);
|
||||
conn->SetProxyInfo(argv[1], proxyUser, proxyPswd);
|
||||
printf("Proxy URL: %s\n", argv[1]);
|
||||
if (proxyUser && proxyPswd)
|
||||
{
|
||||
printf("Proxy User: %s\n", proxyUser);
|
||||
printf("Proxy Pswd: %s\n", proxyPswd);
|
||||
}
|
||||
|
||||
rv = conn->Open();
|
||||
spew("nsHTTPConn::Open", rv);
|
||||
|
||||
rv = conn->Get(ProgressCB, NULL); // use leaf from URL
|
||||
printf("\n"); // newline after progress completes
|
||||
spew("nsHTTPConn::Get", rv);
|
||||
|
||||
rv = conn->Close();
|
||||
spew("nsHTTPConn::Close", rv);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* is this an HTTP URL? */
|
||||
if (strncmp(argv[1], kHTTP, strlen(kHTTP)) == 0)
|
||||
{
|
||||
nsHTTPConn *conn = new nsHTTPConn(argv[1]);
|
||||
|
||||
rv = conn->Open();
|
||||
spew("nsHTTPConn::Open", rv);
|
||||
|
||||
rv = conn->Get(ProgressCB, NULL);
|
||||
printf("\n"); // newline after progress completes
|
||||
spew("nsHTTPConn::Get", rv);
|
||||
|
||||
rv = conn->Close();
|
||||
spew("nsHTTPConn::Close", rv);
|
||||
}
|
||||
|
||||
/* or is this an FTP URL? */
|
||||
else if (strncmp(argv[1], kFTP, strlen(kFTP)) == 0)
|
||||
{
|
||||
char *host = 0, *path = 0, *file = (char*) kLoclFile;
|
||||
int port = 21;
|
||||
|
||||
rv = nsHTTPConn::ParseURL(kFTP, argv[1], &host, &port, &path);
|
||||
spew("nsHTTPConn::ParseURL", rv);
|
||||
|
||||
nsFTPConn *conn = new nsFTPConn(host);
|
||||
|
||||
rv = conn->Open();
|
||||
spew("nsFTPConn::Open", rv);
|
||||
|
||||
if (strrchr(path, '/') != (path + strlen(path)))
|
||||
file = strrchr(path, '/') + 1; // set to leaf name
|
||||
rv = conn->Get(path, file, nsFTPConn::BINARY, 1, ProgressCB);
|
||||
printf("\n"); // newline after progress completes
|
||||
spew("nsFTPConn::Get", rv);
|
||||
|
||||
rv = conn->Close();
|
||||
spew("nsFTPConn::Close", rv);
|
||||
|
||||
if (host)
|
||||
free(host);
|
||||
if (path)
|
||||
free(path);
|
||||
}
|
||||
|
||||
/* or we don't understand the args */
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Like, uhm, dude! I don't get you. ");
|
||||
fprintf(stderr, "See usage...\n");
|
||||
usage(argv[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape 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/NPL/
|
||||
#
|
||||
# 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 Communicator client code,
|
||||
# released March 31, 1998.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Samir Gehani <sgehani@netscape.com>
|
||||
#
|
||||
|
||||
MODULE=xpnet
|
||||
DEPTH=..\..\..\..
|
||||
|
||||
MAKE_OBJ_TYPE=EXE
|
||||
|
||||
EXENAME=TestLibxpnet
|
||||
PDBFILE=TestLibxpnet
|
||||
MAPFILE=TestLibxpnet.map
|
||||
|
||||
PROGRAM=.\$(OBJDIR)\$(EXENAME).exe
|
||||
|
||||
OBJS=.\$(OBJDIR)\TestLibxpnet.obj
|
||||
|
||||
LINCS=-I..\src
|
||||
|
||||
LLIBS=$(DIST)\lib\$(MODULE)_s.lib
|
||||
|
||||
include <$(DEPTH)/config/rules.mak>
|
||||
|
||||
install:: $(PROGRAM)
|
||||
$(MAKE_INSTALL) $(PROGRAM) $(DIST)\bin
|
||||
|
||||
clobber::
|
||||
$(RM) $(DIST)\bin\$(EXENAME).exe
|
||||
|
||||
Reference in New Issue
Block a user