cmtres.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:13k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /* 
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. #if defined(XP_UNIX) || defined(XP_BEOS) || defined(XP_OS2)
  35. #include <sys/types.h>
  36. #include <sys/socket.h>
  37. #include <netinet/in.h>
  38. #else
  39. #ifdef XP_MAC
  40. #include "macsocket.h"
  41. #else
  42. #include <windows.h>
  43. #include <winsock.h>
  44. #endif
  45. #endif
  46. #include <errno.h>
  47. #include "cmtcmn.h"
  48. #include "cmtutils.h"
  49. #include "messages.h"
  50. #include <string.h>
  51. CMTStatus CMT_GetNumericAttribute(PCMT_CONTROL control, CMUint32 resourceID, CMUint32 fieldID, CMInt32 *value)
  52. {
  53.     CMTItem message;
  54.     GetAttribRequest request;
  55.     GetAttribReply reply;
  56.     /* Do some parameter checking */
  57.     if (!control) {
  58.         goto loser;
  59.     }
  60.     /* Set up the request */
  61.     request.resID = resourceID;
  62.     request.fieldID = fieldID;
  63.     /* Encode the request */
  64.     if (CMT_EncodeMessage(GetAttribRequestTemplate, &message, &request) != CMTSuccess) {
  65.         goto loser;
  66.     }
  67.     /* Set the message request type */
  68.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_GET_ATTRIBUTE | SSM_NUMERIC_ATTRIBUTE;
  69.     /* Send the mesage and get the response */
  70.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  71.         goto loser;
  72.     }
  73.     /* Validate the message reply type */
  74.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_GET_ATTRIBUTE | SSM_NUMERIC_ATTRIBUTE)) {
  75.         goto loser;
  76.     }
  77.     /* Decode the reply */
  78.     if (CMT_DecodeMessage(GetAttribReplyTemplate, &reply, &message) != CMTSuccess) {
  79.         goto loser;
  80.     }
  81.     *value = reply.value.u.numeric;
  82.     /* Success */
  83.     if (reply.result == 0) {
  84.         return CMTSuccess;
  85.     } 
  86. loser:
  87.     return CMTFailure;
  88. }
  89. CMTStatus CMT_SetNumericAttribute(PCMT_CONTROL control, CMUint32 resourceID,
  90.   CMUint32 fieldID, CMInt32 value)
  91. {
  92.     CMTItem message;
  93.     SetAttribRequest request;
  94.     if (!control) {
  95.         goto loser;
  96.     }
  97.     /* Set the request */
  98.     request.resID = resourceID;
  99.     request.fieldID = fieldID;
  100.     request.value.type = SSM_NUMERIC_ATTRIBUTE;
  101.     request.value.u.numeric = value;
  102.     /* Encode the message */
  103.     if (CMT_EncodeMessage(SetAttribRequestTemplate, &message, &request) != CMTSuccess) {
  104.         goto loser;
  105.     }
  106.     /* Set the message request type */
  107.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | 
  108.                    SSM_SET_ATTRIBUTE | SSM_NUMERIC_ATTRIBUTE;
  109.     if (CMT_SendMessage(control, &message) != CMTSuccess) {
  110.         goto loser;
  111.     }
  112.     /* Validate the message reply type */
  113.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | 
  114.                               SSM_SET_ATTRIBUTE    | SSM_NUMERIC_ATTRIBUTE)) {
  115.         goto loser;
  116.     }
  117.     return CMTSuccess;
  118.  loser:
  119.     return CMTFailure;
  120. }
  121. CMTStatus
  122. CMT_PadStringValue(CMTItem *dest, CMTItem src)
  123. {
  124.     dest->data = NewArray(unsigned char, src.len+1);
  125.     if (dest->data == NULL) {
  126.         return CMTFailure;
  127.     }
  128.     memcpy(dest->data, src.data, src.len);
  129.     dest->data[src.len] = '';
  130.     dest->len = src.len;
  131.     free(src.data);
  132.     return CMTSuccess;
  133. }
  134. CMTStatus CMT_GetStringAttribute(PCMT_CONTROL control, CMUint32 resourceID, CMUint32 fieldID, CMTItem *value)
  135. {
  136.     CMTItem message;
  137.     GetAttribRequest request;
  138.     GetAttribReply reply;
  139.     /* Do some parameter checking */
  140.     if (!control) {
  141.         goto loser;
  142.     }
  143.     /* Set up the request */
  144.     request.resID = resourceID;
  145.     request.fieldID = fieldID;
  146.     /* Encode the request */
  147.     if (CMT_EncodeMessage(GetAttribRequestTemplate, &message, &request) != CMTSuccess) {
  148.         goto loser;
  149.     }
  150.     /* Set the message request type */
  151.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_GET_ATTRIBUTE | SSM_STRING_ATTRIBUTE;
  152.     
  153.     /* Send the mesage and get the response */
  154.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  155.         goto loser;
  156.     }
  157.     /* Validate the message reply type */
  158.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_GET_ATTRIBUTE | SSM_STRING_ATTRIBUTE)) {
  159.         goto loser;
  160.     }
  161.     /* Decode the response */
  162.     if (CMT_DecodeMessage(GetAttribReplyTemplate, &reply, &message) != CMTSuccess) {
  163.         goto loser;
  164.     }
  165.     /* Success */
  166.     if (reply.result == 0) {
  167.         return CMT_PadStringValue(value, reply.value.u.string);
  168.     } 
  169. loser:
  170.     return CMTFailure;
  171. }
  172. CMTStatus
  173. CMT_SetStringAttribute(PCMT_CONTROL control, CMUint32 resourceID,
  174.        CMUint32 fieldID, CMTItem *value)
  175. {
  176.     CMTItem message;
  177.     SetAttribRequest request;
  178.     
  179.     if (!control) {
  180.         goto loser;
  181.     }
  182.     /* Set up the request */
  183.     request.resID = resourceID;
  184.     request.fieldID = fieldID;
  185.     request.value.type = SSM_STRING_ATTRIBUTE;
  186.     request.value.u.string = *value;
  187.     /* Encode the request */
  188.     if (CMT_EncodeMessage(SetAttribRequestTemplate, &message, &request) != CMTSuccess) {
  189.         goto loser;
  190.     }
  191.     /* Set the message request type */
  192.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | 
  193.                    SSM_SET_ATTRIBUTE | SSM_STRING_ATTRIBUTE;
  194.     /* Send the message */
  195.     if (CMT_SendMessage(control, &message) != CMTSuccess) {
  196.         goto loser;
  197.     }
  198.     /* Validate the message request type */
  199.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | 
  200.                          SSM_SET_ATTRIBUTE    | SSM_STRING_ATTRIBUTE)) {
  201.         goto loser;
  202.     }
  203.     return CMTSuccess;
  204. loser:
  205.     return CMTFailure;
  206. }
  207. CMTStatus CMT_DuplicateResource(PCMT_CONTROL control, CMUint32 resourceID,
  208. CMUint32 *newResID)
  209. {
  210.     CMTItem message;
  211.     SingleNumMessage request;
  212.     DupResourceReply reply;
  213.     /* Do some parameter checking */
  214.     if (!control) {
  215.         goto loser;
  216.     }
  217.     /* Set up the request */
  218.     request.value = resourceID;
  219.     /* Encode the request */
  220.     if (CMT_EncodeMessage(SingleNumMessageTemplate, &message, &request) != CMTSuccess) {
  221.         goto loser;
  222.     }
  223.     /* Set the message request type */
  224.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_DUPLICATE_RESOURCE;
  225.     /* Send the mesage */
  226.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  227.         goto loser;
  228.     }
  229.     /* Validate the message reply type */
  230.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_DUPLICATE_RESOURCE)) {
  231.         goto loser;
  232.     }
  233.     /* Decode the reply */
  234.     if (CMT_DecodeMessage(DupResourceReplyTemplate, &reply, &message) != CMTSuccess) {
  235.         goto loser;
  236.     }
  237.     /* Success */
  238.     if (reply.result == 0) {
  239.         *newResID = reply.resID;
  240.         return CMTSuccess;
  241.     } 
  242. loser:
  243.     *newResID = 0;
  244.     return CMTFailure;
  245. }
  246. CMTStatus CMT_DestroyResource(PCMT_CONTROL control, CMUint32 resourceID, CMUint32 resourceType)
  247. {
  248.     CMTItem message;
  249.     DestroyResourceRequest request;
  250.     SingleNumMessage reply;
  251.     /* Do some parameter checking */
  252.     if (!control) {
  253.         goto loser;
  254.     }
  255.     /* Set up the request */
  256.     request.resID = resourceID;
  257.     request.resType = resourceType;
  258.     /* Encode the message */
  259.     if (CMT_EncodeMessage(DestroyResourceRequestTemplate, &message, &request) != CMTSuccess) {
  260.         goto loser;
  261.     }
  262.     /* Set the message request type */
  263.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_DESTROY_RESOURCE;
  264.     /* Send the message */
  265.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  266.         goto loser;
  267.     }
  268.     /* Validate the message reply type */
  269.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_DESTROY_RESOURCE)) {
  270.         goto loser;
  271.     }
  272.     /* Decode the reply */
  273.     if (CMT_DecodeMessage(SingleNumMessageTemplate, &reply, &message) != CMTSuccess) {
  274.         goto loser;
  275.     }
  276.     /* Success */
  277.     if (reply.value == 0) {
  278.         return CMTSuccess;
  279.     }
  280. loser:
  281.     return CMTFailure;
  282. }
  283. CMTStatus CMT_PickleResource(PCMT_CONTROL control, CMUint32 resourceID, CMTItem * pickledResource)
  284. {
  285.     CMTItem message;
  286.     SingleNumMessage request;
  287.     PickleResourceReply reply;
  288.     /* Do some parameter checking */
  289.     if (!control) {
  290.         goto loser;
  291.     }
  292.     /* Set up the request */
  293.     request.value = resourceID;
  294.     /* Encode the request */
  295.     if (CMT_EncodeMessage(SingleNumMessageTemplate, &message, &request) != CMTSuccess) {
  296.         goto loser;
  297.     }
  298.     /* Set the message request type */
  299.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_CONSERVE_RESOURCE | SSM_PICKLE_RESOURCE;
  300.     /* Send the mesage and get the response */
  301.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  302.         goto loser;
  303.     }
  304.     /* Validate the message reply type */
  305.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_CONSERVE_RESOURCE | SSM_PICKLE_RESOURCE)) {
  306.         goto loser;
  307.     }
  308.     /* Decode the reply */
  309.     if (CMT_DecodeMessage(PickleResourceReplyTemplate, &reply,&message) != CMTSuccess) {
  310.         goto loser;
  311.     }
  312.     /* Success */
  313.     if (reply.result == 0) {
  314.         *pickledResource = reply.blob;
  315.         return CMTSuccess;
  316.     } 
  317. loser:
  318.     return CMTFailure;
  319. }
  320. CMTStatus CMT_UnpickleResource(PCMT_CONTROL control, CMUint32 resourceType, CMTItem pickledResource, CMUint32 * resourceID)
  321. {
  322.     CMTItem message;
  323.     UnpickleResourceRequest request;
  324.     UnpickleResourceReply reply;
  325.     /* Do some parameter checking */
  326.     if (!control) {
  327.         goto loser;
  328.     }
  329.     /* Set up the request */
  330.     request.resourceType = resourceType;
  331.     request.resourceData = pickledResource;
  332.     /* Encode the request */
  333.     if (CMT_EncodeMessage(UnpickleResourceRequestTemplate, &message, &request) != CMTSuccess) {
  334.         goto loser;
  335.     }
  336.     /* Set the message request type */
  337.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_CONSERVE_RESOURCE | SSM_UNPICKLE_RESOURCE;
  338.     
  339.     /* Send the mesage and get the response */
  340.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  341.         goto loser;
  342.     }
  343.     /* Validate the message reply type */
  344.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_CONSERVE_RESOURCE | SSM_UNPICKLE_RESOURCE)) {
  345.         goto loser;
  346.     }
  347.     /* Decode the reply */
  348.     if (CMT_DecodeMessage(UnpickleResourceReplyTemplate, &reply, &message) != CMTSuccess) {
  349.         goto loser;
  350.     }
  351.     /* Success */
  352.     if (reply.result == 0) {
  353.         *resourceID = reply.resID;
  354.         return CMTSuccess;
  355.     } 
  356. loser:
  357.     *resourceID = 0;
  358.     return CMTFailure;
  359. }
  360. CMTStatus CMT_GetRIDAttribute(PCMT_CONTROL control, CMUint32 resourceID, CMUint32 fieldID, CMUint32 *value)
  361. {
  362.     CMTItem message;
  363.     GetAttribRequest request;
  364.     GetAttribReply reply;
  365.     /* Do some parameter checking */
  366.     if (!control) {
  367.         goto loser;
  368.     }
  369.     /* Set the request */
  370.     request.resID = resourceID;
  371.     request.fieldID = fieldID;
  372.     /* Encode the message */
  373.     if (CMT_EncodeMessage(GetAttribRequestTemplate, &message, &request) != CMTSuccess) {
  374.         goto loser;
  375.     }
  376.     /* Set the message request type */
  377.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_GET_ATTRIBUTE | SSM_RID_ATTRIBUTE;
  378.     /* Send the mesage and get the response */
  379.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  380.         goto loser;
  381.     }
  382.     /* Validate the message response type */
  383.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_GET_ATTRIBUTE | SSM_RID_ATTRIBUTE)) {
  384.         goto loser;
  385.     }
  386.     /* Decode the reply */
  387.     if (CMT_DecodeMessage(GetAttribReplyTemplate, &reply, &message) != CMTSuccess) {
  388.         goto loser;
  389.     }
  390.     /* Success */
  391.     if (reply.result == 0) {
  392.         *value = reply.value.u.rid;
  393.         return CMTSuccess;
  394.     } 
  395. loser:
  396.     return CMTFailure;
  397. }
  398.