[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[platform-swt-dev] Fix for bug 25619
|
Hi,
Try to fix bug 25619, since it is important to my program :-)
I modified 3 files, try to release/reuse the event sink slot in OleControlSite. Following are the diffs.
Don't know how to create patch files, I also have the three files attached.
jml
$ diff -a --strip-trailing-cr OleEventSink.java old/OleEventSink.java
171,175d170
<
< boolean isEventTableEmpty() {
< if (eventTable==null) return true;
< else return eventTable.isEmpty();
< }
$ diff -a --strip-trailing-cr OleEventTable.java old/OleEventTable.java
65,71d64
<
< boolean isEmpty(){
< for (int i=0; i<types.length; i++) {
< if (types[i] != 0) return false;
< }
< return true;
< }
$ diff -a --strip-trailing-cr OleControlSite.java old/OleControlSite.java
48d47
< // when an item is empty, then corresponding oleEventSink and oleEventSinkGUID will be null
248d246
< int emptyindex = -1;
250,257c248,251
< if (oleEventSinkGUID[i]==null) {// slot not used
< if (emptyindex==-1) emptyindex = i;
< } else {
< if (COM.IsEqualGUID(oleEventSinkGUID[i], guid)) {
< if (iunknown == oleEventSinkIUnknown[i]) {
< index = i;
< break;
< }
---
> if (COM.IsEqualGUID(oleEventSinkGUID[i], guid)) {
> if (iunknown == oleEventSinkIUnknown[i]) {
> index = i;
> break;
264,276c258,274
< if (emptyindex == -1) {
< int oldLength = oleEventSink.length;
< OleEventSink[] newOleEventSink = new OleEventSink[oldLength + 1];
< GUID[] newOleEventSinkGUID = new GUID[oldLength + 1];
< int[] newOleEventSinkIUnknown = new int[oldLength + 1];
< System.arraycopy(oleEventSink, 0, newOleEventSink, 0, oldLength);
< System.arraycopy(oleEventSinkGUID, 0, newOleEventSinkGUID, 0, oldLength);
< System.arraycopy(oleEventSinkIUnknown, 0, newOleEventSinkIUnknown, 0, oldLength);
< oleEventSink = newOleEventSink;
< oleEventSinkGUID = newOleEventSinkGUID;
< oleEventSinkIUnknown = newOleEventSinkIUnknown;
< emptyindex = oldLength;
< }
---
> int oldLength = oleEventSink.length;
> OleEventSink[] newOleEventSink = new OleEventSink[oldLength + 1];
> GUID[] newOleEventSinkGUID = new GUID[oldLength + 1];
> int[] newOleEventSinkIUnknown = new int[oldLength + 1];
> System.arraycopy(oleEventSink, 0, newOleEventSink, 0, oldLength);
> System.arraycopy(oleEventSinkGUID, 0, newOleEventSinkGUID, 0, oldLength);
> System.arraycopy(oleEventSinkIUnknown, 0, newOleEventSinkIUnknown, 0, oldLength);
> oleEventSink = newOleEventSink;
> oleEventSinkGUID = newOleEventSinkGUID;
> oleEventSinkIUnknown = newOleEventSinkIUnknown;
>
> oleEventSink[oldLength] = new OleEventSink(this, iunknown, guid);
> oleEventSinkGUID[oldLength] = guid;
> oleEventSinkIUnknown[oldLength] = iunknown;
> oleEventSink[oldLength].AddRef();
> oleEventSink[oldLength].connect();
> oleEventSink[oldLength].addListener(eventID, listener);
278,283d275
< oleEventSink[emptyindex] = new OleEventSink(this, iunknown, guid);
< oleEventSinkGUID[emptyindex] = guid;
< oleEventSinkIUnknown[emptyindex] = iunknown;
< oleEventSink[emptyindex].AddRef();
< oleEventSink[emptyindex].connect();
< oleEventSink[emptyindex].addListener(eventID, listener);
354,357c346,347
< if (sink != null) {
< sink.disconnect();
< sink.Release();
< }
---
> sink.disconnect();
> sink.Release();
653c643
< if (oleEventSinkGUID[i]!=null && COM.IsEqualGUID(oleEventSinkGUID[i], guid)) {
---
> if (COM.IsEqualGUID(oleEventSinkGUID[i], guid)) {
656,662d645
< if (oleEventSink[i].isEventTableEmpty()) {
< oleEventSink[i].disconnect();
< oleEventSink[i].Release();
< oleEventSinkGUID[i] = null;
< oleEventSink[i] = null;
< oleEventSinkIUnknown[i] = 0;
< }
Attachment:
OleEvent.java
Description: Binary data
Attachment:
OleEventSink.java
Description: Binary data
Attachment:
OleControlSite.java
Description: Binary data