#include #include #include #include Local $aRetArray Local $DisplayDebug = 0 ;=((((F2/(10*1000*1000)-11644473600)/60)/60)/24)+DATE(1970,1,1)-TIME(4,0,0) ----MS SMS Backup Time Calculation Excel ; Calculated the number of seconds since EPOCH (1970/01/01 00:00:00) ; ;local $test=(131084754815400898/(10*1000*1000)-11644473600) ;Local $dtstring=GetDatefromUnixTime($test) ;MsgBox(0,"msgtime",$test) ;Local $iDateCalc = _DateDiff('s', "1970/01/01 00:00:00", _NowCalc()) ;MsgBox($MB_SYSTEMMODAL, "", "Number of seconds since EPOCH: " & $iDateCalc & " timestamp " & GetDatefromUnixTime($test) ) ;Output for Titanium Backup ;a sloppy way to get a whole file in ;Local $testxml=ReadXMLFile("c:\temp\android\smsback.xml","Message") ;_ArrayDisplay($testxml) ;$infile=FileOpenDialog("Select .xml file from WP 8.1 backup",@ScriptDir, "XML (*.xml)") _FileReadToArray(FileOpenDialog("Select .xml file from WP 8.1 backup",@ScriptDir, "XML (*.xml)"), $aRetArray) If @error = 0 Then If $DisplayDebug = 1 Then MsgBox(0, "Any Error?", @error) Local $WorkMSG = StringSplit(_ArrayToString($aRetArray), '', $STR_ENTIRESPLIT) If $DisplayDebug = 1 Then _ArrayDisplay($WorkMSG) Local $loopnum = $WorkMSG[0] Local $Thread[($loopnum + 1)][5] Local $Thaddr[$loopnum + 1] For $i = 2 To $loopnum ;$WorkMSG[0] If StringInStr($WorkMSG[$i], "false", 0) Then ;Test for incoming message vs outgoing Local $Recipients = XMLSplit($WorkMSG[$i], "Recepients") If UBound($Recipients) > 1 Then _ArrayDisplay($Recipients) ;trap any multi-messages - should be none Local $Body = XMLSplit($WorkMSG[$i], "Body") Local $LocalTM = GetDatefromUnixTime(_ArrayToString(XMLSplit($WorkMSG[$i], "LocalTimestamp")) / (10 * 1000 * 1000) - 11644473600) $Thaddr[$i] = _ArrayToString(XMLSplit($Recipients[0], "string")) $Thread[$i][0] = $WorkMSG[$i] $Thread[$i][1] = _ArrayToString(XMLSplit($Recipients[0], "string")) $Thread[$i][2] = $LocalTM $Thread[$i][3] = _ArrayToString($Body) ;Test $Thread[$i][4] = "" & $Thread[$i][3] & "" Else ;If message not incoming then must be outgoing Local $Sender = XMLSplit($WorkMSG[$i], "Sender") If UBound($Sender) > 1 Then _ArrayDisplay($Sender) ; trap any multi-senders - should be none Local $Body = XMLSplit($WorkMSG[$i], "Body") Local $LocalTM = GetDatefromUnixTime(_ArrayToString(XMLSplit($WorkMSG[$i], "LocalTimestamp")) / (10 * 1000 * 1000) - 11644473600) $Thaddr[$i] = _ArrayToString($Sender) $Thread[$i][0] = $WorkMSG[$i] $Thread[$i][1] = _ArrayToString($Sender) $Thread[$i][2] = $LocalTM $Thread[$i][3] = _ArrayToString($Body) $Thread[$i][4] = "" & $Thread[$i][3] & "" ;MsgBox(0,"testsend",_ArrayToString($Sender)) EndIf Next Local $Threadnum[$loopnum][3] Local $THuniq = _ArrayUnique($Thaddr) Local $THMsg[UBound($THuniq) + 1] If $DisplayDebug = 1 Then _ArrayDisplay($THuniq) If $DisplayDebug = 1 Then _ArrayDisplay($Thread) For $i = 2 To $loopnum For $j = 1 To $THuniq[0] If $THuniq[$j] = $Thread[$i][1] Then $THMsg[$j] = $THMsg[$j] & $Thread[$i][4] EndIf ; $Thmsg[$j]=$Thmsg[$j] & $Thread[$i][4] Next Next $lc=0 Local $hFileOpen = FileOpen(@ScriptDir & "\out.xml", $FO_READ + $FO_OVERWRITE) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading/writing the file.") EndIf FileWrite($hFileOpen, "" & @CRLF) FileWrite($hFileOpen, "" & @CRLF) For $j = 1 To $THuniq[0] If StringLen($THuniq[$j]) > 4 Then FileWrite($hFileOpen, "" & @CRLF) FileWrite($hFileOpen, $THMsg[$j] & @CRLF) FileWrite($hFileOpen, "" & @CRLF) $lc=$lc+1 EndIf Next FileWrite($hFileOpen,"") if $DisplayDebug = 1 then MsgBox(0,"Skips",$lc) Else MsgBox(0, "File Read Error", "The import file contains an error") Exit EndIf Func _ArrayUniques($av_Array) Local $i_Flag If Not IsArray($av_Array) And Abs(Int($i_Flag)) <> $i_Flag Then Return $av_Array UBound($av_Array, 2) If Not @error Then Return $av_Array Local $i_Bound = UBound($av_Array), $i_Count_A, $i_Count_B, $av_NewArray[$i_Bound + 1], $i_Number, $av_Temporary $av_NewArray[0] = 0 For $i_Count_A = 0 To $i_Bound - 1 For $i_Count_B = 0 To $i_Bound - 1 If $av_Array[$i_Count_A] == $av_Array[$i_Count_B] And $i_Count_B > $i_Count_A Then ContinueLoop (2) Next $av_NewArray[0] = $av_NewArray[0] + 1 $av_NewArray[$av_NewArray[0]] = $av_Array[$i_Count_A] Next $i_Number = $av_NewArray[0] ReDim $av_NewArray[$i_Number + 1] Return $av_NewArray EndFunc ;==>_ArrayUniques Func ReadXMLFile($Path, $Element) ;by 1234hotmaster Local $aRet = StringRegExp(FileRead($Path), '<' & $Element & '>([^:]*?)', 3) If IsArray($aRet) Then Return $aRet Else Return SetError(-1) EndIf EndFunc ;==>ReadXMLFile Func XMLSplit($Value, $Element) ;by 1234hotmaster Local $aRet = StringRegExp($Value, '<' & $Element & '>([^:]*?)', 3) If IsArray($aRet) Then Return $aRet Else Return SetError(-1) EndIf EndFunc ;==>XMLSplit ;$blTrim: Year in short format and no seconds. Func GetDatefromUnixTime($iUnixTime, $blTrim = True, $iReturnGMT = True) Local $aRet = 0, $aDate = 0 Local $aMonthNumberAbbrev[13] = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] Local $timeAdj = -14400 ;manually adjusted to get import time correct If Not $iReturnGMT Then Local $aSysTimeInfo = _Date_Time_GetTimeZoneInformation() Local $timeAdj = $aSysTimeInfo[1] * 60 If $aSysTimeInfo[0] = 2 Then $timeAdj += $aSysTimeInfo[7] * 60 EndIf ;MsgBox(0,"ta",$timeAdj) $aRet = DllCall("msvcrt.dll", "str:cdecl", "ctime", "int*", $iUnixTime - $timeAdj) If @error Or Not $aRet[0] Then Return "" $aDate = StringSplit(StringTrimRight($aRet[0], 1), " ", 2) ;_ArrayDisplay($aDate) If $blTrim Then Return StringRight($aDate[4], 4) & "-" & StringFormat("%.2d", _ArraySearch($aMonthNumberAbbrev, $aDate[1])) & "-" & $aDate[2] & "T" & $aDate[3] & ".001Z" Return $aDate[4] & "/" & StringFormat("%.2d", _ArraySearch($aMonthNumberAbbrev, $aDate[1])) & "/" & $aDate[2] & " " & $aDate[3] EndFunc ;==>GetDatefromUnixTime ;$blTrim: Year in short format and no seconds. Func _GetDate_fromUnixTime($iUnixTime, $blTrim = True, $iReturnGMT = True) Local $aRet = 0, $aDate = 0 Local $aMonthNumberAbbrev[13] = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] Local $timeAdj = 0 If Not $iReturnGMT Then Local $aSysTimeInfo = _Date_Time_GetTimeZoneInformation() Local $timeAdj = $aSysTimeInfo[1] * 60 If $aSysTimeInfo[0] = 2 Then $timeAdj += $aSysTimeInfo[7] * 60 EndIf $aRet = DllCall("msvcrt.dll", "str:cdecl", "ctime", "int*", $iUnixTime - $timeAdj) If @error Or Not $aRet[0] Then Return "" $aDate = StringSplit(StringTrimRight($aRet[0], 1), " ", 2) If $blTrim Then Return StringRight($aDate[4], 2) & "/" & StringFormat("%.2d", _ArraySearch($aMonthNumberAbbrev, $aDate[1])) & "/" & $aDate[2] & " " & StringTrimRight($aDate[3], 3) Return $aDate[4] & "/" & StringFormat("%.2d", _ArraySearch($aMonthNumberAbbrev, $aDate[1])) & "/" & $aDate[2] & " " & $aDate[3] EndFunc ;==>_GetDate_fromUnixTime