436 lines
9.6 KiB
C++
436 lines
9.6 KiB
C++
/****************************************************************************
|
|
*
|
|
* Microsoft Confidential
|
|
* Copyright (c) Microsoft Corporation 1994
|
|
* All rights reserved
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifdef UNIX_FEATURE_ALIAS
|
|
|
|
#undef UNICODE
|
|
|
|
#include "inetcplp.h"
|
|
#include "shalias.h"
|
|
|
|
#include "mluisupp.h"
|
|
|
|
static TCHAR g_szAliasKey[] = TEXT("Software\\Microsoft\\Internet Explorer\\Unix\\Alias");
|
|
|
|
// Member function definitions for CAlias
|
|
CAlias::CAlias( TCHAR * name )
|
|
{
|
|
m_alias = (TCHAR *) LocalAlloc( LPTR, (lstrlen(name) + 1)*sizeof(TCHAR) );
|
|
StrCpy( m_alias, name );
|
|
m_szurl = NULL;
|
|
m_fDirty= TRUE;
|
|
}
|
|
|
|
CAlias::~CAlias()
|
|
{
|
|
if( m_alias ) LocalFree( m_alias );
|
|
if( m_szurl ) LocalFree( m_szurl );
|
|
}
|
|
|
|
CAlias::Load()
|
|
{
|
|
if(m_alias)
|
|
{
|
|
HKEY hKey;
|
|
|
|
TCHAR aliasKey[MAX_PATH], buffer[MAX_PATH];
|
|
StrCpy( aliasKey, g_szAliasKey);
|
|
StrCat( aliasKey, TEXT("\\"));
|
|
StrCat( aliasKey, m_alias );
|
|
|
|
HRESULT lResult = RegOpenKeyExA(
|
|
HKEY_CURRENT_USER,
|
|
aliasKey,
|
|
0,
|
|
KEY_QUERY_VALUE | KEY_READ,
|
|
&hKey);
|
|
if( lResult == ERROR_SUCCESS )
|
|
{
|
|
DWORD dwLen = MAX_PATH;
|
|
if (RegQueryValue( hKey, NULL, buffer, (long *)&dwLen )
|
|
== ERROR_SUCCESS )
|
|
{
|
|
m_szurl = (TCHAR *)LocalAlloc( LPTR, (dwLen+1)*sizeof(TCHAR));
|
|
StrCpy(m_szurl, buffer);
|
|
}
|
|
|
|
RegCloseKey( hKey );
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
CAlias::Save()
|
|
{
|
|
HRESULT lResult;
|
|
HKEY hKey;
|
|
TCHAR aliasKey[MAX_PATH], buffer[MAX_PATH];
|
|
StrCpy( aliasKey, g_szAliasKey);
|
|
StrCat( aliasKey, TEXT("\\"));
|
|
StrCat( aliasKey, m_alias );
|
|
|
|
lResult = RegOpenKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
aliasKey,
|
|
0,
|
|
KEY_QUERY_VALUE| KEY_WRITE,
|
|
&hKey);
|
|
|
|
if( lResult != ERROR_SUCCESS )
|
|
{
|
|
lResult = RegCreateKey(
|
|
HKEY_CURRENT_USER,
|
|
aliasKey,
|
|
&hKey);
|
|
}
|
|
|
|
if( lResult == ERROR_SUCCESS )
|
|
{
|
|
DWORD dwType = REG_SZ;
|
|
DWORD dwLen = (lstrlen(m_szurl)+1)*sizeof(TCHAR);
|
|
|
|
RegSetValue( hKey, NULL, dwType, m_szurl, dwLen );
|
|
RegCloseKey( hKey);
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
m_fDirty = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
CAlias::Delete()
|
|
{
|
|
TCHAR aliasKey[MAX_PATH], buffer[MAX_PATH];
|
|
StrCpy( aliasKey, g_szAliasKey);
|
|
StrCat( aliasKey, TEXT("\\"));
|
|
StrCat( aliasKey, m_alias );
|
|
RegDeleteKey( HKEY_CURRENT_USER, aliasKey );
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
CAlias::Print()
|
|
{
|
|
if( m_alias ) printf( m_alias );
|
|
printf(",");
|
|
if( m_szurl ) printf( m_szurl );
|
|
printf("\n");
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
STDAPI_(BOOL) FreeAliases( HDPA aliasListIn )
|
|
{
|
|
if(aliasListIn)
|
|
{
|
|
int aliasCount = DPA_GetPtrCount( aliasListIn );
|
|
|
|
for(int i=0; i<aliasCount; i++ )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasListIn, i );
|
|
if(ptr) delete ptr;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
STDAPI_(BOOL) AddAliasToList( HDPA aliasListIn, LPTSTR aliasIn, LPTSTR szurl, HWND hwnd )
|
|
{
|
|
int index;
|
|
CAlias * ptr;
|
|
TCHAR alias[ MAX_ALIAS_LENGTH + 1 ];
|
|
TCHAR achTemp[MAX_ALIAS_LENGTH], achTemp2[MAX_ALIAS_LENGTH];
|
|
|
|
if (aliasListIn && aliasIn && lstrlen(aliasIn)<MAX_ALIAS_LENGTH)
|
|
{
|
|
StrCpy( alias, aliasIn );
|
|
EatSpaces( alias );
|
|
if((index = FindAliasIndex( aliasListIn, alias )) != -1)
|
|
{
|
|
if( !hwnd )
|
|
return FALSE;
|
|
|
|
MLLoadShellLangString(IDS_ERROR_ALIAS_ALREADY_EXISTS,
|
|
achTemp, sizeof(achTemp));
|
|
MLLoadShellLangString(IDS_TITLE_ALIASADD,
|
|
achTemp2, sizeof(achTemp2));
|
|
|
|
if(hwnd && MessageBox(hwnd, achTemp, achTemp2 , MB_YESNO|MB_ICONQUESTION) != IDYES)
|
|
return FALSE;
|
|
|
|
ptr = (CAlias *)DPA_FastGetPtr( aliasListIn, index );
|
|
SetAliasInfo( ptr, NULL, szurl );
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
ptr = new CAlias( alias );
|
|
SetAliasInfo( ptr, NULL, szurl );
|
|
DPA_InsertPtr(aliasListIn, 0x7FFF, (LPVOID)ptr);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
STDAPI_(BOOL) SaveAliases( HDPA aliasListIn )
|
|
{
|
|
// Save the currently changed aliases
|
|
if( aliasListIn )
|
|
{
|
|
int count = DPA_GetPtrCount( aliasListIn );
|
|
|
|
for(int i=0;i<count;i++)
|
|
{
|
|
CAlias * pAlias = (CAlias *)DPA_FastGetPtr( aliasListIn, i );
|
|
if(pAlias && pAlias->m_fDirty)
|
|
{
|
|
pAlias->Save();
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
STDAPI_(BOOL) LoadAliases( HDPA aliasListIn )
|
|
{
|
|
HKEY hKey, hKeyAlias;
|
|
int index = 0;
|
|
DWORD dwLen = MAX_PATH;
|
|
|
|
if(aliasListIn)
|
|
FreeAliases( aliasListIn );
|
|
|
|
TCHAR * buffer = (TCHAR *)LocalAlloc( LPTR, (MAX_PATH+1)*sizeof(TCHAR) );
|
|
|
|
LONG lResult = RegOpenKeyExA(
|
|
HKEY_CURRENT_USER,
|
|
g_szAliasKey,
|
|
0,
|
|
KEY_QUERY_VALUE | KEY_READ,
|
|
&hKeyAlias);
|
|
|
|
if( lResult == ERROR_SUCCESS )
|
|
{
|
|
while( buffer )
|
|
{
|
|
dwLen = MAXPATH;
|
|
if( RegEnumKeyEx( hKeyAlias, index, buffer, &dwLen,
|
|
NULL, NULL, NULL, NULL )
|
|
== ERROR_NO_MORE_ITEMS ) break;
|
|
{
|
|
CAlias * ptr = new CAlias( buffer );
|
|
|
|
if(ptr->Load())
|
|
{
|
|
DPA_InsertPtr(aliasListIn, 0x7FFF, (LPVOID)ptr);
|
|
ptr->m_fDirty = FALSE;
|
|
}
|
|
else
|
|
delete ptr;
|
|
|
|
index++;
|
|
}
|
|
}
|
|
|
|
if(buffer) LocalFree( buffer );
|
|
RegCloseKey( hKeyAlias );
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
STDAPI_(BOOL) PrintAliases( HDPA aliasListIn )
|
|
{
|
|
printf("Listing Aliases:\n");
|
|
|
|
if( !aliasListIn ) return FALSE;
|
|
|
|
int aliasCount = DPA_GetPtrCount( aliasListIn );
|
|
for(int i=0; i<aliasCount; i++ )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasListIn, i );
|
|
ptr->Print();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
STDAPI_(INT) FindAliasIndex(HDPA aliasListIn , LPTSTR alias)
|
|
{
|
|
if( ! aliasListIn ) return -1;
|
|
|
|
int aliasCount = DPA_GetPtrCount( aliasListIn );
|
|
for(int i = 0; i< aliasCount;i++ )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasListIn, i );
|
|
if( !StrCmpI(alias, ptr->m_alias) )
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
STDAPI_(BOOL) FindAliasByURL(HDPA aliasListIn , LPTSTR szurl, LPTSTR aliasIn, INT cchAlias)
|
|
{
|
|
if( ! aliasListIn ) return FALSE;
|
|
|
|
int aliasCount = DPA_GetPtrCount( aliasListIn );
|
|
for(int i = 0; i< aliasCount;i++ )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasListIn, i );
|
|
if( !StrCmp(szurl, ptr->m_szurl) )
|
|
{
|
|
StrCpy( aliasIn, ptr->m_alias );
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
STDAPI_(BOOL) GetURLForAlias(HDPA aliasListIn, LPTSTR alias, LPTSTR szUrl, int cchUrl )
|
|
{
|
|
int index = -1;
|
|
|
|
if(!aliasListIn || !alias || !szUrl || cchUrl <= 0 ) return FALSE;
|
|
|
|
// ENTERCRITICAL;
|
|
|
|
if( (index = FindAliasIndex(aliasListIn, alias) ) != -1 )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasListIn, index );
|
|
StrCpy( szUrl, ptr->m_szurl );
|
|
}
|
|
|
|
Done:
|
|
// LEAVECRITICAL;
|
|
return (index != -1);
|
|
}
|
|
|
|
|
|
STDAPI_(LPCTSTR) GetAliasName( CAlias * ptr )
|
|
{
|
|
if( ptr )
|
|
return ptr->m_alias;
|
|
return NULL;
|
|
}
|
|
|
|
STDAPI_(LPCTSTR) GetAliasUrl( CAlias * ptr )
|
|
{
|
|
if( ptr )
|
|
return ptr->m_szurl;
|
|
return NULL;
|
|
}
|
|
|
|
STDAPI_(LPVOID) CreateAlias( LPTSTR str )
|
|
{
|
|
return new CAlias(str);
|
|
}
|
|
|
|
STDAPI_(VOID) DestroyAlias( CAlias * ptr )
|
|
{
|
|
if( ptr ) delete ptr;
|
|
}
|
|
|
|
STDAPI_(BOOL) SetAliasInfo( CAlias * ptr, TCHAR * alias, TCHAR * url )
|
|
{
|
|
if( ptr )
|
|
{
|
|
if(alias)
|
|
{
|
|
if( ptr->m_alias ) LocalFree( ptr->m_alias );
|
|
ptr->m_alias = DuplicateString( alias );
|
|
ptr->m_fDirty= TRUE;
|
|
}
|
|
if(url)
|
|
{
|
|
if( ptr->m_szurl ) LocalFree( ptr->m_szurl );
|
|
ptr->m_szurl = DuplicateString( url );
|
|
ptr->m_fDirty= TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#ifdef UNICODE
|
|
STDAPI_(BOOL) FindAliasByURLA(HDPA aliasListIn , LPTSTR szurl, LPTSTR aliasIn, INT cchAlias)
|
|
{
|
|
WCHAR szwurl[MAX_URL_STRING];
|
|
WCHAR aliasw[MAX_ALIAS_LENGTH];
|
|
|
|
if( !szurl || !aliasIn || !aliasListIn )
|
|
return FALSE;
|
|
|
|
SHAnsiToUnicode( aliasIn, alias
|
|
}
|
|
|
|
STDAPI_(BOOL) AddAliasToListA( HDPA aliasListIn, LPTSTR aliasIn, LPTSTR szurl, HWND hwnd )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
#else
|
|
|
|
TCHAR *DuplicateString( TCHAR *orig )
|
|
{
|
|
TCHAR * newStr;
|
|
if( !orig ) return NULL;
|
|
|
|
newStr = (TCHAR *)LocalAlloc( LPTR, (lstrlen(orig) + 1)*sizeof(TCHAR));
|
|
if(newStr) StrCpy( newStr, orig );
|
|
|
|
return newStr;
|
|
}
|
|
|
|
TCHAR *EatSpaces( TCHAR * str )
|
|
{
|
|
if( !str ) return NULL;
|
|
|
|
TCHAR *ptr = str, *tmpStr = DuplicateString( str );
|
|
TCHAR *tmpPtr = tmpStr;
|
|
|
|
while( *tmpStr )
|
|
{
|
|
if(*tmpStr == TEXT(' ') || *tmpStr == TEXT('\t') ||
|
|
*tmpStr == TEXT('\n') || *tmpStr == TEXT('\r') ||
|
|
// Remove special characters.
|
|
(int)(*tmpStr) >= 127)
|
|
tmpStr++;
|
|
else
|
|
*ptr++ = *tmpStr++;
|
|
}
|
|
|
|
*ptr = TEXT('\0');
|
|
|
|
LocalFree( tmpPtr );
|
|
|
|
return str;
|
|
}
|
|
|
|
#endif /* UNICODE */
|
|
|
|
#endif /* UNIX_FEATURE_ALIAS */
|