[mapguide-commits] r1319 - trunk/MgDev/Server/src/Services/Mapping

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Wed Mar 21 16:21:10 EDT 2007


Author: traianstanev
Date: 2007-03-21 16:21:10 -0400 (Wed, 21 Mar 2007)
New Revision: 1319

Modified:
   trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.cpp
   trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.h
Log:
Fix for image resource caching (it was not setting the byte array length correctly). Part of patch submitted by Martin. Other part to follow shortly.

Modified: trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.cpp	2007-03-21 19:08:00 UTC (rev 1318)
+++ trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.cpp	2007-03-21 20:21:10 UTC (rev 1319)
@@ -41,11 +41,11 @@
             delete (SymbolDefinition*)(iter->second);
     }
 
-    for (std::map<STRING, unsigned char*>::iterator iter = m_mImageCache.begin();
+    for (std::map<STRING, ImageCacheT>::iterator iter = m_mImageCache.begin();
         iter != m_mImageCache.end(); iter++)
     {
-        if (iter->second != IMAGE_ERROR)
-            delete[] (unsigned char*)(iter->second);
+        if (iter->second.data != IMAGE_ERROR)
+            delete[] (unsigned char*)(iter->second.data);
     }
 }
 
@@ -108,40 +108,51 @@
     return ret;
 }
 
-const unsigned char* SEMgSymbolManager::GetImageData(const wchar_t* resource, int& length)
+const unsigned char* SEMgSymbolManager::GetImageData(const wchar_t* resource, const wchar_t* name, int& length)
 {
-    STRING uniqueName = STRING(resource);
-    unsigned char* ret = m_mImageCache[uniqueName];
+    if (!resource)
+        resource = L"";
+
+    STRING uniqueName = STRING(resource) + STRING(name);
+    ImageCacheT item = m_mImageCache[uniqueName];
+    unsigned char* ret = NULL;
     length = 0;
 
-    if (ret == IMAGE_ERROR)
+    if (item.data == IMAGE_ERROR)
         return NULL;
 
-    if (!ret)
+    if (item.data)
     {
+        ret = item.data;
+        length = item.size;
+    }
+    else
+    {
         try
         {
             Ptr<MgByteReader> sdReader;
 
             if (wcsncmp(uniqueName.c_str(), L"Library://", 10) == 0)
             {
-                MgResourceIdentifier resId(uniqueName);
+                MgResourceIdentifier resId(resource);
 
-                //get and parse the mapdef
-                sdReader = m_svcResource->GetResourceContent(&resId, L"");
+                //get the image named "name" attached to resource "resId"
+                sdReader = m_svcResource->GetResourceData(&resId, name);
             }
             else
             {
-                sdReader = new MgByteReader(uniqueName, MgMimeType::Png, false);
+                sdReader = new MgByteReader(name, MgMimeType::Png, false);
             }
 
             INT64 len = sdReader->GetLength();
             if (len > 0 && len < 16*1024*1024) // draw the line at 16 MB
             {
-                length = (int)len;
-                ret = new unsigned char[length];
-                sdReader->Read(ret, length);
-                m_mImageCache[uniqueName] = ret;
+                ImageCacheT item;
+                length = item.size = (int)len;
+                item.data = new unsigned char[length];
+                sdReader->Read(item.data, length);
+                m_mImageCache[uniqueName] = item;
+                ret = item.data;
             }
         }
         catch (MgException* e)
@@ -150,8 +161,10 @@
             //Set it to something else that's invalid (like 1) in the cache so that
             //we know there was an error and don't try to get it again.
             e->Release();
+            item.size = 0;
+            item.data = IMAGE_ERROR;
+            m_mImageCache[uniqueName] = item;
             ret = NULL;
-            m_mImageCache[uniqueName] = IMAGE_ERROR;
         }
     }
 

Modified: trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.h
===================================================================
--- trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.h	2007-03-21 19:08:00 UTC (rev 1318)
+++ trunk/MgDev/Server/src/Services/Mapping/SEMgSymbolManager.h	2007-03-21 20:21:10 UTC (rev 1319)
@@ -23,6 +23,12 @@
 
 class MgResourceService;
 
+struct ImageCacheT
+{
+    int size;
+    unsigned char* data;
+};
+
 // MappingService specific implementation of the RS_SymbolManager interface.
 // It retrieves DWF symbol data from the resource service and caches it
 // for reuse by stylization.
@@ -33,12 +39,12 @@
     virtual ~SEMgSymbolManager();
 
     virtual SymbolDefinition* GetSymbolDefinition(const wchar_t* resource);
-    virtual const unsigned char* GetImageData(const wchar_t* resource, int& length);
+    virtual const unsigned char* GetImageData(const wchar_t* resource, const wchar_t* name, int& length);
 
 private:
     MgResourceService* m_svcResource;
     std::map<STRING, SymbolDefinition*> m_mSymbolCache;
-    std::map<STRING, unsigned char*> m_mImageCache;
+    std::map<STRING, ImageCacheT> m_mImageCache;
 };
 
 #endif



More information about the mapguide-commits mailing list