There is no public API which we can use to achieve the goal.So we have to hack the launcher.mbm which is used to hold the wallpaper image.
The following code segment which was used in our project demontrates this:
void PutQuad( TPtr8& des, TInt val )
{
TUint8 buffer[4];
TUint8* ptr = (TUint8*)&buffer;
TUint8* pt = (TUint8*)&val;
*ptr++ = *(pt++);
*ptr++ = *(pt++);
*ptr++ = *(pt++);
*ptr++ = *(pt++);
des.Append((TUint8*)&buffer, 4);
}
_LIT(KMbmFileName, "c:\\system\\Data\\Themes\\wallpaper\\launcher.mbm");
void SaveWallpaper(BYTE* grBuf8, TSize size)
{
TSize size1=size;
TSize size2(143, 101);
TInt fileHeaderLen = 5*4;
TInt firstSize = 10*4 + (size1.iHeight * size1.iWidth << 1);
TInt secondSize = 10*4 + (size2.iHeight * (size2.iWidth+1) << 1); // 4 byte align for width
TInt trailerPos = fileHeaderLen + firstSize + secondSize;
TInt firstDataPos = fileHeaderLen;
TInt secondDataPos = firstDataPos + firstSize;
TInt noBitmaps = 2;
TInt trailerSize = 4 + noBitmaps*4;
TInt len = secondDataPos + secondSize + trailerSize;
HBufC8* outBuf = HBufC8::NewL(len);
TPtr8 des = outBuf->Des();
// file header
PutQuad(des, UID1);
PutQuad(des, UID2);
PutQuad(des, UID3);
PutQuad(des, SIG);
PutQuad(des, trailerPos);
// first bitmap header
PutQuad(des, firstSize);
PutQuad(des, 40);
PutQuad(des, size1.iWidth);
PutQuad(des, size1.iHeight);
PutQuad(des, 0);
PutQuad(des, 0);
PutQuad(des, 16);
PutQuad(des, 1);
PutQuad(des, 0);
PutQuad(des, 0);
// first bitmap data
TInt sx = 1,
sy = 39;
TInt height = size1.iHeight;
TInt width = size.iWidth<<1;
TInt scan = size1.iWidth<<1;
TUint8* ptr = grBuf8;// + ((sy-1)*width + sx<<1);
TInt j;
for( j=0; j< height; j++ )
{
ptr += width;
des.Append(ptr, scan);
}
// second bitmap header
PutQuad(des, secondSize);
PutQuad(des, 40);
PutQuad(des, size2.iWidth);
PutQuad(des, size2.iHeight);
PutQuad(des, 0);
PutQuad(des, 0);
PutQuad(des, 12);
PutQuad(des, 1);
PutQuad(des, 0);
PutQuad(des, 0);
// second bitmap data
sx = 1, sy = 39;
scan = (size2.iWidth+1)<<1;
height = size2.iHeight;
ptr = grBuf8;// + ((sy-1)*width + sx<<1);
for( j=0; j< height; j++ )
{
ptr += width;
des.Append(ptr, scan);
}
// mbm trailer
PutQuad(des, noBitmaps);
PutQuad(des, firstDataPos);
PutQuad(des, secondDataPos);
TInt aStat = KErrNone;
RFs m_fs;
if( (aStat=m_fs.Connect()) != KErrNone )
return;
//aStat = m_fs.SetSessionPath( kMFPath() );
// Write MBM Data to file
RFile file;
TInt res = file.Replace(m_fs, KMbmFileName, EFileShareAny | EFileWrite | EFileStream );
User::LeaveIfError(res);
file.Write(des);
file.Close();
delete outBuf;
m_fs.Close();
//delete outBuf;
}