How to fix an issue in OpenOffice.org Michel Loiseleur Wednesday, 19

How to fix an issue
in OpenOffice.org
Michel Loiseleur
Wednesday, 19th of September, 2007
[email protected]
Who am I
●
There was the day before meeting OOo
Open Source Software Assurance
●
One place to fix'em all
●
A guaranted time of correction (SLA)
●
Patches are contributed to community
The real OS world
You
Linagora's answer
You
The Goal
Fix an issue
in less than
5 days
The tools
●
●
Forget tools like
–
Eclipse
–
Visual Studio
–
Anjuta
–
Kdevelop
The code source is too big for them
The tools
●
You have choices between
–
Emacs
–
Vim
–
SlickEdit (Commercial)
–
MSDev (Commercial)
●
See Developer_Tools in the wiki
●
Cscope will be your saviour
The source code
●
As of SRC680_m224, there is 1,9 Gb of
sources
The source code
●
So many code, but hey, do not panic
–
100 folders which are < 2Mbs
–
helpcontent2 (480Mbs) won't need any patch
–
19 external library (sometimes patched)
–
binfilter (62Mbs) is a SO 5.2
The source code
●
Actually, it can be shortened like this
The source code
●
●
You will probably hack in one of those :
–
vcl : Visual Component Library (15 MB)
–
sw : Writer (71 MB)
–
sc, scaddins, scsolver : Calc (80 MB)
–
sd, svx : Draw & Impress (114 MB)
In those folders lies easily 80% of issues
What does it look like
sc/source/ui/docshell/docfunc.cxx:
ScPostIt aNote(pDoc);
//
Zeichenobjekt updaten
//! bei gelocktem Paint auch erst spaeter !!!
ScDetectiveFunc aDetFunc( pDoc, rPos.Tab() );
aDetFunc.ShowComment( rPos.Col(), rPos.Row(),
FALSE ); // FALSE: nur wenn gefunden
}
The saviour
●
–
http://lxr.go-oo.org as an alternative
–
don't ever activate one of the graph options
ScDocument
●
652 public members
●
2 static public members
●
2 public attributes
●
30 private members
●
112 private attributes
●
10 friend classes
The source code
●
That was only one class
●
There are 1977 classes in Calc
●
How can one be able to fix issue in this ?
Tips #1
Don't procrastinate
Just
Do it
Find an issue
●
Sample #1: i7500
–
I can't copy and paste on merged cells
–
It comes with this message box :
"Cell merge not possible if cells already merged!"
Understand the issue
Find the code
●
We have an error message so...
●
We can find the corresponding code (!)
●
grep it and « voilà », in globstr.src
–
STR_MSSG_PASTEFROMCLIP_1
–
STR_MSSG_MOVEBLOCKTO_0
–
STR_MSSG_MERGECELLS_0
Find the file
●
an other grep on « PASTEFROMCLIP » :
●
source/ui/view/viewfun3.cxx:993:
if (bClipOver)
if (lcl_SelHasAttrib(...,HASATTR_OVERLAPPED )) {
ErrorMessage(STR_MSSG_PASTEFROMCLIP_1);
delete pTransClip;
return FALSE;
}
Fix it
if (bClipOver)
if (lcl_SelHasAttrib(...,HASATTR_OVERLAPPED )) {
ScRange destRange( ... );
pDocSh->GetDocFunc().
UnmergeCells(destRange, FALSE, TRUE);
}
That's all folks
Tips #2
You have to know
how to fix the issue
BEFORE
you look at the code
Find an issue
●
●
Sample #2: i51564
–
Open Calc.
–
Fill values A1=1,A2=2,A3=3
–
Select A1,A2,A3
–
Click on "SUM" symbol on the formula toolbar
All the selected values becomes 0 or #REF!
Find the code
●
A grep on « sum » gave ~ 1000 results
●
The feature create a « sum » formula
●
It must use some kind of operation code
●
grep on 'SUM_IF' to find where are opcodes
●
grep on 'SC_OPCODE_SUM' gave 2 files :
–
source/core/tool/appoptio.cxx:106
–
source/ui/view/viewfun2.cxx:725
The Fix
●
●
It was
–
10 pages of specifications
–
5 versions of the patch
–
collaboration between 5 people
for about 30 lines of C++ code
At the end
●
We took more time to think to
–
●
How we want the fix to behave
Than to
–
Really fix it with writing code
Find an issue
●
●
●
Sample #3 : i74651
Removing with API an image from a Calc
document does not change the modified
state of the document.
It can even cause crashes if the
document was not saved
Crash
Really easy. It's tracked in 3 steps :
1. Grab name of files from the trace
2. Recompile only them with
$ build debug=TRUE
3. Launch gdb
Uno API
●
More difficult. A search in developer guide
Uno API
●
The invalid call is « remove » on a
« DrawPage ».
●
That's the only valid entry point to look.
●
http://lxr.go-oo.org returns nothing
●
Time to use doxygen on SD and on SVX
–
SdDrawPage::remove
–
SvxDrawPage::remove
Uno API : The fix
●
After finding the code
●
Find how to use the Undo* API
●
●
The faster way is to take a look at how it
is called
The gigantic code size of OpenOffice.org
Code can become an advantage
Tips #3
Always look at
a reference code
BEFORE
using an API call
After one year
●
Goal attained
●
My last issue took less
–
●
than 15 minutes to fix
You can make it too
Thanks for your attention
[email protected]