transmit now sets up message
This commit is contained in:
		@@ -12,11 +12,7 @@ int main(int, char const*const*const argv) try {
 | 
			
		||||
    std::cout<<"Reader: "<<*it<<std::endl;
 | 
			
		||||
    pcsc::Connection::Reader::Status s(c.reader(*it).status());
 | 
			
		||||
    std::cout<<"Status = "<<s.state<<std::endl;
 | 
			
		||||
    std::cout<<"Attribute = ";
 | 
			
		||||
    for (std::vector<unsigned char>::const_iterator it(s.attr.begin());
 | 
			
		||||
         it!=s.attr.end(); ++it)
 | 
			
		||||
      std::cout<<std::hex<<(int)*it<<" ";
 | 
			
		||||
    std::cout<<std::endl;
 | 
			
		||||
    std::cout<<"ATR = "<<crypto::hex(s.atr)<<std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
 } catch (std::exception& x) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								src/pcsc.hxx
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								src/pcsc.hxx
									
									
									
									
									
								
							@@ -21,10 +21,10 @@
 | 
			
		||||
  #endif
 | 
			
		||||
  namespace pcsc {
 | 
			
		||||
    //! stupid windows needs std::wstring
 | 
			
		||||
    std::wstring strconv(std::string s) {
 | 
			
		||||
    inline std::wstring strconv(std::string s) {
 | 
			
		||||
      return std::wstring(s.begin(), s.end());
 | 
			
		||||
    }
 | 
			
		||||
    std::string strconv(std::wstring s) {
 | 
			
		||||
    inline std::string strconv(std::wstring s) {
 | 
			
		||||
      return std::string(s.begin(), s.end());
 | 
			
		||||
    }
 | 
			
		||||
    typedef wchar_t char_t;
 | 
			
		||||
@@ -35,7 +35,7 @@
 | 
			
		||||
  #include <PCSC/wintypes.h>
 | 
			
		||||
  #include <PCSC/winscard.h>
 | 
			
		||||
  namespace pcsc {
 | 
			
		||||
    const std::string& strconv(const std::string& s) {
 | 
			
		||||
    inline const std::string& strconv(const std::string& s) {
 | 
			
		||||
      return s;
 | 
			
		||||
    }
 | 
			
		||||
    typedef char char_t;
 | 
			
		||||
@@ -104,6 +104,12 @@ namespace pcsc {
 | 
			
		||||
          exception("smardcard access error:\n"+reason) {
 | 
			
		||||
      }
 | 
			
		||||
  };
 | 
			
		||||
  //----------------------------------------------------------------------------
 | 
			
		||||
  class runtime_error: public exception {
 | 
			
		||||
    public:
 | 
			
		||||
      runtime_error(const std::string& reason, const std::string& data) throw():
 | 
			
		||||
          exception("runtime error,\n"+reason+":\n"+crypto::hex(data)) {}
 | 
			
		||||
  };
 | 
			
		||||
  //@}
 | 
			
		||||
 | 
			
		||||
  //! @addtogroup pcsclib
 | 
			
		||||
@@ -175,22 +181,9 @@ namespace pcsc {
 | 
			
		||||
          //! State and attribute list of a reader.
 | 
			
		||||
          class Status {
 | 
			
		||||
            public:
 | 
			
		||||
              Status(unsigned long s, const std::vector<unsigned char>& attrs):
 | 
			
		||||
                  state(s), attr(attrs) {
 | 
			
		||||
              }
 | 
			
		||||
              Status(unsigned long s, const std::string& attrs):
 | 
			
		||||
                  state(s), attr(convert(attrs)) {
 | 
			
		||||
              }
 | 
			
		||||
              Status(unsigned long s, const std::string& a): state(s), atr(a) {}
 | 
			
		||||
              const unsigned long state;
 | 
			
		||||
              const std::vector<unsigned char> attr;
 | 
			
		||||
            private:
 | 
			
		||||
              static std::vector<unsigned char> convert(const std::string& a) {
 | 
			
		||||
                std::vector<unsigned char> res;
 | 
			
		||||
                for (std::string::const_iterator it(a.begin());
 | 
			
		||||
                     it!=a.end(); ++it)
 | 
			
		||||
                  res.push_back(*it);
 | 
			
		||||
                return res;
 | 
			
		||||
              }
 | 
			
		||||
              const std::string atr;
 | 
			
		||||
          };
 | 
			
		||||
      
 | 
			
		||||
          //.............................................................methods
 | 
			
		||||
@@ -215,6 +208,54 @@ namespace pcsc {
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          //! Transmit data to reader.
 | 
			
		||||
          /*! @note Take care: Stings may contain embedded @c 0. */
 | 
			
		||||
          std::string transmit(char cla, char ins, char p1, char p2,
 | 
			
		||||
                               const std::string& lc = std::string(),
 | 
			
		||||
                               unsigned char le = 253) {
 | 
			
		||||
            std::string claInsP1P2;
 | 
			
		||||
            claInsP1P2.push_back(cla);
 | 
			
		||||
            claInsP1P2.push_back(ins);
 | 
			
		||||
            claInsP1P2.push_back(p1);
 | 
			
		||||
            claInsP1P2.push_back(p2);
 | 
			
		||||
            assert(claInsP1P2.size()==4);
 | 
			
		||||
            return transmit(claInsP1P2, lc, le);
 | 
			
		||||
          }
 | 
			
		||||
          
 | 
			
		||||
          //! Transmit data to reader.
 | 
			
		||||
          /*! @note Take care: Stings may contain embedded @c 0. */
 | 
			
		||||
          std::string transmit(char cla, char ins, char p1, char p2,
 | 
			
		||||
                               const char* lc, int len,
 | 
			
		||||
                               unsigned char le = 253) {
 | 
			
		||||
            std::string claInsP1P2;
 | 
			
		||||
            claInsP1P2.push_back(cla);
 | 
			
		||||
            claInsP1P2.push_back(ins);
 | 
			
		||||
            claInsP1P2.push_back(p1);
 | 
			
		||||
            claInsP1P2.push_back(p2);
 | 
			
		||||
            assert(claInsP1P2.size()==4);
 | 
			
		||||
            return transmit(claInsP1P2, std::string(lc, len), le);
 | 
			
		||||
          }
 | 
			
		||||
          
 | 
			
		||||
          //! Transmit data to reader.
 | 
			
		||||
          /*! @note Take care: Stings may contain embedded @c 0.
 | 
			
		||||
              @note Prefer the transmit methods that passes @c cla, @c
 | 
			
		||||
                    ins, @c p1 and @c p2 separate.*/
 | 
			
		||||
          std::string transmit(const std::string& claInsP1P2,
 | 
			
		||||
                               const std::string& lc,
 | 
			
		||||
                               unsigned char le = 253) {
 | 
			
		||||
            if (claInsP1P2.size()!=4)
 | 
			
		||||
              throw runtime_error("transmit: claInsP1P2 must be 4 byte",
 | 
			
		||||
                                  claInsP1P2);
 | 
			
		||||
            if (lc.size()>255) throw runtime_error("transmit: lc too long", lc);
 | 
			
		||||
            std::string msg(claInsP1P2);
 | 
			
		||||
            if (lc.size()) (msg+=(char)lc.size())+=lc;
 | 
			
		||||
            msg+=le;
 | 
			
		||||
            return transmit(msg);
 | 
			
		||||
          }
 | 
			
		||||
          
 | 
			
		||||
          //! Transmit data to reader.
 | 
			
		||||
          /*! @note Take care: Stings may contain embedded @c 0.
 | 
			
		||||
              @note Prefer the transmit methods that passes @c cla, @c
 | 
			
		||||
                    ins, @c p1 and @c p2 separate.*/
 | 
			
		||||
          std::string transmit(std::string in) {
 | 
			
		||||
            DWORD len(1024); // arbitrary
 | 
			
		||||
            unsigned char buff[len];
 | 
			
		||||
@@ -300,7 +341,7 @@ namespace pcsc {
 | 
			
		||||
            check(SCardConnect(_connection._id, strconv(name).c_str(),
 | 
			
		||||
                               mode, protocol,
 | 
			
		||||
                               &_id, &_protocol),
 | 
			
		||||
                  "connect smartcard \""+name+"\" ("+crypto::hex(name)+")");
 | 
			
		||||
                  "connect smartcard \""+name);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          //! forbidden
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user