1 #define INCL_WINSHELLDATA /* Or use INCL_WIN, INCL_PM, */ 2 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 #include "EXTERN.h" 7 #include "perl.h" 8 #include "XSUB.h" 9 #include <os2.h> 10 #ifdef __cplusplus 11 } 12 #endif 13 14 #define Prf_Open(pszFileName) SaveWinError(pPrfOpenProfile(Perl_hab, (pszFileName))) 15 #define Prf_Close(hini) (!CheckWinError(pPrfCloseProfile(hini))) 16 17 BOOL (*pPrfCloseProfile) (HINI hini); 18 HINI (*pPrfOpenProfile) (HAB hab, PCSZ pszFileName); 19 BOOL (*pPrfQueryProfile) (HAB hab, PPRFPROFILE pPrfProfile); 20 BOOL (*pPrfQueryProfileData) (HINI hini, PCSZ pszApp, PCSZ pszKey, PVOID pBuffer, 21 PULONG pulBufferLength); 22 /* 23 LONG (*pPrfQueryProfileInt) (HINI hini, PCSZ pszApp, PCSZ pszKey, LONG sDefault); 24 */ 25 BOOL (*pPrfQueryProfileSize) (HINI hini, PCSZ pszApp, PCSZ pszKey, 26 PULONG pulReqLen); 27 /* 28 ULONG (*pPrfQueryProfileString) (HINI hini, PCSZ pszApp, PCSZ pszKey, 29 PCSZ pszDefault, PVOID pBuffer, ULONG ulBufferLength); 30 */ 31 BOOL (*pPrfReset) (HAB hab, __const__ PRFPROFILE *pPrfProfile); 32 BOOL (*pPrfWriteProfileData) (HINI hini, PCSZ pszApp, PCSZ pszKey, 33 CPVOID pData, ULONG ulDataLength); 34 /* 35 BOOL (*pPrfWriteProfileString) (HINI hini, PCSZ pszApp, PCSZ pszKey, 36 PCSZ pszData); 37 */ 38 39 SV * 40 Prf_Get(pTHX_ HINI hini, PSZ app, PSZ key) { 41 ULONG len; 42 BOOL rc; 43 SV *sv; 44 45 if (CheckWinError(pPrfQueryProfileSize(hini, app, key, &len))) return &PL_sv_undef; 46 sv = newSVpv("", 0); 47 SvGROW(sv, len + 1); 48 if (CheckWinError(pPrfQueryProfileData(hini, app, key, SvPVX(sv), &len)) 49 || (len == 0 && (app == NULL || key == NULL))) { /* Somewhy needed. */ 50 SvREFCNT_dec(sv); 51 return &PL_sv_undef; 52 } 53 SvCUR_set(sv, len); 54 *SvEND(sv) = 0; 55 return sv; 56 } 57 58 I32 59 Prf_GetLength(HINI hini, PSZ app, PSZ key) { 60 U32 len; 61 62 if (CheckWinError(pPrfQueryProfileSize(hini, app, key, &len))) return -1; 63 return len; 64 } 65 66 #define Prf_Set(hini, app, key, s, l) \ 67 (!(CheckWinError(pPrfWriteProfileData(hini, app, key, s, l)))) 68 69 #define Prf_System(key) \ 70 ( (key) ? ( (key) == 1 ? HINI_USERPROFILE \ 71 : ( (key) == 2 ? HINI_SYSTEMPROFILE \ 72 : (die("Wrong profile id %i", key), 0) )) \ 73 : HINI_PROFILE) 74 75 SV* 76 Prf_Profiles(pTHX) 77 { 78 AV *av = newAV(); 79 SV *rv; 80 char user[257]; 81 char system[257]; 82 PRFPROFILE info = { 257, user, 257, system}; 83 84 if (CheckWinError(pPrfQueryProfile(Perl_hab, &info))) return &PL_sv_undef; 85 if (info.cchUserName > 257 || info.cchSysName > 257) 86 die("Panic: Profile names too long"); 87 av_push(av, newSVpv(user, info.cchUserName - 1)); 88 av_push(av, newSVpv(system, info.cchSysName - 1)); 89 rv = newRV((SV*)av); 90 SvREFCNT_dec(av); 91 return rv; 92 } 93 94 BOOL 95 Prf_SetUser(pTHX_ SV *sv) 96 { 97 char user[257]; 98 char system[257]; 99 PRFPROFILE info = { 257, user, 257, system}; 100 101 if (!SvPOK(sv)) die("User profile name not defined"); 102 if (SvCUR(sv) > 256) die("User profile name too long"); 103 if (CheckWinError(pPrfQueryProfile(Perl_hab, &info))) return 0; 104 if (info.cchSysName > 257) 105 die("Panic: System profile name too long"); 106 info.cchUserName = SvCUR(sv) + 1; 107 info.pszUserName = SvPVX(sv); 108 return !CheckWinError(pPrfReset(Perl_hab, &info)); 109 } 110 111 MODULE = OS2::PrfDB PACKAGE = OS2::Prf PREFIX = Prf_ 112 113 HINI 114 Prf_Open(pszFileName) 115 PSZ pszFileName; 116 117 BOOL 118 Prf_Close(hini) 119 HINI hini; 120 121 SV * 122 Prf_Get(hini, app, key) 123 HINI hini; 124 PSZ app; 125 PSZ key; 126 CODE: 127 RETVAL = Prf_Get(aTHX_ hini, app, key); 128 OUTPUT: 129 RETVAL 130 131 int 132 Prf_Set(hini, app, key, s, l = (SvPOK(ST(3)) ? SvCUR(ST(3)): -1)) 133 HINI hini; 134 PSZ app; 135 PSZ key; 136 PSZ s; 137 ULONG l; 138 139 I32 140 Prf_GetLength(hini, app, key) 141 HINI hini; 142 PSZ app; 143 PSZ key; 144 145 HINI 146 Prf_System(key) 147 int key; 148 149 SV* 150 Prf_Profiles() 151 CODE: 152 RETVAL = Prf_Profiles(aTHX); 153 OUTPUT: 154 RETVAL 155 156 BOOL 157 Prf_SetUser(sv) 158 SV *sv 159 CODE: 160 RETVAL = Prf_SetUser(aTHX_ sv); 161 OUTPUT: 162 RETVAL 163 164 BOOT: 165 Acquire_hab(); 166 AssignFuncPByORD(pPrfQueryProfileSize, ORD_PRF32QUERYPROFILESIZE); 167 AssignFuncPByORD(pPrfOpenProfile, ORD_PRF32OPENPROFILE); 168 AssignFuncPByORD(pPrfCloseProfile, ORD_PRF32CLOSEPROFILE); 169 AssignFuncPByORD(pPrfQueryProfile, ORD_PRF32QUERYPROFILE); 170 AssignFuncPByORD(pPrfReset, ORD_PRF32RESET); 171 AssignFuncPByORD(pPrfQueryProfileData, ORD_PRF32QUERYPROFILEDATA); 172 AssignFuncPByORD(pPrfWriteProfileData, ORD_PRF32WRITEPROFILEDATA); 173 174