[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