00001
00002
00003 #ifndef _MAIL_STORE_H_
00004 #define _MAIL_STORE_H_
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "LgiInterfaces.h"
00047 #include "GMime.h"
00048 #include "GOptionsFile.h"
00049 #include "GVariant.h"
00050
00051 class GDataI;
00052 class GDataFolderI;
00053 class GDataStoreI;
00054 class GDataPropI;
00055 typedef GAutoPtr<GStreamI> GAutoStreamI;
00056 void ParseIdList(char *In, List<char> &Out);
00057
00062 #define M_STORAGE_EVENT (M_USER+0x500)
00063
00065 #define FIELD_IS_ONLINE -100
00066 #define FIELD_PROFILE_IMAP_LISTING -101
00067 #define FIELD_PROFILE_IMAP_SELECT -102
00068
00069 #ifdef WIN32
00070
00071 #define GDATA_INT_PROP(name, id) \
00072 int Get##name() { if (!Object) { _asm int 3 } return Object ? Object->GetInt(id) : 0; } \
00073 bool Set##name(int val) { LgiAssert(Object); return Object ? Object->SetInt(id, val) : false; }
00074
00075 #define GDATA_STR_PROP(name, id) \
00076 char *Get##name() { if (!Object) { _asm int 3 } return Object ? Object->GetStr(id) : 0; } \
00077 bool Set##name(const char *val) { LgiAssert(Object); return Object ? Object->SetStr(id, val) : false; }
00078
00079 #define GDATA_DATE_PROP(name, id) \
00080 GDateTime *Get##name() { if (!Object) { _asm int 3 } return (Object ? Object->GetDate(id) : 0); } \
00081 bool Set##name(GDateTime *val) { LgiAssert(Object); return Object ? Object->SetDate(id, val) : false; }
00082
00083 #define GDATA_PERM_PROP(name, id) \
00084 ScribePerm Get##name() { if (!Object) { _asm int 3 } return (ScribePerm) (Object ? Object->GetInt(id) : 0); } \
00085 bool Set##name(ScribePerm val) { LgiAssert(Object); return Object ? Object->SetInt(id, val) : false; }
00086
00087 #else
00088
00089 #define GDATA_INT_PROP(name, id) \
00090 int Get##name() { return Object ? Object->GetInt(id) : 0; } \
00091 bool Set##name(int val) { return Object ? Object->SetInt(id, val) : false; }
00092
00093 #define GDATA_STR_PROP(name, id) \
00094 char *Get##name() { return Object ? Object->GetStr(id) : 0; } \
00095 bool Set##name(const char *val) { return Object ? Object->SetStr(id, val) : false; }
00096
00097 #define GDATA_DATE_PROP(name, id) \
00098 GDateTime *Get##name() { return (Object ? Object->GetDate(id) : 0); } \
00099 bool Set##name(GDateTime *val) { return Object ? Object->SetDate(id, val) : false; }
00100
00101 #define GDATA_PERM_PROP(name, id) \
00102 ScribePerm Get##name() { return (ScribePerm) (Object ? Object->GetInt(id) : 0); } \
00103 bool Set##name(ScribePerm val) { return Object ? Object->SetInt(id, val) : false; }
00104
00105
00106 #endif
00107
00109 enum Store3Status
00110 {
00112 Store3Error,
00115 Store3Delayed,
00117 Store3Success,
00118 };
00119
00121 enum Store3DataState
00122 {
00123 Store3None,
00124 Store3Headers,
00125 Store3Loaded,
00126 };
00127
00129 template <class T>
00130 class GDataIterator
00131 {
00132 public:
00133 virtual ~GDataIterator() {}
00134
00136 virtual T Create(GDataStoreI *Store) = 0;
00138 virtual T First() = 0;
00140 virtual T Next() = 0;
00142 virtual int Length() = 0;
00144 virtual T operator [](int idx) = 0;
00146 virtual int IndexOf(T n) = 0;
00149 virtual bool Delete(T ptr) = 0;
00152 virtual bool Insert(T ptr, int idx = -1) = 0;
00155 virtual bool Empty() = 0;
00158 virtual bool DeleteObjects() = 0;
00159 };
00160
00161
00162 typedef GDataIterator<GDataPropI*> *GDataIt;
00163
00164 #define EmptyVirtual LgiAssert(0); return 0
00165
00167 class GDataPropI : virtual public GDom
00168 {
00169 public:
00170 virtual ~GDataPropI() {}
00171
00173 virtual GDataPropI &operator =(GDataPropI &p) { LgiAssert(0); return *this; }
00175 virtual char *GetStr(int id) { EmptyVirtual; }
00178 virtual bool SetStr(int id, const char *str) { EmptyVirtual; }
00180 virtual int GetInt(int id) { EmptyVirtual; }
00182 virtual bool SetInt(int id, int i) { EmptyVirtual; }
00184 virtual GDateTime *GetDate(int id) { EmptyVirtual; }
00186 virtual bool SetDate(int id, GDateTime *i) { EmptyVirtual; }
00188 virtual GDataPropI *GetObj(int id) { EmptyVirtual; }
00190 virtual GDataIt GetList(int id) { EmptyVirtual; }
00192 virtual bool SetMime(GAutoPtr<GMime> m) { LgiAssert(!"Pretty sure you should be implementing this"); return false; }
00193 };
00194
00197 class GDataI : virtual public GDataPropI
00198 {
00199 public:
00200 void *UserData;
00201
00202 GDataI() { UserData = 0; }
00203 virtual ~GDataI() { }
00204
00206 virtual GDataI &operator =(GDataI &p) = 0;
00207
00210 virtual int Type() = 0;
00213 virtual bool IsOnDisk() = 0;
00215 virtual bool IsOrphan() = 0;
00217 virtual uint64 Size() = 0;
00222 virtual bool Save(GDataI *Parent = 0) = 0;
00226 virtual Store3Status Delete() = 0;
00228 virtual GDataStoreI *GetStore() = 0;
00231 virtual GAutoStreamI GetStream(const char *file, int line) = 0;
00235 virtual bool SetStream(GAutoStreamI stream) { return false; }
00236 };
00237
00239 class GDataFolderI : virtual public GDataI
00240 {
00241 public:
00242 virtual ~GDataFolderI() {}
00243
00245 virtual GDataIterator<GDataFolderI*> &SubFolders() = 0;
00247 virtual GDataIterator<GDataI*> &Children() = 0;
00249 virtual GDataIterator<GDataPropI*> &Fields() = 0;
00252 virtual Store3Status DeleteAllChildren() { return Store3Error; }
00254 virtual void OnSelect(bool s) {}
00256 virtual void OnCommand(const char *Name) {}
00257 };
00258
00262 class GDataEventsI
00263 {
00264 public:
00265 virtual ~GDataEventsI() {}
00266
00269 virtual void Post(GDataStoreI *store, void *Param) {}
00271 virtual bool GetSystemPath(int Folder, GVariant &Path) { return false; }
00273 virtual GOptionsFile *GetOptions(bool Create = false) { return 0; }
00275 virtual void OnNew(GDataFolderI *parent, GArray<GDataI*> &new_items, int pos, bool is_new) = 0;
00277 virtual bool OnDelete(GDataFolderI *parent, GArray<GDataI*> &items) = 0;
00279 virtual bool OnMove(GDataFolderI *new_parent, GDataFolderI *old_parent, GArray<GDataI*> &items) = 0;
00281 virtual bool OnChange(GArray<GDataI*> &items, int FieldHint) = 0;
00283 virtual void OnIntPropChange(GDataStoreI *store, int prop) {}
00285 virtual void OnStrPropChange(GDataStoreI *store, int prop) {}
00287 virtual GStreamI *GetLogger(GDataStoreI *store) { return 0; }
00289 virtual bool Match(GDataStoreI *store, GDataPropI *Addr, int ObjectType, GArray<GDataI*> &Matches) { return 0; }
00290 };
00291
00317 class GDataStoreI : virtual public GDataPropI
00318 {
00319 public:
00320 class GDsTransaction
00321 {
00322 protected:
00323 GDataStoreI *Store;
00324
00325 public:
00326 GDsTransaction(GDataStoreI *s)
00327 {
00328 Store = s;
00329 }
00330
00331 virtual ~GDsTransaction() {}
00332 };
00333
00334 typedef GAutoPtr<GDsTransaction> StoreTrans;
00335
00336 enum DataStoreStatus
00337 {
00338 DsOk = 0,
00339 DsError,
00340 DsMissing,
00341 DsUpgradeRequired,
00342 };
00343
00344 virtual ~GDataStoreI() {}
00345
00347 virtual uint64 Size() = 0;
00349 virtual GDataI *Create(int Type) = 0;
00351 virtual GDataFolderI *GetRoot(bool create = false) = 0;
00362 virtual Store3Status Move
00363 (
00365 GDataFolderI *NewFolder,
00367 GArray<GDataI*> &Items
00368 ) = 0;
00384 virtual Store3Status Delete
00385 (
00387 GArray<GDataI*> &Items,
00389 bool ToTrash
00390 ) = 0;
00401 virtual Store3Status Change
00402 (
00404 GArray<GDataI*> &Items,
00406 int PropId,
00409 GVariant &Value
00410 ) = 0;
00412 virtual bool Compact(GViewI *Parent, Progress *Prog, int Param = 0) = 0;
00415 virtual bool Upgrade(GViewI *Parent, Progress *Prog, GAutoString *Error = 0) { return false; }
00417 virtual void OnEvent(void *Param) = 0;
00420 virtual bool OnIdle() = 0;
00422 virtual GDataEventsI *GetEvents() = 0;
00424 virtual StoreTrans StartTransaction() { return StoreTrans(0); }
00425 };
00426
00429 extern GDataStoreI *OpenMail2
00430 (
00432 char *Mail2Folders,
00434 GDataEventsI *Callback,
00436 bool Create = false
00437 );
00438
00441 extern GDataStoreI *OpenMail3
00442 (
00444 char *Mail3Folder,
00446 GDataEventsI *Callback,
00448 bool Create = false
00449 );
00450
00453 extern GDataStoreI *OpenImap
00454 (
00456 char *Host,
00458 char *User,
00460 char *Pass,
00463 int ConnectFlags,
00464 GDataEventsI *Callback,
00465 GStream *Log,
00466 int AccoundId = 0
00467 );
00468
00470
00471 template <class T>
00472 class DNullIterator : public GDataIterator<T>
00473 {
00474 public:
00475 T First() { return 0; }
00476 T Next() { return 0; }
00477 int Length() { return 0; }
00478 T operator [](int idx) { return 0; }
00479 bool Delete(T ptr) { return 0; }
00480 bool Insert(T ptr, int idx = -1) { return 0; }
00481 bool DeleteObjects() { return 0; }
00482 bool Empty() { return false; }
00483 int IndexOf(T n) { return -1; }
00484 };
00485
00486 enum IteratorState
00487 {
00488 Unloaded,
00489 Loading,
00490 Loaded
00491 };
00492
00493 template <typename TPub, typename TPriv, typename TStore>
00494 class DIterator : public GDataIterator<TPub*>
00495 {
00496 int Cur;
00497
00498 public:
00499 GArray<TPriv*> a;
00500 IteratorState State;
00501
00502 DIterator()
00503 {
00504 Cur = -1;
00505 State = Unloaded;
00506 }
00507
00508 TPub *Create(GDataStoreI *Store)
00509 {
00510 return new TPriv(dynamic_cast<TStore*>(Store));
00511 }
00512
00513 TPub *First()
00514 {
00515 Cur = 0;
00516 return a.Length() > Cur ? a[Cur] : 0;
00517 }
00518
00519 TPub *Next()
00520 {
00521 Cur++;
00522 return a.Length() > Cur ? a[Cur] : 0;
00523 }
00524
00525 int Length()
00526 {
00527 return a.Length();
00528 }
00529
00530 TPub *operator [](int idx)
00531 {
00532 return a[idx];
00533 }
00534
00535 bool Delete(TPub *pub_ptr)
00536 {
00537 TPriv *priv_ptr = dynamic_cast<TPriv*>(pub_ptr);
00538 if (!priv_ptr)
00539 {
00540 LgiAssert(!"Not the right type of object.");
00541 return false;
00542 }
00543
00544 int i = a.IndexOf(priv_ptr);
00545 if (i < 0)
00546 return false;
00547
00548 a.DeleteAt(i, true);
00549 return true;
00550 }
00551
00552 bool Insert(TPub *pub_ptr, int idx = -1)
00553 {
00554 TPriv *priv_ptr = dynamic_cast<TPriv*>(pub_ptr);
00555 if (!priv_ptr)
00556 {
00557 LgiAssert(!"Not the right type of object.");
00558 return false;
00559 }
00560
00561 return a.AddAt(idx < 0 ? a.Length() : idx, priv_ptr);
00562 }
00563
00564 bool Empty()
00565 {
00566 a.Length(0);
00567 return true;
00568 }
00569
00570 bool DeleteObjects()
00571 {
00572 a.DeleteObjects();
00573 return true;
00574 }
00575
00576 int IndexOf(TPub *pub_ptr)
00577 {
00578 TPriv *priv_ptr = dynamic_cast<TPriv*>(pub_ptr);
00579 if (!priv_ptr)
00580 {
00581 LgiAssert(!"Not the right type of object.");
00582 return -1;
00583 }
00584
00585 return a.IndexOf(priv_ptr);
00586 }
00587 };
00588
00589 #endif