Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

384 lines
10 KiB

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4. print.c
  5. Abstract:
  6. This module contains utilitarian functions.
  7. Author:
  8. Wesley Witt (wesw) 29-Nov-1996
  9. Revision History:
  10. --*/
  11. #include "faxapi.h"
  12. #pragma hdrstop
  13. BOOL
  14. ConvertUnicodeMultiSZInPlace(
  15. LPCWSTR UnicodeString,
  16. DWORD ByteCount
  17. )
  18. {
  19. LPWSTR StrW;
  20. LPWSTR From;
  21. LPSTR To;
  22. LPSTR StrA;
  23. StrW = MemAlloc( ByteCount );
  24. if (StrW == NULL) {
  25. return FALSE;
  26. }
  27. CopyMemory( StrW, UnicodeString, ByteCount );
  28. From = StrW;
  29. To = (LPSTR) UnicodeString;
  30. while (From && *From) {
  31. StrA = UnicodeStringToAnsiString( From );
  32. if (StrA == NULL) {
  33. MemFree( StrW );
  34. return FALSE;
  35. }
  36. strcpy( To, StrA );
  37. To += strlen( To ) + 1;
  38. From += wcslen( From ) + 1;
  39. MemFree( StrA );
  40. }
  41. MemFree( StrW );
  42. return TRUE;
  43. }
  44. VOID
  45. ConvertUnicodeStringInPlace(
  46. LPCWSTR UnicodeString
  47. )
  48. {
  49. LPSTR AnsiString = UnicodeStringToAnsiString( UnicodeString );
  50. if (AnsiString) {
  51. strcpy( (LPSTR)UnicodeString, AnsiString );
  52. MemFree( AnsiString );
  53. }
  54. }
  55. VOID
  56. ConvertAnsiiStringInPlace(
  57. LPCSTR AnsiiString
  58. )
  59. {
  60. LPWSTR UnicodeString = AnsiStringToUnicodeString( AnsiiString );
  61. if (UnicodeString) {
  62. wcscpy( (LPWSTR)AnsiiString, UnicodeString );
  63. MemFree( UnicodeString );
  64. }
  65. }
  66. VOID
  67. StoreString(
  68. LPCWSTR String,
  69. PULONG_PTR DestString,
  70. LPBYTE Buffer,
  71. PULONG_PTR Offset
  72. )
  73. {
  74. wcscpy( (LPWSTR) (Buffer+*Offset), String );
  75. *DestString = *Offset;
  76. *Offset += StringSize( String );
  77. }
  78. VOID
  79. StoreStringA(
  80. LPCSTR String,
  81. PULONG_PTR DestString,
  82. LPBYTE Buffer,
  83. PULONG_PTR Offset
  84. )
  85. {
  86. strcpy( (LPSTR) (Buffer+*Offset), String );
  87. ConvertAnsiiStringInPlace( (LPSTR) (Buffer+*Offset) );
  88. *DestString = *Offset;
  89. *Offset += StringSize( (LPWSTR) String );
  90. }
  91. BOOL
  92. WINAPI
  93. FaxCompleteJobParamsA(
  94. IN OUT PFAX_JOB_PARAMA *JobParamsBuffer,
  95. IN OUT PFAX_COVERPAGE_INFOA *CoverpageInfoBuffer
  96. )
  97. {
  98. PFAX_JOB_PARAMA JobParams;
  99. PFAX_COVERPAGE_INFOA CoverpageInfo;
  100. if (!JobParamsBuffer || !CoverpageInfoBuffer) {
  101. SetLastError(ERROR_INVALID_PARAMETER);
  102. return FALSE;
  103. }
  104. *JobParamsBuffer = NULL;
  105. *CoverpageInfoBuffer = NULL;
  106. if (! FaxCompleteJobParamsW((PFAX_JOB_PARAMW *)JobParamsBuffer,(PFAX_COVERPAGE_INFOW *)CoverpageInfoBuffer) ) {
  107. return FALSE;
  108. }
  109. JobParams = *JobParamsBuffer;
  110. CoverpageInfo = *CoverpageInfoBuffer;
  111. if (JobParams->Tsid)
  112. ConvertUnicodeStringInPlace( (LPWSTR) JobParams->Tsid);
  113. if (JobParams->SenderName)
  114. ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderName);
  115. if (JobParams->SenderCompany)
  116. ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderCompany);
  117. if (JobParams->SenderDept)
  118. ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderDept);
  119. if (JobParams->BillingCode)
  120. ConvertUnicodeStringInPlace( (LPWSTR) JobParams->BillingCode);
  121. if (JobParams->DeliveryReportAddress)
  122. ConvertUnicodeStringInPlace( (LPWSTR) JobParams->DeliveryReportAddress);
  123. if (CoverpageInfo->SdrName)
  124. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrName);
  125. if (CoverpageInfo->SdrFaxNumber)
  126. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrFaxNumber);
  127. if (CoverpageInfo->SdrCompany)
  128. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrCompany);
  129. if (CoverpageInfo->SdrAddress)
  130. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrAddress);
  131. if (CoverpageInfo->SdrTitle)
  132. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrTitle);
  133. if (CoverpageInfo->SdrDepartment)
  134. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrDepartment);
  135. if (CoverpageInfo->SdrOfficeLocation)
  136. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrOfficeLocation);
  137. if (CoverpageInfo->SdrHomePhone)
  138. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrHomePhone);
  139. if (CoverpageInfo->SdrOfficePhone)
  140. ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrOfficePhone);
  141. return TRUE;
  142. }
  143. BOOL
  144. WINAPI
  145. FaxCompleteJobParamsW(
  146. IN OUT PFAX_JOB_PARAMW *JobParamsBuffer,
  147. IN OUT PFAX_COVERPAGE_INFOW *CoverpageInfoBuffer
  148. )
  149. {
  150. #define RegStrLen(pValueName,lpdwNeeded) \
  151. RegQueryValueEx(hKey,pValueName,NULL,NULL,NULL,lpdwNeeded)
  152. #define RegStrCpy(pValueName, szPointer, Offset) \
  153. dwNeeded = 256*sizeof(WCHAR); \
  154. rslt = RegQueryValueEx(hKey,pValueName,NULL,NULL,(LPBYTE)TempBuffer,&dwNeeded);\
  155. if (rslt == ERROR_SUCCESS) { \
  156. szPointer = Offset; \
  157. lstrcpy(Offset,TempBuffer); \
  158. Offset = Offset + lstrlen(Offset) +1; \
  159. }
  160. PFAX_JOB_PARAM JobParams = NULL;
  161. PFAX_COVERPAGE_INFO CoverpageInfo = NULL;
  162. HKEY hKey;
  163. BOOL fSuccess=FALSE;
  164. long rslt = ERROR_SUCCESS;
  165. DWORD dwJobNeeded = sizeof (FAX_JOB_PARAMW);
  166. DWORD dwCoverNeeded = sizeof (FAX_COVERPAGE_INFOW);
  167. DWORD dwNeeded = 0;
  168. WCHAR *CPOffset = NULL, *JobOffset = NULL;
  169. WCHAR TempBuffer[256];
  170. if (!JobParamsBuffer || !CoverpageInfoBuffer) {
  171. SetLastError(ERROR_INVALID_PARAMETER);
  172. return FALSE;
  173. }
  174. *JobParamsBuffer = NULL;
  175. *CoverpageInfoBuffer = NULL;
  176. //
  177. // open the key holding our data
  178. //
  179. rslt = RegOpenKeyEx(HKEY_CURRENT_USER,REGKEY_FAX_USERINFO,0,KEY_READ,&hKey);
  180. if (rslt != ERROR_SUCCESS) {
  181. return FALSE;
  182. }
  183. //
  184. // find out how much space we need
  185. //
  186. RegStrLen(REGVAL_FULLNAME,&dwNeeded);
  187. dwCoverNeeded += dwNeeded+1;
  188. dwJobNeeded +=dwNeeded+1;
  189. RegStrLen(REGVAL_COMPANY,&dwNeeded);
  190. dwCoverNeeded += dwNeeded+1;
  191. dwJobNeeded +=dwNeeded+1;
  192. RegStrLen(REGVAL_DEPT,&dwNeeded);
  193. dwCoverNeeded += dwNeeded+1;
  194. dwJobNeeded +=dwNeeded+1;
  195. RegStrLen(REGVAL_FAX_NUMBER,&dwNeeded);
  196. dwCoverNeeded += dwNeeded+1;
  197. dwJobNeeded +=dwNeeded+1;
  198. RegStrLen(REGVAL_ADDRESS,&dwNeeded);
  199. dwCoverNeeded += dwNeeded+1;
  200. RegStrLen(REGVAL_TITLE,&dwNeeded);
  201. dwCoverNeeded += dwNeeded+1;
  202. RegStrLen(REGVAL_OFFICE,&dwNeeded);
  203. dwCoverNeeded += dwNeeded+1;
  204. RegStrLen(REGVAL_HOME_PHONE,&dwNeeded);
  205. dwCoverNeeded += dwNeeded+1;
  206. RegStrLen(REGVAL_OFFICE_PHONE,&dwNeeded);
  207. dwCoverNeeded += dwNeeded+1;
  208. RegStrLen(REGVAL_BILLING_CODE,&dwNeeded);
  209. dwJobNeeded +=dwNeeded+1;
  210. RegStrLen(REGVAL_MAILBOX,&dwNeeded);
  211. // one for email address, one for DR address
  212. dwJobNeeded +=dwNeeded+1;
  213. dwJobNeeded +=dwNeeded+1;
  214. //
  215. // alloc the space
  216. //
  217. JobParams = MemAlloc(dwJobNeeded*sizeof(WCHAR));
  218. CoverpageInfo = MemAlloc(dwCoverNeeded*sizeof(WCHAR));
  219. if (!JobParams || !CoverpageInfo ) {
  220. RegCloseKey(hKey);
  221. if (JobParams) {
  222. MemFree( JobParams );
  223. }
  224. if (CoverpageInfo) {
  225. MemFree( CoverpageInfo );
  226. }
  227. SetLastError (ERROR_NOT_ENOUGH_MEMORY);
  228. return FALSE;
  229. }
  230. //
  231. // fill in the data
  232. //
  233. ZeroMemory(JobParams,sizeof(FAX_JOB_PARAMW) );
  234. JobParams->SizeOfStruct = sizeof(FAX_JOB_PARAMW);
  235. JobParams->ScheduleAction = JSA_NOW;
  236. JobParams->DeliveryReportType = DRT_NONE;
  237. ZeroMemory(CoverpageInfo,sizeof(FAX_COVERPAGE_INFOW));
  238. CoverpageInfo->SizeOfStruct = sizeof(FAX_COVERPAGE_INFOW);
  239. CPOffset = (WCHAR *) ( (LPBYTE) CoverpageInfo + sizeof(FAX_COVERPAGE_INFOW));
  240. JobOffset = (WCHAR *)( (LPBYTE) JobParams + sizeof(FAX_JOB_PARAMW));
  241. RegStrCpy(REGVAL_FULLNAME,CoverpageInfo->SdrName,CPOffset);
  242. RegStrCpy(REGVAL_FULLNAME,JobParams->SenderName,JobOffset);
  243. RegStrCpy(REGVAL_COMPANY,CoverpageInfo->SdrCompany,CPOffset);
  244. RegStrCpy(REGVAL_COMPANY,JobParams->SenderCompany,JobOffset);
  245. RegStrCpy(REGVAL_DEPT,CoverpageInfo->SdrDepartment,CPOffset);
  246. RegStrCpy(REGVAL_DEPT,JobParams->SenderDept,JobOffset);
  247. RegStrCpy(REGVAL_FAX_NUMBER,CoverpageInfo->SdrFaxNumber,CPOffset);
  248. RegStrCpy(REGVAL_FAX_NUMBER,JobParams->Tsid,JobOffset);
  249. RegStrCpy(REGVAL_ADDRESS,CoverpageInfo->SdrAddress,CPOffset);
  250. RegStrCpy(REGVAL_TITLE,CoverpageInfo->SdrTitle,CPOffset);
  251. RegStrCpy(REGVAL_OFFICE,CoverpageInfo->SdrOfficeLocation,CPOffset);
  252. RegStrCpy(REGVAL_HOME_PHONE,CoverpageInfo->SdrHomePhone,CPOffset);
  253. RegStrCpy(REGVAL_OFFICE_PHONE,CoverpageInfo->SdrOfficePhone,CPOffset);
  254. RegStrCpy(REGVAL_BILLING_CODE,JobParams->BillingCode,CPOffset);
  255. RegStrCpy(REGVAL_MAILBOX,JobParams->DeliveryReportAddress,CPOffset);
  256. *JobParamsBuffer = (PFAX_JOB_PARAM)JobParams;
  257. *CoverpageInfoBuffer = (PFAX_COVERPAGE_INFO) CoverpageInfo;
  258. fSuccess = TRUE;
  259. RegCloseKey(hKey);
  260. return fSuccess;
  261. }
  262. BOOL
  263. IsLocalFaxConnection(
  264. HANDLE FaxHandle
  265. )
  266. {
  267. WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
  268. DWORD Size = MAX_COMPUTERNAME_LENGTH + 1;
  269. PWSTR lpMachineName;
  270. if (!FaxHandle) {
  271. SetLastError( ERROR_INVALID_HANDLE );
  272. return FALSE;
  273. }
  274. if (FH_DATA(FaxHandle)->MachineName == NULL) {
  275. return TRUE;
  276. }
  277. lpMachineName = FH_DATA(FaxHandle)->MachineName;
  278. if (wcscmp( lpMachineName, L"." ) == 0) {
  279. return TRUE;
  280. }
  281. if (GetComputerName( ComputerName, &Size )) {
  282. if (_wcsicmp( lpMachineName, ComputerName ) == 0) {
  283. return TRUE;
  284. }
  285. if (lpMachineName[0] == '\\' &&
  286. lpMachineName[1] == '\\' &&
  287. _wcsicmp( &lpMachineName[2], ComputerName ) == 0
  288. ) {
  289. return TRUE;
  290. }
  291. }
  292. return FALSE;
  293. }