www.pudn.com > PocketOBEX_demo.rar > ObexUtil.h
#ifndef _OBEX_UTIL_H_ #define _OBEX_UTIL_H_ #include//------------------------------------------------------------------- // Helper class for easy access to ObexDevice Properties //------------------------------------------------------------------- class CObexDeviceProperties { public: CObexDeviceProperties(IPropertyBag *Prop); CObexDeviceProperties(IObexDevice *Dev); CObexDeviceProperties(IUnknown *Unk); ~CObexDeviceProperties(); // Basic call to read any property HRESULT GetProperty(LPCOLESTR PropName,VARIANT &Value); CString GetProperty(LPCOLESTR PropName); // Retrieve known properties CString GetName(); // NAME of the Device CString GetAddress(); // ADDRESS of the device CString GetTransport(); // TRANSPORT of the device CString GetServices(); // SERVICEs of the device bool CanFTP(); // OBEX-FTP supported? // raw pointer for the PropertyBag operator IPropertyBag*() const { return (IPropertyBag*)m_Bag; } protected: CComPtr m_Bag; }; //------------------------------------------------------------------- // template for a simple list of objects with a m_pNext member // the list can be searched if the T has a member IsKey() //------------------------------------------------------------------- template class CSimpleList { public: T * m_pHead; CSimpleList() : m_pHead(NULL) { } ~CSimpleList() { RemoveAll(); } // Remove all elements (delete objects) void RemoveAll() { while (!IsEmpty()) Remove(m_pHead); m_pHead=NULL; } // Test if any elements in list BOOL IsEmpty() { return m_pHead==NULL; } // Unlink an element, but do not delete // returns pointer to element or NULL T *Unlink(T *Arg) { if (Arg && m_pHead) { if (Arg==m_pHead) { m_pHead=Arg->m_pNext; return Arg; } else { T *p=m_pHead; while (p && p->m_pNext!=Arg) p=p->m_pNext; if (p) { p->m_pNext=Arg->m_pNext; return Arg; } } } return NULL; } // Unlink and delete an element BOOL Remove(T *Arg) { Arg=Unlink(Arg); if (Arg) delete Arg; return Arg!=NULL; } // Add an element to end of list T * Append(T *Arg) { if (Arg) { Arg->m_pNext=NULL; if (IsEmpty()) m_pHead=Arg; else { T * p=m_pHead; while (p->m_pNext) p=p->m_pNext; p->m_pNext=Arg; } } return Arg; } // Add an element to top of list T * Push(T *Arg) { if (Arg) { Arg->m_pNext=m_pHead; m_pHead=Arg; } return Arg; } // Find an Element in List T * Find(LPCWSTR Key) { T *p=m_pHead; while (p && !p->IsKey(Key)) p=p->m_pNext; return p; } }; //------------------------------------------------------------------- // Simple wrapper to read an IStream * into memory //------------------------------------------------------------------- class CStreamToMemory { public: CStreamToMemory(UINT Initial=0,UINT Add=4096); ~CStreamToMemory(); BOOL Read(IStream *pStream); UINT Size(); BYTE *GetData(); void Clear(); void Reset(); protected: BYTE *m_Buffer; UINT m_Allocated; UINT m_Filled; UINT m_PageSize; }; //------------------------------------------------------------------- // CStreamToMemory derived class to manage x-obex/file-list //------------------------------------------------------------------- class CObexListing : public CStreamToMemory { public: CObexListing(UINT Initial=0,UINT Add=4096); ~CObexListing(); BOOL FindFirstFile(WIN32_FIND_DATA *FindFileData,UINT Mask=FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_DIRECTORY); BOOL FindNextFile(WIN32_FIND_DATA *FindFileData); BOOL FindClose(); protected: bool AtText(const char *t); bool IsProp(const char *t,char **pAt); void NextProp(); void SkipProp(); void GetDateProp(const char *At,FILETIME &ft); char *Skip(const char *t); protected: char *m_pCur; UINT m_Mask; }; #endif