[Libreoffice-commits] core.git: Branch 'ports/macosx10.5/master' - 198 commits - accessibility/inc accessibility/source android/Bootstrap apple_remote/Library_AppleRemote.mk apple_remote/source avmedia/Library_avmediaQuickTime.mk avmedia/Module_avmedia.mk avmedia/source basctl/source basegfx/source basic/source bean/com bridges/Library_cpp_uno.mk bridges/source chart2/source clew/Library_clew.mk clew/Module_clew.mk codemaker/source comphelper/inc comphelper/source compilerplugins/clang config_host/config_version.h.in config_host.mk.in configure.ac connectivity/inc connectivity/source cppuhelper/qa cppuhelper/source cppuhelper/test cui/inc cui/source cui/uiconfig dbaccess/inc dbaccess/source desktop/CppunitTest_desktop_lib.mk desktop/inc desktop/Library_sofficeapp.mk desktop/qa desktop/source desktop/test desktop/util desktop/win32 desktop/WinResTarget_sbase.mk desktop/WinResTarget_scalc.mk desktop/WinResTarget_sdraw.mk desktop/WinResTarget_simpress.mk desktop/WinResTarget_smath.mk desktop/WinResT arget_sofficebin.mk desktop/WinResTarget_soffice.mk desktop/WinResTarget_sweb.mk desktop/WinResTarget_swriter.mk download.lst drawinglayer/inc drawinglayer/source editeng/inc editeng/source embeddedobj/test extensions/source external/apache-commons external/beanshell external/curl external/hsqldb external/icu external/jfreereport external/languagetool external/nss external/openssl external/python3 external/rhino filter/Configuration_filter.mk filter/qa filter/source forms/inc forms/source fpicker/Library_fps_aqua.mk fpicker/source fpicker/test framework/source i18npool/source i18nutil/source icon-themes/breeze include/apple_remote include/basegfx include/basic include/canvas include/com include/comphelper include/connectivity include/cppcanvas include/cppu include/cppuhelper include/dbaccess include/default.rc include/drawinglayer include/editeng include/formula include/LibreOfficeKit include/sal include/sax include/sfx2 include/svl include/svtools include/svx include/toolkit includ e/tools include/ucbhelper include/unotools include/vcl include/version.hrc include/xmloff include/xmlscript instsetoo_native/CustomTarget_install.mk instsetoo_native/CustomTarget_setup.mk instsetoo_native/util jurt/com l10ntools/source libreofficekit/Executable_gtktiledviewer.mk libreofficekit/Executable_tilebench.mk libreofficekit/Library_libreofficekitgtk.mk libreofficekit/Module_libreofficekit.mk libreofficekit/source lingucomponent/Module_lingucomponent.mk lingucomponent/source lotuswordpro/inc lotuswordpro/source mysqlc/source nlpsolver/src odk/CustomTarget_settings.mk odk/examples odk/Package_odk_headers.mk offapi/com officecfg/registry oox/source postprocess/CustomTarget_registry.mk postprocess/Rdb_services.mk qadevOOo/runner qadevOOo/tests readlicense_oo/docs remotebridges/examples reportdesign/source Repository.mk ridljar/com rsc/source sal/Library_sal.mk sal/osl sal/qa sax/qa sax/source scaddins/source sc/inc sc/Module_sc.mk sc/qa scripting/java sc/source sc/workben sdext/ source sd/source setup_native/install_name_patcher.app setup_native/scripts sfx2/source shell/Library_macbe.mk shell/source slideshow/source slideshow/test solenv/bin solenv/gbuild sot/inc sot/source starmath/qa starmath/source stoc/source svgio/inc svgio/source svl/qa svl/source svtools/inc svtools/source svx/Executable_gengal.mk svx/inc svx/Library_svxcore.mk svx/source sw/CppunitTest_sw_ooxmlimport.mk swext/mediawiki sw/inc sw/Module_sw.mk sw/qa sw/source sysui/CustomTarget_deb.mk sysui/CustomTarget_rpm.mk sysui/desktop test/source toolkit/Library_tk.mk toolkit/source tools/source tubes/source unotools/source ure/source uui/inc uui/source vcl/Executable_icontest.mk vcl/Executable_mtfdemo.mk vcl/Executable_ui-previewer.mk vcl/Executable_vcldemo.mk vcl/generic vcl/inc vcl/Library_desktop_detector.mk vcl/Library_vcl.mk vcl/Module_vcl.mk vcl/osx vcl/qa vcl/quartz vcl/source vcl/StaticLibrary_vclmain.mk vcl/uiconfig vcl/unx vcl/win vcl/workben wizards/com writerfilter/inc writerfilter /source xmerge/source xmloff/inc xmloff/source xmlsecurity/source xmlsecurity/workben
Douglas Mencken
dougmencken at gmail.com
Wed Oct 21 04:37:10 PDT 2015
Rebased ref, commits from common ancestor:
commit a25bb747b285a5b0e56b7eb502950a90203c4dee
Author: Douglas Mencken <dougmencken at gmail.com>
Date: Sun Oct 18 11:29:49 2015 -0400
vcx.osx.print: convert to use modern API
Change-Id: Icc7d7ad95d1ffbf55f1cd704148f3ceb58618e6c
diff --git a/vcl/inc/osx/printview.h b/vcl/inc/osx/printview.h
index b63900b..ef8b891 100644
--- a/vcl/inc/osx/printview.h
+++ b/vcl/inc/osx/printview.h
@@ -45,7 +45,8 @@ struct PrintAccessoryViewState
vcl::PrinterController* mpController;
AquaSalInfoPrinter* mpInfoPrinter;
}
--(id)initWithController: (vcl::PrinterController*)pController withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter;
+-(id)initWithController: (vcl::PrinterController*)pController
+ withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter;
-(BOOL)knowsPageRange: (NSRangePointer)range;
-(NSRect)rectForPage: (int)page;
-(NSPoint)locationOfPrintRect: (NSRect)aRect;
@@ -55,7 +56,9 @@ struct PrintAccessoryViewState
@interface AquaPrintAccessoryView : NSObject
{
}
-+(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp withController: (vcl::PrinterController*)pController withState: (PrintAccessoryViewState*)pState;
++(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp
+ withController: (vcl::PrinterController*)pController
+ withState: (PrintAccessoryViewState*)pState;
@end
#endif // INCLUDED_VCL_INC_OSX_PRINTVIEW_H
diff --git a/vcl/osx/printaccessoryview.mm b/vcl/osx/printaccessoryview.mm
index d03d4f4..ee5d1e9 100644
--- a/vcl/osx/printaccessoryview.mm
+++ b/vcl/osx/printaccessoryview.mm
@@ -45,11 +45,15 @@ using namespace com::sun::star;
using namespace com::sun::star::beans;
using namespace com::sun::star::uno;
-/* Note: the accessory view as implemented here is already deprecated in Leopard. Unfortunately
- as long as our baseline is Tiger we cannot gain the advantages over multiple accessory views
- as well havs having accessory views AND a preview (as long as you are linked vs. 10.4 libraries
- the preview insists on not being present. This is unfortunate.
-*/
+#if MACOSX_SDK_VERSION <= 1040
+// as long as you are linking with 10.4 libraries there's no preview
+# define VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+# undef MODERN_IMPLEMENTATION_OF_PRINT_DIALOG
+#else
+// since 10.5 you can use multiple accessory views and have accessory views and a preview
+# define MODERN_IMPLEMENTATION_OF_PRINT_DIALOG
+# undef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+#endif
class ControllerProperties;
@@ -60,10 +64,98 @@ class ControllerProperties;
-(id)initWithControllerMap: (ControllerProperties*)pController;
-(void)triggered:(id)pSender;
-(void)triggeredNumeric:(id)pSender;
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
-(void)triggeredPreview:(id)pSender;
+#endif
-(void)dealloc;
@end
+#ifdef MODERN_IMPLEMENTATION_OF_PRINT_DIALOG
+
+ at interface AquaPrintPanelAccessoryController : NSViewController< NSPrintPanelAccessorizing >
+
+NSPrintOperation *mpPrintOperation;
+vcl::PrinterController *mpController;
+PrintAccessoryViewState *mpState;
+
+-(void)forPrintOperation:(NSPrintOperation*)pPrintOp;
+-(void)withController:(vcl::PrinterController*)pController;
+-(void)withState:(PrintAccessoryViewState*)pState;
+
+-(NSSet*)keyPathsForValuesAffectingPreview;
+-(NSArray*)localizedSummaryItems;
+
+-(sal_Int32)updatePrintOperation:(sal_Int32)pLastPageCount;
+
+ at end
+
+ at implementation AquaPrintPanelAccessoryController
+
+-(void)forPrintOperation:(NSPrintOperation*)pPrintOp
+{
+ mpPrintOperation = pPrintOp;
+}
+
+-(void)withController:(vcl::PrinterController*)pController
+{
+ mpController = pController;
+}
+
+-(void)withState:(PrintAccessoryViewState*)pState
+{
+ mpState = pState;
+}
+
+-(NSSet*)keyPathsForValuesAffectingPreview
+{
+ return [ NSSet setWithObject:@"updatePrintOperation" ];
+}
+
+-(NSArray*)localizedSummaryItems
+{
+ return [ NSArray arrayWithObject:
+ [ NSDictionary dictionary ] ];
+}
+
+-(sal_Int32)updatePrintOperation:(sal_Int32)pLastPageCount
+{
+ // page range may be changed by option choice
+ sal_Int32 nPages = mpController->getFilteredPageCount();
+
+ mpState->bNeedRestart = false;
+ if( nPages != pLastPageCount )
+ {
+ #if OSL_DEBUG_LEVEL > 1
+ SAL_INFO( "vcl.osx.print", "number of pages changed" <<
+ " from " << pLastPageCount << " to " << nPages );
+ #endif
+ mpState->bNeedRestart = true;
+ }
+
+ NSTabView* pTabView = [[[self view] subviews] objectAtIndex:0];
+ NSTabViewItem* pItem = [pTabView selectedTabViewItem];
+ if( pItem )
+ mpState->nLastPage = [pTabView indexOfTabViewItem: pItem];
+ else
+ mpState->nLastPage = 0;
+
+ if( mpState->bNeedRestart )
+ {
+ // AppKit does not give a chance of changing the page count
+ // and don't let cancel the dialog either
+ // hack: send a cancel message to the modal window displaying views
+ NSWindow* pNSWindow = [NSApp modalWindow];
+ if( pNSWindow )
+ [pNSWindow cancelOperation: nil];
+ [[mpPrintOperation printInfo] setJobDisposition: NSPrintCancelJob];
+ }
+
+ return nPages;
+}
+
+ at end
+
+#endif
class ControllerProperties
{
@@ -74,79 +166,95 @@ class ControllerProperties
std::vector< NSObject* > maViews;
int mnNextTag;
sal_Int32 mnLastPageCount;
- PrintAccessoryViewState* mpState;
NSPrintOperation* mpOp;
+ PrintAccessoryViewState* mpState;
+ ResStringArray maLocalizedStrings;
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ NSBox* mpPreviewBox;
+ NSImageView* mpPreview; // print preview is not provided "by default"
NSView* mpAccessoryView;
NSTabView* mpTabView;
- NSBox* mpPreviewBox;
- NSImageView* mpPreview;
NSTextField* mpPageEdit;
NSStepper* mpStepper;
- NSTextView* mpPagesLabel;
- ResStringArray maLocalizedStrings;
+#else
+ AquaPrintPanelAccessoryController* mpAccessoryController;
+#endif
public:
- ControllerProperties( vcl::PrinterController* i_pController,
- NSPrintOperation* i_pOp,
- NSView* i_pAccessoryView,
- NSTabView* i_pTabView,
- PrintAccessoryViewState* i_pState )
- : mpController( i_pController ),
- mnNextTag( 0 ),
- mnLastPageCount( i_pController->getFilteredPageCount() ),
- mpState( i_pState ),
- mpOp( i_pOp ),
- mpAccessoryView( i_pAccessoryView ),
- mpTabView( i_pTabView ),
- mpPreviewBox( nil ),
- mpPreview( nil ),
- mpPageEdit( nil ),
- mpStepper( nil ),
- mpPagesLabel( nil ),
- maLocalizedStrings( VclResId( SV_PRINT_NATIVE_STRINGS ) )
+ ControllerProperties( vcl::PrinterController* i_pController
+ , NSPrintOperation* i_pOp
+ , PrintAccessoryViewState* i_pState
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ , NSView* i_pAccessoryView
+ , NSTabView* i_pTabView
+#else
+ , AquaPrintPanelAccessoryController* i_pAccessoryController
+#endif
+ )
+ : mpController( i_pController )
+ , mnNextTag( 0 )
+ , mnLastPageCount( i_pController->getFilteredPageCount() )
+ , mpOp( i_pOp )
+ , mpState( i_pState )
+ , maLocalizedStrings( VclResId( SV_PRINT_NATIVE_STRINGS ) )
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ , mpPreviewBox( nil )
+ , mpPreview( nil )
+ , mpAccessoryView( i_pAccessoryView )
+ , mpTabView( i_pTabView )
+ , mpPageEdit( nil )
+ , mpStepper( nil )
+#else
+ , mpAccessoryController( i_pAccessoryController )
+#endif
{
- mpState->bNeedRestart = false;
- DBG_ASSERT( maLocalizedStrings.Count() >= 5, "resources not found !" );
+ //mpState->bNeedRestart = false;
+ assert( maLocalizedStrings.Count() >= 5 && "resources not found" );
}
-
+
rtl::OUString getMoreString()
{
return maLocalizedStrings.Count() >= 4
? OUString( maLocalizedStrings.GetString( 3 ) )
: OUString( "More" );
}
-
+
rtl::OUString getPrintSelectionString()
{
return maLocalizedStrings.Count() >= 5
? OUString( maLocalizedStrings.GetString( 4 ) )
: OUString( "Print selection only" );
}
-
+
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
void updatePrintJob()
{
- // TODO: refresh page count etc from mpController
-
- // page range may have changed depending on options
+ // page range may be changed by option choice
sal_Int32 nPages = mpController->getFilteredPageCount();
- #if OSL_DEBUG_LEVEL > 1
+
+ mpState->bNeedRestart = false;
if( nPages != mnLastPageCount )
- fprintf( stderr, "trouble: number of pages changed from %ld to %ld !\n", mnLastPageCount, nPages );
- #endif
- mpState->bNeedRestart = (nPages != mnLastPageCount);
+ {
+ #if OSL_DEBUG_LEVEL > 1
+ SAL_INFO( "vcl.osx.print", "number of pages changed" <<
+ " from " << mnLastPageCount << " to " << nPages );
+ #endif
+ mpState->bNeedRestart = true;
+ }
+ mnLastPageCount = nPages;
+
NSTabViewItem* pItem = [mpTabView selectedTabViewItem];
if( pItem )
mpState->nLastPage = [mpTabView indexOfTabViewItem: pItem];
else
mpState->nLastPage = 0;
- mnLastPageCount = nPages;
+
if( mpState->bNeedRestart )
{
- // Warning: bad hack ahead
- // Apple does not give us a chance of changing the page count,
- // and they don't let us cancel the dialog either
- // hack: send a cancel message to the window displaying our views.
- // this is ugly.
+ // Warning: bad ugly hack ahead
+ // AppKit does not give a chance of changing the page count
+ // and don't let cancel the dialog either
+ // hack: send a cancel message to the modal window displaying views
NSWindow* pNSWindow = [NSApp modalWindow];
if( pNSWindow )
[pNSWindow cancelOperation: nil];
@@ -158,7 +266,8 @@ class ControllerProperties
updatePreviewImage( nPage-1 );
}
}
-
+#endif
+
int addNameTag( const rtl::OUString& i_rPropertyName )
{
int nNewTag = mnNextTag++;
@@ -173,18 +282,18 @@ class ControllerProperties
maTagToValueInt[ nNewTag ] = i_nValue;
return nNewTag;
}
-
+
void addObservedControl( NSObject* i_pView )
{
maViews.push_back( i_pView );
}
-
+
void addViewPair( NSView* i_pLeft, NSView* i_pRight )
{
maViewPairMap[ i_pLeft ] = i_pRight;
maViewPairMap[ i_pRight ] = i_pLeft;
}
-
+
NSView* getPair( NSView* i_pLeft ) const
{
NSView* pRight = nil;
@@ -193,7 +302,7 @@ class ControllerProperties
pRight = it->second;
return pRight;
}
-
+
void changePropertyWithIntValue( int i_nTag )
{
std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( i_nTag );
@@ -204,7 +313,11 @@ class ControllerProperties
if( pVal )
{
pVal->Value <<= value_it->second;
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
updatePrintJob();
+#else
+ mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount];
+#endif
}
}
}
@@ -218,11 +331,15 @@ class ControllerProperties
if( pVal )
{
pVal->Value <<= i_nValue;
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
updatePrintJob();
+#else
+ mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount];
+#endif
}
}
}
-
+
void changePropertyWithBoolValue( int i_nTag, bool i_bValue )
{
std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( i_nTag );
@@ -236,11 +353,15 @@ class ControllerProperties
pVal->Value <<= i_bValue ? sal_Int32(2) : sal_Int32(0);
else
pVal->Value <<= i_bValue;
- updatePrintJob();
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ updatePrintJob();
+#else
+ mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount];
+#endif
}
}
}
-
+
void changePropertyWithStringValue( int i_nTag, const rtl::OUString& i_rValue )
{
std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( i_nTag );
@@ -250,11 +371,15 @@ class ControllerProperties
if( pVal )
{
pVal->Value <<= i_rValue;
- updatePrintJob();
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ updatePrintJob();
+#else
+ mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount];
+#endif
}
}
}
-
+
void updateEnableState()
{
for( std::vector< NSObject* >::iterator it = maViews.begin(); it != maViews.end(); ++it )
@@ -266,11 +391,11 @@ class ControllerProperties
pCtrl = (NSControl*)pObj;
else if( [pObj isKindOfClass: [NSCell class]] )
pCell = (NSCell*)pObj;
-
+
int nTag = pCtrl ? [pCtrl tag] :
pCell ? [pCell tag] :
-1;
-
+
std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( nTag );
if( name_it != maTagToPropertyName.end() && ! name_it->second.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("PrintContent")) )
{
@@ -284,11 +409,12 @@ class ControllerProperties
}
else if( pCell )
[pCell setEnabled: bEnabled];
-
}
}
}
-
+
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+
void updatePreviewImage( sal_Int32 i_nPage )
{
sal_Int32 nPages = mpController->getFilteredPageCount();
@@ -339,7 +465,7 @@ class ControllerProperties
{
if( maLocalizedStrings.Count() < 3 )
return;
-
+
// get the preview control
NSRect aPreviewFrame = [mpAccessoryView frame];
aPreviewFrame.origin.x = 0;
@@ -363,24 +489,24 @@ class ControllerProperties
[mpPreview setImageAlignment: NSImageAlignCenter];
[mpPreview setImageFrameStyle: NSImageFrameNone];
[mpPreviewBox addSubview: [mpPreview autorelease]];
-
+
// add a label
sal_Int32 nPages = mpController->getFilteredPageCount();
rtl::OUStringBuffer aBuf( 16 );
aBuf.append( "/ " );
aBuf.append( rtl::OUString::number( nPages ) );
-
+
NSString* pText = CreateNSString( aBuf.makeStringAndClear() );
NSRect aTextRect = { { 100, 5 }, { 100, 22 } };
- mpPagesLabel = [[NSTextView alloc] initWithFrame: aTextRect];
- [mpPagesLabel setFont: [NSFont controlContentFontOfSize: 0]];
- [mpPagesLabel setEditable: NO];
- [mpPagesLabel setSelectable: NO];
- [mpPagesLabel setDrawsBackground: NO];
- [mpPagesLabel setString: [pText autorelease]];
- [mpPagesLabel setToolTip: [CreateNSString( maLocalizedStrings.GetString( 2 ) ) autorelease]];
- [mpPreviewBox addSubview: [mpPagesLabel autorelease]];
-
+ NSTextView* aPagesLabel = [[NSTextView alloc] initWithFrame: aTextRect];
+ [aPagesLabel setFont: [NSFont controlContentFontOfSize: 0]];
+ [aPagesLabel setEditable: NO];
+ [aPagesLabel setSelectable: NO];
+ [aPagesLabel setDrawsBackground: NO];
+ [aPagesLabel setString: [pText autorelease]];
+ [aPagesLabel setToolTip: [CreateNSString( maLocalizedStrings.GetString( 2 ) ) autorelease]];
+ [mpPreviewBox addSubview: [aPagesLabel autorelease]];
+
NSRect aFieldRect = { { 45, 5 }, { 35, 25 } };
mpPageEdit = [[NSTextField alloc] initWithFrame: aFieldRect];
[mpPageEdit setEditable: YES];
@@ -388,14 +514,14 @@ class ControllerProperties
[mpPageEdit setDrawsBackground: YES];
[mpPageEdit setToolTip: [CreateNSString( maLocalizedStrings.GetString( 1 ) ) autorelease]];
[mpPreviewBox addSubview: [mpPageEdit autorelease]];
-
+
// add a stepper control
NSRect aStepFrame = { { 85, 5 }, { 15, 25 } };
mpStepper = [[NSStepper alloc] initWithFrame: aStepFrame];
[mpStepper setIncrement: 1];
[mpStepper setValueWraps: NO];
[mpPreviewBox addSubview: [mpStepper autorelease]];
-
+
// constrain the text field to decimal numbers
NSNumberFormatter* pFormatter = [[NSNumberFormatter alloc] init];
[pFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4];
@@ -407,16 +533,16 @@ class ControllerProperties
[mpPageEdit setFormatter: pFormatter];
[mpStepper setMinValue: 1];
[mpStepper setMaxValue: nPages];
-
+
[mpPageEdit setIntValue: 1];
[mpStepper setIntValue: 1];
-
+
// connect target and action
[mpStepper setTarget: i_pCtrlTarget];
[mpStepper setAction: @selector(triggeredPreview:)];
[mpPageEdit setTarget: i_pCtrlTarget];
[mpPageEdit setAction: @selector(triggeredPreview:)];
-
+
// set first preview image
updatePreviewImage( 0 );
}
@@ -444,6 +570,9 @@ class ControllerProperties
}
}
}
+
+#endif
+
};
static OUString filterAccelerator( rtl::OUString const & rText )
@@ -455,6 +584,7 @@ static OUString filterAccelerator( rtl::OUString const & rText )
}
@implementation ControlTarget
+
-(id)initWithControllerMap: (ControllerProperties*)pController
{
if( (self = [super init]) )
@@ -463,6 +593,7 @@ static OUString filterAccelerator( rtl::OUString const & rText )
}
return self;
}
+
-(void)triggered:(id)pSender
{
if( [pSender isMemberOfClass: [NSPopUpButton class]] )
@@ -500,10 +631,12 @@ static OUString filterAccelerator( rtl::OUString const & rText )
}
else
{
- SAL_INFO( "vcl.osx.print", "Unsupported class" << ([pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil"));
+ SAL_INFO( "vcl.osx.print", "Unsupported class" <<
+ ( [pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil" ) );
}
mpController->updateEnableState();
}
+
-(void)triggeredNumeric:(id)pSender
{
if( [pSender isMemberOfClass: [NSTextField class]] )
@@ -532,19 +665,25 @@ static OUString filterAccelerator( rtl::OUString const & rText )
}
else
{
- SAL_INFO( "vcl.osx.print", "Unsupported class" << ([pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil"));
+ SAL_INFO( "vcl.osx.print", "Unsupported class" <<
+ ([pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil") );
}
mpController->updateEnableState();
}
+
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
-(void)triggeredPreview:(id)pSender
{
mpController->changePreview( pSender );
}
+#endif
+
-(void)dealloc
{
delete mpController;
[super dealloc];
}
+
@end
struct ColumnItem
@@ -584,7 +723,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize,
)
{
// balance columns
-
+
// first get overall column widths
long nLeftWidth = 0;
long nRightWidth = 0;
@@ -600,7 +739,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize,
if( nW > nRightWidth )
nRightWidth = nW;
}
-
+
// right align left column
for( size_t i = 0; i < rLeftColumn.size(); i++ )
{
@@ -637,7 +776,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize,
[rRightColumn[i].pControl setFrame: aCtrlRect];
}
}
-
+
NSArray* pSubViews = [pNSView subviews];
unsigned int nViews = [pSubViews count];
NSRect aUnion = NSZeroRect;
@@ -647,7 +786,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize,
{
aUnion = NSUnionRect( aUnion, [[pSubViews objectAtIndex: n] frame] );
}
-
+
// move everything so it will fit
for( unsigned int n = 0; n < nViews; n++ )
{
@@ -657,12 +796,12 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize,
aFrame.origin.y -= aUnion.origin.y - 5;
[pCurSubView setFrame: aFrame];
}
-
+
// resize the view itself
aUnion.size.height += 10;
aUnion.size.width += 20;
[pNSView setFrameSize: aUnion.size];
-
+
if( aUnion.size.width > rMaxSize.width )
rMaxSize.width = aUnion.size.width;
if( aUnion.size.height > rMaxSize.height )
@@ -728,10 +867,11 @@ static sal_Int32 findBreak( const rtl::OUString& i_rText, sal_Int32 i_nPos )
Reference< i18n::XBreakIterator > xBI( vcl::unohelper::CreateBreakIterator() );
if( xBI.is() )
{
- i18n::Boundary aBoundary = xBI->getWordBoundary( i_rText, i_nPos,
- Application::GetSettings().GetLanguageTag().getLocale(),
- i18n::WordType::ANYWORD_IGNOREWHITESPACES,
- sal_True );
+ i18n::Boundary aBoundary =
+ xBI->getWordBoundary( i_rText, i_nPos,
+ Application::GetSettings().GetLanguageTag().getLocale(),
+ i18n::WordType::ANYWORD_IGNOREWHITESPACES,
+ true );
nRet = aBoundary.endPos;
}
return nRet;
@@ -855,7 +995,9 @@ static void addRadio( NSView* pCurParent, long& rCurX, long& rCurY, long nAttach
// setup radio matrix
NSButtonCell* pProto = [[NSButtonCell alloc] init];
- NSRect aRadioRect = { { static_cast<CGFloat>(rCurX + nOff), 0 }, { static_cast<CGFloat>(280 - rCurX), static_cast<CGFloat>(5*rChoices.getLength()) } };
+ NSRect aRadioRect = { { static_cast<CGFloat>(rCurX + nOff), 0 },
+ { static_cast<CGFloat>(280 - rCurX),
+ static_cast<CGFloat>(5*rChoices.getLength()) } };
[pProto setTitle: @"RadioButtonGroup"];
[pProto setButtonType: NSRadioButton];
NSMatrix* pMatrix = [[NSMatrix alloc] initWithFrame: aRadioRect
@@ -1079,43 +1221,56 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
rCurY = aFieldRect.origin.y - 5;
}
-// In 10.5 and later:
-// 'setAccessoryView:' is deprecated
-
-// Make deprecation warnings just warnings in a -Werror compilation.
-
-#ifdef __GNUC__
-// #pragma GCC diagnostic push
-#pragma GCC diagnostic warning "-Wdeprecated-declarations"
-#endif
-
@implementation AquaPrintAccessoryView
-+(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp withController: (vcl::PrinterController*)pController withState: (PrintAccessoryViewState*)pState
+
++(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp
+ withController: (vcl::PrinterController*)pController
+ withState: (PrintAccessoryViewState*)pState
{
const Sequence< PropertyValue >& rOptions( pController->getUIOptions() );
if( rOptions.getLength() == 0 )
return nil;
+ NSRect aViewFrame = { NSZeroPoint, { 600, 400 } };
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ NSRect aTabViewFrame = { { 190, 0 }, { 410, 400 } };
+#else
+ NSRect aTabViewFrame = aViewFrame;
+#endif
+
+ NSView* pAccessoryView = [[NSView alloc] initWithFrame: aViewFrame];
+ NSTabView* pTabView = [[NSTabView alloc] initWithFrame: aTabViewFrame];
+ [pAccessoryView addSubview: [pTabView autorelease]];
+
+#ifdef MODERN_IMPLEMENTATION_OF_PRINT_DIALOG
+ // create the accessory controller
+ AquaPrintPanelAccessoryController* pAccessoryController =
+ [[AquaPrintPanelAccessoryController alloc] initWithNibName: nil bundle: nil];
+ [pAccessoryController setView: [pAccessoryView autorelease]];
+ [pAccessoryController forPrintOperation: pOp];
+ [pAccessoryController withController: pController];
+ [pAccessoryController withState: pState];
+#endif
+
NSView* pCurParent = 0;
long nCurY = 0;
long nCurX = 0;
- NSRect aViewFrame = { NSZeroPoint, {600, 400 } };
- NSRect aTabViewFrame = { { 190, 0 }, {410, 400 } };
NSSize aMaxTabSize = NSZeroSize;
- NSView* pAccessoryView = [[NSView alloc] initWithFrame: aViewFrame];
- NSTabView* pTabView = [[NSTabView alloc] initWithFrame: aTabViewFrame];
- [pAccessoryView addSubview: [pTabView autorelease]];
-
- bool bIgnoreSubgroup = false;
-
- ControllerProperties* pControllerProperties = new ControllerProperties( pController, pOp, pAccessoryView, pTabView, pState );
+
+ ControllerProperties* pControllerProperties =
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ new ControllerProperties( pController, pOp, pState, pAccessoryView, pTabView );
+#else
+ new ControllerProperties( pController, pOp, pState, pAccessoryController );
+#endif
ControlTarget* pCtrlTarget = [[ControlTarget alloc] initWithControllerMap: pControllerProperties];
-
+
std::vector< ColumnItem > aLeftColumn, aRightColumn;
-
+
// ugly:
// prepend a "selection" checkbox if the properties have such a selection in PrintContent
bool bAddSelectionCheckBox = false, bSelectionBoxEnabled = false, bSelectionBoxChecked = false;
+
for( int i = 0; i < rOptions.getLength(); i++ )
{
Sequence< beans::PropertyValue > aOptProp;
@@ -1167,15 +1322,15 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
rOptions[i].Value >>= aOptProp;
// extract ui element
- bool bEnabled = true;
rtl::OUString aCtrlType;
rtl::OUString aText;
rtl::OUString aPropertyName;
rtl::OUString aGroupHint;
Sequence< rtl::OUString > aChoices;
+ bool bEnabled = true;
sal_Int64 nMinValue = 0, nMaxValue = 0;
long nAttachOffset = 0;
- sal_Bool bIgnore = sal_False;
+ bool bIgnore = false;
for( int n = 0; n < aOptProp.getLength(); n++ )
{
@@ -1203,7 +1358,7 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
{
sal_Bool bValue = sal_True;
rEntry.Value >>= bValue;
- bEnabled = bValue;
+ bEnabled = bValue ? true : false;
}
else if( rEntry.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("MinValue")) )
{
@@ -1219,7 +1374,9 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
}
else if( rEntry.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("InternalUIOnly")) )
{
- rEntry.Value >>= bIgnore;
+ sal_Bool bValue = sal_False;
+ rEntry.Value >>= bValue;
+ bIgnore = bValue ? true : false;
}
else if( rEntry.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("GroupingHint")) )
{
@@ -1235,8 +1392,10 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Range")) ||
aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Bool")) )
{
- // since our build target is MacOSX 10.4 we can have only one accessory view
- // so we have a single accessory view that is tabbed for grouping
+ bool bIgnoreSubgroup = false;
+
+ // with `setAccessoryView' method only one accessory view can be set
+ // so create this single accessory view as tabbed for grouping
if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Group"))
|| ! pCurParent
|| ( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Subgroup")) && nCurY < -250 && ! bIgnore )
@@ -1245,10 +1404,11 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
rtl::OUString aGroupTitle( aText );
if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Subgroup")) )
aGroupTitle = pControllerProperties->getMoreString();
+
// set size of current parent
if( pCurParent )
adjustViewAndChildren( pCurParent, aMaxTabSize, aLeftColumn, aRightColumn );
-
+
// new tab item
if( ! aText.getLength() )
aText = "OOo";
@@ -1259,11 +1419,9 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
pCurParent = [[NSView alloc] initWithFrame: aTabViewFrame];
[pItem setView: pCurParent];
[pLabel release];
-
- // reset indent
- nCurX = 20;
- // reset Y
- nCurY = 0;
+
+ nCurX = 20; // reset indent
+ nCurY = 0; // reset Y
// clear columns
aLeftColumn.clear();
aRightColumn.clear();
@@ -1277,7 +1435,7 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
bAddSelectionCheckBox = false;
}
}
-
+
if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Subgroup")) && pCurParent )
{
bIgnoreSubgroup = bIgnore;
@@ -1292,12 +1450,12 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
}
else if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Bool")) && pCurParent )
{
- sal_Bool bVal = sal_False;
+ sal_Bool bVal = sal_False;
PropertyValue* pVal = pController->getValue( aPropertyName );
if( pVal )
pVal->Value >>= bVal;
addBool( pCurParent, nCurX, nCurY, nAttachOffset,
- aText, true, aPropertyName, bVal,
+ aText, true, aPropertyName, bVal?true:false,
aRightColumn, pControllerProperties, pCtrlTarget );
}
else if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Radio")) && pCurParent )
@@ -1325,7 +1483,8 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
aLeftColumn, aRightColumn,
pControllerProperties, pCtrlTarget );
}
- else if( (aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Edit")) || aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Range"))) && pCurParent )
+ else if( (aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Edit"))
+ || aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Range"))) && pCurParent )
{
// current value
PropertyValue* pVal = pController->getValue( aPropertyName );
@@ -1341,17 +1500,19 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
SAL_INFO( "vcl.osx.print", "Unsupported UI option \"" << aCtrlType << "\"");
}
}
-
+
pControllerProperties->updateEnableState();
adjustViewAndChildren( pCurParent, aMaxTabSize, aLeftColumn, aRightColumn );
-
- // leave some space for the preview
+
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
+ // leave some space for preview
if( aMaxTabSize.height < 200 )
aMaxTabSize.height = 200;
-
+#endif
+
// now reposition everything again so it is upper bound
adjustTabViews( pTabView, aMaxTabSize );
-
+
// find the minimum needed tab size
NSSize aTabCtrlSize = [pTabView minimumSize];
aTabCtrlSize.height += aMaxTabSize.height + 10;
@@ -1361,11 +1522,21 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
aViewFrame.size.width = aTabCtrlSize.width + aTabViewFrame.origin.x;
aViewFrame.size.height = aTabCtrlSize.height + aTabViewFrame.origin.y;
[pAccessoryView setFrameSize: aViewFrame.size];
-
+
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
pControllerProperties->setupPreview( pCtrlTarget );
+#endif
+#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG
// set the accessory view
[pOp setAccessoryView: [pAccessoryView autorelease]];
+#else // -(void)setAccessoryView:(NSView *)aView of NSPrintOperation is deprecated since 10.5
+ // get the print panel
+ NSPrintPanel* pPrintPanel = [pOp printPanel];
+ [pPrintPanel setOptions: [pPrintPanel options] | NSPrintPanelShowsPreview];
+ // add the accessory controller to the panel
+ [pPrintPanel addAccessoryController: [pAccessoryController autorelease]];
+#endif
// set the current selecte tab item
if( pState->nLastPage >= 0 && pState->nLastPage < [pTabView numberOfTabViewItems] )
@@ -1374,8 +1545,6 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO
return pCtrlTarget;
}
-// #pragma GCC diagnostic pop
-
@end
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/osx/printview.mm b/vcl/osx/printview.mm
index 8b324b9..3fef61d 100644
--- a/vcl/osx/printview.mm
+++ b/vcl/osx/printview.mm
@@ -24,7 +24,9 @@
#include "osx/salprn.h"
@implementation AquaPrintView
--(id)initWithController: (vcl::PrinterController*)pController withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter
+
+-(id)initWithController: (vcl::PrinterController*)pController
+ withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter
{
NSRect aRect = { NSZeroPoint, [pInfoPrinter->getPrintInfo() paperSize] };
if( (self = [super initWithFrame: aRect]) != nil )
@@ -49,7 +51,9 @@
// #i101108# sanity check
if( nWidth < 1 )
nWidth = 1;
- NSRect aRect = { { static_cast<CGFloat>(page % nWidth), static_cast<CGFloat>(page / nWidth) }, aPaperSize };
+ NSRect aRect = { { static_cast<CGFloat>(page % nWidth),
+ static_cast<CGFloat>(page / nWidth) },
+ aPaperSize };
return aRect;
}
@@ -61,7 +65,8 @@
-(void)drawRect: (NSRect)rect
{
- mpInfoPrinter->setStartPageOffset( static_cast<int>(rect.origin.x), static_cast<int>(rect.origin.y) );
+ mpInfoPrinter->setStartPageOffset( static_cast<int>(rect.origin.x),
+ static_cast<int>(rect.origin.y) );
NSSize aPaperSize = [mpInfoPrinter->getPrintInfo() paperSize];
int nPage = (int)(aPaperSize.width * rect.origin.y + rect.origin.x);
@@ -69,6 +74,7 @@
if( nPage - 1 < (mpInfoPrinter->getCurPageRangeStart() + mpInfoPrinter->getCurPageRangeCount() ) )
mpController->printFilteredPage( nPage-1 );
}
+
@end
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/osx/salprn.cxx b/vcl/osx/salprn.cxx
index 8ef58ad..f28d10e 100644
--- a/vcl/osx/salprn.cxx
+++ b/vcl/osx/salprn.cxx
@@ -503,8 +503,9 @@ bool AquaSalInfoPrinter::StartJob( const OUString* i_pFileName,
bSuccess = true;
mbJob = true;
pInst->startedPrintJob();
- [pPrintOperation runOperation];
+ BOOL wasSuccessful = [pPrintOperation runOperation];
pInst->endedPrintJob();
+ bSuccess = wasSuccessful ? true : false;
bWasAborted = [[[pPrintOperation printInfo] jobDisposition] compare: NSPrintCancelJob] == NSOrderedSame;
mbJob = false;
if( pReleaseAfterUse )
commit 0d10a73a546e2813582e377ee44cd9dba663bef2
Author: Douglas Mencken <dougmencken at gmail.com>
Date: Fri Oct 16 16:12:46 2015 -0400
temporarily(?) disable ww8export & ww8import qa-tests for Mac OS X 10.5
Change-Id: If4ac2239c3f6ed9d992072a537e3728e1fdbee4e
diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk
index 7dfd541..03fa9a9 100644
--- a/sw/Module_sw.mk
+++ b/sw/Module_sw.mk
@@ -62,8 +62,8 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\
CppunitTest_sw_ooxmlfieldexport \
CppunitTest_sw_ooxmlw14export \
CppunitTest_sw_ooxmlimport \
- CppunitTest_sw_ww8export \
- CppunitTest_sw_ww8import \
+ $(if $(filter-out 1050,$(MACOSX_SDK_VERSION)),CppunitTest_sw_ww8export) \
+ $(if $(filter-out 1050,$(MACOSX_SDK_VERSION)),CppunitTest_sw_ww8import) \
CppunitTest_sw_rtfexport \
CppunitTest_sw_rtfimport \
CppunitTest_sw_odfexport \
commit 1f5a7db72a022e448e3608a048bb10fc8e88a491
Author: Douglas Mencken <dougmencken at gmail.com>
Date: Thu Oct 15 11:00:00 2015 -0400
[UNO~C++] [WiP] try to fix UNO bridge for gcc3_macosx_powerpc part
diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx
index 81bae49f..556e87c 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx
@@ -49,7 +49,7 @@ static typelib_TypeClass cpp2uno_call(
// gpreg: [ret *], this, [gpr params]
// fpreg: [fpr params]
- // ovrflw: [gpr or fpr params (properly aligned)]
+ // ovrflw: [gpr or fpr params (space for entire parameter list aligned)]
// return
typelib_TypeDescription * pReturnTypeDescr = 0;
@@ -83,11 +83,14 @@ static typelib_TypeClass cpp2uno_call(
// stack space
assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" );
+
// parameters
void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
void ** pCppArgs = pUnoArgs + nParams;
+
// indices of values this have to be converted (interface conversion cpp<=>uno)
sal_Int32 * pTempIndices = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+
// type descriptions for reconversions
typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
@@ -102,7 +105,6 @@ static typelib_TypeClass cpp2uno_call(
if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
// value
{
-
switch (pParamTypeDescr->eTypeClass)
{
@@ -524,8 +526,8 @@ static void cpp_vtable_call( int nFunctionIndex, int nVtableOffset, void** gpreg
int const codeSnippetSize = 136;
-unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset,
- bool simpleRetType)
+unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex,
+ sal_Int32 vtableOffset, bool simpleRetType )
{
// fprintf(stderr,"in codeSnippet functionIndex is %x\n", functionIndex);
@@ -679,8 +681,9 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
sal_Int32 functionCount, sal_Int32 vtableOffset)
{
- (*slots) -= functionCount;
- Slot * s = *slots;
+ (*slots) -= functionCount;
+ Slot * s = *slots;
+
// fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
// fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
// fflush(stderr);
diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous
index 7fb88fe..b2d22f0 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous
+++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous
@@ -46,7 +46,7 @@ static typelib_TypeClass cpp2uno_call(
// gpreg: [ret *], this, [gpr params]
// fpreg: [fpr params]
- // ovrflw: [gpr or fpr params (space for entire parameter list in structure format properly aligned)]
+ // ovrflw: [gpr or fpr params (space for entire parameter list aligned)]
// return
typelib_TypeDescription * pReturnTypeDescr = 0;
@@ -59,11 +59,13 @@ static typelib_TypeClass cpp2uno_call(
sal_Int32 ngpreg = 0;
sal_Int32 nfpreg = 0;
-
+ // handle optional return pointer
if (pReturnTypeDescr)
{
if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+ {
pUnoReturn = pRegisterReturn; // direct way for simple types
+ }
else // complex return via ptr (pCppReturn)
{
pCppReturn = *gpreg;
@@ -141,19 +143,19 @@ static typelib_TypeClass cpp2uno_call(
pCppStack = (char *)ovrflw;
// stack space
- OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+ assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" );
// parameters
void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
void ** pCppArgs = pUnoArgs + nParams;
- // indizes of values this have to be converted (interface conversion cpp<=>uno)
- sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+ // indices of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndices = (sal_Int32 *)(pUnoArgs + (2 * nParams));
// type descriptions for reconversions
typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
- sal_Int32 nTempIndizes = 0;
+ sal_Int32 nTempIndices = 0;
for ( nPos = 0; nPos < nParams; ++nPos )
{
@@ -199,9 +201,9 @@ static typelib_TypeClass cpp2uno_call(
{
// uno out is unconstructed mem!
pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
- pTempIndizes[nTempIndizes] = nPos;
+ pTempIndices[nTempIndices] = nPos;
// will be released at reconversion
- ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
}
// is in/inout
else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
@@ -209,9 +211,9 @@ static typelib_TypeClass cpp2uno_call(
uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ),
*(void **)pCppStack, pParamTypeDescr,
pThis->getBridge()->getCpp2Uno() );
- pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+ pTempIndices[nTempIndices] = nPos; // has to be reconverted
// will be released at reconversion
- ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
}
else // direct way
{
@@ -223,26 +225,24 @@ static typelib_TypeClass cpp2uno_call(
pCppStack += sizeof(sal_Int32); // standard parameter length
}
-
// ExceptionHolder
uno_Any aUnoExc; // Any will be constructed by callee
uno_Any * pUnoExc = &aUnoExc;
// invoke uno dispatch call
- (*pThis->getUnoI()->pDispatcher)(
- pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+ (*pThis->getUnoI()->pDispatcher)( pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
// in case an exception occurred...
if (pUnoExc)
{
// destruct temporary in/inout params
- for ( ; nTempIndizes--; )
+ for ( ; nTempIndices--; )
{
- sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+ sal_Int32 nIndex = pTempIndices[nTempIndices];
if (pParams[nIndex].bIn) // is in/inout => was constructed
- uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 );
- TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+ uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndices], 0 );
+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] );
}
if (pReturnTypeDescr)
TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
@@ -256,10 +256,10 @@ static typelib_TypeClass cpp2uno_call(
else // else no exception occurred...
{
// temporary params
- for ( ; nTempIndizes--; )
+ for ( ; nTempIndices--; )
{
- sal_Int32 nIndex = pTempIndizes[nTempIndizes];
- typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+ sal_Int32 nIndex = pTempIndices[nTempIndices];
+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndices];
if (pParams[nIndex].bOut) // inout/out
{
@@ -305,7 +305,7 @@ static typelib_TypeClass cpp_mediate(
void ** gpreg, void ** fpreg, void ** ovrflw,
sal_Int64 * pRegisterReturn /* space for register return */ )
{
- OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
+ assert( sizeof(sal_Int32)==sizeof(void *) && "### unexpected!" );
// gpreg: [ret *], this, [other gpr params]
// fpreg: [fpr params]
@@ -329,7 +329,7 @@ static typelib_TypeClass cpp_mediate(
typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
- OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" );
+ assert( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex && "### illegal vtable index!" );
if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
{
throw RuntimeException(
@@ -339,7 +339,7 @@ static typelib_TypeClass cpp_mediate(
// determine called method
sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
- OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
+ assert( nMemberPos < pTypeDescr->nAllMembers && "### illegal member index!" );
TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
@@ -516,7 +516,7 @@ unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex,
if (! simpleRetType )
functionIndex |= 0x80000000;
- // OSL_ASSERT( sizeof (long) == 4 );
+ // assert( sizeof (long) == 4 );
// FIXME: why are we leaving an 8k gap in the stack here
// FIXME: is this to allow room for signal handling frames?
@@ -652,7 +652,8 @@ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
bridges::cpp_uno::shared::VtableFactory::Slot *
bridges::cpp_uno::shared::VtableFactory::initializeBlock(
- void * block, sal_Int32 slotCount)
+ void * block, sal_Int32 slotCount, sal_Int32,
+ typelib_InterfaceTypeDescription *)
{
Slot * slots = mapBlockToVtable(block);
slots[-2].fn = 0;
@@ -675,7 +676,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
for (sal_Int32 i = 0; i < type->nMembers; ++i) {
typelib_TypeDescription * member = 0;
TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
- OSL_ASSERT(member != 0);
+ assert(member != 0);
switch (member->eTypeClass) {
case typelib_TypeClass_INTERFACE_ATTRIBUTE:
// Getter:
@@ -708,7 +709,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
break;
default:
- OSL_ASSERT(false);
+ assert(false);
break;
}
TYPELIB_DANGER_RELEASE(member);
diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx
index 9c09999..b0a4e3f 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx
@@ -303,7 +303,7 @@ static void callVirtualMethod(
static void cpp_call(
bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
- bridges::cpp_uno::shared::VtableSlot aVtableSlot,
+ bridges::cpp_uno::shared::VtableSlot aVtableSlot,
typelib_TypeDescriptionReference * pReturnTypeRef,
sal_Int32 nParams, typelib_MethodParameter * pParams,
void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
@@ -320,7 +320,7 @@ static void cpp_call(
// return
typelib_TypeDescription * pReturnTypeDescr = 0;
TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
- // assert( pReturnTypeDescr && "### expected return type description!" );
+ //assert( pReturnTypeDescr && "### expected return type description!" );
void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
@@ -341,13 +341,13 @@ static void cpp_call(
}
}
// push this
- void* pAdjustedThisPtr = reinterpret_cast< void **>(pThis->getCppI()) + aVtableSlot.offset;
+ void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset;
*(void**)pCppStack = pAdjustedThisPtr;
pCppStack += sizeof( void* );
*pPT++ = 'I';
// stack space
- // assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" );
+ //assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" );
// args
void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams );
// indices of values this have to be converted (interface conversion cpp<=>uno)
@@ -430,8 +430,7 @@ static void cpp_call(
{
uno_copyAndConvertData(
*(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
- pUnoArgs[nPos], pParamTypeDescr,
- pThis->getBridge()->getUno2Cpp() );
+ pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
pTempIndices[nTempIndices] = nPos; // has to be reconverted
// will be released at reconversion
@@ -499,8 +498,7 @@ static void cpp_call(
catch (...)
{
// fill uno exception
- fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
- *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+ fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
// temporary params
for ( ; nTempIndices--; )
@@ -525,8 +523,8 @@ void unoInterfaceProxyDispatch(
void * pReturn, void * pArgs[], uno_Any ** ppException )
{
// is my surrogate
- bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
- = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
+ = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI);
switch (pMemberDescr->eTypeClass)
{
diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous
index 0f5e0bc..67435c0 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous
+++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous
@@ -38,7 +38,7 @@ using namespace ::com::sun::star::uno;
namespace
{
-//==================================================================================================
+
static void callVirtualMethod(
void * pAdjustedThisPtr,
sal_Int32 nVtableIndex,
@@ -77,9 +77,6 @@ static void callVirtualMethod(
// Note: This keeps us from having to decode the signature twice and
// prevents problems with later local variables.
- // FIXME: I do not believe the following is true but we will keep the
- // FIXME: extra space just to be safe until proven otherwise
-
// Note: could require up to 2*nStackLongs words of parameter stack area
// if the call has many float parameters (i.e. floats take up only 1
// word on the stack but take 2 words in parameter area in the
@@ -267,16 +264,16 @@ static void callVirtualMethod(
case typelib_TypeClass_CHAR:
case typelib_TypeClass_SHORT:
case typelib_TypeClass_UNSIGNED_SHORT:
- *(unsigned short*)pRegisterReturn = (unsigned short)iret;
+ *(unsigned short*)pRegisterReturn = (unsigned short)iret;
break;
case typelib_TypeClass_BOOLEAN:
case typelib_TypeClass_BYTE:
- *(unsigned char*)pRegisterReturn = (unsigned char)iret;
+ *(unsigned char*)pRegisterReturn = (unsigned char)iret;
break;
case typelib_TypeClass_FLOAT:
- *(float*)pRegisterReturn = (float)dret;
+ *(float*)pRegisterReturn = (float)dret;
break;
case typelib_TypeClass_DOUBLE:
@@ -288,7 +285,6 @@ static void callVirtualMethod(
}
-//==================================================================================================
static void cpp_call(
bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
bridges::cpp_uno::shared::VtableSlot aVtableSlot,
@@ -308,7 +304,7 @@ static void cpp_call(
// return
typelib_TypeDescription * pReturnTypeDescr = 0;
TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
- OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
+ //assert( pReturnTypeDescr && "### expected return type description!" );
void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
@@ -330,22 +326,21 @@ static void cpp_call(
}
}
// push this
- void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI())
- + aVtableSlot.offset;
+ void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset;
*(void**)pCppStack = pAdjustedThisPtr;
pCppStack += sizeof( void* );
*pPT++ = 'I';
// stack space
- OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+ //assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" );
// args
void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams );
- // indizes of values this have to be converted (interface conversion cpp<=>uno)
- sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams);
+ // indices of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndices = (sal_Int32 *)(pCppArgs + nParams);
// type descriptions for reconversions
typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams));
- sal_Int32 nTempIndizes = 0;
+ sal_Int32 nTempIndices = 0;
for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
{
@@ -353,8 +348,7 @@ static void cpp_call(
typelib_TypeDescription * pParamTypeDescr = 0;
TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
- if (!rParam.bOut
- && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
{
uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr,
pThis->getBridge()->getUno2Cpp() );
@@ -412,9 +406,9 @@ static void cpp_call(
uno_constructData(
*(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
pParamTypeDescr );
- pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+ pTempIndices[nTempIndices] = nPos; // default constructed for cpp call
// will be released at reconversion
- ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
}
// is in/inout
else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
@@ -423,9 +417,9 @@ static void cpp_call(
*(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
- pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+ pTempIndices[nTempIndices] = nPos; // has to be reconverted
// will be released at reconversion
- ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
}
else // direct way
{
@@ -444,7 +438,7 @@ static void cpp_call(
try
{
- OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 3), "UNALIGNED STACK !!! (Please DO panic)" );
+ assert( !( (pCppStack - pCppStackStart ) & 3) && "UNALIGNED STACK !!! (Please DO panic)" );
callVirtualMethod(
pAdjustedThisPtr, aVtableSlot.index,
pCppReturn, pReturnTypeDescr->eTypeClass, pParamType,
@@ -453,10 +447,10 @@ static void cpp_call(
*ppUnoExc = 0;
// reconvert temporary params
- for ( ; nTempIndizes--; )
+ for ( ; nTempIndices--; )
{
- sal_Int32 nIndex = pTempIndizes[nTempIndizes];
- typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+ sal_Int32 nIndex = pTempIndices[nTempIndices];
+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndices];
if (pParams[nIndex].bIn)
{
@@ -491,12 +485,12 @@ static void cpp_call(
fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
// temporary params
- for ( ; nTempIndizes--; )
+ for ( ; nTempIndices--; )
{
- sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+ sal_Int32 nIndex = pTempIndices[nTempIndices];
// destroy temp cpp param => cpp: every param was constructed
- uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release );
- TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+ uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndices], cpp_release );
+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] );
}
// return type
if (pReturnTypeDescr)
@@ -514,8 +508,7 @@ void unoInterfaceProxyDispatch(
{
// is my surrogate
bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
- = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI);
- // typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
+ = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI);
switch (pMemberDescr->eTypeClass)
{
commit fed23c77ddac5f027d846dc2f5f47fda7398ae9c
Author: Douglas Mencken <dougmencken at gmail.com>
Date: Thu Oct 15 10:46:53 2015 -0400
[UNO~C++] restore vintage versions of cpp2uno.cxx and uno2cpp.cxx
... from famous commit 7aa6f1b01481c1d0f1a12f56ad197c797056c37b
diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous
new file mode 100644
index 0000000..7fb88fe
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous
@@ -0,0 +1,719 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+#include <typelib/typedescription.hxx>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+
+#include "share.hxx"
+
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+static typelib_TypeClass cpp2uno_call(
+ bridges::cpp_uno::shared::CppInterfaceProxy * pThis,
+ const typelib_TypeDescription * pMemberTypeDescr,
+ typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return
+ sal_Int32 nParams, typelib_MethodParameter * pParams,
+ void ** gpreg, void ** fpreg, void ** ovrflw,
+ sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+
+ // gpreg: [ret *], this, [gpr params]
+ // fpreg: [fpr params]
+ // ovrflw: [gpr or fpr params (space for entire parameter list in structure format properly aligned)]
+
+ // return
+ typelib_TypeDescription * pReturnTypeDescr = 0;
+ if (pReturnTypeRef)
+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+
+ void * pUnoReturn = 0;
+ void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need
+
+ sal_Int32 ngpreg = 0;
+ sal_Int32 nfpreg = 0;
+
+
+ if (pReturnTypeDescr)
+ {
+ if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+ pUnoReturn = pRegisterReturn; // direct way for simple types
+ else // complex return via ptr (pCppReturn)
+ {
+ pCppReturn = *gpreg;
+ ngpreg++;
+ ++ovrflw;
+
+ pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+ ? alloca( pReturnTypeDescr->nSize )
+ : pCppReturn); // direct way
+ }
+ }
+ // pop this
+ ngpreg++;
+ ++ovrflw;
+
+ // after handling optional return pointer and "this"
+ // make use of the space that is allocated to store all parameters in the callers stack
+ // by comying the proper registers filled with parameters to that space
+ char * pCppStack = (char *)ovrflw;
+
+
+ sal_Int32 nPos;
+
+ for ( nPos = 0; nPos < nParams; ++nPos )
+ {
+ const typelib_MethodParameter & rParam = pParams[nPos];
+ if (rParam.bOut)
+ {
+ if (ngpreg < 8)
+ {
+ *(sal_Int32 *)pCppStack = ((sal_Int32 *)gpreg)[ngpreg++];
+ }
+ pCppStack += sizeof (sal_Int32);
+ }
+ else
+ {
+ switch (rParam.pTypeRef->eTypeClass)
+ {
+ case typelib_TypeClass_FLOAT:
+ if (nfpreg < 13)
+ {
+ *(float *)pCppStack = ((double *)fpreg)[nfpreg++];
+ }
+ pCppStack += sizeof (float);
+ ngpreg += 1;
+ break;
+ case typelib_TypeClass_DOUBLE:
+ if (nfpreg < 13)
+ {
+ *(double *)pCppStack = ((double *)fpreg)[nfpreg++];
+ }
+ pCppStack += sizeof (double);
+ ngpreg += 2;
+ break;
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ case typelib_TypeClass_HYPER:
+ if (ngpreg < 8)
+ {
+ *(sal_Int32 *)pCppStack = ((sal_Int32 *)gpreg)[ngpreg++];
+ }
+ pCppStack += sizeof (sal_Int32);
+ // fall through on purpose
+ default:
+ if (ngpreg < 8)
+ {
+ *(sal_Int32 *)pCppStack = ((sal_Int32 *)gpreg)[ngpreg++];
+ }
+ pCppStack += sizeof (sal_Int32);
+ }
+ }
+ }
+
+ // now the stack has all of the parameters stored in it ready to be processed
+ // so we are ready to build the uno call stack
+ pCppStack = (char *)ovrflw;
+
+ // stack space
+ OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+
+ // parameters
+ void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
+ void ** pCppArgs = pUnoArgs + nParams;
+
+ // indizes of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+
+ // type descriptions for reconversions
+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
+
+ sal_Int32 nTempIndizes = 0;
+
+ for ( nPos = 0; nPos < nParams; ++nPos )
+ {
+ const typelib_MethodParameter & rParam = pParams[nPos];
+ typelib_TypeDescription * pParamTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+ // value
+ {
+ switch (pParamTypeDescr->eTypeClass)
+ {
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ pCppArgs[nPos] = pCppStack +3;
+ pUnoArgs[nPos] = pCppStack +3;
+ break;
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ pCppArgs[nPos] = pCppStack +2;
+ pUnoArgs[nPos] = pCppStack +2;
+ break;
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ case typelib_TypeClass_DOUBLE:
+ pCppArgs[nPos] = pCppStack;
+ pUnoArgs[nPos] = pCppStack;
+ pCppStack += sizeof(sal_Int32); // extra long (two regs)
+ break;
+ default:
+ pCppArgs[nPos] = pCppStack;
+ pUnoArgs[nPos] = pCppStack;
+ }
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ else // ptr to complex value | ref
+ {
+ pCppArgs[nPos] = *(void **)pCppStack;
+
+ if (! rParam.bIn) // is pure out
+ {
+ // uno out is unconstructed mem!
+ pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
+ pTempIndizes[nTempIndizes] = nPos;
+ // will be released at reconversion
+ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ }
+ // is in/inout
+ else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+ {
+ uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+ *(void **)pCppStack, pParamTypeDescr,
+ pThis->getBridge()->getCpp2Uno() );
+ pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+ // will be released at reconversion
+ ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+ }
+ else // direct way
+ {
+ pUnoArgs[nPos] = *(void **)pCppStack;
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ }
+ pCppStack += sizeof(sal_Int32); // standard parameter length
+ }
+
+
+ // ExceptionHolder
+ uno_Any aUnoExc; // Any will be constructed by callee
+ uno_Any * pUnoExc = &aUnoExc;
+
+ // invoke uno dispatch call
+ (*pThis->getUnoI()->pDispatcher)(
+ pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+
+ // in case an exception occurred...
+ if (pUnoExc)
+ {
+ // destruct temporary in/inout params
+ for ( ; nTempIndizes--; )
+ {
+ sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+
+ if (pParams[nIndex].bIn) // is in/inout => was constructed
+ uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 );
+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+ }
+ if (pReturnTypeDescr)
+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+
+ CPPU_CURRENT_NAMESPACE::raiseException(
+ &aUnoExc, pThis->getBridge()->getUno2Cpp() );
+ // has to destruct the any
+ // is here for dummy
+ return typelib_TypeClass_VOID;
+ }
+ else // else no exception occurred...
+ {
+ // temporary params
+ for ( ; nTempIndizes--; )
+ {
+ sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+
+ if (pParams[nIndex].bOut) // inout/out
+ {
+ // convert and assign
+ uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+ uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+ }
+ // destroy temp uno param
+ uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
+
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+ // return
+ if (pCppReturn) // has complex return
+ {
+ if (pUnoReturn != pCppReturn) // needs reconversion
+ {
+ uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+ // destroy temp uno return
+ uno_destructData( pUnoReturn, pReturnTypeDescr, 0 );
+ }
+ // complex return ptr is set to return reg
+ *(void **)pRegisterReturn = pCppReturn;
+ }
+ if (pReturnTypeDescr)
+ {
+ typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+ return eRet;
+ }
+ else
+ return typelib_TypeClass_VOID;
+ }
+}
+
+
+//==================================================================================================
+static typelib_TypeClass cpp_mediate(
+ sal_Int32 nFunctionIndex,
+ sal_Int32 nVtableOffset,
+ void ** gpreg, void ** fpreg, void ** ovrflw,
+ sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+ OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
+
+ // gpreg: [ret *], this, [other gpr params]
+ // fpreg: [fpr params]
+ // ovrflw: [gpr or fpr params (in space allocated for all params properly aligned)]
+
+ void * pThis;
+ if( nFunctionIndex & 0x80000000 )
+ {
+ nFunctionIndex &= 0x7fffffff;
+ pThis = gpreg[1];
+ }
+ else
+ {
+ pThis = gpreg[0];
+ }
+
+ pThis = static_cast< char * >(pThis) - nVtableOffset;
+ bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
+ = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(pThis);
+
+
+ typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
+
+ OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" );
+ if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
+ {
+ throw RuntimeException(
+ rtl::OUString( "illegal vtable index!" ),
+ (XInterface *)pThis );
+ }
+
+ // determine called method
+ sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
+ OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
+
+ TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
+
+ typelib_TypeClass eRet;
+ switch (aMemberDescr.get()->eTypeClass)
+ {
+ case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+ {
+ if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex)
+ {
+ // is GET method
+ eRet = cpp2uno_call(
+ pCppI, aMemberDescr.get(),
+ ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef,
+ 0, 0, // no params
+ gpreg, fpreg, ovrflw, pRegisterReturn );
+ }
+ else
+ {
+ // is SET method
+ typelib_MethodParameter aParam;
+ aParam.pTypeRef =
+ ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef;
+ aParam.bIn = sal_True;
+ aParam.bOut = sal_False;
+
+ eRet = cpp2uno_call(
+ pCppI, aMemberDescr.get(),
+ 0, // indicates void return
+ 1, &aParam,
+ gpreg, fpreg, ovrflw, pRegisterReturn );
+ }
+ break;
+ }
+ case typelib_TypeClass_INTERFACE_METHOD:
+ {
+ // is METHOD
+ switch (nFunctionIndex)
+ {
+ case 1: // acquire()
+ pCppI->acquireProxy(); // non virtual call!
+ eRet = typelib_TypeClass_VOID;
+ break;
+ case 2: // release()
+ pCppI->releaseProxy(); // non virtual call!
+ eRet = typelib_TypeClass_VOID;
+ break;
+ case 0: // queryInterface() opt
+ {
+ typelib_TypeDescription * pTD = 0;
+ TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( gpreg[2] )->getTypeLibType() );
+ if (pTD)
+ {
+ XInterface * pInterface = 0;
+ (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
+ pCppI->getBridge()->getCppEnv(),
+ (void **)&pInterface, pCppI->getOid().pData, (typelib_InterfaceTypeDescription *)pTD );
+
+ if (pInterface)
+ {
+ ::uno_any_construct(
+ reinterpret_cast< uno_Any * >( gpreg[0] ),
+ &pInterface, pTD, cpp_acquire );
+ pInterface->release();
+ TYPELIB_DANGER_RELEASE( pTD );
+ *(void **)pRegisterReturn = gpreg[0];
+ eRet = typelib_TypeClass_ANY;
+ break;
+ }
+ TYPELIB_DANGER_RELEASE( pTD );
+ }
+ } // else perform queryInterface()
+ default:
+ eRet = cpp2uno_call(
+ pCppI, aMemberDescr.get(),
+ ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef,
+ ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams,
+ ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams,
+ gpreg, fpreg, ovrflw, pRegisterReturn );
+ }
+ break;
+ }
+ default:
+ {
+ throw RuntimeException(
+ rtl::OUString( "no member description found!" ),
+ (XInterface *)pThis );
+ }
+ }
+
+ return eRet;
+}
+
+//==================================================================================================
+/**
+ * is called on incoming vtable calls
+ * (called by asm snippets)
+ */
+static void cpp_vtable_call( int nFunctionIndex, int nVtableOffset, void** gpregptr, void** fpregptr, void** ovrflw)
+{
+ sal_Int32 gpreg[8];
+ double fpreg[13];
+
+ // FIXME: why are we restoring the volatile ctr register here
+ sal_Int32 ctrsave = ((sal_Int32*)gpregptr)[-1];
+
+ memcpy( gpreg, gpregptr, 32);
+ memcpy( fpreg, fpregptr, 104);
+
+ volatile long nRegReturn[2];
+
+ // sal_Bool bComplex = nFunctionIndex & 0x80000000 ? sal_True : sal_False;
+
+ typelib_TypeClass aType =
+ cpp_mediate( nFunctionIndex, nVtableOffset, (void**)gpreg, (void**)fpreg, ovrflw, (sal_Int64*)nRegReturn );
+
+ // FIXME: why are we restoring the volatile ctr register here
+ // FIXME: and why are we putting back the values for r4, r5, and r6 as well
+ // FIXME: this makes no sense to me, all of these registers are volatile!
+ __asm__( "lwz r4, %0\n\t"
+ "mtctr r4\n\t"
+ "lwz r4, %1\n\t"
+ "lwz r5, %2\n\t"
+ "lwz r6, %3\n\t"
+ : : "m"(ctrsave), "m"(gpreg[1]), "m"(gpreg[2]), "m"(gpreg[3]) );
+
+ switch( aType )
+ {
+
+ // move return value into register space
+ // (will be loaded by machine code snippet)
+
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ __asm__( "lbz r3,%0\n\t" : :
+ "m"(nRegReturn[0]) );
+ break;
+
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ __asm__( "lhz r3,%0\n\t" : :
+ "m"(nRegReturn[0]) );
+ break;
+
+ case typelib_TypeClass_FLOAT:
+ __asm__( "lfs f1,%0\n\t" : :
+ "m" (*((float*)nRegReturn)) );
+ break;
+
+ case typelib_TypeClass_DOUBLE:
+ __asm__( "lfd f1,%0\n\t" : :
+ "m" (*((double*)nRegReturn)) );
+ break;
+
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ __asm__( "lwz r4,%0\n\t" : :
+ "m"(nRegReturn[1]) ); // fall through
+
+ default:
+ __asm__( "lwz r3,%0\n\t" : :
+ "m"(nRegReturn[0]) );
+ break;
+ }
+}
+
+
+int const codeSnippetSize = 136;
+
+unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex,
+ sal_Int32 vtableOffset, bool simpleRetType )
+{
+ if (! simpleRetType )
+ functionIndex |= 0x80000000;
+
+ // OSL_ASSERT( sizeof (long) == 4 );
+
+ // FIXME: why are we leaving an 8k gap in the stack here
+ // FIXME: is this to allow room for signal handling frames?
+ // FIXME: seems like overkill here but this is what was done for Mac OSX for gcc2
+ // FIXME: also why no saving of the non-volatile CR pieces here, to be safe
+ // FIXME: we probably should
+
+ /* generate this code */
+
+ // # so first save gpr 3 to gpr 10 (aligned to 4)
+ // stw r3, -8000(r1)
+ // stw r4, -7996(r1)
+ // stw r5, -7992(r1)
+ // stw r6, -7988(r1)
+ // stw r7, -7984(r1)
+ // stw r8, -7980(r1)
+ // stw r9, -7976(r1)
+ // stw r10,-7972(r1)
+
+ // # next save fpr 1 to fpr 13 (aligned to 8)
+ // stfd f1, -7968(r1)
+ // stfd f2, -7960(r1)
+ // stfd f3, -7952(r1)
+ // stfd f4, -7944(r1)
+ // stfd f5, -7936(r1)
+ // stfd f6, -7928(r1)
+ // stfd f7, -7920(r1)
+ // stfd f8, -7912(r1)
+ // stfd f9, -7904(r1)
+ // stfd f10,-7896(r1)
+ // stfd f11,-7888(r1)
+ // stfd f12,-7880(r1)
+ // stfd f13,-7872(r1)
+
+ // FIXME: ctr is volatile, while are we saving it and not CR?
+ // mfctr r3
+ // stw r3, -8004(r1)
+
+ // # now here is where cpp_vtable_call must go
+ // lis r3,0xdead
+ // ori r3,r3,0xbeef
+ // mtctr r3
+
+ // # now load up the functionIndex number
+ // lis r3, 0xdead
+ // ori r3,r3,0xbeef
+
+ // # now load up the vtableOffset
+ // lis r4, 0xdead
+ // ori r4,r4,0xbeef
+
+ // #now load up the pointer to the saved gpr registers
+ // addi r5,r1,-8000
+
+ // #now load up the pointer to the saved fpr registers
+ // addi r6,r1,-7968
+
+ // #now load up the pointer to the overflow call stack
+ // addi r7,r1,24 # frame pointer plus 24
+
+ // bctr
+
+ unsigned long * p = (unsigned long *) code;
+
+ * p++ = 0x9061e0c0;
+ * p++ = 0x9081e0c4;
+ * p++ = 0x90a1e0c8;
+ * p++ = 0x90c1e0cc;
+ * p++ = 0x90e1e0d0;
+ * p++ = 0x9101e0d4;
+ * p++ = 0x9121e0d8;
+ * p++ = 0x9141e0dc;
+ * p++ = 0xd821e0e0;
+ * p++ = 0xd841e0e8;
+ * p++ = 0xd861e0f0;
+ * p++ = 0xd881e0f8;
+ * p++ = 0xd8a1e100;
+ * p++ = 0xd8c1e108;
+ * p++ = 0xd8e1e110;
+ * p++ = 0xd901e118;
+ * p++ = 0xd921e120;
+ * p++ = 0xd941e128;
+ * p++ = 0xd961e130;
+ * p++ = 0xd981e138;
+ * p++ = 0xd9a1e140;
+ * p++ = 0x7c6902a6;
+ * p++ = 0x9061e0bc;
+ * p++ = 0x3c600000 | (((unsigned long)cpp_vtable_call) >> 16);
+ * p++ = 0x60630000 | (((unsigned long)cpp_vtable_call) & 0x0000FFFF);
+ * p++ = 0x7c6903a6;
+ * p++ = 0x3c600000 | (((unsigned long)functionIndex) >> 16);
+ * p++ = 0x60630000 | (((unsigned long)functionIndex) & 0x0000FFFF);
+ * p++ = 0x3c800000 | (((unsigned long)vtableOffset) >> 16);
+ * p++ = 0x60840000 | (((unsigned long)vtableOffset) & 0x0000FFFF);
+ * p++ = 0x38a1e0c0;
+ * p++ = 0x38c1e0e0;
+ * p++ = 0x38e10018;
+ * p++ = 0x4e800420;
+
+ return (code + codeSnippetSize);
+
+}
+
+
+}
+
+void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const * bptr, unsigned char const * eptr)
+{
+ int const lineSize = 32;
+ for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+ __asm__ volatile ("dcbst 0, %0" : : "r"(p) : "memory");
+ }
+ __asm__ volatile ("sync" : : : "memory");
+ for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+ __asm__ volatile ("icbi 0, %0" : : "r"(p) : "memory");
+ }
+ __asm__ volatile ("isync" : : : "memory");
+}
+
+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+{
+ return static_cast< Slot * >(block) + 2;
+}
+
+sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+ sal_Int32 slotCount)
+{
+ return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+}
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::initializeBlock(
+ void * block, sal_Int32 slotCount)
+{
+ Slot * slots = mapBlockToVtable(block);
+ slots[-2].fn = 0;
+ slots[-1].fn = 0;
+ return slots + slotCount;
+}
+
+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+ Slot ** slots, unsigned char * code,
+ typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+ sal_Int32 functionCount, sal_Int32 vtableOffset)
+{
+ (*slots) -= functionCount;
+ Slot * s = *slots;
+
+ // fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
+ // fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
+ // fflush(stderr);
+
+ for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+ typelib_TypeDescription * member = 0;
+ TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+ OSL_ASSERT(member != 0);
+ switch (member->eTypeClass) {
+ case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+ // Getter:
+ (s++)->fn = code;
+ code = codeSnippet(
+ code, functionOffset++, vtableOffset,
+ bridges::cpp_uno::shared::isSimpleType(
+ reinterpret_cast<
+ typelib_InterfaceAttributeTypeDescription * >(
+ member)->pAttributeTypeRef));
+
+ // Setter:
+ if (!reinterpret_cast<
+ typelib_InterfaceAttributeTypeDescription * >(
+ member)->bReadOnly)
+ {
+ (s++)->fn = code;
+ code = codeSnippet(code, functionOffset++, vtableOffset, true);
+ }
+ break;
+
+ case typelib_TypeClass_INTERFACE_METHOD:
+ (s++)->fn = code;
+ code = codeSnippet(
+ code, functionOffset++, vtableOffset,
+ bridges::cpp_uno::shared::isSimpleType(
+ reinterpret_cast<
+ typelib_InterfaceMethodTypeDescription * >(
+ member)->pReturnTypeRef));
+ break;
+
+ default:
+ OSL_ASSERT(false);
+ break;
+ }
+ TYPELIB_DANGER_RELEASE(member);
+ }
+ return code;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous
new file mode 100644
index 0000000..0f5e0bc
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous
@@ -0,0 +1,636 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#include <sys/types.h>
+#include <sys/malloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/vtables.hxx"
+
+#include "share.hxx"
+
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+static void callVirtualMethod(
+ void * pAdjustedThisPtr,
+ sal_Int32 nVtableIndex,
+ void * pRegisterReturn,
+ typelib_TypeClass eReturnType,
+ char * pPT,
+ sal_Int32 * pStackLongs,
+ sal_Int32 /* nStackLongs */)
+{
+
+ // parameter list is mixed list of * and values
+ // reference parameters are pointers
+
+ // the basic idea here is to use gpr[8] as a storage area for
+ // the future values of registers r3 to r10 needed for the call,
+ // and similarly fpr[13] as a storage area for the future values
+ // of floating point registers f1 to f13
+
+ unsigned long * mfunc; // actual function to be invoked
+ int gpr[8]; // storage for gpregisters, map to r3-r10
+ int off; // offset used to find function
+ double fpr[13]; // storage for fpregisters, map to f1-f13
+ int n; // number of gprs mapped so far
+ int f; // number of fprs mapped so far
+ volatile long *p; // pointer to parameter overflow area
+ int c; // character of parameter type being decoded
+ volatile double dret; // temporary function return values
+ volatile int iret, iret2;
+
+ // Because of the Power PC calling conventions we could be passing
+ // parameters in both register types and on the stack. To create the
+ // stack parameter area we need we now simply allocate local
+ // variable storage param[] that is at least the size of the parameter stack
+ // (more than enough space) which we can overwrite the parameters into.
+
+ // Note: This keeps us from having to decode the signature twice and
+ // prevents problems with later local variables.
+
+ // FIXME: I do not believe the following is true but we will keep the
+ // FIXME: extra space just to be safe until proven otherwise
+
+ // Note: could require up to 2*nStackLongs words of parameter stack area
+ // if the call has many float parameters (i.e. floats take up only 1
+ // word on the stack but take 2 words in parameter area in the
+ // stack frame .
+
+
+ // unsigned long param[(2*nStackLongs)];
+
+ /* now begin to load the C++ function arguments into storage */
+ n = 0;
+ f = 0;
+
+
+ /* set up a pointer to the stack parameter area */
+ __asm__ ( "addi %0,r1,24" : "=r" (p) : /* no inputs */ );
+
+ // #i94421#, work around compiler error:
+ volatile long * pCopy = p;
+ (void) pCopy; // avoid warning about unused variable
+
+ // never called
+ // if (! pAdjustedThisPtr )CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
+
+
+ // now we need to parse the entire signature string
+ // until we get the END indicator
+
+ // treat complex return pointer like any other parameter
+
+ // parse the argument list up to the ending )
+
+ while (*pPT != 'X') {
+ c = *pPT;
+ switch (c) {
+
+ case 'D': /* type is double */
+ if (f < 13) {
+ fpr[f++] = *((double *)pStackLongs); /* store in register */
+ n+=2;
+ p+=2;
+ } else {
+ *p++ = *pStackLongs; /* or on the parameter stack */
+ *p++ = *(pStackLongs + 1);
+ }
+ pStackLongs += 2;
+ break;
+
+ case 'F': /* type is float */
+ /* floats are stored as 1 32 bit word on param stack */
+ if (f < 13) {
+ fpr[f++] = *((float *)pStackLongs);
+ n+=1;
+ p++;
+ } else {
+ *((float *)p) = *((float *)pStackLongs);
+ p += 1;
+ }
+ pStackLongs += 1;
+ break;
+
+ case 'H': /* type is long long */
+ if (n < 8)
+ {
+ gpr[n++] = *pStackLongs;
+ p++;
+ }
+ else
+ *p++ = *pStackLongs;
+ if(n < 8)
+ {
+ gpr[n++] = *(pStackLongs+1);
+ p++;
+ }
+ else
+ *p++ = *(pStackLongs+1);
+ pStackLongs += 2;
+ break;
+
+ case 'S':
+ if (n < 8) {
+ gpr[n++] = *((unsigned short*)pStackLongs);
+ p++;
+ } else {
+ *p++ = *((unsigned short *)pStackLongs);
+ }
+ pStackLongs += 1;
+ break;
+
+ case 'B':
+ if (n < 8) {
+ gpr[n++] = *((char *)pStackLongs);
+ p++;
+ } else {
+ *p++ = *((char *)pStackLongs);
+ }
+ pStackLongs += 1;
+ break;
+
+ default:
+ if (n < 8) {
+ gpr[n++] = *pStackLongs;
+ p++;
+ } else {
+ *p++ = *pStackLongs;
+ }
+ pStackLongs += 1;
+ break;
+ }
+ pPT++;
+ }
+
+
+ /* figure out the address of the function we need to invoke */
+ off = nVtableIndex;
+ off = off * 4; // 4 bytes per slot
+ mfunc = *((unsigned long **)pAdjustedThisPtr); // get the address of the vtable
+ mfunc = (unsigned long *)((char *)mfunc + off); // get the address from the vtable entry at offset
+ mfunc = *((unsigned long **)mfunc); // the function is stored at the address
+ typedef void (*FunctionCall)(sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32);
+ FunctionCall ptr = (FunctionCall)mfunc;
+
+ /* Set up the machine registers and invoke the function */
+
+ __asm__ __volatile__ (
+ "lwz r3, 0(%0)\n\t"
+ "lwz r4, 4(%0)\n\t"
+ "lwz r5, 8(%0)\n\t"
+ "lwz r6, 12(%0)\n\t"
+ "lwz r7, 16(%0)\n\t"
+ "lwz r8, 20(%0)\n\t"
+ "lwz r9, 24(%0)\n\t"
+ "lwz r10, 28(%0)\n\t"
+ "lfd f1, 0(%1)\n\t"
+ "lfd f2, 8(%1)\n\t"
+ "lfd f3, 16(%1)\n\t"
+ "lfd f4, 24(%1)\n\t"
+ "lfd f5, 32(%1)\n\t"
+ "lfd f6, 40(%1)\n\t"
+ "lfd f7, 48(%1)\n\t"
+ "lfd f8, 56(%1)\n\t"
+ "lfd f9, 64(%1)\n\t"
+ "lfd f10, 72(%1)\n\t"
+ "lfd f11, 80(%1)\n\t"
+ "lfd f12, 88(%1)\n\t"
+ "lfd f13, 96(%1)\n\t"
+ : : "r" (gpr), "r" (fpr)
+ : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
+ "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
+ "f10", "f11", "f12", "f13"
+ );
+
+ // tell gcc that r3 to r10 are not available to it for doing the TOC and exception munge on the func call
+ register sal_uInt32 r3 __asm__("r3");
+ register sal_uInt32 r4 __asm__("r4");
+ register sal_uInt32 r5 __asm__("r5");
+ register sal_uInt32 r6 __asm__("r6");
+ register sal_uInt32 r7 __asm__("r7");
+ register sal_uInt32 r8 __asm__("r8");
+ register sal_uInt32 r9 __asm__("r9");
+ register sal_uInt32 r10 __asm__("r10");
+
+ (*ptr)(r3, r4, r5, r6, r7, r8, r9, r10);
+
+
+ __asm__ __volatile__ (
+ "stw r3, %1\n\t"
+ "stw r4, %2\n\t"
+ "stfd f1, %0\n\t"
+ : : "m" (dret), "m" (iret), "m" (iret2)
+ );
+
+
+ switch( eReturnType )
+ {
+ case typelib_TypeClass_HYPER:
+ case typelib_TypeClass_UNSIGNED_HYPER:
+ ((long*)pRegisterReturn)[1] = iret2;
+ // fall thru on purpose
+ case typelib_TypeClass_LONG:
+ case typelib_TypeClass_UNSIGNED_LONG:
+ case typelib_TypeClass_ENUM:
+ ((long*)pRegisterReturn)[0] = iret;
+ break;
+
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ *(unsigned short*)pRegisterReturn = (unsigned short)iret;
+ break;
+
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ *(unsigned char*)pRegisterReturn = (unsigned char)iret;
+ break;
+
+ case typelib_TypeClass_FLOAT:
+ *(float*)pRegisterReturn = (float)dret;
+ break;
+
+ case typelib_TypeClass_DOUBLE:
+ *(double*)pRegisterReturn = dret;
+ break;
+ default:
+ break;
+ }
+}
+
+
+//==================================================================================================
+static void cpp_call(
+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+ bridges::cpp_uno::shared::VtableSlot aVtableSlot,
+ typelib_TypeDescriptionReference * pReturnTypeRef,
+ sal_Int32 nParams, typelib_MethodParameter * pParams,
+ void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
+{
+ // max space for: [complex ret ptr], values|ptr ...
+ char * pCppStack =
+ (char *)alloca( sizeof(sal_Int32) + ((nParams+2) * sizeof(sal_Int64)) );
+ char * pCppStackStart = pCppStack;
+
+ // need to know parameter types for callVirtualMethod so generate a signature string
+ char * pParamType = (char *) alloca(nParams+2);
+ char * pPT = pParamType;
+
+ // return
+ typelib_TypeDescription * pReturnTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+ OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
+
+ void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
+
+ if (pReturnTypeDescr)
+ {
+ if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+ {
+ pCppReturn = pUnoReturn; // direct way for simple types
+ }
+ else
+ {
+ // complex return via ptr
+ pCppReturn = *(void **)pCppStack
+ = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+ ? alloca( pReturnTypeDescr->nSize )
+ : pUnoReturn); // direct way
+ *pPT++ = 'C'; //signify that a complex return type on stack
+ pCppStack += sizeof(void *);
+ }
+ }
+ // push this
+ void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI())
+ + aVtableSlot.offset;
+ *(void**)pCppStack = pAdjustedThisPtr;
+ pCppStack += sizeof( void* );
+ *pPT++ = 'I';
+
+ // stack space
+ OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+ // args
+ void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams );
+ // indizes of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams);
+ // type descriptions for reconversions
+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams));
+
+ sal_Int32 nTempIndizes = 0;
+
+ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+ {
+ const typelib_MethodParameter & rParam = pParams[nPos];
+ typelib_TypeDescription * pParamTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+ if (!rParam.bOut
+ && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+ {
+ uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+
+ switch (pParamTypeDescr->eTypeClass)
+ {
+
+ // we need to know type of each param so that we know whether to use
+ // gpr or fpr to pass in parameters:
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list