messagingfw/biomsgfw/gfpsrc/gfp.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/gfpsrc/gfp.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,232 @@
+// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Generic File Parser:
+// - Operator logo, OTA bitmap, parser 
+// - Ringing Tones
+// Still in a rudimentary shape, pending specifications and design from Symbian.
+// At the present the parser can only parse an Operator Logo Message containing 
+// an OTA bitmap.
+// When ParseL is called the message is passed to the base class StoreL method,
+// which converts the descriptor to 8bit format,ie binary,
+// and then saves it as an attachment file. 
+// Possibles: May have to implement a ProcessL fn to either save the file in a different directory
+// or launch an application, after the user presses the accept button in the viewer.
+// 
+//
+
+
+#include <msventry.h>
+#include <biodb.h>
+//
+#include <gfp.h>
+
+
+//
+// Constructor
+//
+CMsvGenericFileParser::CMsvGenericFileParser(CRegisteredParserDll& aRegisteredParserDll, CMsvEntry& aEntry, RFs& aFs)
+: CBaseScriptParser2(aRegisteredParserDll, aEntry, aFs), 
+iState(0), iReport(0), iCompleted(0)
+    {
+    }
+
+//
+// Factory methods
+//
+EXPORT_C CMsvGenericFileParser* CMsvGenericFileParser::NewL(CRegisteredParserDll& aRegisteredParserDll, CMsvEntry& aEntry, RFs& aFs)
+    {
+    CMsvGenericFileParser* self = new (ELeave) CMsvGenericFileParser(aRegisteredParserDll, aEntry, aFs);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+void CMsvGenericFileParser::ConstructL()
+    {
+    CActiveScheduler::Add(this);
+    }
+
+CMsvGenericFileParser::~CMsvGenericFileParser()
+    {
+    if (iParsedFieldArray != NULL)
+        {
+        iParsedFieldArray->ResetAndDestroy();
+        delete iParsedFieldArray;
+        }
+	if (iSmsBuf)
+		delete iSmsBuf;
+    }
+
+void CMsvGenericFileParser::ParseL(TRequestStatus& aStatus, const TDesC& aSms)
+    {
+    TMsvEntry entry = iEntry.Entry();   //  Get the generic stuff
+    iEntryId = entry.Id();              //  store the TMsvId
+	iBioType= entry.iBioType;
+    
+    __ASSERT_DEBUG((entry.MtmData3() == 0 || entry.MtmData3() == 1),
+                            User::Panic(_L("GXXP-DLL"),KErrGeneral));
+
+    //  Already parsed....
+    if(entry.MtmData3() == 1)
+        {
+        iReport = &aStatus;
+        User::RequestComplete(iReport, KErrNone);
+        }
+    //  not parsed
+    else if(entry.MtmData3() == 0)
+        {
+        if (iSettings!= NULL)
+            {
+            delete iSettings;
+            iSettings = NULL;
+            }
+        iSettings = aSms.AllocL();         // Allocate new HBufC object
+        ChangeStateL(EParseMessage);       //Don't set initial request -just parse it???
+        aStatus = KRequestPending;
+        iReport = &aStatus;
+        }
+    else
+        {
+        User::Leave(KErrNotSupported);
+        }
+    }
+
+
+//
+//  ProcessL() --   Currently, the parser doesn't actually use a  separate
+//					 commit phase to save any information to persistant .
+//                  store. This is done as part of the ParseL function.  Therefore  
+//                  this function is superflous, and is only required to satisfy  
+//					the base class inheritance requirements.  This may change...
+//                  .. Complete  KErrNotSupported..
+//
+void CMsvGenericFileParser::ProcessL(TRequestStatus& aStatus)
+    {
+    iReport = &aStatus;
+    User::RequestComplete(iReport, KErrNotSupported);
+    }
+
+void CMsvGenericFileParser::DoCancel()
+    {
+	User::RequestComplete(iReport,KErrCancel);
+    }
+
+void CMsvGenericFileParser::RunL()
+    {
+    iCompleted = iStatus.Int();
+    if (iCompleted != KErrNone)
+        {
+        User::RequestComplete(iReport,iCompleted);
+        return;
+        }
+
+    switch (iState)
+        {
+        case EParseMessage:
+            TRAPD(err, ChangeStateL(ECompleteMessage));
+            if(err != KErrNone)
+                {
+                User::RequestComplete(iReport, err);
+                }
+            break;
+                        
+        case ECompleteMessage:
+            User::RequestComplete(iReport, KErrNone);
+            break;
+
+        default:
+            break;
+        }
+    }
+
+void CMsvGenericFileParser::ChangeStateL(TParseSession aState)
+    {
+    iState = aState;
+    switch (iState)
+        {                    
+        case EParseMessage:
+            ParseMessageL();
+            break;
+
+        case ECompleteMessage:
+            CompleteMessageL();
+            break;
+
+        default:
+            break;
+        }
+	RequestComplete(iStatus, KErrNone);
+
+    SetActive();
+    }
+
+void CMsvGenericFileParser::ParseMessageL()
+    {
+	// Header of message has already been stripped away by Socket Observer
+	// The message body is therefore our binary data converted to unicode.
+	// We need to call a function to convert descriptor and create an 
+	// eight bit attachment file. Also want to put a message into the body
+
+	// Store (Ringing Tones or OL/VCD/VCL...) to file 
+
+	TUid uid;
+	TInt count =0;
+	HBufC* fileExt=NULL;
+
+	CBIODatabase* bioDB = CBIODatabase::NewL(iFs);
+	CleanupStack::PushL(bioDB);
+	
+	count = bioDB->BIOCount();
+	while (count--)
+		{
+		bioDB->GetBioMsgID(count, uid);
+		if(uid == TUid::Uid(iBioType))
+			{
+			fileExt=bioDB->GetFileExtL(uid).AllocLC();//get file extension
+			break;
+			}
+		}
+
+	if(fileExt == NULL || fileExt->Length()<=0)
+		User::Leave(KErrNotFound);
+	
+	TBuf<64> tempBuf;
+	tempBuf.Format(_L("%x"), iEntry.Entry().Id());
+	tempBuf.Append(fileExt->Des());
+	StoreL(TFileName(tempBuf));   // pass the filename to base class method - creates a new folder 
+						// linked to message entry and stores body as an 8 bit  attachment file
+		
+	CleanupStack::PopAndDestroy(2);// fileExt, bioDB
+    }
+
+void CMsvGenericFileParser::CompleteMessageL()
+    {
+	// Binary data has been saved in attachment file. 
+
+	iEntry.SetEntryL(iEntryId);
+
+    //  Change the current message details
+	TMsvEntry entry= iEntry.Entry();
+
+    entry.SetMtmData3(1);    //  Indicates that we've parsed it..
+
+	iEntry.ChangeL(entry);
+    }
+
+void CMsvGenericFileParser::RequestComplete(TRequestStatus& aStatus, TInt aError)
+    {
+    TRequestStatus* p = &aStatus;
+    User::RequestComplete(p, aError);
+    }