00001
00002
00003
00004
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
00031
00032 #ifndef __STORAGE_H__
00033 #define __STORAGE_H__
00034
00035 #include "zmmf/zmmf.h"
00036 #include "singleton.h"
00037 #include "cds_objects.h"
00038 #include "dictionary.h"
00039 #include "sync.h"
00040 #include "hash.h"
00041 #include "autoscan.h"
00042
00043 #define BROWSE_DIRECT_CHILDREN 0x00000001
00044 #define BROWSE_ITEMS 0x00000002
00045 #define BROWSE_CONTAINERS 0x00000004
00046 #define BROWSE_EXACT_CHILDCOUNT 0x00000008
00047 #define BROWSE_TRACK_SORT 0x00000010
00048 #define BROWSE_HIDE_FS_ROOT 0x00000020
00049
00050 class BrowseParam : public zmm::Object
00051 {
00052 protected:
00053 unsigned int flags;
00054 int objectID;
00055
00056 int startingIndex;
00057 int requestedCount;
00058
00059
00060 int totalMatches;
00061
00062 public:
00063 inline BrowseParam(int objectID, unsigned int flags)
00064 {
00065 this->objectID = objectID;
00066 this->flags = flags;
00067 startingIndex = 0;
00068 requestedCount = 0;
00069 }
00070
00071 inline int getFlags() { return flags; }
00072 inline unsigned int getFlag(unsigned int mask) { return flags & mask; }
00073 inline void setFlags(unsigned int flags) { this->flags = flags; }
00074 inline void setFlag(unsigned int mask) { flags |= mask; }
00075 inline void changeFlag(unsigned int mask, bool value) { if (value) setFlag(mask); else clearFlag(mask); }
00076 inline void clearFlag(unsigned int mask) { flags &= !mask; }
00077
00078 inline int getObjectID() { return objectID; }
00079
00080 inline void setRange(int startingIndex, int requestedCount)
00081 {
00082 this->startingIndex = startingIndex;
00083 this->requestedCount = requestedCount;
00084 }
00085 inline void setStartingIndex(int startingIndex)
00086 { this->startingIndex = startingIndex; }
00087
00088 inline void setRequestedCount(int requestedCount)
00089 { this->requestedCount = requestedCount; }
00090
00091 inline int getStartingIndex() { return startingIndex; }
00092 inline int getRequestedCount() { return requestedCount; }
00093
00094 inline int getTotalMatches() { return totalMatches; }
00095
00096 inline void setTotalMatches(int totalMatches)
00097 { this->totalMatches = totalMatches; }
00098
00099 };
00100
00101 class Storage : public Singleton<Storage>
00102 {
00103 public:
00104 static zmm::Ref<Storage> getInstance();
00105
00106 virtual void init() = 0;
00107 virtual void addObject(zmm::Ref<CdsObject> object, int *changedContainer) = 0;
00108
00125 virtual void addContainerChain(zmm::String path, zmm::String lastClass,
00126 int lastRefID, int *containerID, int *updateID) = 0;
00127
00133 virtual zmm::String buildContainerPath(int parentID, zmm::String title) = 0;
00134
00135 virtual void updateObject(zmm::Ref<CdsObject> object, int *changedContainer) = 0;
00136
00137 virtual zmm::Ref<zmm::Array<CdsObject> > browse(zmm::Ref<BrowseParam> param) = 0;
00138 virtual zmm::Ref<zmm::Array<zmm::StringBase> > getMimeTypes() = 0;
00139
00140
00141
00148 virtual zmm::Ref<CdsObject> findObjectByPath(zmm::String path) = 0;
00149
00156 virtual int findObjectIDByPath(zmm::String fullpath) = 0;
00157
00163 virtual zmm::String incrementUpdateIDs(int *ids, int size) = 0;
00164
00165
00166 virtual zmm::Ref<CdsObject> loadObject(int objectID) = 0;
00167 virtual int getChildCount(int contId, bool containers = true, bool items = true, bool hideFsRoot = false) = 0;
00168
00169 class ChangedContainers : public Object
00170 {
00171 public:
00172 ChangedContainers()
00173 {
00174 upnp = zmm::Ref<zmm::IntArray>(new zmm::IntArray());
00175 ui = zmm::Ref<zmm::IntArray>(new zmm::IntArray());
00176 }
00177 zmm::Ref<zmm::IntArray> upnp;
00178 zmm::Ref<zmm::IntArray> ui;
00179 };
00180
00191 virtual zmm::Ref<ChangedContainers> removeObject(int objectID, bool all) = 0;
00192
00197 virtual zmm::Ref<DBRHash<int> > getObjects(int parentID, bool withoutContainer) = 0;
00198
00203 virtual zmm::Ref<ChangedContainers> removeObjects(zmm::Ref<DBRHash<int> > list, bool all = false) = 0;
00204
00206 virtual zmm::Ref<CdsObject> loadObjectByServiceID(zmm::String serviceID) = 0;
00207
00211 virtual zmm::Ref<zmm::IntArray> getServiceObjectIDs(char servicePrefix) = 0;
00212
00213
00214 virtual int getTotalFiles() = 0;
00215
00216
00217 virtual zmm::String getInternalSetting(zmm::String key) = 0;
00218 virtual void storeInternalSetting(zmm::String key, zmm::String value) = 0;
00219
00220
00221 virtual void updateAutoscanPersistentList(scan_mode_t scanmode, zmm::Ref<AutoscanList> list) = 0;
00222 virtual zmm::Ref<AutoscanList> getAutoscanList(scan_mode_t scanmode) = 0;
00223 virtual void addAutoscanDirectory(zmm::Ref<AutoscanDirectory> adir) = 0;
00224 virtual void updateAutoscanDirectory(zmm::Ref<AutoscanDirectory> adir) = 0;
00225 virtual void removeAutoscanDirectoryByObjectID(int objectID) = 0;
00226 virtual void removeAutoscanDirectory(int autoscanID) = 0;
00232 virtual int isAutoscanChild(int objectID) = 0;
00233
00237 virtual int getAutoscanDirectoryType(int objectId) = 0;
00238
00242 virtual int isAutoscanDirectoryRecursive(int objectId) = 0;
00243
00249 virtual zmm::Ref<AutoscanDirectory> getAutoscanDirectory(int objectID) = 0;
00250
00254 virtual void autoscanUpdateLM(zmm::Ref<AutoscanDirectory> adir) = 0;
00255
00256 virtual void checkOverlappingAutoscans(zmm::Ref<AutoscanDirectory> adir) = 0;
00257
00258 virtual zmm::Ref<zmm::IntArray> getPathIDs(int objectID) = 0;
00259
00261 virtual void shutdown() = 0;
00262
00269 virtual int ensurePathExistence(zmm::String path, int *changedContainer) = 0;
00270
00272 virtual void clearFlagInDB(int flag) = 0;
00273
00274 virtual zmm::String getFsRootName() = 0;
00275
00276 virtual void threadCleanup() = 0;
00277 virtual bool threadCleanupRequired() = 0;
00278
00279 protected:
00280
00281 static void stripAndUnescapeVirtualContainerFromPath(zmm::String path, zmm::String &first, zmm::String &last);
00282 static zmm::Ref<Storage> createInstance();
00283 };
00284
00285 #endif // __STORAGE_H__