customizemii-wiidb/TransmitMii/TransmitMii_Associations.cs
2009-12-09 18:58:32 +00:00

246 lines
9.0 KiB
C#

/* This file is part of TransmitMii (Original code by dillonaumiller, thanks!)
* Copyright (C) 2009 dillonaumiller, Leathl
*
* TransmitMii is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* TransmitMii is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace TransmitMii
{
public static class TransmitMii_Associations
{
public enum Extension
{
DOL = 0,
ELF = 1,
Both = 2,
WAD = 3
}
public static string AssociationPath()
{
try { return Registry.GetValue("HKEY_CLASSES_ROOT\\WiiBin\\shell\\sendwii\\command", "", "").ToString().Replace("%1", "").Replace("\"", ""); }
catch { return ""; }
}
public static bool CheckAssociation(Extension which)
{
if (which == Extension.Both)
{
if (Registry.GetValue("HKEY_CLASSES_ROOT\\.dol", "", "").ToString().ToLower() == "wiibin" &&
Registry.GetValue("HKEY_CLASSES_ROOT\\.elf", "", "").ToString().ToLower() == "wiibin") return true;
else return false;
}
string regKey;
if (which == Extension.DOL)
regKey = "HKEY_CLASSES_ROOT\\.dol";
else if (which == Extension.ELF)
regKey = "HKEY_CLASSES_ROOT\\.elf";
else
regKey = "HKEY_CLASSES_ROOT\\.wad";
if (Registry.GetValue(regKey, "", "").ToString().ToLower() != "wiibin") return false;
else return true;
}
public static bool DeleteAssociation(Extension which)
{
try
{
string regKey;
if (which == Extension.DOL)
regKey = "HKEY_CLASSES_ROOT\\.dol";
else if (which == Extension.ELF)
regKey = "HKEY_CLASSES_ROOT\\.elf";
else
regKey = "HKEY_CLASSES_ROOT\\.wad";
if (ValueExists(regKey, ""))
Registry.SetValue(regKey, "", "");
return true;
}
catch { return false; }
}
public static bool AddAssociation(Extension which, bool makeDefault, string iconPath, bool updateIconCache)
{
//-------
//OPTIONS
//-------
//if(makeDefault) then "Send to Wii" will be the default action for this file type
//if((iconPath == null) || (iconPath == "")) then we won't create a "DefaultIcon" entry for this type
//if(updateIconCache) then force explorer to update it's icon cache (without a logout/login cycle), NOTE: this has a side affect of possibly losing custom desktop icon positions
if ((which == Extension.DOL) || (which == Extension.Both))
if (AddExtension("dol", makeDefault, iconPath) == false)
return false;
if ((which == Extension.ELF) || (which == Extension.Both))
if (AddExtension("elf", makeDefault, iconPath) == false)
return false;
if (which == Extension.WAD)
if (AddExtension("wad", makeDefault, iconPath) == false)
return false;
//get explorer to re-draw the new icon, if needed
if(updateIconCache)
UpdateExplorerIconCache();
return true;
}
//==========================================================================
// private code
//==========================================================================
static bool AddExtension(string extension, bool makeDefault, string iconPath)
{
bool createClass = true;
string rkEXT = "HKEY_CLASSES_ROOT\\." + extension;
string rkCLS = "HKEY_CLASSES_ROOT\\WiiBin";
//check if the file-type already has a class
if (ValueExists(rkEXT, ""))
{
string currClass = (string)Registry.GetValue(rkEXT, "", "");
if (currClass.Trim().Length > 0)
{
rkCLS = "HKEY_CLASSES_ROOT\\" + currClass;
if (ValueExists(rkCLS, "")) //exists, and is valid
createClass = false;
}
else //we need to create an entry for this filetype
if (KeyCreate(rkEXT, "WiiBin") == false)
return false;
}
else //we need to create an entry for this filetype
if (KeyCreate(rkEXT, "WiiBin") == false)
return false;
if(createClass) //then we'll be using our own "WiiBin" class
{
//create main key
if (KeyCreate(rkCLS, "Wii Binary Image") == false)
return false;
//create "DefaultIcon" subkey
if (iconPath != null)
if (iconPath != "")
if (KeyCreate(rkCLS + "\\DefaultIcon", iconPath) == false)
return false;
//create "Shell" subkey
if (KeyCreate(rkCLS + "\\shell", "") == false)
return false;
}
//set default icon if desired
if (iconPath != null)
if (iconPath != "")
if (SetStringValue(rkCLS + "\\DefaultIcon", "", iconPath) == false)
return false;
//set default action if desired
if (makeDefault)
if (SetStringValue(rkCLS + "\\shell", "", "sendwii") == false)
return false;
//create "Shell\\sendwii" subkey
if (KeyCreate(rkCLS + "\\shell\\sendwii", "Send to Wii") == false)
return false;
//create "Shell\\sendwii\\command
if (KeyCreate(rkCLS + "\\shell\\sendwii\\command", "\"" + System.Reflection.Assembly.GetExecutingAssembly().Location + "\" \"%1\"") == false)
return false;
return true;
}
static bool ValueExists(string key, string value)
{
if (Registry.GetValue(key, value, null) == null)
return false;
return true;
}
static bool KeyCreate(string key, object defaultValue)
{
try
{
Registry.SetValue(key, "", defaultValue);
return true;
}
catch(Exception)
{
return false;
}
}
static bool SetStringValue(string key, string value, string data)
{
try
{
Registry.SetValue(key, value, data);
return true;
}
catch(Exception)
{
return false;
}
}
[DllImport("user32.dll")] static extern long SendMessageTimeout(int hWnd, int Msg, int wParam, string lParam, int fuFlags, int uTimeout, out int lpdwResult);
static void UpdateExplorerIconCache()
{
string currMetricVal = (string)Registry.GetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics", "Shell Icon Size", null);
if (currMetricVal == null)
return; //how the hell did this happen?
int iSize;
try
{
iSize = int.Parse(currMetricVal) + 1;
}
catch (Exception)
{
iSize = 31;
}
RegistryKey siz;
int res = 0;
siz = Registry.CurrentUser.OpenSubKey("Control Panel").OpenSubKey("Desktop").OpenSubKey("WindowMetrics", true);
siz.SetValue("Shell Icon Size", iSize.ToString());
siz.Flush();
siz.Close();
SendMessageTimeout(0xFFFF, 0x001A, 0, "", 0, 100, out res);
siz = Registry.CurrentUser.OpenSubKey("Control Panel").OpenSubKey("Desktop").OpenSubKey("WindowMetrics", true);
siz.SetValue("Shell Icon Size", currMetricVal);
siz.Flush();
siz.Close();
SendMessageTimeout(0xFFFF, 0x001A, 0, "", 0, 100, out res);
}
}
}