1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/* -*- 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/.
*/
#include "basictest.hxx"
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <basic/sbstar.hxx>
#include <basic/basrdll.hxx>
#include <basic/sbmod.hxx>
#include <basic/sbmeth.hxx>
#include <basic/sbuno.hxx>
#include <osl/file.hxx>
void MacroSnippet::InitSnippet()
{
mpBasic = new StarBASIC();
StarBASIC::SetGlobalErrorHdl( LINK( this, MacroSnippet, BasicErrorHdl ) );
}
void MacroSnippet::MakeModule( const OUString& sSource )
{
mpMod = mpBasic->MakeModule( "TestModule", sSource );
}
MacroSnippet::MacroSnippet( const OUString& sSource )
: mbError(false)
{
InitSnippet();
MakeModule( sSource );
}
MacroSnippet::MacroSnippet()
: mbError(false)
{
InitSnippet();
}
void MacroSnippet::LoadSourceFromFile( const OUString& sMacroFileURL )
{
OUString sSource;
fprintf(stderr,"loadSource opening macro file %s\n", OUStringToOString( sMacroFileURL, RTL_TEXTENCODING_UTF8 ).getStr() );
osl::File aFile(sMacroFileURL);
if(aFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None)
{
sal_uInt64 size;
sal_uInt64 size_read;
if(aFile.getSize(size) == osl::FileBase::E_None)
{
void* buffer = calloc(1, size+1);
CPPUNIT_ASSERT(buffer);
if(aFile.read( buffer, size, size_read) == osl::FileBase::E_None)
{
if(size == size_read)
{
OUString sCode(static_cast<sal_Char*>(buffer), size, RTL_TEXTENCODING_UTF8);
sSource = sCode;
}
}
free(buffer);
}
}
CPPUNIT_ASSERT_MESSAGE( "Source is empty", ( sSource.getLength() > 0 ) );
MakeModule( sSource );
}
SbxVariableRef MacroSnippet::Run( const css::uno::Sequence< css::uno::Any >& rArgs )
{
SbxVariableRef pReturn;
if ( !Compile() )
return pReturn;
SbMethod* pMeth = mpMod.is() ? static_cast<SbMethod*>(mpMod->Find( "doUnitTest", SbxClassType::Method )) : nullptr;
if ( pMeth )
{
if ( rArgs.getLength() )
{
SbxArrayRef aArgs = new SbxArray;
for ( int i=0; i < rArgs.getLength(); ++i )
{
SbxVariable* pVar = new SbxVariable();
unoToSbxValue( pVar, rArgs[ i ] );
aArgs->Put( pVar, i + 1 );
}
pMeth->SetParameters( aArgs.get() );
}
pReturn = new SbxMethod( *static_cast<SbxMethod*>(pMeth));
}
return pReturn;
}
SbxVariableRef MacroSnippet::Run()
{
css::uno::Sequence< css::uno::Any > aArgs;
return Run( aArgs );
}
bool MacroSnippet::Compile()
{
CPPUNIT_ASSERT_MESSAGE("module is NULL", mpMod.get() != nullptr );
mpMod->Compile();
return !mbError;
}
bool MacroSnippet::HasError() { return mbError; }
IMPL_LINK( MacroSnippet, BasicErrorHdl, StarBASIC *, /*pBasic*/, bool)
{
fprintf(stderr,"(%d:%d)\n",
StarBASIC::GetLine(), StarBASIC::GetCol1());
fprintf(stderr,"Basic error: %s\n", OUStringToOString( StarBASIC::GetErrorText(), RTL_TEXTENCODING_UTF8 ).getStr() );
mbError = true;
return false;
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|