aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_pmp/DeviceView.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_pmp/DeviceView.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-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.h257
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(&times,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