diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_pmp/DeviceView.h | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_pmp/DeviceView.h')
-rw-r--r-- | Src/Plugins/Library/ml_pmp/DeviceView.h | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_pmp/DeviceView.h b/Src/Plugins/Library/ml_pmp/DeviceView.h new file mode 100644 index 00000000..a930834e --- /dev/null +++ b/Src/Plugins/Library/ml_pmp/DeviceView.h @@ -0,0 +1,257 @@ +#ifndef __DEVICEVIEW_H_ +#define __DEVICEVIEW_H_ + +//#define _WIN32_WINNT 0x0400 + +#include <windows.h> +#include <windowsx.h> +#include <stdio.h> +#include <shlobj.h> +#include <shellapi.h> +#include "..\..\General\gen_ml/ml.h" +#include "..\..\General\gen_ml/itemlist.h" +#include "..\..\General\gen_ml/childwnd.h" +#include "../winamp/wa_ipc.h" +#include "../winamp/ipc_pe.h" +#include "LinkedQueue.h" +#include "pmp.h" +#include "resource1.h" +#include "config.h" +#include "transfer_thread.h" +#include "api__ml_pmp.h" +#include "..\..\General\gen_ml/ml_ipc_0313.h" + +#include <bfc/platform/types.h> +#include "../devices/ifc_device.h" +#include "../devices/ifc_deviceactivity.h" +#include "pmp.h" +#include <bfc/multipatch.h> +#include <vector> + +#define COMMITTIMERID 0x2345 + +extern C_Config * gen_mlconfig; +extern LinkedQueue cloudTransferQueue, cloudFinishedTransfers; +extern int cloudTransferProgress; +extern winampMediaLibraryPlugin plugin; + +wchar_t *guessTitles(const wchar_t *filename, int *tracknum,wchar_t **artist, wchar_t **album,wchar_t **title); // free result after using artist, etc +wchar_t* GetDefaultSaveToFolder(wchar_t* path_to_store); + +#define AVERAGEBASIS 3 +class TransferContext +{ +public: + TransferContext() : dev(0), transfer_thread(NULL) + { + numTransfers=0; + start=0; + end=0; + InitializeCriticalSection(&transfer_lock); + killer = CreateEvent(NULL, TRUE, FALSE, 0); + notifier = CreateEvent(NULL, FALSE, FALSE, 0); + paused = 0; + ZeroMemory(×,sizeof(times)); + } + + ~TransferContext() + { + DeleteCriticalSection(&transfer_lock); + CloseHandle(killer); + CloseHandle(notifier); + } + + void WaitForKill() + { + SetEvent(notifier); + WaitForSingleObject(killer, INFINITE); + } + void DoOneTransfer(HANDLE handle); + bool IsPaused(); + void Pause(); + void Resume(); + + static bool IsAllPaused(); + static void PauseAll(); + static void ResumeAll(); + + int numTransfers; + int times[AVERAGEBASIS]; + time_t start, end; + DeviceView *dev; + volatile size_t paused; + HANDLE killer, notifier; + CRITICAL_SECTION transfer_lock; + ThreadID *transfer_thread; + + static volatile size_t paused_all; +}; + +enum +{ + PATCH_IFC_DEVICE, + PATCH_IFC_DEVICEACTIVITY, +}; + +class DeviceView : public MultiPatch<PATCH_IFC_DEVICE, ifc_device>, + public MultiPatch<PATCH_IFC_DEVICEACTIVITY, ifc_deviceactivity> +{ +public://protected: + HNAVITEM treeItem, videoTreeItem, queueTreeItem; + int queueActiveIcon; + int isCloudDevice; + std::vector<HNAVITEM> playlistTreeItems; + LinkedQueue finishedTransfers; + + HNAVITEM AddPlaylistNode(int id); + int AddTrackToTransferQueue(DeviceView * device, itemRecordW * item, bool dupeCheck, bool forceDupe=false); // true on success + int AddTrackToTransferQueue(CopyInst * inst); +public: + TransferContext transferContext; + int videoView; + int SyncConnectionDefault; + prefsDlgRecW devPrefsPage; + int currentTransferProgress; // percentage + double transferRate; + int threadKillswitch; + LinkedQueue transferQueue; + bool commitNeeded; + C_Config * config; + Device * dev; + int metadata_fields; + DeviceView(Device *dev); + + void SetVideoView(BOOL enabled); + bool GetTransferFromMlSupported(int dataType); + intptr_t TransferFromML(int type,void* data, int unsupportedReturn, int supportedReturn, int playlist=0); + intptr_t TransferFromDrop(HDROP hDrop, int playlist=0); + intptr_t MessageProc(int message_type, intptr_t param1, intptr_t param2, intptr_t param3); + void DevicePropertiesChanges(); + int CreatePlaylist(wchar_t * name=NULL, bool silent=false); + void RenamePlaylist(int id); + bool DeletePlaylist(int playlistId, bool deleteFiles, bool verbal); + int AddFileListToTransferQueue(char ** files, int num, int playlist=0); + int AddFileListToTransferQueue(wchar_t ** files, int num, int playlist=0); + int AddItemListToTransferQueue(itemRecordListW * items, int playlist=0); + int AddItemListToTransferQueue(C_ItemList * items, int playlist=0); + void TransferPlaylist(wchar_t * file, wchar_t * name=NULL); // name=NULL when its from the ML and we must find out ourself... + int TransferTracksToPlaylist(C_ItemList *itemRecords, int plid); + void TransferAddCloudPlaylist(wchar_t * file, wchar_t * name0); + int DeleteTracks(C_ItemList * tracks, HWND centerWindow); + void Sync(bool silent = false); + void CloudSync(bool silent = false); + void Autofill(); + void Eject(); + bool PlayTracks(C_ItemList * tracks, int startPlaybackAt, bool enqueue, bool msgIfImpossible, HWND parent=NULL); // returns false if failed/unsupported + bool PlayPlaylist(int playlistId, bool enqueue, bool msgIfImpossible, HWND parent=NULL); + void CopyTracksToHardDrive(songid_t * tracks, int numTracks); + void CopyTracksToHardDrive(C_ItemList * tracks); + void CopyPlaylistToLibrary(int plnum); + void OnActivityStarted(); + void OnActivityChanged(); + void OnActivityFinished(); + void OnNameChanged(const wchar_t *new_name); +//private: + void RegisterViews(HNAVITEM parent); + void Unregister(); + + BOOL DisplayDeviceContextMenu(HNAVITEM item, HWND hostWindow, POINT pt); + BOOL DisplayPlaylistContextMenu(int playlistId, HNAVITEM item, HWND hostWindow, POINT pt); + +// navigation + BOOL Navigation_IsPlaylistItem(HNAVITEM item, int *playlistId); + HWND Navigation_CreateViewCb(HNAVITEM item, HWND parentWindow); + BOOL Navigation_ShowContextMenuCb(HNAVITEM item, HWND hostWindow, POINT pt); + BOOL Navigation_ClickCb(HNAVITEM item, int actionType, HWND hostWindow); + int Navigation_DropTargetCb(HNAVITEM item, unsigned int dataType, void *data); + BOOL Navigation_TitleEditBeginCb(HNAVITEM item); + BOOL Navigation_TitleEditEndCb(HNAVITEM item, const wchar_t *title); + BOOL Navigation_KeyDownCb(HNAVITEM item, NMTVKEYDOWN *keyData, HWND hwnd); + + size_t GetPlaylistName(wchar_t *buffer, size_t bufferSize, int playlistId, const wchar_t *defaultName, BOOL quoteSpaces); + +public: + /* ifc_device */ + int QueryInterface(GUID interface_guid, void **object); + const char *GetName(); + HRESULT GetIcon(wchar_t *buffer, size_t bufferSize, int width, int height); + HRESULT GetDisplayName(wchar_t *buffer, size_t bufferSize); + + const char *GetType(); + const char *GetDisplayType(); + const char *GetConnection(); + + BOOL GetHidden(); + + HRESULT GetTotalSpace(uint64_t *size); + HRESULT GetUsedSpace(uint64_t *size); + + BOOL GetAttached(); + HRESULT Attach(HWND hostWindow); + HRESULT Detach(HWND hostWindow); + + HRESULT EnumerateCommands(ifc_devicesupportedcommandenum **enumerator, DeviceCommandContext context); + HRESULT SendCommand(const char *command, HWND hostWindow, ULONG_PTR param); + HRESULT GetCommandFlags(const char *command, DeviceCommandFlags *flags); + + HRESULT GetActivity(ifc_deviceactivity **activity); + + HRESULT Advise(ifc_deviceevent *handler); + HRESULT Unadvise(ifc_deviceevent *handler); + + HWND CreateView(HWND parentWindow); + void SetNavigationItem(void *navigationItem); + + HRESULT GetDropSupported(unsigned int dataType); + HRESULT Drop(void *data, unsigned int dataType); + + HRESULT SetDisplayName(const wchar_t *displayName, bool force); + + HRESULT GetModel(wchar_t *buffer, size_t bufferSize); + HRESULT GetStatus(wchar_t *buffer, size_t bufferSize); + + void UpdateActivityState(); + void UpdateSpaceInfo(BOOL updateUsedSpace, BOOL notifyChanges); + + /* ifc_deviceactivity */ + BOOL GetActive(); + BOOL GetCancelable(); + HRESULT GetProgress(unsigned int *percentCompleted); + HRESULT Activity_GetDisplayName(wchar_t *buffer, size_t bufferMax); + HRESULT Activity_GetStatus(wchar_t *buffer, size_t bufferMax); + HRESULT Cancel(HWND hostWindow); + + /* Dispatchable */ + size_t AddRef() + { + return InterlockedIncrement((LONG*)&ref_count); + } + + size_t Release() + { + if (0 == ref_count) + return ref_count; + + LONG r = InterlockedDecrement((LONG*)&ref_count); + if (0 == r) + delete(this); + + return r; + } + +private: + RECVS_MULTIPATCH; + std::vector<ifc_deviceevent*> event_handlers; + char name[128]; + size_t ref_count; + ~DeviceView(); + const char *connection_type; + const char *display_type; + BOOL navigationItemCreated; + BOOL activityRunning; + unsigned int currentProgress; + uint64_t usedSpace; + uint64_t totalSpace; +}; + +#endif
\ No newline at end of file |