Commit | Line | Data |
760ac839 |
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(PrfOpenProfile(Perl_hab, (pszFileName))) |
15 | #define Prf_Close(hini) (!CheckWinError(PrfCloseProfile(hini))) |
16 | |
17 | SV * |
18 | Prf_Get(HINI hini, PSZ app, PSZ key) { |
19 | ULONG len; |
20 | BOOL rc; |
21 | SV *sv; |
22 | |
23 | if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return &sv_undef; |
24 | sv = newSVpv("", 0); |
25 | SvGROW(sv, len); |
26 | if (CheckWinError(PrfQueryProfileData(hini, app, key, SvPVX(sv), &len)) |
27 | || (len == 0 && (app == NULL || key == NULL))) { /* Somewhy needed. */ |
28 | SvREFCNT_dec(sv); |
29 | return &sv_undef; |
30 | } |
31 | SvCUR_set(sv, len); |
32 | *SvEND(sv) = 0; |
33 | return sv; |
34 | } |
35 | |
36 | U32 |
37 | Prf_GetLength(HINI hini, PSZ app, PSZ key) { |
38 | U32 len; |
39 | |
40 | if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return -1; |
41 | return len; |
42 | } |
43 | |
44 | #define Prf_Set(hini, app, key, s, l) \ |
45 | (!(CheckWinError(PrfWriteProfileData(hini, app, key, s, l)))) |
46 | |
47 | #define Prf_System(key) \ |
48 | ( (key) ? ( (key) == 1 ? HINI_USERPROFILE \ |
49 | : ( (key) == 2 ? HINI_SYSTEMPROFILE \ |
50 | : (die("Wrong profile id %i", key), 0) )) \ |
51 | : HINI_PROFILE) |
52 | |
53 | SV* |
54 | Prf_Profiles() |
55 | { |
56 | AV *av = newAV(); |
57 | SV *rv; |
58 | char user[257]; |
59 | char system[257]; |
60 | PRFPROFILE info = { 257, user, 257, system}; |
61 | |
62 | if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return &sv_undef; |
63 | if (info.cchUserName > 257 || info.cchSysName > 257) |
64 | die("Panic: Profile names too long"); |
65 | av_push(av, newSVpv(user, info.cchUserName - 1)); |
66 | av_push(av, newSVpv(system, info.cchSysName - 1)); |
67 | rv = newRV((SV*)av); |
68 | SvREFCNT_dec(av); |
69 | return rv; |
70 | } |
71 | |
72 | BOOL |
73 | Prf_SetUser(SV *sv) |
74 | { |
75 | char user[257]; |
76 | char system[257]; |
77 | PRFPROFILE info = { 257, user, 257, system}; |
78 | |
79 | if (!SvPOK(sv)) die("User profile name not defined"); |
80 | if (SvCUR(sv) > 256) die("User profile name too long"); |
81 | if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return 0; |
82 | if (info.cchSysName > 257) |
83 | die("Panic: System profile name too long"); |
84 | info.cchUserName = SvCUR(sv) + 1; |
85 | info.pszUserName = SvPVX(sv); |
86 | return !CheckWinError(PrfReset(Perl_hab, &info)); |
87 | } |
88 | |
89 | MODULE = OS2::PrfDB PACKAGE = OS2::Prf PREFIX = Prf_ |
90 | |
91 | HINI |
92 | Prf_Open(pszFileName) |
93 | PSZ pszFileName; |
94 | |
95 | BOOL |
96 | Prf_Close(hini) |
97 | HINI hini; |
98 | |
99 | SV * |
100 | Prf_Get(hini, app, key) |
101 | HINI hini; |
102 | PSZ app; |
103 | PSZ key; |
104 | |
105 | int |
106 | Prf_Set(hini, app, key, s, l = (SvPOK(ST(3)) ? SvCUR(ST(3)): -1)) |
107 | HINI hini; |
108 | PSZ app; |
109 | PSZ key; |
110 | PSZ s; |
111 | ULONG l; |
112 | |
113 | U32 |
114 | Prf_GetLength(hini, app, key) |
115 | HINI hini; |
116 | PSZ app; |
117 | PSZ key; |
118 | |
119 | HINI |
120 | Prf_System(key) |
121 | int key; |
122 | |
123 | SV* |
124 | Prf_Profiles() |
125 | |
126 | BOOL |
127 | Prf_SetUser(sv) |
128 | SV *sv |
129 | |
130 | BOOT: |
131 | Acquire_hab(); |