diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/bm.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Winamp/bm.cpp')
-rw-r--r-- | Src/Winamp/bm.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/Src/Winamp/bm.cpp b/Src/Winamp/bm.cpp new file mode 100644 index 00000000..24127018 --- /dev/null +++ b/Src/Winamp/bm.cpp @@ -0,0 +1,129 @@ +/** (c) Nullsoft, Inc. C O N F I D E N T I A L + ** Filename: + ** Project: + ** Description: + ** Author: + ** Created: + **/ +#include "main.h" +#include "../Plugins/Library/ml_bookmarks/bookmark.h" +#include <malloc.h> +#include "api.h" +#include "../nu/AutoCharFn.h" +#include "../nu/AutoChar.h" +#include <strsafe.h> + +void Bookmark_additem(wchar_t *fn, wchar_t *ft) +{ + if ((!fn || fn && !*fn) || (!ft || ft && !*ft)) return; + + BookmarkWriter bookmarks; + bookmarks.Open(BOOKMARKFILE); + bookmarks.Write(AutoCharFn(fn), AutoCharFn(ft)); + bookmarks.Close(); + + bookmarks.Open(BOOKMARKFILE8); + bookmarks.Write(AutoChar(fn, CP_UTF8), AutoChar(ft, CP_UTF8)); + bookmarks.Close(); + + size_t bufSize = wcslen(fn)+wcslen(ft)+3; + wchar_t *buf=(wchar_t*)_malloca(bufSize*sizeof(wchar_t)), *buf2pass = buf; + if (buf) + { + StringCchCopyExW(buf, bufSize, fn, &buf, &bufSize, 0); + buf++; bufSize--; + StringCchCopyW(buf, bufSize, ft); + SendMessageW(hMainWindow,WM_WA_IPC,(WPARAM)buf2pass,IPC_ADDBOOKMARKW); + AGAVE_API_STATS->IncrementStat(api_stats::BOOKMARK_COUNT); + _freea(buf); + } +} + +void Bookmark_AddCommandline(wchar_t *lpszCmdParam) +{ + wchar_t *p = lpszCmdParam; + if (p) + { + if (*p == L'\"') { p++; p[lstrlenW(p) - 1] = 0; } + Bookmark_additem(p, PlayList_gettitle(p, 1)); + } +} + +void WriteEscaped(FILE *fp, const char *str) +{ + // TODO: for speed optimization, + // we should wait until we hit a special character + // and write out everything else so before it, + // like how ASX loader does it + while (str && *str) + { + switch(*str) + { + case '&': + fputs("&", fp); + break; + case '>': + fputs(">", fp); + break; + case '<': + fputs("<", fp); + break; + case '\'': + fputs("'", fp); + break; + case '\"': + fputs(""", fp); + break; + default: + fputc(*str, fp); + break; + } + // write out the whole character + char *next = CharNextA(str); + while (++str != next) + fputc(*str, fp); + } +} + +void Bookmark_WriteAsXML(const wchar_t *filename, int max) +{ + FILE *destFp=_wfopen(filename,L"wb"); + FILE *fp=_wfopen(BOOKMARKFILE8,L"rt"); + + if (fp && destFp) + { + //fprintf(destFp, "<?xml version=\"1.0\" encoding=\"windows-%u\"?>", GetACP()); + fprintf(destFp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); + fputs("<bookmarks>\n", destFp); + int x=0; + for (;;) + { + char ft[4096] = {0}, fn[4096] = {0}; + fgets(fn,4096,fp); + if (feof(fp)) break; + fgets(ft,4096,fp); + if (feof(fp)) break; + if (ft[0] && fn[0]) + { + if (fn[strlen(fn)-1]=='\n') fn[strlen(fn)-1]=0; + if (ft[strlen(ft)-1]=='\n') ft[strlen(ft)-1]=0; + if (ft[0] && fn[0]) + { + fputs("<bookmark file=\"", destFp); + WriteEscaped(destFp, fn); + fputs("\" title=\"", destFp); + WriteEscaped(destFp, ft); + fputs("\"/>\n", destFp); + x++; + } + } + if (x == max) + break; + } + fputs("</bookmarks>", destFp); + } + if (fp) + fclose(fp); + if (destFp) + fclose(destFp); +}
\ No newline at end of file |