blob: 03864d851ed033b2b4be699bc33977eed6ad23f8 [file] [log] [blame]
Edric Milaret4bba46d2015-04-29 16:33:38 -04001/***************************************************************************
Anthony LĂ©onard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 by Savoir-faire Linux *
Edric Milaret4bba46d2015-04-29 16:33:38 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "utils.h"
20
Edric Milaret36587362016-02-04 12:30:52 -050021#ifdef Q_OS_WIN
Edric Milaret3ba22ca2016-03-01 13:28:01 -050022#include <windows.h>
Edric Milaretb37aa1f2015-07-09 16:39:04 -040023#include <lmcons.h>
24#include <shobjidl.h>
25#include <shlguid.h>
26#include <shlobj.h>
27#include <shlwapi.h>
28#endif
29
Edric Milaret3ba22ca2016-03-01 13:28:01 -050030
31//Qt
32#include <QObject>
33#include <QErrorMessage>
Edric Milaret25236d92016-03-28 09:40:58 -040034#include <QPainter>
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -040035#include <QStackedWidget>
36#include <QPropertyAnimation>
Edric Milaret3ba22ca2016-03-01 13:28:01 -050037
Edric Milaret4bba46d2015-04-29 16:33:38 -040038bool
Edric Milaret1eca0292015-06-29 12:03:36 -040039Utils::CreateStartupLink()
40{
Edric Milaret36587362016-02-04 12:30:52 -050041#ifdef Q_OS_WIN
Edric Milaret465a3142015-06-02 15:02:52 -040042 TCHAR szPath[MAX_PATH];
43 GetModuleFileName(NULL, szPath, MAX_PATH);
Edric Milaret4bba46d2015-04-29 16:33:38 -040044
Edric Milaret465a3142015-06-02 15:02:52 -040045 std::wstring programPath(szPath);
Edric Milaret4bba46d2015-04-29 16:33:38 -040046
Edric Milaret465a3142015-06-02 15:02:52 -040047 TCHAR startupPath[MAX_PATH];
48 SHGetFolderPathW(NULL, CSIDL_STARTUP, NULL, 0, startupPath);
49
50 std::wstring linkPath(startupPath);
51 linkPath += TEXT("\\Ring.lnk");
Edric Milaret4bba46d2015-04-29 16:33:38 -040052
53 return Utils::CreateLink(programPath.c_str(), linkPath.c_str());
Edric Milaretb37aa1f2015-07-09 16:39:04 -040054#else
55 return true;
56#endif
Edric Milaret4bba46d2015-04-29 16:33:38 -040057}
58
59bool
60Utils::CreateLink(LPCWSTR lpszPathObj, LPCWSTR lpszPathLink) {
Edric Milaret36587362016-02-04 12:30:52 -050061#ifdef Q_OS_WIN
Edric Milaret4bba46d2015-04-29 16:33:38 -040062 HRESULT hres;
63 IShellLink* psl;
64
65 hres = CoCreateInstance(CLSID_ShellLink, NULL,
66 CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
67 if (SUCCEEDED(hres))
68 {
69 IPersistFile* ppf;
70 psl->SetPath(lpszPathObj);
Edric Milaret90bd5a82015-06-08 10:07:59 -040071 psl->SetArguments(TEXT("--minimized"));
Edric Milaret4bba46d2015-04-29 16:33:38 -040072
73 hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
74 if (SUCCEEDED(hres))
75 {
76 hres = ppf->Save(lpszPathLink, TRUE);
77 ppf->Release();
78 }
79 psl->Release();
80 }
81 return hres;
Edric Milaretb37aa1f2015-07-09 16:39:04 -040082#else
Edric Milaret36587362016-02-04 12:30:52 -050083 Q_UNUSED(lpszPathObj)
84 Q_UNUSED(lpszPathLink)
Edric Milaretb37aa1f2015-07-09 16:39:04 -040085 return true;
86#endif
Edric Milaret4bba46d2015-04-29 16:33:38 -040087}
88
89void
90Utils::DeleteStartupLink() {
Edric Milaret36587362016-02-04 12:30:52 -050091#ifdef Q_OS_WIN
Edric Milaret465a3142015-06-02 15:02:52 -040092 TCHAR startupPath[MAX_PATH];
93 SHGetFolderPathW(NULL, CSIDL_STARTUP, NULL, 0, startupPath);
Edric Milaret4bba46d2015-04-29 16:33:38 -040094
Edric Milaret465a3142015-06-02 15:02:52 -040095 std::wstring linkPath(startupPath);
96 linkPath += TEXT("\\Ring.lnk");
Edric Milaret4bba46d2015-04-29 16:33:38 -040097
98 DeleteFile(linkPath.c_str());
Edric Milaretb37aa1f2015-07-09 16:39:04 -040099#endif
Edric Milaret4bba46d2015-04-29 16:33:38 -0400100}
101
102bool
103Utils::CheckStartupLink() {
Edric Milaret36587362016-02-04 12:30:52 -0500104#ifdef Q_OS_WIN
Edric Milaret465a3142015-06-02 15:02:52 -0400105 TCHAR startupPath[MAX_PATH];
106 SHGetFolderPathW(NULL, CSIDL_STARTUP, NULL, 0, startupPath);
Edric Milaret4bba46d2015-04-29 16:33:38 -0400107
Edric Milaret465a3142015-06-02 15:02:52 -0400108 std::wstring linkPath(startupPath);
109 linkPath += TEXT("\\Ring.lnk");
Edric Milaret4bba46d2015-04-29 16:33:38 -0400110 return PathFileExists(linkPath.c_str());
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400111#else
112 return true;
113#endif
Edric Milaret4bba46d2015-04-29 16:33:38 -0400114}
115
Edric Milaret031c3052015-04-29 18:14:18 -0400116QString
117Utils::GetRingtonePath() {
Edric Milaret36587362016-02-04 12:30:52 -0500118#ifdef Q_OS_WIN
Edric Milaret031c3052015-04-29 18:14:18 -0400119 TCHAR workingDirectory[MAX_PATH];
120 GetCurrentDirectory(MAX_PATH, workingDirectory);
121
122 QString ringtonePath = QString::fromWCharArray(workingDirectory);
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500123 ringtonePath += QStringLiteral("\\ringtones\\default.wav");
Edric Milaret031c3052015-04-29 18:14:18 -0400124
125 return ringtonePath;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400126#else
127 return QString("/usr/local");
128#endif
Edric Milaret031c3052015-04-29 18:14:18 -0400129}
130
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400131QString
132Utils::GenGUID() {
Edric Milaret36587362016-02-04 12:30:52 -0500133#ifdef Q_OS_WIN
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400134 GUID gidReference;
135 wchar_t *str;
136 HRESULT hCreateGuid = CoCreateGuid(&gidReference);
137 if (hCreateGuid == S_OK) {
138 StringFromCLSID(gidReference, &str);
139 auto gStr = QString::fromWCharArray(str);
140 return gStr.remove("{").remove("}").toLower();
141 }
142 else
Edric Milaret36587362016-02-04 12:30:52 -0500143 return QString();
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400144#else
145 return QString("");
146#endif
147}
148
149QString
150Utils::GetISODate() {
Edric Milaret36587362016-02-04 12:30:52 -0500151#ifdef Q_OS_WIN
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400152 SYSTEMTIME lt;
153 GetSystemTime(&lt);
154 return QString("%1-%2-%3T%4:%5:%6Z").arg(lt.wYear).arg(lt.wMonth,2,10,QChar('0')).arg(lt.wDay,2,10,QChar('0'))
155 .arg(lt.wHour,2,10,QChar('0')).arg(lt.wMinute,2,10,QChar('0')).arg(lt.wSecond,2,10,QChar('0'));
156#else
Edric Milaret36587362016-02-04 12:30:52 -0500157 return QString();
158#endif
159}
160
161QString
162Utils::GetCurrentUserName() {
163#ifdef Q_OS_WIN
164 wchar_t username[UNLEN+1];
165 DWORD username_len = UNLEN+1;
166 GetUserName(username, &username_len);
Edric Milaret25236d92016-03-28 09:40:58 -0400167 return QString::fromWCharArray(username, username_len-1);
Edric Milaret36587362016-02-04 12:30:52 -0500168#else
169 return QString();
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400170#endif
171}
172
Edric Milaret4097d2f2016-02-09 14:41:50 -0500173void
174Utils::InvokeMailto(const QString& subject,
175 const QString& body,
176 const QString& attachement) {
Edric Milaret3ba22ca2016-03-01 13:28:01 -0500177#ifdef Q_OS_WIN
178 HKEY hKey;
179 LONG lRes = RegOpenKeyExW(HKEY_CLASSES_ROOT, L"mailto", 0, KEY_READ, &hKey);
180 if (lRes != ERROR_FILE_NOT_FOUND) {
181 auto addr = QString("mailto:?subject=%1&body=%2").arg(subject).arg(body);
182 if (not attachement.isEmpty())
183 addr += QString("&attachement=%1").arg(attachement);
184 ShellExecute(nullptr, L"open", addr.toStdWString().c_str(), NULL, NULL, SW_SHOWNORMAL);
185 } else {
186 QErrorMessage errorMessage;
187 errorMessage.showMessage(QObject::tr("No default mail client found"));
188 }
189#endif
Edric Milaret4097d2f2016-02-09 14:41:50 -0500190}
Edric Milaret25236d92016-03-28 09:40:58 -0400191
192QImage
193Utils::getCirclePhoto(const QImage original, int sizePhoto)
194{
195 QImage target(sizePhoto, sizePhoto, QImage::Format_ARGB32_Premultiplied);
196 target.fill(Qt::transparent);
197
198 QPainter painter(&target);
199 painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
200 painter.setBrush(QBrush(Qt::white));
201 auto scaledPhoto = original
202 .scaled(sizePhoto, sizePhoto, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)
203 .convertToFormat(QImage::Format_ARGB32_Premultiplied);
204 int margin = 0;
205 if (scaledPhoto.width() > sizePhoto) {
206 margin = (scaledPhoto.width() - sizePhoto) / 2;
207 }
208 painter.drawEllipse(0, 0, sizePhoto, sizePhoto);
209 painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
210 painter.drawImage(0, 0, scaledPhoto, margin, 0);
211 return target;
212}
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -0400213
214void
215Utils::slidePage(QStackedWidget* stack, QWidget* widget, bool toRight)
216{
217 if (stack->indexOf(widget) != -1 && stack->currentWidget() != widget){
218 QPropertyAnimation* pageAnim = new QPropertyAnimation();
219 int dir = (toRight ? -1 : 1);
220 stack->setCurrentWidget(widget);
221 pageAnim->setTargetObject(widget);
222 pageAnim->setDuration(animDuration_);
223 pageAnim->setStartValue(QPoint(widget->width() * dir, widget->y()));
224 pageAnim->setEndValue(QPoint(widget->x(), widget->y()));
225 pageAnim->setEasingCurve(QEasingCurve::OutQuad);
226 pageAnim->start();
227 }
228}