00001
00002
00003
00004
00005
00007
00008 #ifndef _ROKU_INCLUDE_CASCADE_NET_CASCADEUPNP_H
00009 #define _ROKU_INCLUDE_CASCADE_NET_CASCADEUPNP_H
00010
00011 #include <cascade/util/CascadeNewArray.h>
00012 #include <cascade/util/CascadeString.h>
00013 #include <cascade/interthread/CascadeMutex.h>
00014
00016
00017
00018
00019
00020
00021
00022
00023
00025
00026 #define _NEW_CASCADE_UPNP_IFACE
00027 #ifdef WIN32
00028 #undef _NEW_CASCADE_UPNP_IFACE
00029 #endif
00030 #ifdef AD_VDK_OS
00031 #undef _NEW_CASCADE_UPNP_IFACE
00032 #endif
00033
00035
00036 #ifndef _NEW_CASCADE_UPNP_IFACE
00037 #define CascadeAppMessageSink CascadeObject
00038 #else
00039 #include <cascade/app/CascadeAppMessageSink.h>
00040 #endif
00041
00042 class CascadeUPnP : public CascadeAppMessageSink
00043 {
00044 private:
00045 class UPnP; friend class UPnP;
00046 public:
00047 CascadeUPnP();
00048 virtual ~CascadeUPnP();
00049
00050 public:
00051
00052 enum DeviceStatus { kOnline = 0, kOffline = 1 };
00053 class Device
00054 {
00055 public:
00056 CascadeString m_deviceUUID;
00057
00058
00059 CascadeString m_deviceType;
00060
00061
00062 DeviceStatus m_deviceStatus;
00063
00064 CascadeString m_deviceDescriptionURL;
00065
00066 bool m_bRootDevice;
00067
00068
00069 CascadeNewArray<CascadeString> m_serviceTypes;
00070
00071 public:
00072 #ifdef _NEW_CASCADE_UPNP_IFACE
00073 bool operator == (const Device & that) const;
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 Device & operator = (const Device & that);
00084 inline bool IsMediaServer() const { return (m_deviceType == CascadeUPnP::MediaServerDeviceType()); }
00085 #endif
00086 };
00087
00088
00089 class Service
00090 {
00091 public:
00092 CascadeString m_serviceType;
00093
00094
00095
00096
00097 CascadeString m_serviceId;
00098
00099 CascadeString m_scpdUrl;
00100
00101
00102 CascadeString m_controlUrl;
00103
00104 CascadeString m_eventSubUrl;
00105
00106 };
00107
00108
00109 class DeviceIcon
00110 {
00111 public:
00112 CascadeString m_mimeType;
00113 CascadeString m_url;
00114 u16 m_nWidth;
00115 u16 m_nHeight;
00116 u16 m_nDepth;
00117 };
00118
00119
00120 class DeviceDescription
00121 {
00122 public:
00123 CascadeString m_deviceType;
00124
00125
00126
00127 CascadeString m_friendlyName;
00128
00129 CascadeString m_manufacturer;
00130
00131 CascadeString m_manufacturerURL;
00132
00133 CascadeString m_modelDescription;
00134
00135 CascadeString m_modelName;
00136
00137 CascadeString m_modelNumber;
00138
00139 CascadeString m_modelURL;
00140
00141 CascadeString m_serialNumber;
00142
00143 CascadeString m_udn;
00144
00145 #ifdef _NEW_CASCADE_UPNP_IFACE
00146 CascadeString m_deviceUUID;
00147 #endif
00148 CascadeString m_upc;
00149
00150
00151 CascadeNewArray<Service> m_deviceServices;
00152
00153 CascadeNewArray<DeviceIcon> m_deviceIcons;
00154
00155 };
00156 class AVObject
00157 {
00158 public:
00159 AVObject() : m_classActions(0), m_numericProperties(0), m_stringProperties(0), m_personas(0), m_resources(0) { }
00160 public:
00161 enum ObjectType
00162 {
00163 kContainer = 0,
00164 kItem
00165 };
00166 enum ClassActionType
00167 {
00168 kCreate = 0,
00169 kSearch
00170 };
00171 enum NumericPropertyType
00172 {
00173 kStorageTotal = 0,
00174 kStorageUsed,
00175 kStorageFree,
00176 kStorageMaxPartition,
00177 kDVDRegionCode,
00178 kOriginalTrackNumber
00179 };
00180 enum StringPropertyType
00181 {
00182 kWriteStatus = 0,
00183 kStorageMedium,
00184 kData,
00185 kActor,
00186 kAlbum,
00187 kArtist,
00188 kAuthor,
00189 kCreator,
00190 kGenre,
00191 kDirector,
00192 kProducer,
00193 kPublisher,
00194 kAlbumArtURL,
00195 kArtistDiscographyURI,
00196 kLyricsURI,
00197 kRelation,
00198 kPlaylist,
00199 kIconURI,
00200 kRegion,
00201 kRating,
00202 kRights,
00203 kLanguage,
00204 kRadioCallSign,
00205 kRadioStationID,
00206 kRadioBand,
00207 kChannelNumber,
00208 kChannelName,
00209 kScheduledStartTime,
00210 kScheduledEndTime,
00211 kDescription,
00212 kTOC,
00213 kUserAnnotation
00214 };
00215 enum PersonaType
00216 {
00217 kActorPersona = 0,
00218 kArtistPersona,
00219 kAuthorPersona
00220 };
00221 class ClassAction
00222 {
00223 public:
00224 ClassActionType m_type;
00225 CascadeString m_class;
00226 CascadeString m_className;
00227 bool m_bIncludeDerived;
00228 };
00229 class NumericProperty
00230 {
00231 public:
00232 NumericPropertyType m_type;
00233 s32 m_nValue;
00234 };
00235 class StringProperty
00236 {
00237 public:
00238 StringPropertyType m_type;
00239 CascadeString m_value;
00240 };
00241 class Persona
00242 {
00243 public:
00244 PersonaType m_type;
00245 CascadeString m_name;
00246 CascadeString m_role;
00247 };
00248 class Resource
00249 {
00250 public:
00251 CascadeString m_protocolInfo;
00252 CascadeString m_protection;
00253 CascadeString m_URI;
00254 CascadeString m_importURI;
00255 u32 m_nSize;
00256 CascadeString m_duration;
00257 u32 m_nBitrate;
00258 u32 m_nSampleRate;
00259 u32 m_nBitsPerSample;
00260 u32 m_nNumChannels;
00261 CascadeString m_resolution;
00262 u32 m_nColorDepth;
00263 };
00264 public:
00265 ObjectType m_type;
00266 CascadeString m_id;
00267 CascadeString m_idParent;
00268 CascadeString m_idRef;
00269 bool m_bRestricted;
00270 u32 m_nChildCount;
00271 bool m_bSearchable;
00272 CascadeString m_title;
00273 CascadeString m_class;
00274 CascadeString m_className;
00275 CascadeNewArray<ClassAction> m_classActions;
00276 CascadeNewArray<NumericProperty> m_numericProperties;
00277 CascadeNewArray<StringProperty> m_stringProperties;
00278 CascadeNewArray<Persona> m_personas;
00279 CascadeNewArray<Resource> m_resources;
00280 };
00281 class AVObjectArray : private CascadeNewArray<AVObject *>
00282 {
00283 public:
00284 AVObjectArray() : CascadeNewArray<AVObject *>(0), m_nOwningTransactionID(0) { }
00285 virtual ~AVObjectArray();
00286 public:
00287 void Empty();
00288
00289 AVObject * TakeOwnership(u32 nIndex);
00290
00291
00292
00293
00294 u32 GetSize();
00295 AVObject * operator[](u32 nIndex) const;
00296 AVObject * GetAt(u32 nIndex) const;
00297 u32 GetOwningTransactionID() const;
00298
00299 private:
00300 u32 m_nOwningTransactionID;
00301 CascadeMutex m_mutex;
00302 friend class UPnP;
00303 friend class CascadeUPnPMessage;
00304 };
00305 public:
00306 #ifdef _NEW_CASCADE_UPNP_IFACE
00307
00308
00309
00310
00311
00312
00313 enum TransactionResult
00314 {
00315 kUnknownDevice = 0,
00316 kDeviceNotUPnPAVServer,
00317 kDeviceNotWMCServer,
00318 kDeviceOffline,
00319 kDeviceError,
00320 kTimeout,
00321 kResourceBusy,
00322 kDeviceDescriptionNotCached,
00323 kRemoteSystemElementNotResponding,
00324 kAllocationError,
00325 kDataError,
00326 kParameterError,
00327 kEnumerationAborted,
00328 kObjectArrayInUse,
00329 kReissueTransaction,
00330 kSuccess
00331 };
00332
00333
00334 virtual u32 CatalogLocalDevices();
00335 virtual u32 RequestDeviceDescription(const CascadeString & deviceUUID);
00336 virtual u32 RequestDeviceMount(const CascadeString & deviceUUID);
00337
00338
00339 virtual u32 RequestWMCAuthorizationStatus(const CascadeString & deviceUUID);
00340 virtual u32 RequestAVSearchCapabilities(const CascadeString & deviceUUID);
00341
00342 virtual u32 InitiateAVSearch(
00343 const CascadeString & deviceUUID,
00344 const CascadeString & containerObjectID,
00345 const CascadeString & searchTerm,
00346 const CascadeString & filterTerm,
00347 const CascadeString & sortTerm,
00348 u32 nStartIndex,
00349 u32 nCount,
00350 AVObjectArray & arrayToFill);
00351
00352 virtual u32 InitiateAVBrowse(
00353 const CascadeString & deviceUUID,
00354 const CascadeString & containerObjectID,
00355 const CascadeString & filterTerm,
00356 const CascadeString & sortTerm,
00357 u32 nStartIndex,
00358 u32 nCount,
00359 AVObjectArray & arrayToFill);
00360
00361 virtual u32 InitiateAVObjectFetch(
00362 const CascadeString & deviceUUID,
00363 const CascadeString & objectID,
00364 const CascadeString & filterTerm,
00365 AVObject & objectToSet);
00366
00367
00368 virtual void CancelTransaction(u32 nTransactionID);
00369
00370
00371 virtual void OnCatalogResult(const Device & device);
00372 virtual void OnDeviceDescriptionResult(u32 nTransactionID, TransactionResult result, const DeviceDescription & deviceDescription);
00373 virtual void OnDeviceMountResult(u32 nTransactionID, TransactionResult result, bool bMounted);
00374 virtual void OnWMCAuthorizationStatusResult(u32 nTransactionID, TransactionResult result, bool bAuthorized);
00375 virtual void OnAVSearchCapabilitiesResult(u32 nTransactionID, TransactionResult result, const CascadeString & searchCapabilities);
00376 virtual void OnAVSearchResult(u32 nTransactionID, TransactionResult result, u32 nMatchCount, AVObjectArray & objectArray, bool bComplete);
00377
00378
00379
00380
00381
00382
00383
00384 virtual void OnAVBrowseResult(u32 nTransactionID, TransactionResult result, u32 nMatchCount, AVObjectArray & objectArray, bool bComplete);
00385 virtual void OnAVObjectFetchResult(u32 nTransactionID, TransactionResult result, AVObject & object);
00386
00387
00388 virtual bool GetDeviceFromUUID(const CascadeString & deviceUUID, Device & deviceToSet);
00389
00390
00391
00392
00393
00394
00395 virtual bool GetCachedDeviceDescription(const CascadeString & deviceUUID, DeviceDescription & deviceDescriptionToSet);
00396
00397
00398
00399
00400
00401
00402
00403 virtual bool UnmountDevice(const CascadeString & deviceUUID);
00404 virtual bool IsDeviceMounted(const CascadeString & deviceUUID);
00405
00406 virtual bool AddDeviceToPersistentMountList(const CascadeString & deviceUUID);
00407 virtual bool RemoveDeviceFromPersistentMountList(const CascadeString & deviceUUID);
00408 virtual bool RemoveAllDevicesFromPersistentMountList();
00409 virtual bool IsDeviceInPersistentMountList(const CascadeString & deviceUUID);
00410
00411 typedef bool (MountListEnumCallback)(const CascadeString & deviceUUID, void * pClientData);
00412 virtual bool EnumerateMountedDevices(MountListEnumCallback * pCallback, void * pClientData);
00413 virtual bool EnumeratePersistentMountList(MountListEnumCallback * pCallback, void * pClientData);
00414 virtual bool IsDeviceOnline(const CascadeString & deviceUUID);
00415
00416 virtual bool IsWindowsMediaConnect(const DeviceDescription & deviceDescription);
00417
00418 static const char * MediaServerDeviceType();
00419
00420
00421 TransactionResult GetLastTransactionResult();
00422 static const char * TransactionResultToString(TransactionResult result);
00423
00424 private:
00425 virtual bool OnWormholeMessage(const CascadeMessage & message);
00426 private:
00427 UPnP * m_pUPnP;
00428 #else
00429 public:
00430 virtual bool InitiateUPnPSearch(const CascadeString & searchTerm);
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457 virtual bool GetDeviceDescription(const Device & device,
00458 DeviceDescription & deviceDescriptionToSet,
00459 u32 nTimeoutMS = 5000);
00460
00461
00462
00463
00464
00465
00466
00467
00468 virtual bool GetDeviceDescriptionAsync(const Device & device);
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 public:
00483 virtual void OnSearchResult(const Device & device);
00484
00485
00486
00487 virtual void OnStatusChange(const Device & device);
00488
00489
00490
00491
00492
00493
00494
00495
00496 virtual void OnDeviceDescriptionComplete(bool bSuccess, const Device & device, const DeviceDescription & deviceDescription);
00497
00498
00499 #endif
00500 };
00501
00502 #endif // _ROKU_INCLUDE_CASCADE_NET_CASCADEUPNP_H
00503
00505
00507
00508
00509
00510
00511