This adds Saved Email Messages and actually has the patch attached (duh). 
-edge
Index: src/s11n-boost.h
===================================================================
RCS file: /cvsroot/barry/barry/src/s11n-boost.h,v
retrieving revision 1.8
diff -u -r1.8 s11n-boost.h
--- src/s11n-boost.h	6 Jun 2007 20:52:55 -0000	1.8
+++ src/s11n-boost.h	7 Jun 2007 23:09:30 -0000
@@ -234,6 +234,24 @@
 	}
 }
 
+template <class ArchiveT>
+void serialize(ArchiveT &ar, Barry::SavedMessage &m, const unsigned int ver)
+{
+	ar & make_nvp("From", m.From);
+	ar & make_nvp("To", m.To);
+	ar & make_nvp("Cc", m.Cc);
+	ar & make_nvp("Bcc", m.Bcc);
+	ar & make_nvp("Sender", m.Sender);
+	ar & make_nvp("ReplyTo", m.ReplyTo);
+	ar & make_nvp("Subject", m.Subject);
+	ar & make_nvp("Body", m.Body);
+	ar & make_nvp("Attachment", m.Attachment);
+
+	if( ver < BARRY_POD_MAP_VERSION ) {
+		ar & make_nvp("Unknowns", m.Unknowns);
+	}
+}
+
 }} // namespace boost::serialization
 
 #endif
Index: src/record.h
===================================================================
RCS file: /cvsroot/barry/barry/src/record.h,v
retrieving revision 1.25
diff -u -r1.25 record.h
--- src/record.h	6 Jun 2007 20:52:55 -0000	1.25
+++ src/record.h	7 Jun 2007 23:09:29 -0000
@@ -205,6 +205,7 @@
 #include "r_servicebook.h"
 #include "r_task.h"
 #include "r_pin_message.h"
+#include "r_saved_message.h"
 
 #endif
 
Index: src/Makefile.am
===================================================================
RCS file: /cvsroot/barry/barry/src/Makefile.am,v
retrieving revision 1.17
diff -u -r1.17 Makefile.am
--- src/Makefile.am	6 Jun 2007 20:52:55 -0000	1.17
+++ src/Makefile.am	7 Jun 2007 23:09:29 -0000
@@ -67,6 +67,7 @@
 	r_memo.h \
 	r_message.h \
 	r_pin_message.h \
+	r_saved_message.h \
 	r_servicebook.h \
 	r_task.h \
 	socket.h \
@@ -94,6 +95,7 @@
 	r_message.cc \
 	r_pin_message.cc \
 	r_servicebook.cc \
+	r_saved_message.cc \
 	r_task.cc \
 	packet.cc packet.h \
 	controller.cc \
Index: tools/btool.cc
===================================================================
RCS file: /cvsroot/barry/barry/tools/btool.cc,v
retrieving revision 1.18
diff -u -r1.18 btool.cc
--- tools/btool.cc	6 Jun 2007 20:52:55 -0000	1.18
+++ tools/btool.cc	7 Jun 2007 23:09:30 -0000
@@ -234,6 +234,11 @@
 			new RecordParser<PINMessage, Store<PINMessage> > (
 				new Store<PINMessage>(filename, false)));
 	}
+	else if( name == "Saved Email Messages" ) {
+		return auto_ptr<Parser>(
+			new RecordParser<SavedMessage, Store<SavedMessage> > (
+				new Store<SavedMessage>(filename, false)));
+	}
 	else {
 		// unknown database, use null parser
 		return auto_ptr<Parser>( new DataDumpParser );
Index: src/r_saved_message.cc
===================================================================
RCS file: src/r_saved_message.cc
diff -N src/r_saved_message.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/r_saved_message.cc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,239 @@
+///
+/// \file	r_saved_message.cc
+///		Blackberry database record parser class for email records.
+///
+
+/*
+    Copyright (C) 2005-2007, Net Direct Inc. (http://www.netdirect.ca/)
+    Copyright (C) 2005-2007, Brian Edginton ([EMAIL PROTECTED])
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+    See the GNU General Public License in the COPYING file at the
+    root directory of this project for more details.
+*/
+
+#include "r_saved_message.h"
+#include "record-internal.h"
+#include "protocol.h"
+#include "protostructs.h"
+#include "data.h"
+#include "time.h"
+#include "error.h"
+#include "endian.h"
+#include <ostream>
+#include <iomanip>
+#include <time.h>
+#include <stdexcept>
+
+#define __DEBUG_MODE__
+#include "debug.h"
+
+using namespace std;
+using namespace Barry::Protocol;
+
+namespace Barry {
+
+///////////////////////////////////////////////////////////////////////////////
+// Message class
+
+
+// Email / message field codes
+#define SEMFC_TO		0x01		// can occur multiple times
+#define SEMFC_CC		0x02		// ditto
+#define SEMFC_BCC		0x03		// ditto
+#define SEMFC_SENDER		0x04
+#define SEMFC_FROM		0x05
+#define SEMFC_REPLY_TO		0x06
+#define SEMFC_SUBJECT		0x0b
+#define SEMFC_BODY		0x0c
+#define SEMFC_ATTACHMENT	0x16
+#define SEMFC_RECORDID		0x4b
+#define SEMFC_END		0xffff
+
+FieldLink<SavedMessage> SavedMessageFieldLinks[] = {
+   { SEMFC_TO,         "To",          0, 0,    0, &SavedMessage::To, 0 },
+   { SEMFC_CC,         "Cc",          0, 0,    0, &SavedMessage::Cc, 0 },
+   { SEMFC_BCC,        "Bcc",         0, 0,    0, &SavedMessage::Bcc, 0 },
+   { SEMFC_SENDER,     "Sender",      0, 0,    0, &SavedMessage::Sender, 0 },
+   { SEMFC_FROM,       "From",        0, 0,    0, &SavedMessage::From, 0 },
+   { SEMFC_REPLY_TO,   "ReplyTo",     0, 0,    0, &SavedMessage::ReplyTo, 0 },
+   { SEMFC_SUBJECT,    "Subject",     0, 0,    &SavedMessage::Subject, 0, 0 },
+   { SEMFC_BODY,       "Body",        0, 0,    &SavedMessage::Body, 0, 0 },
+   { SEMFC_ATTACHMENT, "Attachment",  0, 0,    &SavedMessage::Attachment, 0, 0 },
+   { SEMFC_END,        "End of List", 0, 0,    0, 0, 0 }
+};
+
+SavedMessage::SavedMessage()
+{
+	Clear();
+}
+
+SavedMessage::~SavedMessage()
+{
+}
+
+const unsigned char* SavedMessage::ParseField(const unsigned char *begin,
+					 const unsigned char *end)
+{
+	const CommonField *field = (const CommonField *) begin;
+
+	// advance and check size
+	begin += COMMON_FIELD_HEADER_SIZE + btohs(field->size);
+	if( begin > end )		// if begin==end, we are ok
+		return begin;
+
+	if( !btohs(field->size) )	// if field has no size, something's up
+		return begin;
+
+	// cycle through the type table
+	for(	FieldLink<SavedMessage> *b = SavedMessageFieldLinks;
+		b->type != SEMFC_END;
+		b++ )
+	{
+		if( b->type == field->type ) {
+			if( b->strMember ) {
+				// parse regular string
+				std::string &s = this->*(b->strMember);
+				s.assign((const char *)field->u.raw, btohs(field->size)-1);
+				return begin;	// done!
+			}
+			else if( b->addrMember ) {
+				// parse email address
+				// get dual name+addr string first
+				const char *fa = (const char*)field->u.addr.addr;
+				std::string dual(fa, btohs(field->size) - sizeof(field->u.addr.unknown));
+
+				// assign first string, using null terminator...letting std::string add it for us if it doesn't exist
+				Address &a = this->*(b->addrMember);
+				a.Name = dual.c_str();
+
+				// assign second string, using first size as starting point
+				a.Email = dual.c_str() + a.Name.size() + 1;
+				return begin;
+			}
+		}
+	}
+	// handle special cases
+	switch( field->type ) {
+	case SEMFC_RECORDID:
+		MessageRecordId = field->u.uint32;
+		return begin;
+	}
+	// if still not handled, add to the Unknowns list
+	UnknownField uf;
+	uf.type = field->type;
+	uf.data.assign((const char*)field->u.raw, btohs(field->size));
+	Unknowns.push_back(uf);
+	
+	return begin;
+}
+
+uint8_t SavedMessage::GetRecType() const
+{
+	throw std::logic_error("SavedMessage::GetRecType() called, and not supported by the USB protocol.  Should never get called.");
+}
+
+// empty API, not required by protocol
+uint32_t SavedMessage::GetUniqueId() const
+{
+	throw std::logic_error("SavedMessage::GetUniqueId() called, and not supported by the USB protocol.  Should never get called.");
+}
+
+void SavedMessage::ParseHeader(const Data &data, size_t &offset)
+{
+	// we skip the "header" since we don't know what to do with it yet
+	offset += MESSAGE_RECORD_HEADER_SIZE;
+}
+
+void SavedMessage::ParseFields(const Data &data, size_t &offset)
+{
+	const unsigned char *finish = ParseCommonFields(*this,
+		data.GetData() + offset, data.GetData() + data.GetSize());
+	offset += finish - (data.GetData() + offset);
+}
+
+void SavedMessage::BuildHeader(Data &data, size_t &offset) const
+{
+	throw std::logic_error("SavedMessage::BuildHeader not yet implemented");
+}
+
+void SavedMessage::BuildFields(Data &data, size_t &offset) const
+{
+	throw std::logic_error("SavedMessage::BuildFields not yet implemented");
+}
+
+void SavedMessage::Clear()
+{
+	From.Name.clear();
+	From.Email.clear();
+	To.Name.clear();
+	To.Email.clear();
+	Cc.Name.clear();
+	Cc.Email.clear();
+	Bcc.Email.clear();
+	Bcc.Name.clear();
+	Sender.Name.clear();
+	Sender.Email.clear();
+	ReplyTo.Name.clear();
+	ReplyTo.Email.clear();
+	Subject.clear();
+	Body.clear();
+	Attachment.clear();
+	
+	MessageRecordId = 0;
+	
+	Unknowns.clear();
+}
+
+// dump message in mbox format
+void SavedMessage::Dump(std::ostream &os) const
+{
+	// FIXME - use current time until we figure out the date headers
+	time_t fixme = time(NULL);
+	
+	os << "Record ID  (0x"   << MessageRecordId << ")\n";
+	os << "From " << (From.Email.size() ? From.Email.c_str() : "unknown")
+	   << "  " << ctime(&fixme);
+	os << "Date: " << ctime(&fixme);
+	os << "From: " << From << "\n";
+	if( To.Email.size() )
+		os << "To: " << To << "\n";
+	if( Cc.Email.size() )
+		os << "Cc: " << Cc << "\n";
+	if( Bcc.Email.size() )
+		os << "Bcc: " << Bcc << "\n";
+	if( Sender.Email.size() )
+		os << "Sender: " << Sender << "\n";
+	if( ReplyTo.Email.size())
+		os << "Reply To: " << ReplyTo << "\n";
+	if( Subject.size() )
+		os << "Subject: " << Subject << "\n";
+	os << "\n";
+	for(	std::string::const_iterator i = Body.begin();
+		i != Body.end() && *i;
+		i++)
+	{
+		if( *i == '\r' )
+			os << '\n';
+		else
+			os << *i;
+	}
+	os << "\n";
+	if( Attachment.size() )
+		os << "Attachments: " << Attachment << "\n";
+	
+	os << Unknowns;
+	os << "\n\n";
+}
+
+
+} // namespace Barry
+
Index: src/r_saved_message.h
===================================================================
RCS file: src/r_saved_message.h
diff -N src/r_saved_message.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/r_saved_message.h	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,102 @@
+///
+/// \file	r_save_message.h
+///		Blackberry database record parser class for saved email message records.
+///
+
+/*
+    Copyright (C) 2005-2007, Net Direct Inc. (http://www.netdirect.ca/)
+    Copyright (C) 2007, Brian Edginton ([EMAIL PROTECTED])
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+    See the GNU General Public License in the COPYING file at the
+    root directory of this project for more details.
+*/
+
+#ifndef __BARRY_RECORD_SAVED_MESSAGE_H__
+#define __BARRY_RECORD_SAVED_MESSAGE_H__
+
+#include "record.h"
+#include <iosfwd>
+#include <string>
+#include <vector>
+#include <map>
+#include <stdint.h>
+
+namespace Barry {
+
+//
+// NOTE:  All classes here must be container-safe!  Perhaps add sorting
+//        operators in the future.
+//
+
+/// \addtogroup RecordParserClasses
+/// @{
+
+class SavedMessage
+{
+public:
+	uint8_t RecType;
+	uint32_t RecordId;
+	
+	Address From;
+	Address To;
+	Address Cc;
+	Address Bcc;
+	Address Sender;
+	Address ReplyTo;
+	std::string Subject;
+	std::string Body;
+	std::string Attachment;
+	uint32_t MessageRecordId;
+	std::vector<UnknownField> Unknowns;
+
+public:
+	const unsigned char* ParseField(const unsigned char *begin,
+		const unsigned char *end);
+
+public:
+	SavedMessage();
+	~SavedMessage();
+
+	// Parser / Builder API (see parser.h / builder.h)
+	uint8_t GetRecType() const;
+	uint32_t GetUniqueId() const;	// empty API, not required by protocol
+	void SetIds(uint8_t Type, uint32_t Id){ RecType = Type; RecordId = Id; }
+	void ParseHeader(const Data &data, size_t &offset);
+	void ParseFields(const Data &data, size_t &offset);
+	void BuildHeader(Data &data, size_t &offset) const;
+	void BuildFields(Data &data, size_t &offset) const;
+	void Clear();
+	void Dump(std::ostream &os) const;
+	
+	// sorting
+	bool operator<(const SavedMessage &other) const { return Subject < other.Subject; }
+
+	// database name
+	static const char * GetDBName() { return "Saved Email Messages"; }
+	static uint8_t GetDefaultRecType() { return 3; }
+};
+
+inline std::ostream& operator<<(std::ostream &os, const SavedMessage &msg) {
+	msg.Dump(os);
+	return os;
+}
+
+std::ostream& operator<<(std::ostream &os, const Address &msga);
+
+
+/// @}
+
+} // namespace Barry
+
+#endif // __BARRY_RECORD_SAVED_MESSAGE_H__
+
+

Attachment: pgpriBTP1vXnb.pgp
Description: PGP signature

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Barry-devel mailing list
Barry-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/barry-devel

Reply via email to