[haiku-commits] r34358 - haiku/trunk/src/servers/midi

  • From: philippe.houdoin@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 29 Nov 2009 22:39:49 +0100 (CET)

Author: phoudoin
Date: 2009-11-29 22:39:49 +0100 (Sun, 29 Nov 2009)
New Revision: 34358
Changeset: http://dev.haiku-os.org/changeset/34358/haiku
Ticket: http://dev.haiku-os.org/ticket/4562

Modified:
   haiku/trunk/src/servers/midi/DeviceWatcher.cpp
   haiku/trunk/src/servers/midi/DeviceWatcher.h
Log:
Stupid me, vector icon data loaded by a local BResources 
object is lost outside its scope. 
Now vector data is copied instead.

Spotted by Pete Goodeve, thanks!
This should close #4562.


Modified: haiku/trunk/src/servers/midi/DeviceWatcher.cpp
===================================================================
--- haiku/trunk/src/servers/midi/DeviceWatcher.cpp      2009-11-29 21:38:47 UTC 
(rev 34357)
+++ haiku/trunk/src/servers/midi/DeviceWatcher.cpp      2009-11-29 21:39:49 UTC 
(rev 34358)
@@ -63,11 +63,23 @@
 
        BResources resources;
        if (resources.SetTo(&file) == B_OK) {
-               fVectorIconData = (const uint8*)resources.LoadResource(
-                       B_VECTOR_ICON_TYPE,     "endpoint_vector_icon", 
&fVectorIconDataSize);
+               size_t dataSize;
+               // Load MIDI port endpoint vector icon
+               const uint8* data = (const uint8*)resources.LoadResource(
+                       B_VECTOR_ICON_TYPE,     "endpoint_vector_icon", 
&dataSize);
+                       
+               if (data != NULL && dataSize > 0)
+                       fVectorIconData = new(std::nothrow) uint8[dataSize];
+                       
+               if (fVectorIconData) {
+                       // data is own by resources local object: copy its 
content for
+                       // later use
+                       memcpy(fVectorIconData, data, dataSize);
+                       fVectorIconDataSize = dataSize;
+               }
        }
 
-       // Render 32x32 and 16x16 icons for R5 compatibility    
+       // Render 32x32 and 16x16 B_CMAP8 icons for R5 compatibility    
        if (fVectorIconData != NULL) {
                fLargeIcon = new(std::nothrow) BBitmap(BRect(0, 0, 31, 31), 
B_CMAP8);
                fMiniIcon  = new(std::nothrow) BBitmap(BRect(0, 0, 15, 15), 
B_CMAP8);
@@ -94,6 +106,7 @@
        
        delete fLargeIcon;
        delete fMiniIcon;
+       delete[] fVectorIconData;
 }
 
 

Modified: haiku/trunk/src/servers/midi/DeviceWatcher.h
===================================================================
--- haiku/trunk/src/servers/midi/DeviceWatcher.h        2009-11-29 21:38:47 UTC 
(rev 34357)
+++ haiku/trunk/src/servers/midi/DeviceWatcher.h        2009-11-29 21:39:49 UTC 
(rev 34358)
@@ -39,7 +39,7 @@
        typedef HashMap<HashString, DeviceEndpoints*> DeviceEndpointsMap;
        DeviceEndpointsMap              fDeviceEndpointsMap;
 
-       const uint8* fVectorIconData;
+       uint8* fVectorIconData;
        size_t fVectorIconDataSize;
        BBitmap* fLargeIcon;
        BBitmap* fMiniIcon;


Other related posts:

  • » [haiku-commits] r34358 - haiku/trunk/src/servers/midi - philippe . houdoin