Skip to main content

[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


Back to the top