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