#include <iostream>
#include <string>
#include <vector>
#include "matt_com.h"

using namespace std;
using namespace matt_com;

wstring 
to_wstring(const string& s) 
{
   wstring ret;
   int len = MultiByteToWideChar(CP_ACP,0,s.c_str(),-1,NULL,0);
   if(len != 0) {
      vector<wchar_t> buffer(len);
      MultiByteToWideChar(CP_ACP,0,s.c_str(),-1,buffer.data(),len);
      ret = wstring(buffer.data());
   }
   return ret;
}

int
main(int argc, char* argv[]) 
{
   void* obj = 0;
   void* OpenTextFile = 0;
   void* Stream = 0;
   void* StreamObject = 0;
   void* ReadAll = 0;
   void* Data = 0;
   int rc = 0;
   wstring file = L"test.txt";
   try {
      com_init();
      if(argc == 2) {
         file = to_wstring(argv[1]);
      }
      obj = create_object(L"Scripting.FileSystemObject");
      COM_ASSERT(obj != 0);
      OpenTextFile = get_com_method(obj, L"OpenTextFile");
      COM_ASSERT(OpenTextFile != 0);
      Stream = object_call(obj, OpenTextFile, get_com_args("%d%s",1,file.c_str()));
      COM_ASSERT(Stream != 0);
      StreamObject = get_result_handle(Stream);
      COM_ASSERT(StreamObject != 0);
      ReadAll = get_com_method(StreamObject, L"ReadAll");
      COM_ASSERT(ReadAll != 0);
      Data = object_call(StreamObject, ReadAll, get_com_args(""));
      COM_ASSERT(Data != 0);
      wcout << get_result_string(Data) << endl;
   }
   catch(const char* message) {
      cerr << message << endl;
      rc = 1;
   }
   catch(...) {
      cerr << "exception..." << endl;
      rc = 1;
   }
   if(Data) release_result(Data);
   if(ReadAll) release_method(ReadAll);
   if(StreamObject) release_object(StreamObject);
   if(Stream) release_result(Stream);
   if(OpenTextFile) release_method(OpenTextFile);
   if(obj) release_object(obj);
   com_fin();
   return rc;
}