Change to require Windows SDK 7.0 or later to build.
Fix project files.
Modify documents.
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Debug\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Debug_64\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Release\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Release_64\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Debug\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Debug_64\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Release\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Release_64\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Debug\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Debug_64\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Release\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\Release_64\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Debug\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Debug_64\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Release\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Release_64\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Debug\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Debug_64\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Release\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Release_64\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Debug\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Debug_64\FFFTP.exe"\r
LinkIncremental="2"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Release\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib ws2_32.lib"\r
+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib uuid.lib winmm.lib wintrust.lib ws2_32.lib"\r
OutputFile=".\FFFTP_Eng_Release_64\FFFTP.exe"\r
LinkIncremental="1"\r
SuppressStartupBanner="true"\r
// 全設定暗号化対応\r
int Restart();\r
void RestartAndTerminate();\r
+// タスクバー進捗表示\r
+int LoadTaskbarList3();\r
+void FreeTaskbarList3();\r
+int IsTaskbarList3Loaded();\r
+void UpdateTaskbarProgress();\r
\r
/*===== filelist.c =====*/\r
\r
void InitTransCurDir(void);\r
int DoDownload(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork);\r
int CheckPathViolation(TRANSPACKET *packet);\r
+// タスクバー進捗表示\r
+LONGLONG AskTransferSizeLeft(void);\r
+LONGLONG AskTransferSizeTotal(void);\r
+int AskTransferErrorDisplay(void);\r
\r
/*===== codecnv.c =====*/\r
\r
// 再転送対応\r
static int TransferErrorMode = EXIST_OVW;\r
static int TransferErrorNotify = NO;\r
+// タスクバー進捗表示\r
+static LONGLONG TransferSizeLeft = 0;\r
+static LONGLONG TransferSizeTotal = 0;\r
+static int TransferErrorDisplay = 0;\r
\r
/*===== 外部参照 =====*/\r
\r
(strncmp(Pkt->Cmd, "STOR", 4) == 0))\r
{\r
TransFiles++;\r
+ // タスクバー進捗表示\r
+ TransferSizeLeft += Pkt->Size;\r
+ TransferSizeTotal += Pkt->Size;\r
PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
}\r
}\r
(strncmp(Pkt->Cmd, "STOR", 4) == 0))\r
{\r
TransFiles++;\r
+ // タスクバー進捗表示\r
+ TransferSizeLeft += Pkt->Size;\r
+ TransferSizeTotal += Pkt->Size;\r
PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
}\r
Pkt = Pkt->Next;\r
// 同時接続対応\r
NextTransPacketBase = NotDel;\r
TransFiles = 0;\r
+ // タスクバー進捗表示\r
+ TransferSizeLeft = 0;\r
+ TransferSizeTotal = 0;\r
PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
ReleaseMutex(hListAccMutex);\r
// 同時接続対応\r
// TransFiles--;\r
if(TransFiles > 0)\r
TransFiles--;\r
+ // タスクバー進捗表示\r
+ if(TransferSizeLeft > 0)\r
+ TransferSizeLeft -= Pos->Size;\r
+ if(TransferSizeLeft < 0)\r
+ TransferSizeLeft = 0;\r
+ if(TransFiles == 0)\r
+ TransferSizeTotal = 0;\r
PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
}\r
// Pos = TransPacketBase;\r
{\r
if(strncmp(Pkt->Cmd, "RETR", 4) == 0 || strncmp(Pkt->Cmd, "STOR", 4) == 0)\r
{\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay++;\r
if(TransferErrorNotify == YES && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Pkt) == NO)\r
ClearAll = YES;\r
else\r
Pkt->Mode = TransferErrorMode;\r
AddTransFileList(Pkt);\r
}\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay--;\r
}\r
}\r
}\r
{\r
if(strncmp(Pkt->Cmd, "RETR", 4) == 0 || strncmp(Pkt->Cmd, "STOR", 4) == 0)\r
{\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay++;\r
if(TransferErrorNotify == YES && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt) == NO)\r
ClearAll = YES;\r
else\r
Pkt->Mode = TransferErrorMode;\r
AddTransFileList(Pkt);\r
}\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay--;\r
}\r
}\r
}\r
ReleaseMutex(hErrMsgMutex);\r
return r;\r
}\r
+\r
+// タスクバー進捗表示\r
+LONGLONG AskTransferSizeLeft(void)\r
+{\r
+ return(TransferSizeLeft);\r
+}\r
+\r
+LONGLONG AskTransferSizeTotal(void)\r
+{\r
+ return(TransferSizeTotal);\r
+}\r
+\r
+int AskTransferErrorDisplay(void)\r
+{\r
+ return(TransferErrorDisplay);\r
+}\r
+\r
<body>\r
SourceForge.JP版<span style="font-weight:bold"><span style="color:yellow;vertical-align:super">F</span><span style="color:green">F</span><span style="color:red;vertical-align:sub">F</span><span style="color:green">TP</span></span>のビルドおよび開発の手順について<br>\r
<ol>\r
+ <li>ビルドの準備<br>\r
+ FFFTPをビルドするには以下のものをご用意ください。\r
+ <ol>\r
+ <li>次のいずれかのバージョンのVisual C++\r
+ <ol>\r
+ <li>Visual C++ 2005\r
+ <li>Visual C++ 2005 Express Edition\r
+ <li>Visual C++ 2008\r
+ <li>Visual C++ 2010以降(各自でプロジェクトファイルを変換してください)\r
+ </ol>\r
+ <li>Windows SDK 7.0以降(Visual C++ 2010以降には標準で付属)\r
+ </ol>\r
<li>ビルドの手順<br>\r
FFFTPをビルドするには以下の手順に従ってください。\r
<ol>\r
#include <stdarg.h>\r
// IPv6対応\r
//#include <winsock.h>\r
+// タスクバー進捗表示\r
+#include <shobjidl.h>\r
\r
#include "common.h"\r
#include "resource.h"\r
static int PortableVersion;\r
// ローカル側自動更新\r
HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
+// タスクバー進捗表示\r
+static ITaskbarList3* pTaskbarList3;\r
\r
\r
/*===== グローバルなワーク =====*/\r
// UPnP対応\r
CoInitialize(NULL);\r
LoadUPnP();\r
+ // タスクバー進捗表示\r
+ LoadTaskbarList3();\r
\r
// UTF-8対応\r
LoadUnicodeNormalizationDll();\r
#endif\r
// SFTP対応\r
FreePuTTY();\r
+ // タスクバー進捗表示\r
+ FreeTaskbarList3();\r
// UPnP対応\r
FreeUPnP();\r
CoUninitialize();\r
switch (message)\r
{\r
// ローカル側自動更新\r
+ // タスクバー進捗表示\r
case WM_CREATE :\r
SetTimer(hWnd, 1, 1000, NULL);\r
+ SetTimer(hWnd, 2, 100, NULL);\r
break;\r
\r
// ローカル側自動更新\r
// 自動切断対策\r
+ // タスクバー進捗表示\r
case WM_TIMER :\r
switch(wParam)\r
{\r
LastDataConnectionTime = time(NULL);\r
}\r
break;\r
+ case 2:\r
+ if(IsTaskbarList3Loaded() == YES)\r
+ UpdateTaskbarProgress();\r
+ break;\r
}\r
break;\r
\r
KillTimer(hWnd, 1);\r
if(ChangeNotification != INVALID_HANDLE_VALUE)\r
FindCloseChangeNotification(ChangeNotification);\r
+ // タスクバー進捗表示\r
+ KillTimer(hWnd, 2);\r
// WSACleanup();\r
// DestroyWindow(hWndFtp);\r
PostQuitMessage(0);\r
exit(1);\r
}\r
\r
+// タスクバー進捗表示\r
+int LoadTaskbarList3()\r
+{\r
+ int Sts;\r
+ Sts = FFFTP_FAIL;\r
+ if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK)\r
+ {\r
+ Sts = FFFTP_SUCCESS;\r
+ }\r
+ return Sts;\r
+}\r
+\r
+void FreeTaskbarList3()\r
+{\r
+ if(pTaskbarList3 != NULL)\r
+ pTaskbarList3->lpVtbl->Release(pTaskbarList3);\r
+ pTaskbarList3 = NULL;\r
+}\r
+\r
+int IsTaskbarList3Loaded()\r
+{\r
+ int Sts;\r
+ Sts = NO;\r
+ if(pTaskbarList3 != NULL)\r
+ Sts = YES;\r
+ return Sts;\r
+}\r
+\r
+void UpdateTaskbarProgress()\r
+{\r
+ if(AskTransferSizeTotal() > 0)\r
+ {\r
+ if(AskTransferErrorDisplay() > 0)\r
+ pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR);\r
+ else\r
+ pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL);\r
+ pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal());\r
+ }\r
+ else\r
+ pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);\r
+}\r
+\r
int IsUPnPLoaded()\r
{\r
int Sts;\r
- Sts = FFFTP_FAIL;\r
+ Sts = NO;\r
if(pUPnPNAT != NULL && pUPnPMap != NULL)\r
- Sts = FFFTP_SUCCESS;\r
+ Sts = YES;\r
return Sts;\r
}\r
\r