00001
00002
00003
00004
00005
00006
00007
00008
00010
00011 #ifndef UPnpCDS_H_
00012 #define UPnpCDS_H_
00013
00014 #include <qdom.h>
00015 #include <qdatetime.h>
00016
00017 #include "upnp.h"
00018 #include "upnpcdsobjects.h"
00019 #include "eventing.h"
00020 #include "mythdbcon.h"
00021
00022 class UPnpCDS;
00023
00024 typedef enum
00025 {
00026 CDSM_Unknown = 0,
00027 CDSM_GetServiceDescription = 1,
00028 CDSM_Browse = 2,
00029 CDSM_Search = 3,
00030 CDSM_GetSearchCapabilities = 4,
00031 CDSM_GetSortCapabilities = 5,
00032 CDSM_GetSystemUpdateID = 6
00033
00034 } UPnpCDSMethod;
00035
00036 typedef enum
00037 {
00038 CDS_BrowseUnknown = 0,
00039 CDS_BrowseMetadata = 1,
00040 CDS_BrowseDirectChildren = 2
00041
00042 } UPnpCDSBrowseFlag;
00043
00045
00046 class UPnpCDSRequest
00047 {
00048 public:
00049
00050 QString m_sObjectId;
00051
00052 QString m_sContainerID;
00053 QString m_sFilter;
00054 short m_nStartingIndex;
00055 short m_nRequestedCount;
00056 QString m_sSortCriteria;
00057
00058
00059
00060 QString m_sParentId;
00061 UPnpCDSBrowseFlag m_eBrowseFlag;
00062
00063
00064
00065 QString m_sSearchCriteria;
00066 QStringList m_sSearchList;
00067 QString m_sSearchClass;
00068
00069 public:
00070
00071 UPnpCDSRequest() : m_nStartingIndex ( 0 ),
00072 m_nRequestedCount( 0 ),
00073 m_eBrowseFlag( CDS_BrowseUnknown )
00074 {
00075 }
00076 };
00077
00079
00080 class UPnpCDSExtensionResults
00081 {
00082 public:
00083
00084 CDSObjects m_List;
00085 UPnPResultCode m_eErrorCode;
00086 QString m_sErrorDesc;
00087
00088 short m_nTotalMatches;
00089 short m_nUpdateID;
00090
00091 public:
00092
00093 UPnpCDSExtensionResults() : m_eErrorCode( UPnPResult_Success ),
00094 m_nTotalMatches(0),
00095 m_nUpdateID(0)
00096 {
00097 m_List.setAutoDelete( true );
00098 }
00099
00100 void Add ( CDSObject *pObject );
00101 QString GetResultXML();
00102 };
00103
00105
00106 typedef struct
00107 {
00108 char *title;
00109 char *column;
00110 char *sql;
00111 char *where;
00112
00113 } UPnpCDSRootInfo;
00114
00115 class UPnpCDSExtension
00116 {
00117 public:
00118
00119 QString m_sExtensionId;
00120 QString m_sName;
00121 QString m_sClass;
00122
00123 protected:
00124
00125 QString RemoveToken ( const QString &sToken, const QString &sStr, int num );
00126
00127 virtual UPnpCDSExtensionResults *ProcessRoot ( UPnpCDSRequest *pRequest,
00128 UPnpCDSExtensionResults *pResults,
00129 QStringList &idPath );
00130 virtual UPnpCDSExtensionResults *ProcessAll ( UPnpCDSRequest *pRequest,
00131 UPnpCDSExtensionResults *pResults,
00132 QStringList &idPath );
00133 virtual UPnpCDSExtensionResults *ProcessItem ( UPnpCDSRequest *pRequest,
00134 UPnpCDSExtensionResults *pResults,
00135 QStringList &idPath );
00136 virtual UPnpCDSExtensionResults *ProcessKey ( UPnpCDSRequest *pRequest,
00137 UPnpCDSExtensionResults *pResults,
00138 QStringList &idPath );
00139 virtual UPnpCDSExtensionResults *ProcessContainer( UPnpCDSRequest *pRequest,
00140 UPnpCDSExtensionResults *pResults,
00141 int nNodeIdx,
00142 QStringList &idPath );
00143
00144
00145
00146 virtual void CreateItems ( UPnpCDSRequest *pRequest,
00147 UPnpCDSExtensionResults *pResults,
00148 int nNodeIdx,
00149 const QString &sKey,
00150 bool bAddRef );
00151
00152 virtual bool IsBrowseRequestForUs ( UPnpCDSRequest *pRequest );
00153 virtual bool IsSearchRequestForUs ( UPnpCDSRequest *pRequest );
00154
00155 virtual int GetDistinctCount ( UPnpCDSRootInfo *pInfo );
00156 virtual int GetCount ( const QString &sColumn, const QString &sKey );
00157
00158
00159
00160 virtual UPnpCDSRootInfo *GetRootInfo ( int nIdx) = 0;
00161 virtual int GetRootCount ( ) = 0;
00162 virtual QString GetTableName ( QString sColumn ) = 0;
00163 virtual QString GetItemListSQL( QString sColumn = "" ) = 0;
00164 virtual void BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams ) = 0;
00165
00166 virtual void AddItem( const QString &sObjectId,
00167 UPnpCDSExtensionResults *pResults,
00168 bool bAddRef,
00169 MSqlQuery &query ) = 0;
00170
00171 virtual CDSObject *CreateContainer( const QString &sId,
00172 const QString &sTitle,
00173 const QString &sParentId )
00174 {
00175 return CDSObject::CreateContainer( sId, sTitle, sParentId );
00176 }
00177
00178
00179 public:
00180
00181 UPnpCDSExtension( QString sName,
00182 QString sExtensionId,
00183 QString sClass )
00184 {
00185 m_sName = QObject::tr( sName );
00186 m_sExtensionId = sExtensionId;
00187 m_sClass = sClass;
00188 }
00189
00190 virtual ~UPnpCDSExtension() {}
00191
00192 virtual UPnpCDSExtensionResults *Browse( UPnpCDSRequest *pRequest );
00193 virtual UPnpCDSExtensionResults *Search( UPnpCDSRequest *pRequest );
00194
00195 virtual QString GetSearchCapabilities() { return( "" ); }
00196 virtual QString GetSortCapabilities () { return( "" ); }
00197 };
00198
00199 typedef QPtrList< UPnpCDSExtension > UPnpCDSExtensionList;
00200
00203
00204
00205
00208
00209 class UPnpCDS : public Eventing
00210 {
00211 private:
00212
00213 UPnpCDSExtensionList m_extensions;
00214 CDSObject m_root;
00215
00216 QString m_sServiceDescFileName;
00217 QString m_sControlUrl;
00218
00219 private:
00220
00221 UPnpCDSMethod GetMethod ( const QString &sURI );
00222 UPnpCDSBrowseFlag GetBrowseFlag ( const QString &sFlag );
00223
00224 void HandleBrowse ( HTTPRequest *pRequest );
00225 void HandleSearch ( HTTPRequest *pRequest );
00226 void HandleGetSearchCapabilities( HTTPRequest *pRequest );
00227 void HandleGetSortCapabilities ( HTTPRequest *pRequest );
00228 void HandleGetSystemUpdateID ( HTTPRequest *pRequest );
00229
00230 protected:
00231
00232
00233
00234 virtual QString GetServiceType () { return "urn:schemas-upnp-org:service:ContentDirectory:1"; }
00235 virtual QString GetServiceId () { return "urn:upnp-org:serviceId:CDS_1-0"; }
00236 virtual QString GetServiceControlURL() { return m_sControlUrl.mid( 1 ); }
00237 virtual QString GetServiceDescURL () { return m_sControlUrl.mid( 1 ) + "/GetServDesc"; }
00238
00239 public:
00240 UPnpCDS( UPnpDevice *pDevice,
00241 const QString &sSharePath );
00242
00243 virtual ~UPnpCDS();
00244
00245 void RegisterExtension ( UPnpCDSExtension *pExtension );
00246 void UnregisterExtension( UPnpCDSExtension *pExtension );
00247
00248 virtual bool ProcessRequest( HttpWorkerThread *pThread, HTTPRequest *pRequest );
00249 };
00250
00251 #endif